【发布时间】:2020-08-26 02:24:34
【问题描述】:
我已经编写了一个碰撞检查代码并运行了它,运行良好,但它只适用于一层。例如,我的代码正在获取图层 id 并获取该图层中的图块并给它们一个介于 1 和 0 之间的数字。如果为 1,则表示碰撞,否则 (0) 则没有障碍物。我的问题是我有不止一层,比如对象和对象2。但是我不能选择“objects2”层来获取id。我可以选择“对象”层。这是我的代码:
"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
【问题讨论】:
-
你能解释一下你需要两个碰撞层吗?可能不需要处理第二次碰撞。
-
@Steven 是的,当然,我有一个地形层,上面有对象层,例如树木、灌木丛。 (环境事物)。在此之上,我有 objects2 层,例如房屋、农场围栏等。我需要不止一层,因为我需要把一些东西放在一些东西上。我想你已经明白了 :D link 这是我地图的图像。
-
我明白了,感谢您提供的信息。根据我的经验,我使用一个不可见的对象层进行对象碰撞,并使用另一个对象层纯粹用于视觉效果,以绘制碰撞,这样碰撞与您使用的瓷砖无关,您只需要使用一个碰撞层。
-
@Steven 我已经传递给该系统,因为它更容易做到。感谢您的回答。我很感激。 :)
-
没问题,在这种情况下,我会将我的评论标记为答案。
标签: collision-detection collision game-maker-studio-2 game-maker-language