/** 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;
}
您可能还需要对两个参数(x 和 y at)进行操作的方法。
对于 ID->piece 转换,反之亦然,您可以使用多种方法。选择哪一个取决于确切的要求(速度、游戏大小......)。因此,请确保您隐藏了实现细节,以便以后可以更改它们。
我将从一个真正简单的解决方案开始:
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 必须返回一个 Collection of pieces。如果顺序无关紧要,则为 set,如果重要,则为 List。