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