0

Wellp, я посмотрел везде, и я, как зеленый, как они приходят на это ..AS3 Столкновение обнаружения - Прыжки толкает персонажа через пол

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

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

http://sta.sh/0ucxs1xjaua

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

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

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

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; 
    } 
} 

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

ответ

0

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

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

, если у позиции вашего игрока получить ниже действующей нулевой точки, установить его у позиции к нулю и остановить ускорение down

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

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

Смежные вопросы