我是 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(而且我是初学者并且完全依赖教程这一事实并没有多大帮助)
对不起,如果我的英语有缺陷,我不得不将所有代码翻译成英文以便更好地理解,因为之前它是葡萄牙语
我预计敌人会撞到墙上,就像任何碰撞一样,敌人在碰到墙壁时会停下来,但相反,敌人会像幽灵一样简单地穿过墙壁。
我尝试了一切,测试了碰撞掩码,检查了变量,代码的顺序,检查了对象的名称,但没有任何效果
在碰撞前调用 state() 和重力代码。它会在没有的情况下工作,但感觉不会像玩家在被告知移动后总是移动 1 帧那样反应灵敏。
您的碰撞代码是实际移动玩家的代码,因此除非您想传送玩家,否则切勿直接更改 x 和 y。而是使用变量 hsp 和 vsp。
在walking_state中,你调用“x += lengthdir_x(vel, _dir);”这将直接移动玩家。由于碰撞代码依赖于 hsp,因此通过直接改变它的 x 位置来移动玩家,不会检查该移动的碰撞。
你应该说:“hsp = lengthdir_x(vel, _dir);”然后碰撞代码将负责移动玩家和碰撞
编辑:另外,消息被交换的原因是因为 X 轴是水平的,Y 轴是垂直的。所以 X 是墙壁,Y 是地板和天花板。