PImage数组 - NullPointerException

时间:2014-04-03 18:38:32

标签: arrays nullpointerexception processing sprite

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

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

这个较大的PImage包含192帧。游戏最初是基于龙球,因此计划是让角色充电并转换过某一点 - 这三个转换组在纸张上相互存储。在这些组中是动作的动画集 - 打孔,踢,空闲,移动等。每个动作是一个帧,每个动画包含四个帧(4 * 16 * 3)。

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

可以在这里找到整个草图,图像和所有: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语句在绘图中运行对象函数。

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

提前感谢任何建议,我确实搜索过但nullPointerException让我觉得这是一个非常常见和模糊的错误,我无法找到一个帮助我的例子。

1 个答案:

答案 0 :(得分:1)

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