2017-02-13 7 views
1

タイトルはほぼすべて説明していますが、最近私は2D配列について学びましたが、私が作成しているこのスペースインベーダーゲームで2D配列を正しく動かす方法について少し混乱しています。スペースインベーダーのための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; 
    } 
} 

答えて

1

ロジック欠陥がmoveAlien()方法です。あなたは特定のデルタで外人のxの位置を移動します。外国人が何らかのスクリーン境界(x >= widthx <=0の小切手)を通過したことが検出された場合、デルタを逆転させて外国人の動きを逆転させ、yの位置を更新して下に移動させます。

エイリアンは垂直列に配置されているため、一方の列は常にそのような境界に到達し、他方の列はまだ到達していません。その列が下がり、その動きを元に戻すようになります。他の列は、後で「追いつく」。そのため、列ごとに下に移動するだけでなく、列も互いに移動します。

ブロックされたエイリアンが右端の境界に達したとき、または残っている左端のエイリアンが左の境界に達したときを検出して、エイリアンをブロックとして移動させてから更新する必要がありますすべての外国人が下に移動する。

それぞれのエイリアンに独自の状態があり、それをエイリアンクラスに制御するロジックを置き、それを実際にオブジェクト指向の設計にするという考え方です。スペースインベーダーの場合、エイリアンはブロック内を移動するため、エイリアンはすべて互いに影響します。その結果、デザインの個性が大きすぎます。おそらく、あなたはインベーダー配列全体の状態を維持するいくつかのクラスを追加することができます(左端と右端の列にはブロック全体の方向性があります)、動きループ内のコントロールを行い、エイリアンの位置を更新します順番。

+0

私はこれを行う方法、または一般的な方向の少なくとも1点について説明したいと思っていました。 – Ryan

+0

@Ryan問題の根源を教えてくれました。互いの間を移動し始める。プログラミング方法を学びたい場合は、コードをリファクタリングする方法について考える必要があります。あなたの質問はコードを編集する場所でした。私はそれに答えた。あなたのためにそれをコーディングすることは、あなたの学習にはほとんど価値がないでしょう。 SOはそのようなサイトではありません。 –

+0

私はこれまでにこのサイトで他に1つの質問をしてきました。人々は私を助けてくれて満足していました。私は以前に問題が何かを理解しようと数時間を費やしました。私はしばしば助けを求めるのが好きではありませんが、私がするときは、少なくとも私が何を変える必要があるかを私に見せてくれるのはうれしいでしょう。エイリアンクラスで2D配列を作成する必要がありますか?私は2D配列を初めて使いました。私は大学から助けを得ることになりましたが、今週はオフになりました。 – Ryan

関連する問題