吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1320|回复: 16
收起左侧

[求助] java坦克大战,坦克移动问题

[复制链接]
zhou0773 发表于 2022-8-15 12:17

各位大佬,我在学习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
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方法时没有把坦克的坐标传进去,应该是
[Java] 纯文本查看 复制代码
 
//画出坦克-使用封装方法,调用方法
        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。
宽度,高度不管。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表