用Java写解谜RPG-2.Game与GameObject:内存与swing的交流

MVC建设完毕后,我们将开始Game类中currentObject对象,即GameObject的建设。

GameObject是实现具体的绘画部分。由于失误,笔者将本应该是第二篇的本文漏掉了,读者在读本篇时可以参考上篇《MVC下的开始界面和所谓按钮》可以参考。

 

总的来说,GameObject随着操作进行变化,这一点类似于Android中的activity,当自己启动游戏时,Game中的currentObjectStartObject;当选择了开始游戏时,Game中的GameObject类型的currentObject又被替换成了RpgObject。在Game的大环境下,currentObject随着操作变化被替换,从而产生与Androidactivity之间替换的类似效果。

 

附上GameObject的代码


package model;

import java.applet.AudioClip;
import java.awt.Graphics;

import model.rpg.Player;
import model.rpg.SaveData;
import model.rpg.map.Map;
import model.start.ItemObject;
import model.start.LoadObject;
import view.Control;
import view.Lib;
/**
 * Game在运作时重画此类和其子类的对象
 * */
public abstract class GameObject {
	private static AudioClip click,change,sound;
	private static AudioClip music = null;
	private double startTime = 0;
	private static long mill = 0;

	static {
		try {
			click = java.applet.Applet.newAudioClip(GameObject.class.getClassLoader().getResource("source/start/确认.wav"));
			change = java.applet.Applet.newAudioClip(GameObject.class.getClassLoader().getResource("source/start/切换.wav"));
		} catch (Exception ef) {
		}
	}
	
	/**
	 * 构造方法,new的时候将被自动更新到Game中的currentObject中
	 * */
	public GameObject() {
		startTime = System.currentTimeMillis();
		if (!(this instanceof LoadObject || this instanceof ItemObject)) {
			Game.getInstance().setCurrent(this);
		}
	}
	
	/**
	 * 循环播放背景音乐
	 * */
	public void musicStart(String music) {
		try {
			GameObject.music = java.applet.Applet.newAudioClip(this.getClass().getClassLoader().getResource(music));
			GameObject.music.loop();// 循环播放
		} catch (Exception ef) {
			javax.swing.JOptionPane.showMessageDialog(null, "音乐播放失败");
		}
	}

	protected abstract void keyResponse();

	public abstract void draw(Graphics g);

	public abstract void die();
	
	/**为了避免因keyPressed连续触发而造成的不便,在某些地方需要检查这次按下和上次按下之间是否有时间间隔,即是否松开过手*/
	public static boolean checkTimeGap(int gap) {
		boolean timeGap = false;
		if (Math.abs(mill - System.currentTimeMillis()) > gap) {
			timeGap = true;
		}
		mill = System.currentTimeMillis();
		return timeGap;
	}
	
	/**为了避免因keyPressed连续触发而造成的不便,需要检查这次按下和刚刚启动之间是否有时间间隔,即是否new之后没有及时松手*/
	protected boolean checkStartGap(int gap) {
		long mill = System.currentTimeMillis();
		if (mill - startTime > gap)
			return true;
		return false;
	}

	public GameObject getType() {
		return this;
	}
	
	/**
	 * Rpg专用
	 * */
	public SaveData getNowStatus(){
		return new SaveData();
	}
	
	/**
	 * 各种音效的播放
	 * */
	public void tempSoundPlay(String path){
		try {
			sound = java.applet.Applet.newAudioClip(this.getClass().getClassLoader().getResource(path));
			sound.play();
		} catch (Exception ef) {
		}
	}
	/**由于是静态对象,只要游戏不关闭窗口,得到的Item就不会丢失,所以必须清空*/
	protected void clearStatic(){
		
				Player.getInstance().getItems().clear();
				Map.startChase = false;
				Map.chaseReady = 0;
				Control.chaseX = 6;
				Control.chaseY = 6;
				Map.readyForDoor = false;
				Map.playerX = 6- Lib.clipX / 2 - 1;
				Map.playerY = 6- Lib.clipY / 2 - 1;
				Player.getInstance().clearDirection();
	}
	/**
	 * 点击音效
	 * */
	public void click(){
		click.play();
	}
	/**
	 * 上下切换音效
	 * */
	public void change(){
		change.play();
	}
	/**
	 * 背景音乐停止
	 * */
	public static void musicStop() {
		music.stop();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值