2017-09-29 12 views
0

Javaクラスの演習でいくつか問題があります。私はゲームで2つの長方形を作成しました。私はすでに動きクラスを持っていて、動きのスレッドのインスタンスを作成しましたが、動かないようです。スレッドを使用して長方形の図形を移動する際に問題が発生しました

これは私が持っている気圧コードです: Entityクラス

class Entity implements Drawable{ 
Point pos; 
Rectangle body; 
boolean rigid; 

public Entity(){ 
    pos = new Point(0,0); 
    body = new Rectangle(pos, new Dimension(0,0)); 
} 

public Entity(Point p, Dimension d){ 
    pos = new Point(p); 
    body = new Rectangle(pos, d); 
} 

public Entity(int x, int y, int width, int height){ 
    pos = new Point(x,y); 
    body = new Rectangle(pos, new Dimension(width, height)); 
} 

public BufferedImage getActualImage(){ 
    Dimension d = body.getSize(); 
    return new BufferedImage(d.width, d.height, BufferedImage.TYPE_3BYTE_BGR); 
} 
} 

このクラスは、ゲーム環境とはどこでウィンドウ上のオブジェクトを追加することです。

class Field extends JPanel{ 
Player p1; 
int i=0; 
static ArrayList<Entity> objects = new ArrayList<Entity>(); 


private ActionListener actionListener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     revalidate(); 
     repaint(); 
    } 
}; 

public Field(){ 

    //Implementar patron de disen/o 
    p1 = setupPlayer(); 
    Game.objects.add(p1); 

    //Player p2 = new Player(); 
    //p2.setImageRightRun("hero\\run.png"); 
    //Game.objects.add(p2); 

    Entity e1 = new Entity(0, 520, 600, 50); 
    Blocks block1 = new Blocks(260, 370, 100, 20); 
    Blocks block2 = new Blocks(190, 440, 100, 20); 
    Goal block3 = new Goal(300, 270, 50,50); 
    Game.objects.add(e1); 
    Game.objects.add(block1); 
    Game.objects.add(block2); 
    Game.objects.add(block3); 
    new Thread(new MovementBlock(block1)).start(); //movement thread// 
    PlayerBehaviour pb = new PlayerBehaviour(p1); 
    this.addKeyListener(pb); 
    Timer tick = new Timer(20, actionListener); 
    tick.setInitialDelay(0); 
    tick.start(); 
} 

ブロッククラス

class Blocks extends Entity{ 
    public Blocks(int x, int y, int ancho, int largo){ 
     super(x,y,ancho,largo); 
    } 
} 

や移動のためのスレッド

class MovementBlock implements Runnable{ 
    Blocks block; 
    int velX = 2; 
    public MovementBlock(Blocks block){ 
     this.block = block; 
    } 

    public void run(){ 
     if(block.pos.x < 0 || block.pos.x > 500){ 
      velX = -velX; 
     } 
     block.pos.x = block.pos.x + 1; 
     repaint(); 
    } 
} 

これはブロックと運動のための私が持っているコードで、私はないんだけど何かがあります動きを考えている?

読んでいただきありがとうございます。

答えて

0

動きが連続的なアクションである場合、runメソッドはループである必要があります。あなたが書いた方法で、それは一度だけ実行されます。これをMovementBlockに追加します。

boolean running = true; 
int frameDelay = 20; // ms 

public void stop() { running = false; } 

public void run() { 
    while (running) { 
     try { 
      if (block.pos.x < 0 || block.pos.x > 500) { 
       velX = -velX; 
      } 
      block.pos.x += velX; 
      repaint(); 
      Thread.sleep(frameDelay); 
     } catch (InterruptedException e) {} 
    } 
} 
関連する問題