我正在制作一个游戏而我在从另一个类中获取变量时遇到了麻烦。我有一个Sprite类和一个JPanel类。在我的游戏中,一旦我击中硬币,我希望我的分数上升。我的相交硬币代码在我的Sprite类中。当我击中硬币时,我怎么能这样做,我的分数上升了1? 这段代码来自我的JPanel类。这些变量一直是最重要的。
public static int CoinScore = 0;
private String Score = "Score :";
private String TextOnScreen="";
这是我在JPanel中的paintcomponent方法。
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(BackgroundImage,0,0,720,480,0,0,720,480,null);
g2d.setColor(Color.black);
g2d.fillRoundRect(25, 2, 100, 30, 10, 10);
g2d.setColor(Color.orange);
Font cp = new Font("Courier", Font.BOLD, 20);
g2d.setFont(cp);
TextOnScreen = Score + Integer.toString(CoinScore);
g2d.drawString(TextOnScreen,30,30); 30,30.
for (int i=0; i<mySprites.length; i++)
mySprites[i].drawSprite(g2d);
}
这是我的Sprite课程。
if (SpriteFilename == "Resources/sprite-concepts.png" && sprites[i].SpriteFilename == "Resources/coin2.png")
{
sprites[i].SpriteVisible = false;
sprites[i].SpriteBounds.width = 0;
sprites[i].SpriteBounds.height = 0;
}
我尝试在精灵类中使用CoinScore = CoinScore + 1,但是它表示CoinScore无法解析为变量?我该如何解决?
答案 0 :(得分:1)
Class.Coinshare = Class.Coinshare +1;
类似的东西?由于它是静态的和公共的,你必须使用它首先属于的类名来调用它,以便访问它。
答案 1 :(得分:1)
如果您在Java中询问基本变量范围,请阅读oracle documentation
CoinScore
已被声明为静态不是吗?所以它是一个类变量,因此它可能与
ClassName.publicStaticVariable
答案 2 :(得分:0)
您的drawSprite()
方法是否会返回任何内容?这可能会返回交叉点的结果,您可以检查以增加分数。
或者只是在Sprite
中使用另一种方法,让您知道是否发生了交叉。
答案 3 :(得分:0)
这里有很多答案可以让你完全按照你的要求行事(通过课堂名称进行静态访问,也可以制作单身等等)。
但是我想指出一点
这只是您即将面临的一系列问题中的第一个
(当然,除非得分是你唯一的比赛状态)
这是因为您正在混合模型和视图。 MVC并不总是一个简单的答案(并不总是正确的答案),但最好是你考虑你的架构。让状态在绘制逻辑中改变逻辑并不是一个好主意。如果你以后需要做一些额外的逻辑来确定获得精灵的奖金怎么办?那些结果有点CPU密集?如果你在模型中设置了一个asych更新它会很好,但是因为它在绘制方法中你的游戏会突然一次又一次地开始冻结。
在EDT中反对这种逻辑的另外两个论点要考虑:
总而言之,我的建议是更新模型中对象的状态并在那里进行碰撞检查,同时保留绘图线程,绘制。您甚至可以将碰撞逻辑保留在Sprite类中(这似乎是一个合理的位置),只是不是从draw调用,而是从集中式状态更新方法调用。
(另外,全局变量 EVIL ,大多数支持那些具有相应反模式的语言)