【发布时间】: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