我正在制作一个有多颗小行星的游戏。目标是尽可能多地躲避尽可能多的小行星。我做到这一点,一旦小行星到达屏幕的底部,它就会重新发送,现在我想要计算每次它到达底部并将其添加到分数中。 我的问题是所有的小行星都是同一类,所以如果我使用:
if(y>700){
y=-50; //
x= (int) (Math.random()*670); // To send the asteroid back up
setLocation(x,y); //
score++; // To add up the score
System.out.println(score); // To print the score
每个小行星都会增加自己已达到底部的次数,但我想知道有多少小行星已达到底部。所以我想我必须从小行星类中得到分数并将其添加到其他类中,但我不知道如何。
这是小行星类的代码:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Astroid extends JPanel implements ActionListener
{
public int yVelocity = 1;
public int x = (int) (Math.random()*650), y = (int) (Math.random()*-1000);
public Timer timer;
private int score;
public Astroid(int x,int y)
{
this.setLocation(x, y);
this.setSize(25, 25);
this.setBackground(Color.WHITE);
this.setVisible(true);
}
{
this.timer = null;
this.timer = new Timer(10,new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0)
{
setLocation(x,(y+=yVelocity));
timer.setDelay(10);
repaint();
if(y>700){
y=-50;
x= (int) (Math.random()*670);
setLocation(x,y);
score++;
System.out.println(score);
}
}
});
timer.start();
}
}
这是创建小行星的类的代码:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SterTest extends JFrame implements ActionListener
{
public int a;
public SterTest()
{
this.setSize(700, 700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
final JPanel p = new JPanel();
p.setBackground(Color.BLACK);
p.setLayout(null);
for(a=0;a<3;a++) {
Astroid astroid = new Astroid(1,1);
p.add(astroid);
} //Creates 3 asteroids to start with
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Astroid astroid2 = new Astroid(1,1);
p.add(astroid2);
a++;
System.out.println("Het aantal asteroids in game is:"+a);
}
}, 5000, 5000); // creates a new asteroid every 5 seconds or so
this.add(p);
this.setVisible(true);
}
答案 0 :(得分:1)
跟踪分数可能不是Asteroid
类的工作,因此变量最好保存在更集中的类中。然后,您可以向每个小行星添加中心类的实例,并调用方法来增加分数。像这样:
public class ScoreKeeper {
private AtomicInteger score;
public void incrementScore (int points) {
score.getAndAdd (points);
}
public int getScore () {
return score.get ();
}
}
在您的课程SterTest
中,您将创建一个ScoreKeeper
的实例,并将其传递给您创建的每个新Astroid
实例。
public class Astroid {
private ScoreKeeper scoreKeeper;
public Astroid(int x,int y, ScoreKeeper scoreKeeper) {
//... existing code ...
this.scoreKeeper = scoreKeeper;
}
// ... when you want to increment the score, do this:
scoreKeeper.incrementScore (1);
}
答案 1 :(得分:0)
注意:有更好的和更多的OO方法。这个答案是从当前解决方案到工作代码的最快路径。
将分数声明为静态。
private static int score
这将为您提供该变量的单个副本。
<强>然而强>
我看到你有一些线索。在这种情况下,您需要一点同步才能保持分数一致。
我建议添加
private static final Object scoreLock
到你的领域。并将score++
替换为
synchronized(scoreLock)
{
Asteroid.score++;
}
答案 2 :(得分:0)
如果你对保持个体小行星的得分不感兴趣,那么没有理由在该类中添加score
变量。分数应保持在较高级别,可能在您的SterTest()类中。当您检测到小行星已经到达底部时,只需增加该分数即可。我不想告诉你如何设计你的程序,但最明显的方法是让actionPerformed返回分数。
答案 3 :(得分:0)
创建AsteroidListener
界面。也许是这样的:
public interface AsteroidListener {
public void impact(Asteroid asteroid);
}
让您的SterTest
类实现此接口。为您的Asteroid构造函数添加一个新参数,用于侦听器。
public Asteroid(int x, int y, AsteroidListener listener) { }
当您需要调用侦听器以通知它存在影响时:
listener.impact(this);
在SterTest课程中取得分数。
答案 4 :(得分:0)
使用Java Observer / Observable模式:
public class Score extends Observable {
private AtomicInteger counter = new AtomicInteger();
public void increment() {
setChanged();
notifyObservers(Integer.valueOf(counter.incrementAndGet()));
}
}
此课程已添加到Astroid
:
public Astroid(Score score, int x,int y) {
// ...
@Override
public void actionPerformed(ActionEvent event) {
// ...
score.increment();
}
}
StarTest
实现了Observer
接口:
public class StarTest implements Observer {
// ...
@Override
public void update(Observable o, Object arg) {
Integer count = (Inter)arg;
// do something with the score
}
}
您按以下方式连接Observer
和Observable
:
StarTest starTest = new StarTest();
Score score = new Score();
score.addObserver(starTest);
Astroid astroid = new Astroid(score, x, y);