欢迎来到我的另外一篇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) {
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);
}
}
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);//把反馈的方向设置为行动方向
}
源代码:下载
现在人物运动可以通过虚拟按键控制,是不是很简单呢?现在图像有了也能控制了,但是还没有声音,因此接下来我会写一些使用zgf播放游戏声音的教程。