1
私は現在、ArrayList
にBalls
を追加していますが、非常に高速に追加されます。ボールに遅れを入れたいですが、2つのスレッドがありますが、まだ同期していません私はかなり新しいですから。遅延を持つArraylistにボールを追加する
私はゲームを呼び出し、ボールはBallholder
に追加されます。誰もがこれに対する解決策を知っていますか?あなたは以下のコードを見れば
public class BallsPanel implements Runnable {
ArrayList<Balls> ballHolder;
boolean notFull = true;
int a = 0, d = 0;
int counter = 0;
boolean drop = false;
boolean running;
Thread ballCreator;
public BallsPanel() {
ballHolder = new ArrayList();
}
public void ballCreation() {
ballCreator = new Thread(this);
ballCreator.start();
}
public ArrayList<Balls> getBall() {
return ballHolder;
}
@Override
public void run() {
try {
Thread.sleep(5000);
ballHolder.add((new Balls()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Menu extends JFrame implements Runnable, KeyListener {
Thread animator;
volatile boolean running = true;
int x = 100, y = 100, w = 20, h = 20;
boolean notFull = true;
BallsPanel a;
JLabel ballCounterHolder;
int ballCounter = 0;
public Menu() {
this.setSize(1000, 1000);
this.addKeyListener(this);
a = new BallsPanel();
ballCounterHolder = new JLabel();
this.add(ballCounterHolder);
startGame();
this.setFocusable(true);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void startGame() {
if (((animator == null) && (running != false))) {
animator = new Thread(this);
animator.start();
running = true;
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
ArrayList ms = a.getBall();
for (Object m1 : ms) {
// if((m[i].wBall) != m[i+1].wBall)
Balls m = (Balls) m1;
g.setColor(m.colorBall[m.rndColor]);
g.fillOval(m.xBall, m.yBall, m.wBall + 1, m.hBall + 1);
g.drawOval(m.xBall, m.yBall, m.wBall, m.hBall);
}
}
public void ballUpdate() {
// ballCounterHolder.setText(Integer.toString((ballCounter)));
ArrayList ms = a.getBall();
for (int i = 0; i < ms.size(); i++) {
Balls m = (Balls) ms.get(i);
// System.out.println(i+" " +i+1);
if (m.isVisible()) {
m.drop();
} else {
ms.remove(i);
ballCounter = ballCounter + 1;
}
}
}
@Override
public void run() {
long beforeTime, timeDiff, sleepTime;
beforeTime = System.currentTimeMillis();
while (running = true) {
startGame();
a.ballCreation();
repaint();
ballUpdate();
timeDiff = System.currentTimeMillis() - beforeTime;
sleepTime = (1000/5) - timeDiff;
if (sleepTime <= 0) {
sleepTime = 5;
}
try {
Thread.sleep(sleepTime);
} catch (InterruptedException ex) {
}
// System.out.print(sleepTime+"\n");
beforeTime = System.currentTimeMillis();
}
}
@SuppressWarnings("deprecation")
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if ((keyCode == KeyEvent.VK_P)) {
if (running == true) {
running = false;
animator.suspend();
} else {
running = false;
animator.resume();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new Menu();
}
}
public class Balls {
int xBall, yBall, wBall, hBall;
int newBall = (int) (Math.random() * 500) + 1;
int ySpeed = 20;// (int)(Math.random() * 8) + 3;
int rndColor = (int) (Math.random() * 10) + 0;
boolean visi;
Color[] colorBall;
public Balls() {
xBall = 40 + newBall;
yBall = 0;
wBall = 20;
hBall = 20;
visi = true;
colorBall = new Color[10];
colorBall[0] = Color.red;
colorBall[1] = Color.blue;
colorBall[2] = Color.yellow;
colorBall[3] = Color.pink;
colorBall[4] = Color.orange;
colorBall[5] = Color.green;
colorBall[6] = Color.black;
colorBall[7] = Color.magenta;
colorBall[8] = Color.cyan;
colorBall[9] = Color.gray;
}
public boolean isVisible() {
return visi;
}
public void drop() {
if (yBall < 500) {
yBall = yBall + ySpeed;
visi = true;
} else {
visi = false;
}
}
public int getWidth() {
return wBall;
}
public int getHeight() {
return hBall;
}
}
クラスボールとは何ですか?名前で判断すると、クラスボールにはクラスボールの複数のインスタンスが含まれていると仮定します。 –
私はクラスボールを追加しました。 – EricTheDevil