0

Wellp,我到處找,我爲綠色,因爲他們來此..AS3碰撞檢測 - 跳躍的字符推透過落地

我最近開始使用AS3玩,因爲我想學習它,所以我開始建立一個簡單的一些平臺成交。

我想我知道我的問題是,但找到解決方案已經哈哈德半。

http://sta.sh/0ucxs1xjaua

據我考證,這是球員位置計算/幀率的問題。在程序計算他的位置和地面之間的關係之前,角色已經走得太遠了,當它最終確認了他的位置時,它開始重新校準,使他回到零點。

我的特別問題是每個製作教程和材料的人都使用不同的標籤系統,我無法找到足夠適應平原語言這個特殊問題的任何東西。

所以請原諒我的問題,但有沒有人有機會查看我的代碼,並幫助我發現問題出在哪裏。如果(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位置獲得低於零點的,設置它的y位置爲零,並停止加速down

另外,重要的一點是,不要先使用你的hittest函數,在你的加速函數之後使用它們,在每個循環中使用它們,這樣做會更好。另外,增加電影的幀率並降低加速度值是讓事情工作得更好的好方法。