/** 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が必要な場合は、コレクションのコレクションを返す必要があります。注文が問題でない場合はセット、そうであればリスト。
そのgetPixelPosition()のコードと私はあなたの答えを受け入れるでしょう:) –
Geez ClickUpvoteはヒントを受け取ります。モデルとしてスクリーンを使用するのは良い設計ではありません。メモリモデルを使用します。色と位置は独立した属性です。メモリモデルを使用して、他の属性を格納することもできます。例:http://www.fastgraph.com/qfrip.html – jim
x、y属性を知らなくても、スプライトを画面上に描画して、あるタイルから別のタイルに移動したことを示すことはできますか? –