【问题标题】:Making a player "bump" from an enemy/hazard in GML在 GML 中让玩家从敌人/危险中“碰撞”
【发布时间】:2022-01-26 04:25:45
【问题描述】:

我一直在为我的孩子们使用 Game Maker Studio 2.0 制作 RPG,但遇到了一个主要问题。与敌人和危险发生碰撞。一般的碰撞会导致游戏继续记录碰撞并导致玩家立即死亡。我正在尝试替换将玩家扭曲到每个房间的一个安全位置的初步解决方案,这并不理想 - 所以我创建了一些脚本来根据敌人的哪个方向/侧面将玩家“撞击”到安全区域玩家相撞。我不是一个伟大的程序员,我倾向于编写过于复杂的代码。它几乎起作用了——它只是每次都将玩家撞向同一个方向——在敌人的左边。如果有人可以检查这些脚本并给我一些提示,将不胜感激。

敌人对象中与玩家碰撞的代码:

var get_enemy_loc, player_side, col

get_enemy_loc = scr_enemy_pos(obj_scorpion)
player_side = scr_player_orient(get_enemy_loc[0],get_enemy_loc[1],obj_player.x,obj_player.y)
col = scr_check_block(get_enemy_loc[0],get_enemy_loc[1])

show_debug_message("Player X")
show_debug_message(obj_player.x)
show_debug_message("Player Y")
show_debug_message(obj_player.y)
show_debug_message("Enemy X")
show_debug_message(get_enemy_loc[0])
show_debug_message("Enemy Y")
show_debug_message(get_enemy_loc[1])

if player_side[0] = true and col[2] = false{
    scr_shift_player(1)
}
    else
        if col[0] = false{
            scr_shift_player(4)
        }
        else{
            if col[3] = false{
                scr_shift_player(3)
            }
            else{
                scr_shift_player(2)
            }   
}
 if player_side[1] = true and col[2] = false{
     scr_shift_player(1)
 }
    else
        if col[0] = false{
            scr_shift_player(4)
        }
        else{
            if col[1] = false{
                scr_shift_player(2)
            }
            else{
                scr_shift_player(3)
            }
        }
        
if player_side[2] = true and col[3] = false{
    scr_shift_player(3)
}
    else
        if col[0] = false{
            scr_shift_player(4)
        }
        else{
            if col[2] = false{
                scr_shift_player(1)
            }
            else{
                scr_shift_player(2)
            }
        }

if player_side[3] = true and col[3] = false{
    scr_shift_player(3)
}
    else
        if col[0] = false{
            scr_shift_player(4)
        }
        else{
            if col[1] = false{
                scr_shift_player(2)
            }
            else{
                scr_shift_player(1)
            }
        }

敌方阵地脚本:

function scr_enemy_pos(enemy_int){
var enemy_pos;
enemy_pos[0] = enemy_int.x;
enemy_pos[1] = enemy_int.y;
return enemy_pos;
}

用于检查阻塞对象的脚本:

function scr_check_block(enemy_x,enemy_y){
var left_col, right_col, up_col, down_col;
var group;
check_left = enemy_x - 100
check_right = enemy_x + 100
check_up = enemy_y + 100
check_down = enemy_y - 100
if position_empty(check_left,enemy_y){
    left_col = false}
    else {
        left_col = true
    }
if position_empty(check_right,enemy_x){
    right_col = false
    }
    else {
        right_col = true
    }
if position_empty(enemy_x,check_up){
    up_col = false
}
    else {
        up_col = true
    }
if position_empty(enemy_x,check_down){
    down_col = false
}
    else {
        down_col = false
    }
group[0] = left_col
group[1] = right_col
group[2] = up_col
group[3] = down_col

return group
}

在碰撞时检查玩家方向的脚本:

function scr_player_orient(enemy_x,enemy_y,player_x,player_y){
    var ne, se, nw, sw;
    ne = false
    se = false
    nw = false
    sw = false
    var comb
    if enemy_x <= player_x and enemy_y <= player_y{
        nw = true
    }
    else{
        nw = false
    }
    if enemy_x > player_x and enemy_y <= player_y{
        ne = true
    }
    else{
        ne = false
    }
    if enemy_x <= player_x and enemy_y > player_y{
        sw = true
    }
    else{
        sw = false
    }
    if enemy_x > player_x and enemy_y > player_y{
        se = true
    }
    else{
        se = false
    }
    comb[0] = nw
    comb[1] = ne
    comb[2] = sw
    comb[3] = se
    
    return comb;
}

执行播放器“bump”的脚本:

function scr_shift_player(dir){
if dir = 1{
    obj_player.y = obj_player.y - 20
    }
if dir = 2{
    obj_player.x = obj_player.x + 20
    }
if dir = 3{
    obj_player.y = obj_player.y + 20
    }
if dir = 4{
    obj_player.x = obj_player.x - 20
    }
}

【问题讨论】:

    标签: collision gml game-maker-studio-2


    【解决方案1】:

    回答了我自己的问题。我通过更新碰撞代码解决了这个问题 使用不同的脚本。我扔掉了 scr_player_orient 并使用以下代码将其替换为 scr_player_dir。

    更新了敌方对象的碰撞代码

    ar get_enemy_loc, player_side, col
    
    get_enemy_loc = scr_enemy_pos(obj_scorpion)
    player_side = scr_player_dir(get_enemy_loc[0],get_enemy_loc[1])
    col = scr_check_block(get_enemy_loc[0],get_enemy_loc[1])
    
    show_debug_message("Player X")
    show_debug_message(obj_player.x)
    show_debug_message("Player Y")
    show_debug_message(obj_player.y)
    show_debug_message("Enemy X")
    show_debug_message(get_enemy_loc[0])
    show_debug_message("Enemy Y")
    show_debug_message(get_enemy_loc[1])
    
    if player_side[0] = true and col[1] = false{
            scr_shift_player(2)
        }
        else{
            scr_shift_player(4)
        }
        
    if player_side[1] = true and col[0] = false{
            scr_shift_player(4)
        }
        else{
            scr_shift_player(2)
        }
    
    if player_side[2] = true and col[2] = false{
            scr_shift_player(2)
        }
        else{
            scr_shift_player(3)
        }
    
    if player_side[3] = true and col[3] = false{
            scr_shift_player(3)
        }
        else{
            scr_shift_player(2)
        }
        
    

    并使用了这个新脚本——scr_player_dir

    function scr_player_dir(enemy_x, enemy_y){
        var left,right,up,down,comb
        left = false
        right = false
        down = false
        up = false
        if enemy_x < obj_player.x{
            right = true && left = false
            }
        else{
            right = false && left = true
        }
        
        if enemy_y < obj_player.x{
            down = true && up = false
        }
        else{
            down = false && up = true
        }
        comb[0] = right
        comb[1] = left
        comb[2] = up
        comb[3] = down
        
        return comb
    }
    

    希望对遇到同样问题的人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多