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);
}
}
hero是啥 sgbyg 发表于 2022-8-15 12:23
hero是啥
是我自己坦克的名字, 绘制坦克直接写死,怎么移动 s1986q 发表于 2022-8-15 12:28
绘制坦克直接写死,怎么移动
没有写死呀,他移动在Tank类,然后是里面的moveUP方法,Speed是速度,然后再Mypanel类里的键盘监听器重写的第二个方法里的Hero.moveUP(),就是移动 两个问题,
第一个是调用drawTank方法时没有把坦克的坐标传进去,应该是
//画出坦克-使用封装方法,调用方法
drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);
第二个是你画坦克的方法drawTank是写死的,并没有用到传入的x和y坐标,估计是教程你还没看完吧 public void drawTank(int x, int y, Graphics g, int direct, int type)
x,y没有使用啊 s1986q 发表于 2022-8-15 13:07
public void drawTank(int x, int y, Graphics g, int direct, int type)
x,y没有使用啊
谢谢,万分感谢,哥能给个提示这一点的xy怎么搞一下吗, 这也可以 看绘制参数是y,加y。
参数是x,加x。
宽度,高度不管。
页:
[1]
2