【问题标题】:PImage array - NullPointerExceptionPImage 数组 - NullPointerException
【发布时间】:2014-04-03 18:38:32
【问题描述】:

对于我当前的项目,我正在使用 P3D 创建一个 2D 格斗游戏,并为角色使用精灵。设置时,我只尝试在屏幕上显示一个字符,所以我当前的设置是:

我有一个名为“Fighter”的父类,它包含世界中位置的值和确定战斗机当前正在做什么的布尔值。然后我有一个名为“动画”的课程,它扩展了“战斗机”。这是存储精灵的地方,我认为 NPE 的起源。该类有一个构造函数,其中较大的 PImage 被切割成较小的帧并存储在每个动画的数组中。

这个较大的 PImage 包含 192 帧。游戏最初是基于龙珠的,所以计划是让角色充电并变形超过某个点 - 3 个变形组在表格上彼此重叠存储。在这些组中是动作的动画集 - 出拳、踢腿、空闲、移动等。每列是一个帧,每个动画包含四个帧 (4*16*3)。

我认为,问题的根源在于将较大的 PImage 分割并将该动画的各个帧存储在一个数组中。我设法让它在早期版本中工作,但我使用了状态,并将整个 PImage(192 帧)存储在一个数组中,并按状态调用行。所有这一切的最终结果是,在屏幕上显示两个字符需要非常长和复杂的代码,无论是相同的还是不同的。

整个草图都可以在这里找到,图片和所有:https://mega.co.nz/#!kRYUBYbI!wNRvKNo54BpAc4QbWZpEuoHJoJJcBkGmRK9rSgoIGu4

这里是 Animation 类,包含用于剪切精灵表的代码。

class Animation extends Fighter {
  PImage [] playerFrames; 
  int count, currentFrame = 0; 


  Animation(int startX, int startY) { // constructor
    for (int x = 0; x < 4; x++) {
      playerFrames[x] = gokuSpriteSheet.get(x*90 + startX, startY, 90, 85);
    }
  } // Animation()

  int cx = (currentFrame == 4 ? 1 : currentFrame);

  void display() {

    if (count++ > 7) {
      count = 0;
      currentFrame++;
      if (currentFrame >= 4) 
        currentFrame = 0;
    }

    image(playerFrames[cx], x, y); 
  } // void display()
}


class AnimationSet { 
  Animation idleRight = new Animation(0, 0);
  Animation idleLeft = new Animation(0, 85);
  Animation moveRight = new Animation(0, 170);
  Animation moveLeft = new Animation(0, 255);
  Animation jumpRight = new Animation(0, 340);
  Animation jumpLeft = new Animation(0, 425);
  Animation punchRight = new Animation(0, 510);
  Animation punchLeft = new Animation(0, 595);
  Animation kickRight = new Animation(0, 680);
  Animation kickLeft = new Animation(0, 765);
  Animation blockRight = new Animation(0, 850); 
  Animation blockLeft = new Animation(0, 935);
  Animation kiAtkRight = new Animation(0, 1020);
  Animation kiAtkLeft = new Animation(0, 1105);
  Animation chargeRight = new Animation(0, 1190);
  Animation chargeLeft = new Animation(0, 1275);
}

AnimationSet [] powerStates;

理想的最终结果是在通用菜单上启动草图,允许您选择世界和您/您的对手角色,然后在您单击继续后最终创建所有这些对象。我仍然不熟悉这种语言中使用的某些技术,所以我认为其中一些是不可能的,但我希望为每个角色皮肤复制动画类 4 次,然后创建一个播放器和每个目标对象。然后我将创建一个整数,让您在菜单中更改它,并根据选择的选项,使用 if 语句在 draw 中运行对象函数。

所以,最后,关于我的问题: 如何在不调用 NPE 的情况下切割较大的 PImage 并存储 4 帧? 我是否需要将精灵表本身更改为每个动作的四帧单独图像,并在构建动画时将每个动作的文件名作为字符串传递? 任何其他解决方案建议,请记住我试图在屏幕上显示 2 个字符,从四个字符中选择(它们可以相同)?

提前感谢您的任何建议,我确实搜索过,但 nullPointerException 给我的印象是一个非常常见且模糊的错误,我找不到帮助我的示例。

【问题讨论】:

    标签: arrays nullpointerexception processing sprite


    【解决方案1】:

    有趣的是,PDE 并没有告诉您 NPE 的来源。不过,您可以通过在代码中添加 print("got here") 调用来自行确定它以缩小范围。当我这样做时,我发现draw() 中的player.func(); 行导致了错误。在该方法中,您使用变量powerStates,您(令人困惑地?)在class_Animation 文件的底部声明了它,但您从未给它一个值(例如powerStates = something;)。当您声明但未定义对象数组时,它会用null 值填充数组,因此当您调用powerStates[SSJ].moveRight.display(); 之类的东西时,它会评估powerStates[SSJ],找到null,然后调用@987654331 @,抛出你的错误。您需要先填充powerStates,然后才能使用其中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 2013-02-16
      • 2013-10-13
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多