对于我目前的项目,我正在使用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让我觉得这是一个非常常见和模糊的错误,我无法找到一个帮助我的例子。
答案 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();
才能使用其中的值。