Java 生成全局变量

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

我正在做一个游戏,但我很难从另一个类中获取变量。我有一节雪碧课和一节JPanel课。在我的游戏中,我希望我的分数在我命中一枚硬币后上升。我的intersect硬币代码在我的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中把CoinScore=CoinScore+1放在}之前,但是它说CoinScore不能解析为变量?如何修复它?

您的
drawSprite()
方法是否返回任何内容?这可以返回交叉点的结果,您可以检查该结果以增加分数


或者干脆在Sprite中使用另一个方法,让您知道是否发生了交叉。

您用类名调用了它吗?如果不是,那就是你的问题

Class.Coinshare = Class.Coinshare +1;

类似的东西?因为它是静态的、公共的,所以必须首先用它所属的类名调用它,才能访问它。

如果您想了解Java中的基本变量范围,必须阅读

CoinScore
已声明为静态,不是吗?所以它是一个类变量,所以它可以像

ClassName.publicStaticVariable

这里有很多答案,可以让您完全按照自己的要求去做(通过类名进行静态访问,可能创建一个单例等等)

然而,我想指出
这只是您即将面临的一系列问题中的第一个问题
(当然,除非分数是唯一的游戏状态)

这是因为您正在混合模型和视图。MVC并不总是一个简单的答案(也不总是正确的答案),但它可能是您考虑架构的最佳选择。在绘制逻辑中使用状态改变逻辑不是一个好主意。如果您以后需要做一些额外的逻辑来确定获得精灵的奖金,而这些奖金多少会占用CPU,该怎么办?如果你在模型中设置了一个asych更新,那就好了,但是由于它是在抽签方法中,你的游戏会不时地突然开始冻结

EDT中反对这种逻辑的另外两个论点需要考虑:

  • 如果碰撞的精灵在碰撞过程中被另一个面板或窗口覆盖,则不计算在内。这仅仅是因为该区域从未调用draw方法
  • 与每秒重画的次数相比,您的移动可能实际上相当罕见(很可能,除非您正在实时构建某些东西)。因此,对尚未移动的对象执行相同的碰撞检查会浪费大量资源
总之,我的建议是更新模型中对象的状态,并在那里进行碰撞检查,同时保留绘图线程,以便进行绘图。您甚至可以将冲突逻辑保留在Sprite类中(这似乎是一个合理的位置),只是不从draw调用,而是从集中式状态更新方法调用


(另外,全局变量是邪恶的,大多数对这些变量有适当支持的语言都有相应的反模式)

您用类名来调用它了吗<代码>Class.Coinshare=Class.Coinshare+1类似的东西?因为它是静态的和公共的,所以你必须先用它所属的类名来调用它,才能访问它。@3kings-你应该把它列出来作为答案。因为你有这么一个简单的问题,所以不需要整个游戏。您可以使用简单的代码来演示您不知道的内容。这就是-basic-troubsleshooting。创建一个可以在视图和控制器之间共享的模型。我不支持这种设计。我看不到
drawSprite()
返回的分数变化会导致设计良好的系统和清晰的代码。我不是说它会返回分数变化。它将返回一个关于交集的布尔值(我也提到了它自己的方法)。不,它只是绘制精灵。我将它公开为静态的,因为我读到它应该是静态的。在我的例子中,会是
GameJPanel.CoinScore+1
?@user3542484如果它所属的类名为yes。@user3542484-假设您的
JPanel
类被称为
GameJPanel
,则为yes。在Java中,静态意味着整个类只有一个变量,无论该类有多少个实例。因此,需要通过类名访问它。
ClassName.publicStaticVariable