GameMaker Collision工作太快

时间:2016-01-04 16:20:44

标签: game-maker

在编程方面,我有点像初学者,最近我在GameMaker Studio中为一个学校项目编写游戏代码:Professional并且在我的玩家登陆另一个游戏方面遇到了一个小问题敌人。因为它现在是我的玩家,当处于足够高的向下速度时将不会注册登陆并摧毁敌人的实例而只是受到伤害(或者游戏将重新启动,因为我还没有实现该部分)。已经测试了几个东西,似乎在更高的速度下玩家跳过它可以摧毁敌人的范围,而是进入敌人附近受到伤害,尽管在低速时玩家与敌人发生碰撞精细。玩家以可变高度跳跃,该高度由他们握住空格键的时间量控制。我相信这可能是由于我的重力值,因为它不是一个整数,但我不确定。我也试过给玩家添加一个终极速度,但是我试过的仍然保持相同游戏美学的数字并没有解决这个问题。

以下是我的玩家对象和敌方对象的代码: 玩家对象:

Create Event:
execute code:

hsp = 0
vsp = 0
grav = 1.5
movespeed = 8
move = 0
jumpsmax = 2
jumps = 0
jumpspeed = 18
dir = 0

Step Event:

execute code:

//Movement
//Main controls
key_right = keyboard_check(ord("D"));
key_left = keyboard_check(ord("A")) * -1;
key_jump = keyboard_check_pressed(vk_space);
key_jump_held = keyboard_check(vk_space);

move = key_left + key_right;
hsp = move * movespeed;
vsp += grav;

if (place_meeting(x,y+1,obj_wall))
{
     jumps = jumpsmax;
}

if (keyboard_check(vk_down) != 1)
{
    if (key_jump) && (jumps > 0)
    {
       jumps -= 1;
       vsp = -jumpspeed;
    }
}

if (vsp < 0) && (!key_jump_held) vsp = max(vsp,-jumpspeed/3)

//Horizontal Collision
if (place_meeting(x+hsp,y,obj_wall))
{
    while(!place_meeting(x+sign(hsp),y,obj_wall))
    {
        x += sign(hsp);
    }
hsp = 0;
}
x += hsp;

//Vertical Collision
if (place_meeting(x,y+vsp,obj_wall))
{
    while(!place_meeting(x,y+sign(vsp),obj_wall))
    {
        y += sign(vsp);
    }
    vsp = 0;
}
y += vsp;
//Shooting
key_k = keyboard_check_pressed(ord("K"))
if (key_k > 0)
{
    bullet = instance_create(x+5*move,y,obj_pellet);
    bullet.hsp = image_xscale * 20;
}
//Animation
if (move!=0) image_xscale= move;
dir = image_xscale; 
if (place_meeting(x,y+1,obj_wall))
{
    if (move != 0)
    {
        sprite_index = spr_playerwalk;
    }
    else
    {
        sprite_index = spr_playeridle;
    }
}
if (vsp = -18) sprite_index = spr_playerjump;
if (sprite_index = spr_playerjump) && (image_index = 11) sprite_index = spr_playerrise;
if (vsp = 1.5) sprite_index = spr_playerfall;
if (sprite_index = spr_playerfall) && (image_index = 11) sprite_index = spr_playerdescend;
//Bullet Collision
if (place_meeting(x,y,obj_badpellet))
{
    with (obj_badpellet)
    {
        if (place_meeting(x +- 2,y,obj_player))
            {
                game_restart();
            }
    }
instance_destroy();
}



restart = keyboard_check(ord("R"))    
if (restart = 1) game_restart();

敌人对象:

execute code:

dir = 1;
hsp = 0;
vsp = 0;
grav = 0.8;
movespeed = 3;

Step Event:

execute code:

hsp = dir * movespeed;
vsp += grav;
image_xscale = dir * -1;
//Horizontal Collision
if (place_meeting(x+hsp,y,obj_wall))
{
    while(!place_meeting(x+sign(hsp),y,obj_wall))
    {
        x += sign(hsp);
    }
    hsp = 0;
    dir *= -1;
}
x += hsp;

//Vertical Collision
if (place_meeting(x,y+vsp,obj_wall))
{
    while(!place_meeting(x,y+sign(vsp),obj_wall))
    {
        y += sign(vsp);
    }
    vsp = 0;
}
y += vsp;

//Enemy Collison
if (place_meeting(x,y,obj_player))
{
    if (obj_player.y < y-16)
    {
        with (obj_player) vsp = -jumpspeed;
        instance_destroy();
    }
    else
    {
        game_restart();
    }
}
if (place_meeting(x,y,obj_pellet))
{
    with (obj_pellet)
    {
        if (place_meeting(x,y,obj_enemy))
            {
                instance_destroy();
            }
    }
instance_destroy();
}
if (place_meeting(x,y,obj_badpellet))
{
    with (obj_badpellet)
    {
        if (place_meeting(x,y,obj_enemy))
            {
                instance_destroy();
            }
    }
instance_destroy();
}

1 个答案:

答案 0 :(得分:-1)

看起来你的问题是,当玩家击中敌人时,登记在顶部就太过分了。

很难给出一个能够涵盖所有可能性的答案,但一个简单的解决办法就是:

if (obj_player.vsp > 0 and obj_player.y - obj_player.vsp < y-16)
{
    with (obj_player) vsp = -jumpspeed;
    instance_destroy();
}

我在这里做的是检查玩家是否在摔倒,然后检查玩家是否在前一步骤中位于敌人之上(即在碰撞发生之前)。这将区分从上方落入敌人并从侧面进入。