所以标题几乎解释了这一切,最近我已经了解了2D阵列,但我对如何在我正在创建的Space Invaders游戏中正确移动2D阵列感到困惑。
现在我让外星人从左向右移动(反之亦然),然而,他们不会同时向下移动,他们逐列向下移动。有人知道在哪里编辑代码吗?
这是外星人的代码:
class Aliens {
int x = 100, y = 75, deltaX = 1;
Aliens (int x, int y) {
this.x = x;
this.y = y;
}
void drawAlien() {
fill(255);
rect(x, y, 25, 25);
}
void moveAlien() {
x = x + deltaX;
if (x >= width) {
y = y + 20;
deltaX = - deltaX;
} else if (x <=0) {
y = y + 20;
deltaX = - deltaX;
}
}
void updateAlien() {
drawAlien();
moveAlien();
}
}
和我的主要课程:
import ddf.minim.*;
//Global Variables
PImage splash;
PFont roboto;
Defender player;
Aliens[][] alienArray = new Aliens[15][3];
Missile missile;
int gameMode = 0;
int score = 0;
void setup() {
size(1000, 750);
rectMode(CENTER);
textAlign(CENTER, CENTER);
splash = loadImage("Splash.png");
player = new Defender();
for (int row = 0; row < 15; row++) {
for (int column = 0; column < 3; column++) {
alienArray[row][column] = new Aliens((row + 1) * 50, (column + 1) * 50);
}
}
roboto = createFont("Roboto-Regular.ttf", 32);
textFont(roboto);
}
void draw() {
if (gameMode == 0) {
background(0);
textSize(75);
text("Space Invaders", width/2, height/8);
textSize(25);
text("Created by Ryan Simms", width/2, height/4);
textSize(45);
text("Press SPACE to Begin", width/2, height - 100);
image(splash, width/2-125, height/4 + 75);
} else if (gameMode == 1) {
background(0);
score();
player.updateDefender();
for (int row = 0; row < 10; row ++) {
for (int column = 0; column < 3; column++) {
alienArray[row][column].updateAlien();
}
}
if (missile != null) {
missile.updateMissile();
}
if (keyPressed) {
if (key == ' ') {
if (missile == null) {
missile = new Missile(player.x);
}
}
}
if (missile != null) {
if (missile.y <= 0) {
missile = null;
}
}
}
}
void score() {
textSize(20);
text("Score: " + score, 40, 15);
}
void keyPressed() {
if (key == ' ') {
gameMode = 1;
}
}
答案 0 :(得分:1)
逻辑缺陷在moveAlien()
方法中。您将外星人的x
位置移动一定的三角洲。如果检测到外星人已通过某个屏幕边界(x >= width
和x <=0
检查),则会反转增量以反转外星人的移动,并更新y
位置让它向下移动。
由于外星人以垂直方向定位,因此一列将始终到达这样的边界而其他列尚未到达。因此该列将下降,并开始恢复其移动。然后其他列将“赶上”。因此,它们不仅每列向下移动,列也将最终相互移动。
你必须通过检测最右边的外星人到达右边界,或者最左边的外星人到达左边界,然后进行更新来实现一些逻辑让你的外星人移动成一个块。所有外星人都要搬下来。
让每个外星人拥有自己的状态,将控制它的逻辑放在外星人类中并且称这实际上是良好的面向对象设计的想法。事实恰恰相反,对于太空入侵者来说,外星人都会相互影响,因为他们会在一个街区内移动。结果,您的设计导致他们具有太多的个性。也许你可以添加一些维护入侵者数组整体状态的类(例如最左边和最右边的列仍然有一个外星人,整个块的方向),在你的运动循环中控制它并让它更新外星人的位置转动。