如何建立一个瓷砖地图在Java2D游戏?
题
不知道该如何处理这个问题。
基本上,我想要一个像>瓦代表的400x400窗口。每一个坐在屏幕上,e。克 120x300
应该的一部分。我的小精灵4素,因此,我们可以说,1瓦=4的像素。播放器和敌人的精灵都是20x20,使每个玩家/坏人将占用5瓷砖。
然后我想用这类地图:
检索的x/y坐标的一个球员/怪物精灵通过供应的索引/id瓦。
知道那里的边界,因此它不移的精灵之外
400x400
, ,从而隐藏它.碰撞检测,知道是否瓦空缺,或没有。
怎么可以这样做?在谈论具体有关x、y->瓷砖或瓷砖指数>x、y转换(绘制精灵适当)。
解决方案
首先,分裂出去的概念的一个象素,只是关心表示,有一个瓦,这是一个实际的游戏对象有约束它地方的游戏。
我找到一个很好的方式来解开这样的事情是开始勾画出粗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 )
在所有内部单位的审计委员会在砖,不像素。然后像素的信息可以来自委员会独立地从瓦的代表与一位内部的乘法-
public Point getPixelPosition(int xTilePos, int yTilePos, int pixelsPerTile)..
瓷砖,可以在内部作为表示2d列或一个单列,在这种情况下,您会使用某种类型的内部表示,方案的地图你的阵列的委员会广场,因此国防部运算。
其他提示
简短的回答:乘法和模行动。
但是,如果这是绊倒你,我会建议你这样做的一个严重的数学进修之前尝试写一个游戏。
还有你的发言
我的小精灵4素,因此我们 可以说,1瓦=4的像素。的 播放器和敌人的精灵是所有20个x 20,每个玩家/坏人将占据 5瓷砖。
不工作了任何合理的几何形状。如果通过"1瓦=4素"你的意思是,瓷砖2x2,然后玩家需要100个,不是五个。如果你的意思是他们是4x4然后队员25个,这仍然不是5.
/** 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)。
为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必须返回收件。一组,如果订单并不重要,一个列表,如果它。