[英]pictures with non-main Thread does not move
我是Java新手,現在正在使用Threads。但是現在我遇到了一個大問題:當我運行以下代碼時,除了兩個圖像在屏幕上移動外,其中一個確實移動了,甚至另一個都不顯示。 我想知道問題是什么:班級敵人:
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Enemy extends JLabel implements Runnable{
private BufferedImage i;
private int x,y;
Enemy()
{
x=y=0;
try{
i=ImageIO.read(new File("m2.jpg"));
}catch (Exception e){}
this.setIcon(new ImageIcon(i));
this.setLocation(x,y);
this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize()));
}
Enemy(int X,int Y)
{
x=X;
y=Y;
try{
i=ImageIO.read(new File("m2.jpg"));
}catch (Exception e){}
this.setIcon(new ImageIcon(i));
this.setLocation(x,y);
this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize()));
}
public void move()
{
while(true)
{
int p=(int)Math.random()*4+1;
switch (p)
{
case 1:x++;break;
case 2:y++;break;
case 3:x--;break;
case 4:y--;break;
}
this.setLocation(x,y);
this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize()));
}
}
public void run()
{
move();
}
}
類玩家:
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class Player extends JLabel implements Runnable{
private BufferedImage i;
private int x,y;
Player()
{
x=y=0;
try{
i=ImageIO.read(new File("m1.jpg"));
}catch (Exception e){}
this.setIcon(new ImageIcon(i));
this.setLocation(x,y);
this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize()));
}
public void move()
{
int p=(int)Math.random()*4+1;
switch (p)
{
case 1:x++;break;
case 2:y++;break;
case 3:x--;break;
case 4:y--;break;
}
this.setLocation(x,y);
this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize()));
}
public void run()
{
move();
}
}
主類:
import javax.swing.JFrame;
public class Test {
public static void main(String[] args) {
Enemy e=new Enemy(150,150);
Player p=new Player();
JFrame f=new JFrame("Test");
f.setSize(300,300);
f.setLayout(null);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
f.add(e);
f.add(p);
Thread pThread=new Thread(p);
Thread eThread=new Thread(e);
pThread.start();
eThread.start();
while(true)
{
f.setVisible(true);
try
{
Thread.sleep(50);
}catch (Exception q){}
f.remove(p);
f.remove(e);
f.add(p);
f.add(e);
}
}
}
Enemy
和Player
類中對Math.random()
的調用始終四舍五入。 您可能想要:
int p = (int) (Math.random() * 4) + 1;
在move
方法中限制x
和y
的可能值也是一個好主意(maxX =幀寬度-敵人/玩家的寬度; maxY =幀高度-敵人/玩家的高度):
switch (p) {
case 1:
if (x < maxX)
x++;
break;
case 2:
if (y < maxY)
y++;
break;
case 3:
if (x > 0)
x--;
break;
case 4:
if (y > 0)
y--;
break;
}
最后,可以通過為Enemy
和Player
類創建一個通用類來節省一些工作。 您可以在此處放置所有共享代碼,此刻可能是所有代碼。 這兩個對象可以是同一類的實例:
GameObject e = new GameObject(150, 150, size - 150, size - 150, "m2.jpg");
GameObject p = new GameObject(100, 100, size - 100, size - 100, "m1.jpg");
GameObject
類可能如下所示:
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class GameObject extends JLabel implements Runnable {
private BufferedImage i;
private int x, y;
private int maxX;
private int maxY;
public GameObject(int X, int Y, int maxX, int maxY, String imagePath) {
x = X;
y = Y;
this.maxX = maxX;
this.maxY = maxY;
try {
this.i = ImageIO.read(new File(imagePath));
} catch (Exception e) {
e.printStackTrace();
}
this.setIcon(new ImageIcon(this.i));
this.setLocation(x, y);
this.setBounds(new Rectangle(new Point(x, y), this.getPreferredSize()));
}
public void move() {
while (i != null) {
int p = (int) (Math.random() * 4) + 1;
switch (p) {
case 1:
if (x < maxX)
x++;
break;
case 2:
if (y < maxY)
y++;
break;
case 3:
if (x > 0)
x--;
break;
case 4:
if (y > 0)
y--;
break;
}
this.setLocation(x, y);
this.setBounds(new Rectangle(new Point(x, y), this.getPreferredSize()));
}
}
public void run() {
move();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.