Java 如何在android的基于平铺的游戏中检查冲突?

Java 如何在android的基于平铺的游戏中检查冲突?,java,android,Java,Android,如何在基于平铺的游戏中检查碰撞?我已经看过android SDK的示例,但我不理解它们,因为我对android编程还不熟悉 这是我的地图和瓦片课程,我的英雄可以学习,这样我就可以让他在世界各地走动 class Map{ int X = 0; int Y = 0; int tileSize = 30; int [][]map= { //0 = empty tile //1 = wall /

如何在基于平铺的游戏中检查碰撞?我已经看过android SDK的示例,但我不理解它们,因为我对android编程还不熟悉

这是我的地图和瓦片课程,我的英雄可以学习,这样我就可以让他在世界各地走动

 class Map{
    int X = 0;
    int Y = 0; 
    int tileSize = 30;

    int [][]map= {
            //0 = empty tile
            //1 = wall
            //2 = player
            {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,1,1,2,1,1,0,0,0,0,0,1},
            {1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1},
            {1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1},
            {1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
            };



    ArrayList<Tile> tiles = new ArrayList<Tile>();;

    public Map(){
        loadArray();
    }

    public void loadArray(){

        for(int xTiles = 0; xTiles< map.length; xTiles++ ){
            for(int yTiles = 0; yTiles< map[xTiles].length; yTiles++){
                if(map[xTiles][yTiles]==1){//Wall
                tiles.add(new Tile(X, Y, tileSize, map[xTiles][yTiles]));
                tiles.get(tiles.size()-1).setColor(Color.GRAY);
                tiles.get(tiles.size()-1).walkable = false;
                X+=tileSize;
                }else if(map[xTiles][yTiles]==0){//Empty Tile
                    tiles.add(new Tile(X, Y, tileSize, map[xTiles]      [yTiles]));
                X+=tileSize;
                }else if(map[xTiles][yTiles]==2){//Player 
                    tiles.add(new Tile(X, Y, tileSize, map[xTiles][yTiles]));
                X+=tileSize;    
                }
            }
            Y+=tileSize;
            X=0;
            }
        }

    public void drawMap(Canvas canvas){
    for(int index = 0; index < tiles.size(); index++){
        tiles.get(index).drawTile(canvas);
    }
}

}

    class Tile{
    private int type;
    int X;
    int Y;
    int size;
    boolean walkable = true;
    Paint color = new Paint();;
    //rect for the bounds
    Rect bounds = new Rect();

    public Tile(){
        type = 0;
        X = 0;
        Y = 0;
        size = 0;
        color.setColor(Color.TRANSPARENT);
        bounds.set(X, Y, X+size, Y+size);

    }



    public Tile(int X, int Y , int tileSize, int type){
        this.type = type;
        this.X = X;
        this.Y = Y;
        size = tileSize;
        color.setColor(Color.TRANSPARENT);
        bounds.set(X, Y, X+size, Y+size);
    }



    public int getX() {
        return X;
    }



    public int getY() {
        return Y;
    }



    public void setX(int x) {
        X = x;
    }



    public void setY(int y) {
        Y = y;
    }



    public int getType() {
        // TODO Auto-generated method stub
        return type;
    }
    public Paint getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color.setColor(color);
    }

    public void drawTile(Canvas canvas){
        canvas.drawRect(bounds, color);
    }
}
类映射{
int X=0;
int Y=0;
int tileSize=30;
int[][]映射={
//0=空磁贴
//1=墙
//2=玩家
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,1,1,2,1,1,0,0,0,0,0,1},
{1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1},
{1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1},
{1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
ArrayList tiles=新的ArrayList();;
公共地图(){
loadArray();
}
公共void loadArray(){
for(int-xTiles=0;xTiles
这是我的英雄班

 class Hero{
    private static final int SIZE = 30;
    //Coordinates 
    int X = 60;
    int Y = 60;
    int sx=30, sy=30;
    private Paint paint = new Paint();
    public Rect Bounds = new Rect(X,Y,X+30,Y+30);
    boolean solid = true;

    //Map Things
    Map map;

    public Hero(Map map){
        this.map = map;
        paint.setColor(Color.RED);
        paint.setStyle(Style.FILL_AND_STROKE);

        location();
    }




    private void location() {

        for(int index = 0; index<map.tiles.size(); index++){
            if(map.tiles.get(index).getType() == 2){
                this.X = map.tiles.get(index).getX();
                this.Y = map.tiles.get(index).getY();

            }
        }

    }




    public void move(int KeyCode) {
        switch(KeyCode){

        case KeyEvent.KEYCODE_DPAD_DOWN:
            {if(Collision()){Y+=sy;} break;}
        case KeyEvent.KEYCODE_DPAD_UP:
            {Y-=sy; break;}
        case KeyEvent.KEYCODE_DPAD_LEFT:
            {X-=sx; break;}
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            {X+=sx; break;}
        }

    }







    private boolean Collision() {
        for(int index = 0; index< map.tiles.size(); index++){
            if(Rect.intersects(map.tiles.get(index).bounds, this.Bounds)){
                return map.tiles.get(index).walkable;}  
        }
        return false;
    }




    public int getX() {
        return X;
    }



    public int getY() {
        return Y;
    }



    public void setX(int x) {
        X = x;
    }



    public void setY(int y) {
        Y = y;
    }


    public void position(int x, int y){
        X = x;
        Y = y;

    }

    public void update(){
        Bounds.set(X, Y, (X+SIZE), (Y+SIZE));

    }


    public void Draw(Canvas canvas){
        canvas.drawRect(Bounds, paint);
        canvas.drawText("Player", Bounds.left, Bounds.top-5, paint);
    }
}
职业英雄{
私有静态最终整数大小=30;
//坐标
int X=60;
int Y=60;
intsx=30,sy=30;
私人油漆=新油漆();
公共矩形边界=新矩形(X,Y,X+30,Y+30);
布尔实数=真;
//地图
地图;
公众英雄(地图){
this.map=map;
油漆。设置颜色(颜色。红色);
绘制设置样式(样式填充和笔划);
位置();
}
私有空间位置(){

对于(int index=0;index如果您指的是检查您的互动程序是否“可行走”,那么每次您的玩家决定移动英雄时(可能是在移动操纵杆或单击时)您需要确定您的英雄将在哪个磁贴上,然后检查该磁贴是否已将walkable设置为true。您的代码已经很好地实现了这一点

如果你指的是与其他实体(如NPC)的碰撞,那么当玩家决定移动英雄时,你需要获得它们中每一个的位置,并确定新位置是否与其中一个可碰撞实体的位置相同

大致如下:

case KeyEvent.KEYCODE_DPAD_DOWN: {
int target = hero.getY() + 1;
if(map.getTile(hero.getX(), target).isWalkable())
   hero.setY(target);
break;
}

你必须记录英雄的最后位置,在每个移动事件中,你可以检查下一个相对于英雄的方向图块。正如你在二维矩阵中实现的,所以如果英雄的位置是说地图[0][0],玩家一次下来一个位置,那么地图中的相对位置就是地图[1][0]。这样可以最大限度地减少比较。每个方向都有二维权重,如
向上移动可以有[CurrentPosition.x-1][CurrentPosition.y-1],向左移动可以有[CurrentPosition.x][CurrentPosition.y+1]等等……

那么我应该在我的Tile类中添加Xcoord Ycood吗?这样我可以从Tile的ArrayList中调用它们既然你有确定的矩阵,你可以使用简单的
ArrayList
,而不是
ArrayList
,但是如果你想使用
ArrayList
,那么你可以创建另一个
ArraList
e>
其中
位置
Xcoord和Ycoord
。我不知道简单
数组
ArrayList中的性能热度。我终于做到了!它可能不对,但现在可以工作了。这是我为玩家移动的每个方向创建的移动方法感谢你的示例我能够让它工作代码相似
case KeyEvent.KEYCODE_DPAD_DOWN: {
int target = hero.getY() + 1;
if(map.getTile(hero.getX(), target).isWalkable())
   hero.setY(target);
break;
}