2011-01-01 13 views
0

これは大きな疑問に思うかもしれません。私はコーディングの初心者ですが、誰かがこのコードの何が間違っているのか教えてください。 (かなり短いです。) このコードの目的は、あらかじめ定義されたオブジェクトヒーローを加速して移動させ、時間の経過と共にゆっくりと減速させることです。二つの文がありますコードの問題

var vTimer:Timer; new Timer(10) 

import flash.utils.Timer; 
import flash.events.KeyboardEvent; 

var vMove:Number = 0 
var vMoveMaxL = -15 
var vMoveMaxR = 15 
var vLeft:Boolean = false 
var vRight:Boolean = false 
var vAccel:Number = 0.5 
var vDeccel:Number = 1 
var vDeccelFactor:Number = 0.1 
var vTimer:Timer; new Timer(10) 

vTimer.addEventListener(TimerEvent.TIMER, MovementTimer); 
vTimer.start(); 

function MovementTimer(event:TimerEvent):void 
{ 
//Acceleration 
{ 
    //Initiation 
    { 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, Acceleration); 
    function Acceleration(event:KeyboardEvent):void 
    { 
    switch (event.keyCode) 
    { 
    case Keyboard.LEFT: 
    { 
     if (vMove > vMoveMaxL) 
     { 
     vMove = vMoveMaxL; 
     vLeft = true; 
     } 
     else 
     { 
     vMove -= vAccel; 
     vLeft = true; 
     } 
    } 
    case Keyboard.RIGHT: 
    { 
     if (vMove < vMoveMaxR) 
     { 
     vMove = vMoveMaxR; 
     vRight = true; 
     } 
     else 
     { 
     vMove += vMoveMaxR; 
     vRight = true; 
     } 
    } 
    } 
    } 
    } 
    //Blank 
    { 
    stage.addEventListener(KeyboardEvent.KEY_UP, Conditioner); 
    function Conditioner(event:KeyboardEvent):void 
    { 
    switch (event.keyCode) 
    { 
    case Keyboard.LEFT: 
    { 
     vLeft = false; 
    } 
    case Keyboard.RIGHT: 
    { 
     vRight = false; 
    } 
    } 
    } 
    } 
} 
//Decceleration 
{ 
    if (vMove == 0) 
    { 
    vMove = 0; 
    } 
    else 
    { 
    if (vLeft==false && vRight==false) 
    { 
    vDeccel -= vDeccelFactor; 
    { 
    vMove *= vDeccel; 
    } 
    } 
    else 
    { 
    vMove = vMove; 
    } 
    } 
} 
//Blank 
{ 
    hero.x += vMove; 
} 
//Blank 
} 

答えて

2

この行は不審に見える最初はvTimerという名前のタイマーがあるように起こっていると言う、二つ目は10msの間隔で新しいタイマーを作成します。タイマーを作成してvTimerに割り当てるという単一のステートメントがあることを意味します。だから、それは次のようになります。

var vTimer:Timer = new Timer(10); 

私は、コードの残りの部分をよく見ていないが、私は、これはトラックにあなたを取得願っています。

編集:コードの残りの部分を詳しく見ると、かなりの問題があります。

vTimerは、タイマーを設定すると、10msごとにMovementTimerを呼び出します。 100回/秒。 MovementTimerを呼び出すたびにKEY_DOWNの新しいリスナーが追加されるため、1秒後にキーを押すとAccelerationに100回の呼び出しが行われます。

タイマー機能の外で、キーハンドラ関数とリスナアサイメントを移動する必要があります。キーリスナーがフラグを設定するパターン(vLeftなど)を実装しようとしているように見え、タイマーは各ティックごとにアクセラレーションを適用します。それは良いパターンですが、動作させるにはかなりの修正が必要です。

は、ここで私は、リスナーとキーのフラグのために使用したい基本的な構造です:

var left:Boolean = false; 
var right:Boolean = false; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

function onKeyDown(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.LEFT) { 
    left = true; 
    } 
    else if (event.keyCode == Keyboard.RIGHT) { 
    right = true; 
    } 
} 
function onKeyUp(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.LEFT) { 
    left = false; 
    } 
    else if (event.keyCode == Keyboard.RIGHT) { 
    right = false; 
    } 
} 

var timer:Timer = new Timer(10); 
timer.addListener(TimerEvent.TIMER, onTimer); 

function onTimer(event:TimerEvent):void { 
    if (left) { 
    // do left acceleration things 
    } 
    else { 
    // deceleration things 
    } 
    if (right) { 
    // do right acceleration things 
    } 
    else { 
    // deceleration things 
    } 
    // apply movements 
} 

私はこのコードをテストしていませんが、それはあなた自身のコードからどのように異なるか、うまくいけばそれは明らかです。この作業が終わったら、加速/減速を意味のある値で再度調整することができます。

を考える/注意すべき他の物事のカップル:あなたはvMove = vMove

  • あなたは多くのを使用言う部分を削除することができるように自分自身に値を代入

    • は、何もしません。単純なステートメントの周りの不要なブロック({}の間の部分)。 actionscript(とjavascript)では、これらはクラスやクラス関数以外の変数のスコープを変更しないので、if/elseステートメントに必要でない限り、それらを削除することができます。
    • キーアップハンドラは、vLeftvRightの両方をfalseに設定します。左キーと右キーの両方を押すとどうなりますか?そのうちの1つだけを解放しますか?

    コードに問題がなければ、キーのポーリングを処理するライブラリを調べてください。速いGoogleの検索では、同じ方法で他のキーを押したければ、スパゲッティコードを避けるのに役立つhttp://code.google.com/p/bigroom/wiki/KeyPollが示唆されています。

  • +0

    ありがとうございます - 動作が可能ですが、何らかの理由でvAccelを0.000000000000000001などに設定しても、オブジェクトが非常に高速に移動します。 – Tom

    +0

    タイマーの更新間隔を増やすことができます。現在のもの(10msごとに更新)が速すぎる可能性があります。 – erkmene