0

Wellp을 통해 문자, 내가 찾아 봤는데 밀어, 그들은이에 와서 나는 녹색으로 해요 ..AS3 충돌 감지 - 점프 바닥

내가 배우고 싶은 때문에 최근 AS3와 함께 연주하기 시작했습니다 그래서 저는 간단한 platformer 거래를 시작했습니다.

문제가 인 것을 알고 있다고 생각하지만 해결 방법을 찾지 못했습니다. 내가 연구 할 수 있는지부터

http://sta.sh/0ucxs1xjaua

,이 선수의 위치 계산/프레임 속도의 문제이다. 캐릭터가 바닥과 관련하여 자신의 위치를 ​​계산하기에는 너무 멀리 지나갔고, 마침내 자신이 어디에 있는지를 인식하면 재 보정이 시작되어 그를 0으로 되돌립니다.

내 특정 문제는 튜토리얼과 물건을 만드는 모든 사람들이 서로 다른 라벨링 시스템을 사용하고 내가 plainspeak이 특정 문제에 적응 충분히 아무것도 찾을 수 있다는 것입니다.

그래서 물어 저를 용서하지만, 혹시 누군가가 내 코드를 체크 아웃하고 일이 잘못 어디로 가는지 나를 발견 도움이 될 것입니다하시기 바랍니다. 그것은

경우 (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

약간의 해결책을 위해 변경해야 할 내용을 보내 드리겠습니다. 그러나 그것은 최선의 노력이 아닙니다. 나는 당신의 전체 논리를 바꾸고 싶지는 않지만 논리에서 이것을 사용할 수 있습니다.

가 점프 후 y 위치를 고정 시간 기준으로 계산을 사용하지 않는, 는

플레이어의 y 위치가 0 점 이하의를 얻는 경우에

가 0으로는 y 위치의 설정 즉시 그 계산하자 및 가속 정지 아래로 또한

, 중요한 점은, 모든 루프에서, 당신의 가속 기능 후 사용할 먼저 그러나 hitTest 기능을 사용하지 않는, 즉 더 나은 노력하고 있습니다.

또한 영화의 프레임 율을 높이고 가속 값을 줄이는 것이 일을 훨씬 잘하도록하는 좋은 방법입니다.