Java小游戏学习笔记四,动态移动进阶与子弹的发射

人物的斜线移动

	接上一章的人物移动,如果我想要这个人物往斜线的方向移动,那么
	上一章的方法则无法实现,所以今天要进阶的优化移动。
	代码如下:
		首先确认移动的对象,然后在对象中创建一个有参方法获得
		方向,将上章判断移动的代码导入得到如下:
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);

效果图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值