android游戏教程:实现触屏控制和虚拟按键

欢迎来到我的另外一篇android游戏开发教程,今天我会使用zgf开发框架实现虚拟按键,使用虚拟按键控制之前编写的动画,现在让我们开始吧。


一.实现虚拟按键


打开zgf api看到框架中有个package叫做com.zxx43.commen.key,打开它可以看到ImageButton和KeyUtil两个类,ImageButton是图形按钮,而KeyUtil是触摸点。建立虚拟按键类Key,在这个类中将会使用到上面这两个类的方法。Key类代码如下:


//图形按键对象
	private ImageButton btnUp;
	private ImageButton btnDown;
	private ImageButton btnLeft;
	private ImageButton btnRight;
	
	//还没有按的图像
	private Bitmap leftMap;
	private Bitmap rightMap;
	private Bitmap upMap;
	private Bitmap downMap;
	
	//按键按下的图像
	private Bitmap leftClickMap;
	private Bitmap rightClickMap;
	private Bitmap upClickMap;
	private Bitmap downClickMap;

//设置按键位置
	int btnL=leftMap.getWidth();
	int btnH=leftMap.getHeight();
	int lmx=2*btnL+btnH;
	int lmd=3*btnL/2+btnH/2;
	int lmn=btnL;
	int hmx=GameAct.GetDispH()-btnL;
	int hmd=GameAct.GetDispH()-3*btnL/2-btnH/2;
	int hmn=GameAct.GetDispH()-2*btnL-btnH;
	btnUp=new ImageButton(lmd, hmn, upMap);
	btnDown=new ImageButton(lmd, hmx, downMap);
	btnLeft=new ImageButton(lmn, hmd, leftMap);
	btnRight=new ImageButton(lmx, hmd, rightMap);

按键要实现如下功能:


//绘制按键
	public void drawBtn(Canvas c,Paint p) {
		btnLeft.addImageButton(c, p);
		btnRight.addImageButton(c, p);
		btnUp.addImageButton(c, p);
		btnDown.addImageButton(c, p);
	}
	
	//检测是否重设按键图案
	public void resetButton() {
		btnLeft.buttonAct(leftMap);
		btnRight.buttonAct(rightMap);
		btnUp.buttonAct(upMap);
		btnDown.buttonAct(downMap);
	}
	
	//延迟按下(这里没用)
	public void delay() {
		if(!canClick&&clickTime=maxTime) {
			clickTime=0;
			canClick=true;
		}
	}
	
	//检测哪个按键被按下
	private int checkKey(Context con, int x, int y) {
		int code=Constants.KEY_NONE;
		Bitmap clMap;
		
		if(btnLeft.click(x, y)) {
			clMap=leftClickMap;
			btnLeft.clicked(clMap);
			code=Constants.KEY_LEFT;
		} else if(btnRight.click(x, y)) {
			clMap=rightClickMap;
			btnRight.clicked(clMap);
			code=Constants.KEY_RIGHT;
		} else if(btnUp.click(x, y)) {
			clMap=upClickMap;
			btnUp.clicked(clMap);
			code=Constants.KEY_UP;
		} else if(btnDown.click(x, y)) {
			clMap=downClickMap;
			btnDown.clicked(clMap);
			code=Constants.KEY_DOWN;
		}
		
		//按键被按下了,延迟一段时间才能再按下
		/*
		if(!canClick)
			code=Constants.KEY_NONE;
		else if(code!=Constants.KEY_NONE&&canClick)
			canClick=false;
		 */
		
		return code;
	}
	
	//方向键被按下发生的事件,返回被按下键的方向
	public int distClick(Context con, int x, int y) {
		int code=checkKey(con, x, y);
		int dist=Constants.NONE;
		if (code == Constants.KEY_LEFT) 
			dist=Constants.LEFT;
		else if(code == Constants.KEY_RIGHT)
			dist=Constants.RIGHT;
		else if(code == Constants.KEY_UP) 
			dist=Constants.UP;
		else if(code == Constants.KEY_DOWN) 
			dist=Constants.DOWN;
		return dist;
	}

虚拟按键类就实现了,接着我们要在程序中调用这些方法控制人物运动。


二.控制人物运动


在之前编写的Game类中的public void moveKey(MotionEvent e)public void pressKey(MotionEvent e)public void releseKey(MotionEvent e)方法中编写按键事件代码:


@Override
	public void moveKey(MotionEvent e) {
		isPress=true;
		ku=new KeyUtil((int)e.getX(),(int)e.getY());
	}

	@Override
	public void pressKey(MotionEvent e) {
		isPress=true;
		ku=new KeyUtil((int)e.getX(),(int)e.getY());
	}

	@Override
	public void releseKey(MotionEvent e) {
		isPress=false;
		ku=null;
	}

然后在public void keyAct(Context con)编写事件响应代码:


public void keyAct(Context con) {
		key.resetButton();//检测是否重设按键图案
		key.delay();//延迟按下(这里没用)
		
		if(isPress&&ku!=null) {
			int x=ku.getX();//获取触摸的x坐标
			int y=ku.getY();//获取触摸的y坐标
			int dist=key.distClick(con, x, y);//从按键中获得行动方向
			scene.pushKey(dist);//推送获得的行动方向
		} else if(!isPress) {
			int dist=Constants.NONE;
			scene.pushKey(dist);
		}
	}

之后改写Scene类,把按键方向推送进去控制人物运动:


public void act() {
		//控制人物行走
		int dist=per.getDist();
		if(dist!=Constants.NONE)
			per.move(dist);
		else 
			per.stop();
		per.act();
	}
	
	//推送触屏反馈内容
	public void pushKey(int dist) {
		per.setDist(dist);//把反馈的方向设置为行动方向
	}

完成了,效果如下:

android游戏教程:实现触屏控制和虚拟按键_第1张图片


源代码:下载


现在人物运动可以通过虚拟按键控制,是不是很简单呢?现在图像有了也能控制了,但是还没有声音,因此接下来我会写一些使用zgf播放游戏声音的教程。



你可能感兴趣的:(Android)