Java 生成全局变量
我正在做一个游戏,但我很难从另一个类中获取变量。我有一节雪碧课和一节JPanel课。在我的游戏中,我希望我的分数在我命中一枚硬币后上升。我的intersect硬币代码在我的Sprite类中。当我击中硬币时,我的分数上升到1分,我怎么能做到这一点呢? 这段代码来自我的JPanel类。这些是自上而下声明的变量Java 生成全局变量,java,swing,jpanel,intersect,Java,Swing,Jpanel,Intersect,我正在做一个游戏,但我很难从另一个类中获取变量。我有一节雪碧课和一节JPanel课。在我的游戏中,我希望我的分数在我命中一枚硬币后上升。我的intersect硬币代码在我的Sprite类中。当我击中硬币时,我的分数上升到1分,我怎么能做到这一点呢? 这段代码来自我的JPanel类。这些是自上而下声明的变量 public static int CoinScore = 0; private String Score = "Score :"; private Stri
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中把CoinScore=CoinScore+1放在}之前,但是它说CoinScore不能解析为变量?如何修复它?您的drawSprite()
方法是否返回任何内容?这可以返回交叉点的结果,您可以检查该结果以增加分数
或者干脆在Sprite中使用另一个方法,让您知道是否发生了交叉。您用类名调用了它吗?如果不是,那就是你的问题
Class.Coinshare = Class.Coinshare +1;
类似的东西?因为它是静态的、公共的,所以必须首先用它所属的类名调用它,才能访问它。如果您想了解Java中的基本变量范围,必须阅读
CoinScore
已声明为静态,不是吗?所以它是一个类变量,所以它可以像
ClassName.publicStaticVariable
这里有很多答案,可以让您完全按照自己的要求去做(通过类名进行静态访问,可能创建一个单例等等) 然而,我想指出
这只是您即将面临的一系列问题中的第一个问题
(当然,除非分数是唯一的游戏状态) 这是因为您正在混合模型和视图。MVC并不总是一个简单的答案(也不总是正确的答案),但它可能是您考虑架构的最佳选择。在绘制逻辑中使用状态改变逻辑不是一个好主意。如果您以后需要做一些额外的逻辑来确定获得精灵的奖金,而这些奖金多少会占用CPU,该怎么办?如果你在模型中设置了一个asych更新,那就好了,但是由于它是在抽签方法中,你的游戏会不时地突然开始冻结 EDT中反对这种逻辑的另外两个论点需要考虑:
- 如果碰撞的精灵在碰撞过程中被另一个面板或窗口覆盖,则不计算在内。这仅仅是因为该区域从未调用draw方法李>
- 与每秒重画的次数相比,您的移动可能实际上相当罕见(很可能,除非您正在实时构建某些东西)。因此,对尚未移动的对象执行相同的碰撞检查会浪费大量资源
(另外,全局变量是邪恶的,大多数对这些变量有适当支持的语言都有相应的反模式)您用类名来调用它了吗<代码>Class.Coinshare=Class.Coinshare+1代码>类似的东西?因为它是静态的和公共的,所以你必须先用它所属的类名来调用它,才能访问它。@3kings-你应该把它列出来作为答案。因为你有这么一个简单的问题,所以不需要整个游戏。您可以使用简单的代码来演示您不知道的内容。这就是-basic-troubsleshooting。创建一个可以在视图和控制器之间共享的模型。我不支持这种设计。我看不到
drawSprite()
返回的分数变化会导致设计良好的系统和清晰的代码。我不是说它会返回分数变化。它将返回一个关于交集的布尔值(我也提到了它自己的方法)。不,它只是绘制精灵。我将它公开为静态的,因为我读到它应该是静态的。在我的例子中,会是GameJPanel.CoinScore+1
?@user3542484如果它所属的类名为yes。@user3542484-假设您的JPanel
类被称为GameJPanel
,则为yes。在Java中,静态意味着整个类只有一个变量,无论该类有多少个实例。因此,需要通过类名访问它。
ClassName.publicStaticVariable