【问题标题】:Using variable from another class使用另一个类的变量
【发布时间】:2018-04-11 16:14:22
【问题描述】:

我确信这很简单,但我尝试在这个网站上检查谷歌和其他人的问题,但无法理解。提前感谢您的帮助。

我正在制作一个简单的游戏。我正在尝试设置碰撞检测,但无法使其正常工作。我想要做的是设置一个布尔值来检测渔船(玩家1)是否被鲨鱼击中(如果是这样,那么就失去了生命)。

对于鲨鱼类,我为鲨鱼的颜色设置了一个名为 SHARK1 的变量。然后,我为渔船设置了一个 for 循环,以检查是否曾经检测到鲨鱼的颜色与船发生碰撞。但是,鲨鱼的颜色是在 Shark 类中定义的,我想知道如何在 Fishing Boat 类中使用该变量。代码如下。

//shark class

    class Shark
{
  int x, y, dx, dy;
  int w=37;
  int h=50;
  public PImage sharkPic;

  public final color sharkColor;


  Shark(int x, int y, int dx, int dy)
  {
    this.x=x;
    this.y=y;
    this.dx=dx;
    this.dy=dy;
    sharkPic=loadImage("images/shark.png");
    sharkPic.resize(w,h);
    this.sharkColor=sharkPic.get(20,20);
  }
}

//fishing boat class

    class Fisherman
{
  int x;
  int y;
  Shark shark;

  Fisherman(int x, int y, Shark shark)
  {
    this.x=x;
    this.y=y;
    this.shark=shark;
  }

  void render()
  {
    fill(255,255,0);
    rect(x,y, 80,20, 7);
    rect(x+40,y-50, 10,50);
    fill(255,0,0);
    triangle(x+25,y-40, x+40,y-50, x+40,y-30);
  }

  boolean sharkHitBoat()
  {
    for (int i=y; i<(y+20); i++)
    {
      color detectedColour;
      detectedColour = get(i, y+20);
      if (detectedColour==shark.sharkColor) {
        return true;
      }
    }
    return false;
  }

} //class

然后我会在主类中使用布尔值,这样如果检测到碰撞,玩家就会失去生命,当失去 3 条生命时,游戏结束。可能有一种更简单的方法来实现这一点,但我想知道这是否可能以我的方式进行(如果不是,那么建议将不胜感激)。如果您需要查看其他代码以帮助我知道,我可以提供

谢谢。

【问题讨论】:

标签: java variables processing


【解决方案1】:

这不是我进行碰撞检测的方式。相反,我会简单地在鲨鱼和船周围使用边界框并检查这些框是否重叠。您可以在 Processing here 中阅读有关碰撞检测的更多信息。

但要回答您的问题,您可以通过传入变量或引用该类的实例来使用另一个类中的一个类中的变量。

首先,SHARK1 不是一个很好的变量名,所以我们称之为sharkColor。然后,我们必须确保它是一个类级别的变量,定义在类的顶部:

class Shark
{
  color sharkColor;
  //rest of class

你写的代码意味着SHARK1只能在构造函数内部使用,这绝对不是你想要的。

现在我们有了这个,我们可以将变量的值直接传递给两个类。像这样的:

color colorForShark = color(whatever);
Shark shark = new Shark(colorForShark);
Fisherman fisherman = new Fisherman(colorForShark);

然后每个类会将颜色带入其构造函数,将其存储在类级变量中,然后根据需要使用它。这很简单,但它假设每条鲨鱼都有相同的颜色。

或者我们可以将鲨鱼直接传递给Fisherman,像这样:

Shark shark = new Shark();
Fisherman fisherman = new Fisherman(shark);

您还可以传入Shark 实例中的ArrayList 并循环遍历它们。

无论如何,现在Fisherman 类有一个Shark 变量,然后我们可以使用. 点运算符获取鲨鱼的颜色:

shark.sharkColor

【讨论】:

  • 我觉得 Fisherman 类不应该包含 Shark.. 这对我来说没有意义。我觉得一个更好的解决方案是创建一个接受鲨鱼或鲨鱼列表并检查碰撞的方法。
  • 此外,如果 OP 想说添加鲸鱼或海豚,如果这些类都扩展说 SeeAnimal 然后对于 Fisherman 类有类似 hitBoat(SeeAnimal) 之类的方法,他们可以轻松地做到这一点
  • @RAZ_Muh_Taz 我不一定不同意你的观点,但我认为这个建议稍微超出了我试图回答的范围。随意提供您自己的答案,但请注意,OP 并没有真正询问他们的设计。
  • 恐怕我不太明白,因为我的编码水平还很基础。我已将该变量移至 Shark 类的顶部(public final color sharkColor;),但 Fisherman 类仍然无法识别该变量。此外, SharkColor 变量在 Shark 构造函数中定义为 (this.sharkColor=sharkPic.get(20,20);) - 我已将 SharkPic 设为类顶部的公共变量,但 Fisherman 类也无法识别.
  • @codenoob 您需要将颜色或鲨鱼本身传递给Fisherman 构造函数,然后将其保存到类级变量中才能使用它。
【解决方案2】:

这里有两个问题。

我看到的第一个问题是变量 SHARK1 的范围。您正在 Shark 构造函数中创建此变量,因此范围仅在 Shark 构造函数内,这意味着该变量在构造函数之外不可见。有关变量范围的更多信息,请阅读本文:https://www.geeksforgeeks.org/variable-scope-in-java/

将 Shark 类更改为以下。请注意,我为鲨鱼的颜色添加了一个类级别变量。

class Shark
{
  int x, y, dx, dy;
  int w=37;
  int h=50;
  PImage sharkPic;
  public final Color sharkColor;

  Shark(int x, int y, int dx, int dy)
  {
    this.x=x;
    this.y=y;
    this.dx=dx;
    this.dy=dy;
    sharkPic=loadImage("images/shark.png");
    sharkPic.resize(w,h);
    this.sharkColor= sharkPic.get(20,20); //variable for shark color thats needed for collision detection
  }

第二个问题是您的 Fisherman 课程对您的 Shark 课程一无所知。您需要将 Shark 的实例传递给 Fisherman 类。见下文:

class Fisherman {
        int x;
        int y;
        Shark shark;

        Fisherman(int x, int y, Shark shark) {
            this.x = x;
            this.y = y;
            this.shark = shark;
        }

        void render() {
            fill(255, 255, 0);
            rect(x, y, 80, 20, 7);
            rect(x + 40, y - 50, 10, 50);
            fill(255, 0, 0);
            triangle(x + 25, y - 40, x + 40, y - 50, x + 40, y - 30);
        }

        boolean sharkHitBoat() {
            for (int i = y; i < (y + 20); i++) {
                Color detectedColour = get(i, y + 20);
                if (detectedColour == shark.sharkColor) //this is where I'm putting the color variable, this causes an error at the moment.
                {
                    return true;
                }
            }
            return false;
        }
    }

现在您可以执行以下操作:

 Shark shark = new Shark(1, 2, 3, 4);
 Fisherman fisherman = new Fisherman(1, 2, shark);
 fisherman.sharkHitBoat();

【讨论】:

  • 我在 Shark 类下添加了公共最终颜色行,而不是像您建议的构造函数,但 Fisherman 类中的布尔值仍然无法识别颜色变量
  • 你能在这里添加错误,以便我可以提供更多帮助。
  • 当然,这行代码是“if (detectedColour==sharkColor)”,错误是变量sharkColor不存在。 (我将变量的名称从 SHARK1 更改为 SharkColor,并将名称 SHARK1 的所有实例更改为 SharkColor)
  • @codenoob .. 对不起这里的混乱。您收到此错误的原因是您的 Fisherman 课程对您的 Shark 课程一无所知。我已经更新了上面的答案以展示一个更好的工作示例
  • 你从哪里得到 NullPointerException?
猜你喜欢
  • 2023-02-21
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多