AS3 Collision Detection — прыжки толкают персонажа сквозь пол

Хорошо, я везде искал, и я такой же зеленый, как и они..

Я недавно начал играть с AS3, потому что я хочу изучить его, поэтому я начал создавать простой платформер.

Кажется, я знаю, в чем моя проблема, но поиск решения занял полтора часа.

http://sta.sh/0ucxs1xjaua

Из того, что я могу исследовать, это вопрос расчета положения игрока/частоты кадров. Персонаж заходит слишком далеко, прежде чем программа вычисляет его положение относительно пола, и когда она, наконец, распознает, где он находится, она начинает перекалибровку, возвращая его в Ноль.

Моя особая проблема заключается в том, что все, кто создает учебные пособия и прочее, используют разные системы маркировки, и я не могу найти ничего, достаточно подходящего для этой конкретной проблемы в простом языке.

Поэтому, пожалуйста, простите меня за вопрос, но есть ли шанс, что кто-нибудь сможет проверить мой код и помочь мне определить, где что-то идет не так. Я чувствую, что это как-то связано с

if(downBumping) немного, но я изо всех сил пытаюсь понять, что и как изменить. :\

Вот код:

import flash.geom.Point;
import flash.events.KeyboardEvent;
import flash.events.Event;

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, loop);

var scrollX:Number = 0;
var scrollY:Number = 0;

var xSpeed:Number = 0;
var ySpeed:Number = 0;

var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var upPressed:Boolean = false;
var downPressed:Boolean = false;

var leftBumping:Boolean = false;
var rightBumping:Boolean = false;
var upBumping:Boolean = false;
var downBumping:Boolean = false; 

var leftBumpPoint:Point = new Point(-62, 40);
var rightBumpPoint:Point = new Point(62, 40);
var upBumpPoint:Point = new Point(0, -83);
var downBumpPoint:Point = new Point(0, 80);

var animationState:String = "idle";

class Player extends player {
    var speedConstant:int = 4;
    var friction:Number = .75;
    var maxSpeedConstant:Number = 18;
    var gravityConstant:Number = 16;
    var jumpConstant:Number = -180;
}

function loop(e:Event):void{

    if(back.collisions.hitTestPoint(player.x + leftBumpPoint.x, player.y +     leftBumpPoint.y, true)){
        trace("my butt!!");
    leftBumping = true;
    } else {
        leftBumping = false;
    }

    if(back.collisions.hitTestPoint(player.x + rightBumpPoint.x, player.y +     rightBumpPoint.y, true)){
        trace("my face!!");
        rightBumping = true;
    } else {
        rightBumping = false;
    }

    if(back.collisions.hitTestPoint(player.x + upBumpPoint.x, player.y + upBumpPoint.y,     true)){
        trace("my head!!");
        upBumping = true;
    } else {
        upBumping = false;
    }

    if(back.collisions.hitTestPoint(player.x + downBumpPoint.x, player.y +     downBumpPoint.y, true)){
        trace("my feet!");
        downBumping = true;
    } else {
        downBumping = false;
    }

    //speed mechanics
    if(leftPressed){
        xSpeed -= speedConstant;
        player.scaleX = -1;
    } else if(rightPressed){
        xSpeed += speedConstant;
        player.scaleX = 1;
    }   

    if(leftBumping){
        if(xSpeed < 0){
            xSpeed *= -0.5;
        }
    }
    if(rightBumping){
        if(xSpeed > 0){
            xSpeed *= -0.5;
        }
    }
    if(upBumping){
        if(ySpeed < 0){
            ySpeed *= -0.5;
        }
    }
    if(downBumping){
        if(ySpeed > 0){
            ySpeed *= -.19;
        }
        if(upPressed){ //and if we're pressing UP
            ySpeed = jumpConstant; //set y speed to jump constant
        }
    } else {//if we are not touching the floor
        ySpeed += gravityConstant; //accelerate downwards       
    }   

    if(xSpeed > maxSpeedConstant){
        xSpeed = maxSpeedConstant;
    } else if(xSpeed < (maxSpeedConstant * -1)){
        xSpeed = (maxSpeedConstant * -1);
    }

    xSpeed *= friction;
    ySpeed *= friction;

    if(Math.abs(xSpeed) < 0.5){
        xSpeed = 0;
    }

    scrollX -= xSpeed;
    scrollY -= ySpeed;

    back.x = scrollX;
    back.y = scrollY;

    if( ( leftPressed || rightPressed || xSpeed > speedConstant || xSpeed <     speedConstant *-1) && downBumping){
        animationState = "walk";
    }else if(downBumping){
        animationState = "idle";
    }

    if(player.currentLabel !=animationState){
        player.gotoAndStop(animationState)
    }
}


function keyDownHandler(e:KeyboardEvent):void{
    if(e.keyCode == Keyboard.LEFT){
        leftPressed = true;
    } else if(e.keyCode == Keyboard.RIGHT){
        rightPressed = true;
    } else if(e.keyCode == Keyboard.UP){
        upPressed = true;
    } else if(e.keyCode == Keyboard.DOWN){
        downPressed = true;
    }
}

function keyUpHandler(e:KeyboardEvent):void{
    if(e.keyCode == Keyboard.LEFT){
        leftPressed = false;
    } else if(e.keyCode == Keyboard.RIGHT){
        rightPressed = false;
    } else if(e.keyCode == Keyboard.UP){
        upPressed = false;
    } else if(e.keyCode == Keyboard.DOWN){
        downPressed = false;
    }
}

Любая помощь будет очень признательна. Я хочу учиться, но это сложно, когда я даже не знаю, что именно искать.. Большое спасибо!


person ninthtale    schedule 19.02.2014    source источник


Ответы (1)


Я собираюсь написать вам, что вам нужно изменить для небольшого решения. Но это не лучшая попытка. Я просто не хотел менять всю вашу логику, но вы можете использовать это в своей логике.

не используйте вычисление на основе времени для фиксации положения y после прыжка, пусть этот расчет будет мгновенным

если y-позиция вашего игрока становится ниже нуля, установите ее y-позицию на ноль и прекратите ускорение вниз

Кроме того, важный момент: не используйте свои самые эффективные функции в первую очередь, используйте их после функций ускорения в каждом цикле, что увеличивает усилия.

Кроме того, увеличение частоты кадров вашего фильма и уменьшение значений ускорения — отличный способ заставить все работать намного лучше.

person Bora Kasap    schedule 19.02.2014