zhou0773 发表于 2022-8-15 12:17

java坦克大战,坦克移动问题



各位大佬,我在学习java敲"坦克大战"游戏的时候遇见了一点小问题就是坦克可以改变方向,但是移动不了,我甚至按照老师的代码重新敲了一遍都不行,
希望各位大佬能抽空帮忙看一下,或者给一个解决方法,里面的代码为了更容易看清楚,我基本上都注释上了

这是一个Tank类,编写一个坦克


public class Tank {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标
    private int direct;//0上 1右 2下 3左
    private int speed = 1;//速度

    public int getSpeed() {
      return speed;
    }

    public void setSpeed(int speed) {
      this.speed = speed;
    }

    //上右下左移动
    public void moveUP(){
      y -= speed;
    }

    public void moveRight(){
      x += speed;
    }

    public void moveDown(){
      y += speed;
    }

    public void moveLeft(){
      x -= speed;
    }
    public int getDirect() {
      return direct;
    }

    public void setDirect(int direct) {
      this.direct = direct;
    }

    public Tank(int x, int y) {
      this.x = x;
      this.y = y;
    }

    public int getX() {
      return x;
    }

    public void setX(int x) {
      this.x = x;
    }

    public int getY() {
      return y;
    }

    public void setY(int y) {
      this.y = y;
    }
}



这是一个我自己的坦克,继承Tank

//我的坦克
public class Hero extends Tank {
    public Hero(int x, int y) {
      super(x, y);
    }
}



这是绘制坦克的一个类,是我的初始化坦克和如何控制坦克上下左右移动

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

@SuppressWarnings({"all"})
//坦克游戏绘制区
//为了监听键盘事件,实现KeyListener
public class MyPanel extends JPanel implements KeyListener {
    Hero hero = null;//定义我的坦克

    public MyPanel() {
      hero = new Hero(100, 100);//初始化坦克
      hero.setSpeed(2);//速度
    }

    @Override
    public void paint(Graphics g) {
      super.paint(g);
      g.fillRect(0, 0, 1000, 750);//填充矩形,默认黑色
      //画出坦克-使用封装方法,调用方法
      drawTank(getX(), getY(), g, hero.getDirect(), 1);
    }

    //编写方法,画出坦克

    /**
   * @AuThor 微笑
* @Description
* @Param X 坦克的左上角 X 轴
* @Param Y 坦克的左上角 Y 轴
* @Param g 为画笔
* @Param direct 坦克方向上下左右
* @Param type 坦克类型
* @date 2022/8/4 15:29
   */
public void drawTank(int x, int y, Graphics g, int direct, int type) {
      switch (type) {
            //根据不同类型设置坦克的颜色
            case 0://自己的坦克
                g.setColor(Color.cyan);
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);
                break;
      }
      //根据坦克的方向,绘制不同的坦克类型
      //direct表示方向(0表示向上 1表示向右 2表示向下 3表示向左)
      switch (direct) {
            case 0://是向上
                g.fill3DRect(60, 100, 10, 60, false);//画出坦克左边的轮子
                g.fill3DRect(60 + 30, 100, 10, 60, false);//画出坦克右边的轮子
                g.fill3DRect(60 + 10, 100 + 10, 20, 40, false);//画出坦克的盖子
                g.fillOval(60 + 10, 100 + 20, 20, 20);//画出圆盖
                g.drawLine(60 + 20, 100 + 30, 60 + 20, 100);//画出炮筒
                break;
            case 1://是向右
                g.fill3DRect(60, 100, 60, 10, false);//画出坦克上边的轮子
                g.fill3DRect(60, 100 + 30, 60, 10, false);//画出坦克下边的轮子
                g.fill3DRect(60 + 10, 100 + 10, 40, 20, false);//画出坦克的盖子
                g.fillOval(60 + 20, 100 + 10, 20, 20);//画出圆盖
                g.drawLine(60 + 30, 100 + 20, 60 + 60, 100 + 20);//画出炮筒
                break;
            case 2://是向下
                g.fill3DRect(60, 100, 10, 60, false);//画出坦克左边的轮子
                g.fill3DRect(60 + 30, 100, 10, 60, false);//画出坦克右边的轮子
                g.fill3DRect(60 + 10, 100 + 10, 20, 40, false);//画出坦克的盖子
                g.fillOval(60 + 10, 100 + 20, 20, 20);//画出圆盖
                g.drawLine(60 + 20, 100 + 30, 60 + 20, 100 + 60);//画出炮筒
                break;
            case 3://是向左
                g.fill3DRect(60, 100, 60, 10, false);//画出坦克上边的轮子
                g.fill3DRect(60, 100 + 30, 60, 10, false);//画出坦克下边的轮子
                g.fill3DRect(60 + 10, 100 + 10, 40, 20, false);//画出坦克的盖子
                g.fillOval(60 + 20, 100 + 10, 20, 20);//画出圆盖
                g.drawLine(60 + 30, 100 + 20, 60 , 100 + 20);//画出炮筒
                break;
            default:
                System.out.println("暂时不做其他处理");
      }
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }
    //处理WASD 键按下的情况
    @Override
    public void keyPressed(KeyEvent e) {
      if (e.getKeyCode() == KeyEvent.VK_W){//摁下W键向上
            hero.setDirect(0);//改变坦克方向
            hero.moveUP();//向上移动
      }else if (e.getKeyCode() == KeyEvent.VK_D){//摁下D键向右
            hero.setDirect(1);
            hero.moveRight();//向右移动
      }else if (e.getKeyCode() == KeyEvent.VK_S){//摁下S键向下
            hero.setDirect(2);
            hero.moveDown();//向下移动
      }else if (e.getKeyCode() == KeyEvent.VK_A){//摁下A键向左
            hero.setDirect(3);
            hero.moveLeft();//向左移动
      }
      this.repaint();//重绘面板
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}



这是一个主方法区域



import javax.swing.*;

public class dyTankGame02 extends JFrame {
    //定义坦克
    MyPanel mp = null;
    public static void main(String[] args) {
      dyTankGame02 dyTankGame01 = new dyTankGame02();


    }
    public dyTankGame02(){
      mp = new MyPanel();
      this.add(mp);//游戏的绘图区域
      this.setSize(1000,750);
      this.addKeyListener(mp);//让JFrame监听键盘事件
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);
    }
}








sgbyg 发表于 2022-8-15 12:23

hero是啥

zhou0773 发表于 2022-8-15 12:24

sgbyg 发表于 2022-8-15 12:23
hero是啥

是我自己坦克的名字,

s1986q 发表于 2022-8-15 12:28

绘制坦克直接写死,怎么移动

zhou0773 发表于 2022-8-15 12:59

s1986q 发表于 2022-8-15 12:28
绘制坦克直接写死,怎么移动

没有写死呀,他移动在Tank类,然后是里面的moveUP方法,Speed是速度,然后再Mypanel类里的键盘监听器重写的第二个方法里的Hero.moveUP(),就是移动

xuanxin 发表于 2022-8-15 13:06

两个问题,
第一个是调用drawTank方法时没有把坦克的坐标传进去,应该是

//画出坦克-使用封装方法,调用方法
      drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);

第二个是你画坦克的方法drawTank是写死的,并没有用到传入的x和y坐标,估计是教程你还没看完吧

s1986q 发表于 2022-8-15 13:07

public void drawTank(int x, int y, Graphics g, int direct, int type)
x,y没有使用啊

zhou0773 发表于 2022-8-15 13:10

s1986q 发表于 2022-8-15 13:07
public void drawTank(int x, int y, Graphics g, int direct, int type)
x,y没有使用啊

谢谢,万分感谢,哥能给个提示这一点的xy怎么搞一下吗,

莫思莫念 发表于 2022-8-15 13:17

这也可以

s1986q 发表于 2022-8-15 13:23

看绘制参数是y,加y。
参数是x,加x。
宽度,高度不管。
页: [1] 2
查看完整版本: java坦克大战,坦克移动问题