【发布时间】: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