碰撞检查GMS2

问题描述 投票:1回答:1

我写了一个碰撞检查代码并运行它,完美地工作,但它只对一个图层工作。 例如,我的代码是获取图层ID并获取该图层中的瓷砖,并给它们一个1和0之间的数字,如果它是1,则有一个碰撞,否则(0)则没有障碍物。我的问题是我有多个图层,比如objects和objects2。但我不能选择 "objects2 "层来获取id。我只能选择 "objects "层。这是我的代码。

"CREATE" EVENT IN COLLISION OBJECT "obj_collision"

var lay_id = layer_get_id("Objeler");
var lay_id2 = layer_get_id("Objeler2");
var map_id = layer_tilemap_get_id(lay_id);
var map_id2 = layer_tilemap_get_id(lay_id2);

hcells = room_width / 16;
vcells = room_height / 16;

for (var yy = 0; yy < vcells; yy ++){
    for (var xx = 0; xx < hcells; xx ++){
            //Bu kod tile'ın integer değerini veriyor.
            tile = tilemap_get(map_id, xx, yy);         

            if (tile <= 6){
                //Hareket edebilir.
                a_grid[xx,yy] = 0;
            }else{
                //Hareket edemez.
                a_grid[xx,yy] = 1;
            }
        }
    }

    for (var yy = 0; yy < vcells; yy ++){
    for (var xx = 0; xx < hcells; xx ++){
            //Bu kod tile'ın integer değerini veriyor.
            tile2 = tilemap_get(map_id2, xx, yy);           

            if (tile2 <= 6){
                //Hareket edebilir.
                a_grid2[xx,yy] = 0;
            }else{
                //Hareket edemez.
                a_grid2[xx,yy] = 1;
            }
        }
    }


STEP EVENT IN CHARACTER OBJECT "obj_karakter"

#region MOVEMENT

gridX = floor(x/16);
gridY = floor(y/16);

if (canMove){
    if (keyboard_check(vk_up)){
        if (gridY > 0) && (obj_collision.a_grid[gridX, gridY - 1] == 0){
            targetX = x;
            targetY = y - 16;
            sprite_index = spr_yukarikarakter;
            canMove = false;
        }
    }
    if (keyboard_check(vk_down)){
        if (gridY < (obj_collision.vcells - 1)) && (obj_collision.a_grid[gridX, gridY + 1] == 0){
            targetX = x;
            targetY = y + 16;
            sprite_index = spr_asagikarakter;
            canMove = false;
        }
    }

    if (keyboard_check(vk_left)){   
        if (gridX > 0) && (obj_collision.a_grid[gridX - 1, gridY] == 0){
            targetX = x - 16;
            targetY = y;
            sprite_index = spr_solakarakter;
            canMove = false;
        }
    }

    if (keyboard_check(vk_right)){
        if (gridY < (obj_collision.hcells - 1)) && (obj_collision.a_grid[gridX + 1, gridY] == 0){
            targetX = x + 16;
            targetY = y;
            sprite_index = spr_sagakarakter;
            canMove = false;
        }
    }
}
    if (x != targetX) || (y != targetY){
        if (x < targetX) x += stepSpeed;
        if (x > targetX) x -= stepSpeed;
        if (y < targetY) y += stepSpeed;
        if (y > targetY) y -= stepSpeed;
    }else{
    if (x == targetX) || (y == targetY){
        canMove = true;
        if (sprite_index == spr_yukarikarakter) sprite_index = spr_bostayukari
        if (sprite_index == spr_asagikarakter) sprite_index = spr_bostaasagi
        if (sprite_index == spr_solakarakter) sprite_index = spr_bostasola;
        if (sprite_index == spr_sagakarakter) sprite_index = spr_bostasaga;
       }
    }


#endregion
collision-detection collision game-maker-studio-2 game-maker-language
1个回答
0
投票

我在Heartbeast的一个教程中学习了这个方法。

我用一个不可见的对象层来处理对象碰撞 然后用另一个对象层纯粹是为了视觉效果,在碰撞上作画。

我的碰撞对象是透明的方块,这样很容易判断出碰撞的位置。完成碰撞层后,我可以用眼睛符号隐藏它,或者用代码隐藏层。(后面可能会提供例子)

这样一来,碰撞与你使用哪块瓷砖无关,你只需要使用一个图层进行碰撞。

© www.soinside.com 2019 - 2024. All rights reserved.