我已经使用JavaFX编写了一个简单的游戏,游戏本身使用了GUIFX,AnimationTimer编写了一个游戏,但是我发现在AnimationTimer对象中更新的任何字段都不能在该对象之外找到。我已经成功地连续记录了游戏的运行时间以及该游戏的得分,但找不到从AnimationTimer对象中获取这些值的方法,因此无法将其添加到我的GUI中。
我已经尝试过java.lang.Reflect,但是我似乎无法使其正常工作。
AnimationTimer animations = new AnimationTimer() //creates animations
{
@Override
public void handle(long now)
{
//update frames
if(jump == 0) //moves the player model to the starting position
{
playerY = 160;
}
else if(jump == 1) //moves the player model up (jumping)
{
playerY = 100;
}
if(shout == 1) //makes player immune while "shouting"
{
player.setFill(Color.GREEN);
}
if(shout == 0) //makes player not immune anymore
player.setFill(Color.BLUE);
if(obstacleX == PLAYER_X) //updates the score
{
points += 10;
score.setText("Score: " + String.valueOf(points));
}
if(player.getBoundsInParent().intersects(obstacle.getBoundsInParent())) //detects if the player model touches an obstacles
{
if(obstacle.getEndY() == 0)
{
if(player.getFill() == Color.BLUE)
player.setFill(Color.RED);
}
else if(obstacle.getEndY() == 130)
player.setFill(Color.RED);
}
if(obstacleX > 0) //moves the obstacles' reference point from the right to the left
obstacleX -= 5;
if(obstacleX == 0)
{
obstacleX = 400;
int[] array = new int[]{0, 0, 130};
Random randomNum = new Random();
int i = randomNum.nextInt(array.length);
random = array[i];
obstacle.setEndY(random);
}
//render frames
player.setCenterY(playerY);
obstacle.setStartX(obstacleX); //this and line 110 move the obstacle across the scene
obstacle.setEndX(obstacleX);
try{ //exception handler for outputs
if(player.getFill() == Color.GREEN)
{
digitalOutput6.setDutyCycle(1); //turns on green LED
digitalOutput0.setDutyCycle(0);
}
if(player.getFill() == Color.BLUE)
{
digitalOutput6.setDutyCycle(0); //turns off LEDs
digitalOutput0.setDutyCycle(0);
}
if(player.getFill() == Color.RED) //stops the animation when the player model reacts to touching an obstacle
{
endTime = System.currentTimeMillis() - startTime;
finalScore = score.getText();
this.stop(); //ends game
gameOver = 1;
digitalOutput0.setDutyCycle(1); //turns on red LED
digitalOutput6.setDutyCycle(0);
gameStage.setScene(gameEnd); //establishing scene
gameStage.setTitle("Game Over");
gameStage.show();
}
} //end of try block
catch(PhidgetException e)
{
System.out.println("Phidget Output Error");
}
} //end of animation handle itself
}; //end of animation method
我尝试使用
long finalTime = animations.getLong(endTime);
和
String endScore = animations.getField(finalScore);
但是没有运气。任何帮助表示赞赏。
答案 0 :(得分:0)
<FlatList
data={messages}
renderItem={({ item }) =>
<ChildComponent
item={item}
check={check}
/>
}
keyExtractor={item => item.id.toString()}
extraData={check}
/>
本身不公开任何属性,创建一个将var inValid = /\s/;
var value = " ";
var k = inValid.test(value);
alert(k);
对象包装在其中的自定义类,并保存要访问的所有属性。
初始化自定义类时,初始化AnimationTimer
对象并覆盖函数(如您所做的那样),还更新要公开的任何属性。
我对javafx不熟悉,可能还有其他更好的方法,这是我能想到的一种快速解决方案。
进行快速搜索,这些示例可能会有所帮助:
https://netopyr.com/2012/06/14/using-the-javafx-animationtimer/
https://tbeernot.wordpress.com/2011/11/12/javafx-2-0-bubblemark/
答案 1 :(得分:0)
首先不要在匿名类上使用反射。它可以工作,但是会导致很多效率低下和肮脏的代码。 其次,您尝试访问方法范围中的字段 handle(现在很久)不在Class范围内。
AnimationTimer t = new AnimationTimer() {
int fieldInt = 0; // would be accessible
@Override
public void handle(long now) {
//do something
}
};
AnimationTimer t = new AnimationTimer() {
@Override
public void handle(long now) {
int fieldInt = 0; // is not accessible as regular field
//do something
}
};
您可以执行以下操作:
使用扩展Animationtimer的类
public class Scheduler extends AnimationTimer{
private int gameEnd = 42;
private String someValue = "hello";
@Override
public void handle(long now) {
gameEnd += 1;
if(gameEnd >= 1000000) {
someValue ="Bye bye";
}
}
public String getSomeValue() {
return someValue;
}
您可以在这里使用:
Scheduler s = new Scheduler();
s.start();
//whatever you want to do
System.out.Println(s.getSomeValue());
,或者当您要使用匿名类方法时,应创建并使用AnimationTimer之外的Property。 (这是我喜欢的事情,因为您可以在Property上使用changeListener,并在更改值时接收回调)
public void whateverMethod() {
SimpleIntegerProperty gameEndProp = new SimpleIntegerProperty(42);
AnimationTimer t = new AnimationTimer() {
@Override
public void handle(long now) {
gameEndProp.set(gameEndProp.get()+1);
}
};
t.start();
//Do something
System.out.println(gameEndProp.get());
}