JAVA坦克大战,这段代码为什么子弹的坐标在变,却不能repaint,但是按下任意键盘的建却重绘了呢? 150

坦克大战pan.baidu.爱死1o6qoils代码在上面的连接中,吧“坦克大战”四个字替换成https://把"爱死"替换成com/s/代码直接javac再java就能... 坦克大战pan.baidu.爱死1o6qoils
代码在上面的连接中,吧“坦克大战”四个字替换成https://
把"爱死"替换成com/s/
代码直接javac再java就能运行。希望知道的能帮助一下。光说不做的别回答了谢谢,帮忙解答的我再追加分。
展开
 我来答
gdmmd
2015-05-12 · TA获得超过1279个赞
知道大有可为答主
回答量:1581
采纳率:66%
帮助的人:1016万
展开全部

Mypanel的  run方法里要调用repaint方法    否则你的repaint方法只会在keyPressed发生的时候才调用

修改一下两个地方

(1)

// 键盘获取事件的函数
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
        if (arg0.getKeyCode() == KeyEvent.VK_J) {
            if (hero.shot.size() < 5) {
                hero.shott();
            }
        }
        if (arg0.getKeyCode() == KeyEvent.VK_W) {
            hero.setSDC(hero.getSpeed(), 0, hero.getColor());
            hero.moveUp();
        } else if (arg0.getKeyCode() == KeyEvent.VK_S) {
            hero.setSDC(hero.getSpeed(), 1, hero.getColor());
            hero.moveDown();
        } else if (arg0.getKeyCode() == KeyEvent.VK_A) {
            hero.setSDC(hero.getSpeed(), 2, hero.getColor());
            hero.moveLeft();
        } else if (arg0.getKeyCode() == KeyEvent.VK_D) {
            hero.setSDC(hero.getSpeed(), 3, hero.getColor());
            hero.moveRight();
        }
        /**
         * 这个repaint注释掉
         */
        //this.repaint();

    }

(2)

// 线程
    /**
     * 一秒钟60帧
     */
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            this.repaint();
            try {
                
                Thread.sleep(1000 / 60);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        
    }


完整代码如下:

import java.awt.*;

import javax.swing.*;

import java.util.*;
import java.awt.event.*;

public class aaa extends JFrame {
    public static void main(String[] args) {
        aaa a1 = new aaa();
        Thread t1 = new Thread(a1.mp);
        t1.start();
    }

    MyPanel mp = null;

    public aaa() {
        mp = new MyPanel();
        this.add(mp);
        this.addKeyListener(mp);
        this.setSize(500, 500);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MyPanel extends JPanel implements KeyListener, Runnable {
    MyTank hero = null;
    Vector<EmenyTank> emeny = new Vector<EmenyTank>();
    int emsize = 5;

    // 键盘获取事件的函数
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
        if (arg0.getKeyCode() == KeyEvent.VK_J) {
            if (hero.shot.size() < 5) {
                hero.shott();
            }
        }
        if (arg0.getKeyCode() == KeyEvent.VK_W) {
            hero.setSDC(hero.getSpeed(), 0, hero.getColor());
            hero.moveUp();
        } else if (arg0.getKeyCode() == KeyEvent.VK_S) {
            hero.setSDC(hero.getSpeed(), 1, hero.getColor());
            hero.moveDown();
        } else if (arg0.getKeyCode() == KeyEvent.VK_A) {
            hero.setSDC(hero.getSpeed(), 2, hero.getColor());
            hero.moveLeft();
        } else if (arg0.getKeyCode() == KeyEvent.VK_D) {
            hero.setSDC(hero.getSpeed(), 3, hero.getColor());
            hero.moveRight();
        }
        /**
         * 这个repaint注释掉
         */
        //this.repaint();

    }

    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    // 完毕
    public MyPanel() {
        hero = new MyTank(250, 250);
        hero.setSDC(5, 2, 2);
        for (int i = 0; i < emsize; ++i) {
            EmenyTank em = new EmenyTank((i + 1) * 60, 20);
            em.setSDC(5, 1, 1);
            emeny.add(em);
        }
    }

    // 线程
    /**
     * 一秒钟60帧
     */
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            this.repaint();
            try {
                
                Thread.sleep(1000 / 60);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        
    }

    public void paint(Graphics g) {
        super.paint(g);
        // 画板,坦克得放在画板后头
        g.fillRect(0, 0, 400, 400);
        // paint敌人坦克
        for (int i = 0; i < emeny.size(); ++i) {
            EmenyTank em = null;
            em = emeny.get(i);
            this.drawTank(em.getX(), em.getY(), g, em.getDirect(),
                    em.getColor());
        }
        // 画我自己的坦克
        this.drawTank(hero.getX(), hero.getY(), g, hero.getDirect(),
                hero.getColor());
        // 画出我的子弹
        for (int i = 0; i < hero.shot.size(); i++) {
            Shot myShot = hero.shot.get(i);
            if (myShot != null && myShot.live == true) {
                g.draw3DRect(myShot.x, myShot.y, 2, 2, false);
            }
            if (myShot.live == false) {
                hero.shot.remove(myShot);
            }
        }
    }

    public void drawTank(int x, int y, Graphics g, int direct, int color) {
        // 判断坦克的颜色(敌我)然后画出坦克
        switch (color) {
        case 0:
            g.setColor(Color.BLUE);
            break;
        case 1:
            g.setColor(Color.YELLOW);
            break;
        case 2:
            g.setColor(Color.GREEN);
            break;
        }
        // 判断坦克的方向然后再画出坦克
        switch (direct) {
        case 0:
            g.fill3DRect(x, y, 10, 30, false);
            g.fill3DRect(x + 26, y, 10, 30, false);
            g.fill3DRect(x + 10, y + 5, 16, 20, false);
            g.drawLine(x + 18, y + 15, x + 18, y);
            break;
        case 1:
            g.fill3DRect(x, y, 10, 30, false);
            g.fill3DRect(x + 26, y, 10, 30, false);
            g.fill3DRect(x + 10, y + 5, 16, 20, false);
            g.drawLine(x + 18, y + 15, x + 18, y + 30);
            break;
        case 2:
            g.fill3DRect(x + 3, y - 3, 30, 10, false);
            g.fill3DRect(x + 3, y + 23, 30, 10, false);
            g.fill3DRect(x + 8, y + 7, 20, 16, false);
            g.drawLine(x + 18, y + 15, x + 3, y + 15);
            break;
        case 3:
            g.fill3DRect(x + 3, y - 3, 30, 10, false);
            g.fill3DRect(x + 3, y + 23, 30, 10, false);
            g.fill3DRect(x + 8, y + 7, 20, 16, false);
            g.drawLine(x + 18, y + 15, x + 33, y + 15);
            break;
        }
    }
}

class EmenyTank extends Tank implements Runnable {
    public EmenyTank(int x, int y) {
        // TODO Auto-generated method stub
        super(x, y);
    }

    public void run() {
    }
}

class Shot implements Runnable {
    protected int x;
    protected int y;
    protected int direct;
    protected int speed = 4;
    protected boolean live = true;

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

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

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

    public int getDirect() {
        return direct;
    }

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

    public int getSpeed() {
        return speed;
    }

    // 子弹的上下左右以及走的速度
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
            }
            switch (direct) {
            case 0:
                y -= speed;
                break;
            case 1:
                y += speed;
                break;
            case 2:
                x -= speed;
                break;
            case 3:
                x += speed;
                break;
            }
            if (x > 400 || x < 0 || y > 400 || y < 0) {
                this.live = false;
                break;
            }
        }
    }
}

class Tank {
    protected int x;
    protected int y;
    protected int speed = 5;
    protected int direct;
    protected int color;
    boolean live;

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

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setSDC(int speed, int direct, int color) {
        this.speed = speed;
        this.direct = direct;
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public int getDirect() {
        return direct;
    }

    public int getColor() {
        return color;
    }
}

class MyTank extends Tank {
    public MyTank(int x, int y) {
        // TODO Auto-generated method stub
        super(x, y);
    }

    Vector<Shot> shot = new Vector<Shot>();
    Shot shota = null;

    public void shott() {
        switch (this.direct) {
        case 0:
            shota = new Shot();
            shota.x = x + 18;
            shota.y = y;
            shota.direct = 0;
            shot.add(shota);
            break;
        case 1:
            shota = new Shot();
            shota.x = x + 18;
            shota.y = y + 30;
            shota.direct = 1;
            shot.add(shota);
            break;
        case 2:
            shota = new Shot();
            shota.x = x + 3;
            shota.y = y + 15;
            shota.direct = 2;
            shot.add(shota);
            break;
        case 3:
            shota = new Shot();
            shota.x = x + 33;
            shota.y = y + 15;
            shota.direct = 3;
            shot.add(shota);
            break;
        }
        Thread t = new Thread(shota);
        t.start();
    }

    public void moveUp() {
        if (y > 0) {
            y -= speed;
        }
    }// 我的坦克得在自己的类里定义怎么移动

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

    public void moveLeft() {
        if (x > 0) {
            x -= speed;
        }
    }

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



推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式