2016-05-17 75 views
0

我对Java和一般编程相当陌生。我正在开发一个小型游戏,用户扮演一个白色方块,其目标是收集屏幕上的所有硬币。随着用户收集硬币,移动红色方块出现在屏幕上,如果用户触摸它们将结束游戏。我使用KeyListener来移动用户的方块。在另一个形状独立移动时使用KeyListener移动形状

我遇到的问题是,当红色正方形移动时,我无法移动玩家的正方形。在paint方法内激活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 

所有这些同时进行。

因此,您需要不同的线程来执行此同时性。

对硬币的一个线程一个线程红色的东西,一个主线程已经存在于主类:

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

不,你并不需要为每一个新的线程移动的对象,这很愚蠢。游戏循环的一个新线程移动并呈现所有内容就足够了。 – eldo