制作全局变量

时间:2014-05-07 17:49:41

标签: java swing jpanel intersect

我正在制作一个游戏而我在从另一个类中获取变量时遇到了麻烦。我有一个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无法解析为变量?我该如何解决?

4 个答案:

答案 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 ,大​​多数支持那些具有相应反模式的语言)