敌人的垂直碰撞不起作用

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

我是 Gamemaker 的初学者,我正在做一个简单的平台游戏,昨天我正在编程让敌人在静止不动或移动之间切换,在这个过程中我去做他的碰撞,并为一些原因,水平碰撞完美,但垂直碰撞没有,我尝试了一切,但垂直碰撞似乎不存在。

下面是创建事件中敌人的“AI”代码,让他在站立或行走之间切换。

//BIGGER SPRITE
image_xscale = 3
image_yscale = 3

//VARIABLES
hsp=0
vsp=0
grav=2

state=noone 
state_time = room_speed * 10;
state_timer=0;

destination_x = x;
vel=2
//STANDING STATE

//WALKING STATE

//METHOD OF CHANGE OF STATE
change_state = function(_state)
{
    state_time--;
    state_timer = irandom(state_time);
    
    if (state_timer == state_time or state_time <= 0)
    {
        //I'LL CHECK WHICH STATE SHOULD I GO
        state = _state[irandom(array_length(_state)-1)];
        
        time_state = room_speed * 10;
    }
}


//METHOD OF IT STANDING
standing_state = function()
{
    //image_blend = c_white;
    
    sprite_index = spr_enemy
    
    change_state([walking_state, standing_state]);
}

walking_state = function()
{
    //MAKE HIM WALK
    //HE WILL CHOOSE ANY POINT WITHIN THE ROOM
    //CHECKING MY DISTANCE FROM THE DESTINATION
    var _dist = point_distance(x, y, destination_x, y);
    //I WILL ONLY SET A DESTINATION IF I AM CLOSE TO MY DESTINATION
    if (_dist < 100)
    {
        destination_x = random(room_width);
    }
    
    //FINDING THE DIRECTION TO MY DESTINATION
    var _dir = point_direction(x, y, destination_x, y)
    
    //MOVING TO MY DESTINATION
    x += lengthdir_x(vel, _dir);
    
    //image_blend = c_red;
    
    //SETTING THE SPRITE
    sprite_index = spr_enemy_run
    if (destination_x < x)
    {
        image_xscale = -3
    }
    else
    {
        image_xscale = 3
    }
    
    change_state([standing_state, walking_state]);
}

//SETTING ITS INITIAL STATE
state = standing_state;`

下面是step事件中碰撞和重力的代码

//HORIZONTAL COLLISION
if place_meeting(x + hsp, y, obj_block)
{
    var _hsp = sign(hsp);
    //AS LONG AS I'M NOT COLLIDING 1 PIXEL IN THE DIRECTION I'M
    while (!place_meeting(x + _hsp, y, obj_block))
    {
        //I MOVE 1 PIXEL IN THAT DIRECTION
        x+=_hsp;
    }
    //I'VE MOVED WHAT I HAD TO MOVE, AND NOW I'M COLLIDING.
    //I END MY SPEED
    hsp = 0;
    show_debug_message("colliding with the floor")
}
//I MOVE
x += hsp;

//VERTICAL COLLISION
if place_meeting(x, y + vsp, obj_block)
{
    var _vsp = sign(vsp);
    while (!place_meeting(x, y + _vsp, obj_block))
    {
        y+=_vsp;
    }
    vsp = 0;
    show_debug_message("colliding with the wall")
}
y += vsp;

//GRAVITY
if !place_meeting(x,y,obj_block)
{
    vsp += grav;
}


//RUNNING THE CURRENT STATE
state();

还有一点我不明白,“撞墙”和“撞地板”的信息是反着出现的,即当敌人撞墙时,出现“撞地板”的信息,当它与地板碰撞时,会出现“与墙壁碰撞”的消息。

我需要帮助,因为我快要疯了 lmao(而且我是初学者并且完全依赖教程这一事实并没有多大帮助)

对不起,如果我的英语有缺陷,我不得不将所有代码翻译成英文以便更好地理解,因为之前它是葡萄牙语

我预计敌人会撞到墙上,就像任何碰撞一样,敌人在碰到墙壁时会停下来,但相反,敌人会像幽灵一样简单地穿过墙壁。

我尝试了一切,测试了碰撞掩码,检查了变量,代码的顺序,检查了对象的名称,但没有任何效果

artificial-intelligence collision game-maker-studio-2
1个回答
0
投票

在碰撞前调用 state() 和重力代码。它会在没有的情况下工作,但感觉不会像玩家在被告知移动后总是移动 1 帧那样反应灵敏。

您的碰撞代码是实际移动玩家的代码,因此除非您想传送玩家,否则切勿直接更改 x 和 y。而是使用变量 hsp 和 vsp。

在walking_state中,你调用“x += lengthdir_x(vel, _dir);”这将直接移动玩家。由于碰撞代码依赖于 hsp,因此通过直接改变它的 x 位置来移动玩家,不会检查该移动的碰撞。

你应该说:“hsp = lengthdir_x(vel, _dir);”然后碰撞代码将负责移动玩家和碰撞

编辑:另外,消息被交换的原因是因为 X 轴是水平的,Y 轴是垂直的。所以 X 是墙壁,Y 是地板和天花板。

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