2017-01-15 4 views
0

さて、私は楽しい時間の中でゲームを構築しています。これは仕事や学校のためではありません。私は卒業した。私がしなかったのはゲームプログラミングを卒業したので、私が行くにつれてそれを学んでいます。私はゲームのカップルを開発しましたが、これはおそらく私の最も高度なものです。2D配列を使用したAndroidビデオゲーム - 接続の一致の検索

私は約5dアレイを持っています。 1つはビットマップを保持するもの、1つはXの位置を保持するもの、もう1つはYの位置を保持するもの、もう1つは要素の状態を保持するもの(鳥、ステータスは飛行状態とヒット状態)各アレイは一緒に働いて、鳥が羽ばたくようなゲームボードを私に与えます。私はゲームボードに触れることができる、私は場所を戻す。この部分はすべて動作します。

私がしようとしているのは、近くの要素が、表示された要素(タッチされた項目)と同じ要素であるかどうかを検出する方法を作成することです。これが起こるとき、私は基本的にこれらの要素のすべてに "ヒット"としてフラグを立てたいと思う。これは、要素の周りに8つのブロックを取得するだけではなく、これは、すべての項目がフラグを立てたアイテムに触れ、それらを「ヒット」として識別させることになります。あなたはたぶんこのようなゲームをプレイしたことでしょう。彼らはゲームのようなパズルです(あなたが鳥があなたの上に倒れ、それがあなたのキャラクターを殺すので、鉱山はクーラーです:))。私は別の2D配列を作成してヒット状態にしました(この問題を解決する私の試みの最新の反復で、ヒット数を2倍にしないで、私は-1で数えない項目にフラグを立てます。

私の配列はすべて、[8] [8]配列である彼らは変更しないでください、彼らは常にそのようになります。これは、それが簡単に例ようにする必要があります。。。

sample from game

画像内の丸い赤い鳥もヒットしたはずです。

オンコード:

public void calculateGunDestruction(){ 
    int currentRow = targetBirdRow; 
    int currentCol = targetBirdCol; 
    int hitbird = whichBird[targetBirdRow][targetBirdCol]; 
    boolean[] pathState = new boolean[5]; 
    countedArray = new int[8][8]; 
    for(int j = 0; j < countedArray.length;j++){ 
     for(int jj = 0; jj< countedArray[j].length;jj++){ 
      countedArray[j][jj] = 0; 
     } 
    } 
    for(int i = currentRow;i < whichBird.length; i++) { 
     for (int ii = currentCol; ii < whichBird[i].length; ii++) { 
      pathState = pathMatch(i,ii,hitbird); 
      if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
       break; 
      } 
     } 
     if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
      break; 
     } 
    } 
    for(int i = currentRow;i > -1; i--) { 
     for (int ii = currentCol; ii < whichBird[i].length; ii++) { 
      pathState = pathMatch(i,ii,hitbird); 
      if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
       break; 
      } 
     } 
     if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
      break; 
     } 
    } 
    for(int i = currentRow;i < whichBird.length; i++) { 
     for (int ii = currentCol; ii > - 1; ii--) { 
      pathState = pathMatch(i,ii,hitbird); 
      if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
       break; 
      } 
     } 
     if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
      break; 
     } 
    } 
    for(int i = currentRow;i > -1; i--) { 
     for (int ii = currentCol; ii > - 1; ii--) { 
      pathState = pathMatch(i,ii,hitbird); 
      if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
       break; 
      } 
     } 
     if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){ 
      break; 
     } 
    } 
} 


public boolean[] pathMatch(int i, int ii, int hitbird){ 

    boolean pathTop = false; 
    boolean pathBottom = false; 
    boolean pathLeft = false; 
    boolean pathRight = false; 

    if(findMatch(i,ii,hitbird)) { 
     if(countedArray[i][ii] == 0) { 
      countedArray[i][ii] = 1; 
      destroyedBirds(i, ii); 
     } 
     if((i - 1) > -1) { 
      if (countedArray[i - 1][ii] == 0) { 
       if (findMatch(i - 1, ii, hitbird)) { 
        countedArray[i - 1][ii] = 1; 
        destroyedBirds(i - 1, ii); 
        pathLeft = true; 
       } else {countedArray[i - 1][ii] = -1;pathLeft = false;} 
      } else {pathLeft = false;} 
     } else {pathLeft = false;} 
     if((i + 1) < 8) { 
      if (countedArray[i + 1][ii] == 0) { 
       if (findMatch(i + 1, ii, hitbird)) { 
        countedArray[i + 1][ii] = 1; 
        destroyedBirds(i + 1, ii); 
        pathRight = true; 
       } else {countedArray[i + 1][ii] = -1;pathRight = false;} 
      } else {pathRight = false;} 
     }else {pathRight = false;} 
     if((ii - 1) > -1) { 
      if (countedArray[i][ii - 1] == 0) { 
       if (findMatch(i, ii - 1, hitbird)) { 
        countedArray[i][ii - 1] = 1; 
        destroyedBirds(i, ii - 1); 
        pathTop = true; 
       } else {countedArray[i][ii - 1] = -1;pathTop = false;} 
      } else {pathTop = false;} 
     } else {pathTop = false;} 
     if((ii + 1) < 8) { 
      if (countedArray[i][ii + 1] == 0) { 
       if (findMatch(i, ii + 1, hitbird)) { 
        countedArray[i][ii + 1] = 1; 
        destroyedBirds(i, ii + 1); 
        pathBottom = true; 
       } else {countedArray[i][ii + 1] = -1;pathBottom = false;} 
      } else {pathBottom = false;} 
     }else {pathBottom = false;} 
    }else{ 
     countedArray[i][ii] = -1; 
    } 

    return new boolean[]{pathTop,pathBottom,pathLeft,pathRight}; 
} 

public boolean findMatch(int row,int col,int hitbird){ 
    if(hitbird == whichBird[row][col]){ 
     return true; 
    } 
    return false; 
} 
public void destroyedBirds(int row,int col){ 
    destroyedBirdsRow.add(0, row); 
    destroyedBirdsCol.add(0, col); 
} 

私はいくつかの異なる方法を試しましたが、これはこの記事の最新のものです。いくつかは他のものよりも近くにあったが、誰もそれを得ていなかった。これらは本当に簡単なことだと思われますが、私は専門的にゲームプログラマーではなく、ゲームプログラミングは私が学ぼうとしているものです。

上記のコードは、基本的に2D配列をタッチした位置から四分円に分割しています。私はコントロールを追加しました "countedArray"この試みでは、実際の方法は、このメソッドでそれを追跡するいくつかの並べ替えの方法を使用してカウントを停止する知っていたので知っていた。タッチポイントから左/下、左、上、右/下、右/上に移動します。上部近く タッチポイント:

int currentRow = targetBirdRow; 
int currentCol = targetBirdCol; 
int hitbird = whichBird[targetBirdRow][targetBirdCol]; 

は鳥が触れた鳥や要素の識別子を保持するヒット。これはひどく上品な解決策ではありませんが、うまく機能しません。この時点で、優雅さは窓から放たれています。私は誰もループのない個々の項目のチェックと作品の希望を読むことができる、長く厄介なコードを書くつもりです。だから、石畳のソリューションは大丈夫です。参照便宜上

- 上記のコードは次のようになりますから呼び出されたエリア:私は完全なゲーム画像を追加するために編集した

if(playerObj.getWeaponSelected() == wGun) { 
    calculateGunDestruction();//CALLING FUNCTION 

    for (int i = 0; i < destroyedBirdsRow.size(); i++) { 
     state[destroyedBirdsRow.get(i)][destroyedBirdsCol.get(i)] = hit; 
    } 
    destroyedBirdsRow.clear(); 
    destroyedBirdsCol.clear(); 

Full Game Image 。なぜそれが複雑であるかに関する質問は私に少し説明するよう促した。 (そして、はい、それを行うよりよい方法があるかもしれません - 私は確かにこれに関する専門家ではありません)。アイデアは、鳥がヒットすると、簡単なヒットイメージを表示し、ヒットした鳥を消してから、左から鳥を移動させ、鳥を置き換える新しい鳥を追加します。その構造はすべて機能します - おそらく、設計上複雑すぎるとは限りません。シングルヒット作品、爆弾のヒットの仕事(あなたがランダムにボード上に新しい鳥として表示される爆弾を撃つとき)。私はヒットした鳥が残したギャップを埋めるために移動する必要のある鳥のアニメーションをガイドするためにポジションアレイを使用します。私はより良い方法を学ぶことに驚くことはありません、私はここに来て、学ぶためにこれをやっていますので、質問の元の範囲外で自由にコメントすることができます。それは他の人が学習しようとするのを助けるかもしれません。私はこれが本当にこのようなサイトの最も重要なポイントだと思います。

私が働くのが難しい部分です。私が銃を撃つとき、アイデアはヒットした鳥に触れている同じ色/種のすべての鳥をペグし、ヒットとしてマークし、それらを消滅させることでした。そして、はい、私は現在、そのセクションのコードはおそらく私が書いた最も複雑なバージョンです。私は今少なくとも12回以上始まった。最も単純なバージョンは、ループの2つのグループと、より少ない外部メソッド(それはサイズの半分でした)を伴いました - それはこのものと同様に働きましたが、余分な鳥にフラグを付ける傾向がありました。この1つは余分な鳥にフラグを付けるようには見えませんが、それらをすべて取得するわけではありません。

私は過去にいくつかの小さなゲームを作りました - しかし、これは私が試した中で最も複雑なゲームです。

答えて

0

おそらくこれであなたの落ち込みは、設計上の複雑さを超えています。私は2Dのゲームボードを格納するために5つの8×8アレイが必要な理由を理解するのに苦労しています。ヒットのタイルをマークし、その周りの人々のための

あなたのソリューションは、簡単にするために、このようなものでなければなりません。もちろん

public static final int NOTHING=0,BIRD_FLYING=1,BIRD_HIT=2, 
         TILE_LAND=0,TILE_WATER=1; 

private int[][] gameBoard=new int[8][8]; // Store terrain etc. 
private int[][] birds=new int[8][8]; // Store entities on the map 
private int tileSize=32; // Store the size of the tile in pixels 
private Image landImg,seaImg,flyingImg,hitImg; // Store the tile images (or use 1 tilesheet and segment it in the draw method) 

private void hitTile(int x,int y) 
{ 
    for(int i=-1;i<=1;i++) 
    { 
     for(int j=-1;j<=1;j++) 
     { 
      birds[hitX+i,hitY+j]=BIRD_HIT; 
     } 
    } 
} 

private void drawTheTiles() 
{ 
    for(int i=0;i<8;i++) 
    { 
     for(int j=0;j<8;j++) 
     { 
      // Draw background tiles first 
      switch(gameBoard[i][j]) 
      { 
       default: 
       case TILE_LAND: 
        g.drawImage(landImg,i*tileSize,j*tileSize,this); 
        break; 
       case TILE_SEA: 
        g.drawImage(seaImg,i*tileSize,j*tileSize,this); 
        break; 
      } 
      // Draw entities on tiles last 
      switch(gameBoard[i][j]) 
      { 
       default: 
       case NOTHING: 
        // Don't draw anything 
        break; 
       case BIRD_FLYING: 
        g.drawImage(flyingImg,i*tileSize,j*tileSize,this); 
        break; 
       case BIRD_HIT: 
        g.drawImage(hitImg,i*tileSize,j*tileSize,this); 
        break; 
      } 
     } 
    } 
} 

、あなた自身のハンドリング、画像の読み込み、レンダリング、および配列に追加する必要があります位置はタイルインデックスによって暗示されることができるので、このような2Dゲームボード用の配列の位置を格納する必要はないはずである。

何かを続けることを望みます。しかし、私はあなたの元のプログラム/前提を完全には理解していません。

+0

私が選んだ唯一の理由は、(多分複雑かもしれませんが)8X8ボードはゲームボード全体ではないということです。 XとYの位置が保存されてゲームボード上に配置され、ヒットしたときにヒットしたと見なされ、ヒットした鳥や鳥が消え、新しい鳥が左から飛んできます。ポジション。配列の形にしておくと、ループに入れて変更のアニメーションをより簡単に表示できます。 (または少なくとも私が考えることができる最も簡単な方法)。 8X8ボードの下にはプレーヤーがいて、彼女は鳥を撃つ。彼女はうんざりすると健康を失う。 – jrende

+0

私は自分の考えを変えるかもしれないと思う。私はシングルヒットを持っています。私は爆弾のヒットを行うことができます(単一の色のすべての鳥を取り除く)が、このグループのヒット物は私よりもはるかに賢く誰かを取るだろう。私は何かをあきらめることはあまりにも難しく、解決策を見つけるために私をもっと追いやっています。 – jrende

関連する問題