Я пытаюсь сделать платформер, вроде всё хорошо, но есть одна проблема. Если игрок попадает в верхний угол, то он по какой то причине телепортируется вниз, хотя не должен. Пожалуйста помогите. вот код:
Код
//Horizontal movement if (key_Left && !key_Right && (hspeed > -maxSpeed)){ hsp -= acc; } else if (!key_Left && key_Right && (hspeed < maxSpeed)){ hsp += acc; } else if (!(key_Left ^^ key_Right)){ if (hsp > 0){ hsp -= spd; } else if (hsp < 0){ hsp += spd; } }
if (hspeed > 0){ hspeed -= spd;[spoiler] } else if (hspeed < 0){ hspeed += spd; }
hsp = clamp(hsp, -maxSpeed, maxSpeed);
//Grounded if (grounded){ dashes = 1; }
//Jumping if key_Jump{ if grounded {vsp = jumpHeight} } if (!key_Jump && vsp < 0){ vsp += grav*2; } vsp += grav;
if (key_Jump_pressed && !grounded && semiJumps > 0) {vsp = semiHeight semiJumps -= 1} if vsp <= maxVsp and key_Jump{ vsp = jumpHeight }
if (place_meeting(x, y - 1, ob_ground) && vsp < 0 && (place_meeting(x + 1, y, ob_ground) || place_meeting(x - 1, y, ob_ground))){ vsp = 0; }
///Collision // Vertical collision(vsp) if place_meeting(x, y + vsp, ob_ground){ while !place_meeting(x, y + sign(vsp), ob_ground) y += sign(vsp); if sign(vsp) = 1 {grounded = 1 semiJumps = semiQuan} vsp = 0; } else { grounded = false; }
//Horizontal collision(hsp) if place_meeting(x + hsp, y, ob_ground){ while !place_meeting(x + sign(hsp), y, ob_ground) x += sign(hsp); hsp = 0; } if place_meeting(x + hsp, y, ob_ground){ while !place_meeting(x + sign(hsp), y, ob_ground) x += sign(hsp); hsp = 0; }
//Horizontal collision(hspeed) if place_meeting(x + hspeed, y, ob_ground){ while !place_meeting(x + sign(hspeed), y, ob_ground) x += sign(hspeed); hspeed = 0; } if place_meeting(x + hspeed, y, ob_ground){ while !place_meeting(x + sign(hspeed), y, ob_ground) x += sign(hspeed); hspeed = 0; }
//Wall Jump if place_meeting(x+1, y, ob_wall) && !grounded && vsp > 0 {vsp = 0.1}; if place_meeting(x-1, y, ob_wall) && !grounded && vsp > 0 {vsp = 0.1};
if key_Jump_pressed && place_meeting(x+1, y, ob_wall) && !place_meeting(x, y+1, ob_ground){ vsp = -1.5 hspeed = -2 ; } if key_Jump_pressed && place_meeting(x-1, y, ob_wall) && !place_meeting(x, y+1, ob_ground){ vsp = -1.5 hspeed = 2; }
Добавлено (19 января 2017, 20:26) --------------------------------------------- Я не понимаю, вопрос слишком сложный и поэтому никто не может помочь, или слишком тупой и поэтому никто не хочет отвечать?
Сообщение отредактировал SirArCade - Четверг, 19 Января 2017, 20:27
SirArCade, код на 146% не оптимальный и избыточный. Зачем использовать встроенную переменную горизонтальной скорости (hspeed), когда введена кастомная (hsp)? Можно, конечно, разобраться в твоём коде, но стоит ли оно того? Всё равно, всё сведётся к тому, чтобы переписать всё заново.
Если не нужна аккумуляция горизонтальной скорости и инерция, то можно использовать простой вариант: Событие Create:
// Задаём скорость move = key_left + key_right; hsp = move * movespeed; if (vsp < maxVspeed) vsp += grav;
// Коллизия с препятствием: // obstacle - родительский объект для всех препятствий if (place_meeting(x, y + 1, obstacle)) { vsp = key_jump * -jumpspeed }
if (place_meeting(x + hsp, y, obstacle)) { while(!place_meeting(x + sign(hsp), y, obstacle)) { x += sign(hsp); } hsp = 0; } x += hsp;
if (place_meeting(x, y + vsp, obstacle)) { while(!place_meeting(x, y + sign(vsp), obstacle)) { y += sign(vsp); } vsp = 0; } y += vsp;
Ну и не забываем правильно настроить маски коллизии у всех объектов.
Добавлено (23 января 2017, 00:51) --------------------------------------------- А если нам нужна возможность отпрыгнуть от стены, то необходимо внести небольшие изменения: В событии Create добавить переменную:
Код
secondJump = false;
В событии Step следует заменить
Код
if (place_meeting(x, y + 1, obstacle)) { vsp = key_jump * -jumpspeed }
на следующий код
Код
if (key_jump) { if (place_meeting(x, y+1, obstacle)) { vsp = -jumpspeed secondJump = true; } else if (secondJump && (place_meeting(x-1, y, obstacle) || place_meeting(x+1, y, obstacle))) { vsp = -jumpspeed div 1.5; secondJump = false; } }
Сообщение отредактировал Rean - Понедельник, 23 Января 2017, 18:33
Rean, я использовал переменную hspeed из-за того что у переменной hsp есть максимальное значение для плавного движения, а при прыжке от стены требовалась скорость выше максимальной и при использовании hsp объект просто телепортировался.