人物的斜线移动
接上一章的人物移动,如果我想要这个人物往斜线的方向移动,那么
上一章的方法则无法实现,所以今天要进阶的优化移动。
代码如下:
首先确认移动的对象,然后在对象中创建一个有参方法获得
方向,将上章判断移动的代码导入得到如下:
public void okDirPressed(int keyCode) {
//TODO 确定方向
switch (keyCode){
case KeyEvent.VK_UP:
System.out.println("向上走");
//按向上箭头给人物设置为向上
this.setDir("U");
up=true;
break;
case KeyEvent.VK_DOWN:
System.out.println("向下走");
down=true;
this.setDir("D");
break;
case KeyEvent.VK_LEFT:
System.out.println("向左走");
this.setDir("L");
left=true;
break;
case KeyEvent.VK_RIGHT:
System.out.println("向右走");
this.setDir("R");
right=true;
break;
}
导入后可以发现,类属性Dir用来控制方向的移动,所以可以使用if判断的方式来实现斜线,因为IF根据布尔类型来进行判断,也就是说要先将4个方向变成布尔属性,得到代码如下:
设置4个布尔类型的属性
boolean up=false;
boolean right=false;
boolean left=false;
boolean down=false;
在上一代码的方法中建立IF判断:
//判断用户用了哪些键
if(up && right){
this.setDir("UR");
System.out.println("东北");
}
if (up&&left){
this.setDir("UL");
System.out.println("西北");
}
if (down&&right){
this.setDir("DR");
System.out.println("东南");
}
if (down&&left){
this.setDir("DL");
System.out.println("西南");
}
当同时按下俩个方向触发IF判断然后根据Dir的值进行移动
键位的优化
在上个代码写完运行后发现了,只要触发一次,那么布尔就会固定的
变成true,使得下一段代码开始按键判定失败。
如何解决:
之前写的代码中不光有触发器,还有松开触发,同理,在松开
里面使用switch判定:
//键盘松开,确定人物方向
public void OkDirReleased(int keyCode){
switch (keyCode){
case KeyEvent.VK_UP:
up=false;
break;
case KeyEvent.VK_DOWN:
down=false;
break;
case KeyEvent.VK_LEFT:
left=false;
break;
case KeyEvent.VK_RIGHT:
right=false;
break;
default:
}
}
随后在测试类中导入方法
//监听键盘事件
this.addKeyListener(new KeyAdapter() {
//当键盘按下的时候触发
// Var 获取被按下的键的数值 如:a-67,B-68
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
buffoon.okDirPressed(keyCode);
buffoon.move(buffoon.getDir());
}
//当键盘松开的时候触发
@Override
public void keyReleased(KeyEvent e) {
int keyCode=e.getKeyCode();
buffoon.OkDirReleased(keyCode);
}
});
扩展代码:防止背景闪动
/**
* 防抖动,防闪屏
*/
@Override
public void update(Graphics g) {
// 创建图形缓冲区
Image imageBg = createImage(1100,700);
// 获取图形缓冲区的上下文
Graphics newGraphics = imageBg.getGraphics();
// 用paint方法对图形缓冲区绘图
paint(newGraphics);
// 释放图形上下文资源
newGraphics.dispose();
// 将图形缓冲区绘制到屏幕上
g.drawImage(imageBg, 0, 0 , 1100,700, this);
}
子弹如何发射?
因为子弹由人物类发射,所以人物类中需要new一个子弹的对象。
并创建一个开火的方法:
创建一个子弹容器
//子弹容器
private List<Missile> missilesList=new ArrayList<Missile>();
/**
* 开火 发射子弹
* 并且子弹与人物类的坐标一样
*/
public Missile fire( ){
return new Missile(this.x,this.y,this.gameClinet);
}
在触发方法中在写一个判断,使用按键发射子弹
case KeyEvent.VK_CONTROL:
//打桩
System.out.println("发子弹");
Missile missile=this.fire();
//将子弹丢到容器中
this.missilesList.add(missile);
//查看容器中的子弹有多少个
System.out.println("this.missileList.size()="+this.missilesList.size());
break;
//画子弹
int size = buffoon.getMissilesList().size();
for (int i = 0; i <size ; i++) {
//将容器子弹拿出
Missile missile =buffoon.getMissilesList().get(i);
//画到屏幕上
missile.paint(g);
效果图