2009-03-08 21 views
3

この問題にどう対処するかわかりません。2DゲームのためにJavaでTiledマップを構築するにはどうすればいいですか?

基本的に、400x400ウィンドウのPixel - > Tile表現が必要です。画面上の各座標(例:120x300)は、タイルの一部にする必要があります。最小のスプライトは4ピクセルなので、1タイル= 4ピクセルと言うことができます。プレイヤーと敵のスプライトはすべて20 x 20なので、各プレイヤー/悪い人は5タイルを占有します。タイルのインデックス/ IDを補給することにより、プレイヤー/モンスタースプライトのX/Y座標を取得し

  • それから私は、このマップクラスを使用します。

  • 境界がどこかを知っているので、スプライトを400x400以上に移動しないので隠蔽します。

  • タイルが空いているかどうかを知る衝突検出。

どのようにすることができますか?ここでは、x、y-> tileまたはtile-> x、y変換(スプライトを適切に描画するための変換)について具体的に説明します。

答えて

4

まず、表現に関係しているピクセルの概念を、実際のゲームオブジェクトであるタイルゲームの制約条件。

これは、あなたが望むものの粗いAPIをスケッチするように始めるのが良い方法を見つけます。次のようなものがあります。

public class Board { 
    public Board (int width, int height){.. } 
    public boolean isOccupied(int x, int y){.. } 
    public void moveTo(Point from, Point to) { .. 
    (maybe throws an exception for outofbounds) 

ここで、ボードのすべての内部ユニットはタイルであり、ピクセルではありません。 次に画素情報を使用すると思います。その場合にタイルが内部、2Dアレイ又は単一のアレイとして表すことができる内部multiplication-

public Point getPixelPosition(int xTilePos, int yTilePos, int pixelsPerTile).. 

のビットとタイル表現からindependantlyボードから誘導することができますいくつかの種類の内部表現スキームを使用して、配列をボードの四角形にマッピングします。

+0

そのgetPixelPosition()のコードと私はあなたの答えを受け入れるでしょう:) –

+0

Geez ClickUpvoteはヒントを受け取ります。モデルとしてスクリーンを使用するのは良い設計ではありません。メモリモデルを使用します。色と位置は独立した属性です。メモリモデルを使用して、他の属性を格納することもできます。例:http://www.fastgraph.com/qfrip.html – jim

+0

x、y属性を知らなくても、スプライトを画面上に描画して、あるタイルから別のタイルに移動したことを示すことはできますか? –

1

短い答え:乗算とモジュロ演算。

しかし、これがあなたのおかげだとすれば、ゲームを書く前に深刻な数学のリフレッシャーをすることをお勧めします。

また、あなたの文

は私の小さいスプライトは4つのピクセルですので、我々 は1枚のタイル= 4つのピクセルと言うことができます。 プレーヤーと敵のスプライトはすべて20 x です。したがって、各プレーヤー/悪い人は 5タイルを占有します。

は、妥当なジオメトリでは機能しません。 「1タイル= 4ピクセル」でタイルが2×2である場合、プレーヤーは5でなく100を取る。プレイヤーが4x4であることを意味するならば、プレイヤーは25をとりますが、これはまだ5ではありません。

+0

タイル=ピクセル/ 4.小さなスプライト(4x4)= 4/4 = 1タイル。大スプライト(20×20)= 20/4 = 5。いいえ?私の悩みは、5などのタイル指数に基づいてx、y座標を検索する方法です。おそらく私に例を教えてもらえますか? –

+0

号20画素×20画素= 400平方画素。 4×4タイルは16平方ピクセルです。 400/16 = 400個の正方形ピクセル領域内に25×4×4のタイル。 – Paul

1
/** size of a tile in pixel (for one dimension)*/ 
int TILE_SIZE_IN_PIXEL = 4; 
/** size of a piece in tiles (for one dimension)*/ 
int PIECE_SIZE_IN_TILE = 5; 


public int tileToPixel(int positionInTiles){ 
    return TILE_SIZE_IN_PIXEL * positionInTiles; 
} 

/** returns the tile coordinate to which the given tile coordinate belongs 

Note: tileToPixel(pixelToTile(x)) only returns x if x is the upper or left edge of a tile 
*/ 
public int pixelToTile(int positionInPixel){ 
    return positionInPixel/TILE_SIZE_IN_PIXEL; 
} 

おそらく2つの引数(xとy)で操作するメソッドが必要になります。

ID->ピース変換では、さまざまな方法があります。どちらを選択するかは、正確な要件(速度、ゲームのサイズなど)に依存します。したがって、実装の詳細を隠しておき、後で変更することができます。

私は本当の簡単な解決策を開始したい:あなたが開始される

public class Piece{ 
    /** x position measured in tiles */ 
    private int x; 
    /** y position measured in tiles */ 
    private int y; 

    /** I don't think you need this, but you asked for it. I'd pass around Piece instances instead */ 
    private final Long id; 

    public void getX(){ 
     return x; 
    } 
    public void getY(){ 
     return y; 
    } 

    public void getID(){ 
     return id; 
    } 

} 

public class Board(){ 
    private Set<Long,Piece> pieces = new HashMap<Piece>(pieces); 

    public Piece getPieceOnTile(int tileX, int tileY){ 
     for(Piece piece:pieces){ 
      if (isPieceOnTile(piece, tileX, tileY)) return piece; 
     } 
    } 

    private boolean isPieceOnTile(piece, tileX, tileY){ 
     if (piece.getX() < tileX) return false; 
     if (piece.getX() > tileX + PIECE_SIZE_IN_TILE) return false; 

     if (piece.getY() < tileY) return false; 
     if (piece.getY() > tileY + PIECE_SIZE_IN_TILE) return false; 

     return true; 
    } 
} 

希望。近くのコンパイラなしですべてのコードが書かれているので、クリエイティブコモンズライセンスのもとで配布される誤植やバグが含まれます。

多くの個数がない場合は、セットにピースを保持するアプローチがうまくいくはずです。ほとんどのボード領域にピースが含まれていない限り、2D配列よりも優れているはずです。現在、すべてのものは重なり合う部分がないと仮定しています。これらのgetPieceOnTileが必要な場合は、コレクションのコレクションを返す必要があります。注文が問題でない場合はセット、そうであればリスト。

+0

タイル番号に基づいてx.y座標を特定する方法を教えてください。それは、私が –

+0

を見つけ出すことができなかったことです。これは、tileToPixelメソッドの目的です –