2016-05-17 14 views
0

私は、Javaとプログラミング一般にはかなり新しいです。私は、ユーザーが画面上のすべてのコインを収集することを目的とした白い四角形としてプレイする小さなゲームを開発しています。ユーザーがコインを収集すると赤い四角が画面に表示され、ユーザーがタッチするとゲームが終了します。私は、ユーザーの四角形を移動するKeyListenerを使用します。別のシェイプが独立して動いているときに、KeyListenerを使ってシェイプを移動する

私が遭遇している問題は、赤い正方形が動いている間にプレーヤーの正方形を動かすことができないということです。塗りつぶし方法でwhileループがアクティブになると、赤い四角形が移動します。私は赤い四角形が動いている間、ユーザーが四角形を動かせるようにしたい。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JFrame; 
public class FinalGame extends Canvas 
{ 



    private static final long serialVersionUID =1L; 
    //refers to players coordinates 
    static int x=230, y=230; 
    static boolean coin1=true; 
    static int coinsCollected=0; 
    static int mj; 
    static boolean bounce=true; 
    public FinalGame() { 
     setSize(new Dimension(500, 500)); 
     setBackground(Color.black); 
     addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent e) { 
       moveSquare(e); 
      } 
     }); 
    } 

    public void paint(Graphics g) 
     { 
      //refers to coin's coordinates 
      int c1x=20; int c1y=20; 


      g.setColor(Color.white); 
      g.fillRect(x,y,20,20); 

      g.setColor(Color.yellow); 
      g.fillOval(c1x, c1y, 20, 20); 

      if((x==c1x)&&(c1y==20)) 
       { 
        coin1=false; 

       } 
      if(coin1==false) 
       { 
        g.setColor(Color.black); 
        g.fillOval(20, 20, 20, 20); 



       int j=230; 
       mj=5; 

//I am unable to move the square while this loop is active 

       while(bounce) 
        {  

         repaint(); 
         if((j==480)||(j==0)) 
          { 
           mj=-mj; 
          } 

         j=j+mj; 

         g.setColor(Color.red); 
         g.fillRect(230, j, 20, 20); 

         delay(); 

         g.setColor(Color.black); 
         g.fillRect(230, j, 20, 20); 

         g.setColor(Color.white); 
         g.fillRect(x,y,20,20); 



        } 
       mj=-mj; 


       } 

      g.setColor(Color.white); 
      g.fillRect(x,y,20,20); 

     } 

    public void moveSquare(KeyEvent e) 
     { 
      switch(e.getKeyCode()) 
      { 
       case KeyEvent.VK_DOWN: 
        y += 5; 
        break; 
       case KeyEvent.VK_UP: 
        y-= 5; 
        break; 
       case KeyEvent.VK_LEFT: 
        x-=5; 
        break; 
       case KeyEvent.VK_RIGHT: 
        x+=5; 
        break; 
      } 
      repaint(); 
     } 
    public static void main(String[] args) 
     { 
       JFrame frame = new JFrame("Basic Game"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       FinalGame ex = new FinalGame(); 
       frame.getContentPane().add(ex); 
       frame.pack(); 
       frame.setResizable(false); 
       frame.setVisible(true); 
       ex.requestFocus(); 


     } 
    public void delay() 
     { 
     try 
       { 
       Thread.sleep(15); 
       } catch (InterruptedException e) 
       { 
       e.printStackTrace(); 
       } 
     } 
} 

答えて

0

あなたのアルゴリズムは次のとおりです。:同時に

create coins at random 

move the player to collect the coins 

create red things also at random 

これらすべての

は、ここに私のコードです。

したがって、この同時性を実現するには別のスレッドが必要です。

コインのための1つのスレッドすでにメインクラスに存在する赤いもののために一つのスレッドと1つのメインスレッド:

class FinalGame extends Canvas 
{ 

private static final long serialVersionUID =1L; 
//refers to players coordinates 
static int x=230, y=230; 
static boolean coin1=true; 
static int coinsCollected=0; 
static int mj; 
static boolean bounce=true; 
Red r; 
Coin c; 
public FinalGame() { 
    setSize(new Dimension(500, 500)); 
    setBackground(Color.black); 
    addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      moveSquare(e); 
     } 
    }); 
    r=new Red(this); 
    r.start(); 
    c=new Coin(this); 
    c.start();  
} 

public void paint(Graphics g) 
    { 
     if(x==r.x && y==r.y) System.exit(0); 

     if(c.visible) { 
      g.setColor(Color.yellow); 
      g.fillOval(c.c1x, c.c1y, 20, 20); 
     } 

     g.setColor(Color.white); 
     g.fillRect(x,y,20,20); 

     g.setColor(Color.red); 
     g.fillRect(r.x, r.y, 20, 20); 

    } 

public void moveSquare(KeyEvent e) 
    { 

     switch(e.getKeyCode()) 
     { 
      case KeyEvent.VK_DOWN: 
       y += 5; 
       break; 
      case KeyEvent.VK_UP: 
       y-= 5; 
       break; 
      case KeyEvent.VK_LEFT: 
       x-=5; 
       break; 
      case KeyEvent.VK_RIGHT: 
       x+=5; 
       break; 
     } 

     repaint(); 
    } 

public void m() 
    { 
      JFrame frame = new JFrame("Basic Game"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      frame.getContentPane().add(this); 
      frame.pack(); 
      frame.setResizable(false); 
      frame.setVisible(true); 
      requestFocus(); 

    } 

class Coin extends Thread { 
    int c1x=20, c1y=20; 
    boolean visible=true; 
    FinalGame f; 

    public Coin(FinalGame f) { 
    this.f=f; 
    } 

    public void run() { 

    while(true) 
    {  

     if((f.x==c1x)&&(c1y==20)) 
     { 
       visible=false; 

     }    
    } 


    } 
} 


class Red extends Thread { 
    int x=130, y=10; 
    FinalGame f; 

    public Red(FinalGame f) { 
    this.f=f; 
    } 

    public void run() { 

      int mj=5; 

      while(true) 
       {  

        if((y==480)||(y==0)) 
         { 
          mj=-mj; 
         } 

        y=y+mj; 

    f.repaint(); 

    try 
    { 
      Thread.sleep(15); 
    } catch (InterruptedException e) 
    { 
      e.printStackTrace(); 
    } 

    } 


    } 
} 

}

+0

いいえ、あなたはすべてのための新しいスレッドを必要としませんそれは愚かです。移動してすべてをレンダリングするゲームループ用の新しいスレッドが1つあれば十分です。 – eldo

関連する問題