java - 线程中的某些代码不重复

标签 java multithreading swing

package TheWork;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;  

import javax.swing.JPanel;

public class MainPanel extends JPanel implements KeyListener, Runnable
{
private Cannon P1 = Cannon.getPlayer();
private TheirBullet[] bullets = {};
private TheirRocket[] rockets = {};
private Enemy[] enemies = {};
private long timeCount = 0;
private int timeDis = 10;

public void drawCannon(Graphics g)
{
    g.setColor(Color.BLUE);
    g.fillRect((int)P1.getX() - 20, (int)Cannon.POS_Y, 40, 20);
    g.fillRect((int)P1.getX() - 5, (int)Cannon.POS_Y - 5, 2, 20);
    g.fillRect((int)P1.getX() + 3, (int)Cannon.POS_Y - 5, 2, 20);
}

public void drawGoodBullet(Graphics g)
{
    for(YourBullet temp : P1.bullets)
    {
    if(temp != null && temp.hit == false)
        {
            g.setColor(Color.BLUE);
            g.drawRect((int)temp.x - 2, (int)temp.y - 2, 4, 4);
        }
    if(temp.hit == true)
        {
            P1.bullets.remove(temp);
        }
    }
}

public void drawBadBullet(Graphics g)
{
    for(int i = 0;i < bullets.length;i++)
    {
        TheirBullet temp = bullets[i];
        g.setColor(Color.GREEN);
        g.drawRect((int)temp.x - 2, (int)temp.y - 2, 4, 4);
    }
    for(int i = 0;i < rockets.length;i++)
    {
        TheirRocket temp = rockets[i];
        g.setColor(Color.RED);
        g.drawRect((int)temp.x - 1, (int)temp.y - 4, 2, 8);
    }

}

public void drawEnemy(Graphics g)
{
    for(int i = 0;i < enemies.length;i++)
    {
        Enemy temp = enemies[i];
        if(temp instanceof Fodder)
        {
            g.setColor(Color.GREEN);
        }
        else
        {
            g.setColor(Color.RED);
        }
        g.fillRect((int)temp.getX() - 10, (int)temp.getY() - 5, 20, 10);
        g.fillRect((int)temp.getX()-2, (int)temp.getY(), 4, 10);
    }
}

@Override
public void paint(Graphics g)
{
    super.paint(g);
    drawCannon(g);
    drawGoodBullet(g);
    drawBadBullet(g);
    drawEnemy(g);   
}


@Override
public void run() 
{   
    timeCount++;
    System.out.println("check 1");
    if(timeCount % 300 == 0)
    {
        Enemy poorThing = generate();
        System.out.println("get");
        enemies = Arrays.copyOf(enemies, enemies.length + 1);
        enemies[enemies.length - 1] = poorThing;
    }
    System.out.println("check 2");
    for(int i = 0;i < enemies.length;i++)
    {
        Enemy temp = enemies[i];
        temp.move();
    }
    System.out.println("check 3");
    while(true) 
    {
        try 
        {
            Thread.sleep(timeDis);
        }
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
    System.out.println("check 4");
    this.repaint();
    System.out.println("check 5");
    }

} 




@Override
public void keyPressed(KeyEvent e) 
{
    if(e.getKeyCode() == KeyEvent.VK_LEFT && P1.getX() > 20)
    {
        P1.goLeft();
        P1.setWay(-1);
    }
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT && P1.getX() < 780) 
    {
        P1.goRight();
        P1.setWay(1);
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE)
    {
        if(P1.bullets.size() <= 6)
        {
            P1.shoot();
        }
    }
    this.repaint();
}

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

}

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

}

public static Enemy generate() 
{
    Random r = new Random();
    Random s = new Random();
    Random t = new Random();
    int chance = r.nextInt(10);
    int dirDec = s.nextInt(2);
    int tirDec = t.nextInt(5);
    if(chance >= 8)
    {
        System.out.println("A acquired");
        return new Danger(dirDec, tirDec);

    }
    else
    {
        System.out.println("B acquired");
        return new Fodder(dirDec, tirDec);

    }

}


}

发生的事情是:我正在尝试创建一个游戏,其中玩家对象(Cannon 类)射击由generate() 方法生成的敌人对象(Fodder 和 Danger 类,两者都是 Enemy 类的子类) ,在 run() 方法中调用(线程在另一个类中启动)。

但是,我从未创建过任何敌人对象。我插入了一些 println 语句来检查程序如何流动,结果是:“A acquire”和“B acquire”永远不会发生,我得到的只是“Check 1”,“Check 2”,“Check 3”,然后“检查 4”和“检查 5”的无限循环。

此外,玩家对象确实被创建并正确绘制,但只是随机的。在不更改任何内容的情况下运行代码的不同尝试中,结果总是在工作和无任何绘制之间变化。

我真的很想知道我哪里做错了,非常感谢。

最佳答案

while(true)不包含敌方生成。该条件只能输入一次,因为当时(第一次调用 run)的 timecount 是 1 而不是 0,这意味着永远不会。

关于java - 线程中的某些代码不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45539415/

相关文章:

java - 将for循环转换为递归方法java

java - 运行 `mvn appengine:set_default_version` 而不重建?

c - 得到错误的答案使用线程安全计数器

java - 在多个不同线程之间共享一个变量

Java Swing 接口(interface)问题

java - Java中的Web应用程序开发到桌面应用程序开发

java - 正在添加到列表的字符<String>

Java if-else条件改变输出颜色

c - 如何在不使用互斥量的情况下在多个线程之间进行同步,以便它们的事务 ID 是唯一的?

Java 图形用户界面 : Cannot find Symbol buildPanel()