簡體   English   中英

AS3的運動

[英]Movement in AS3

我正在學習AS3。 我該如何移動符號?

我的守則

var counter:int = new int();
counter = 0;
var point:symbol1 = new symbol1();  
addChild(point);  
point.x = 25 + 50;  
point.y = 25 + 50;  

stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler); 
function move_handler(e) { 
  if (e.keyCode == Keyboard.SPACE) {  

  while (counter < 200) 
  { 
    trace(counter);
    point.x += 1; 
    counter += 1;
  }
}
}

但是當我按空格時,符號就是快速的。 如何編輯點的速度?

您需要使用ENTER_FRAME事件:

stage.addEventListener(Event.ENTER_FRAME,stageEnterFrame);

function stageEnterFrame(e:Event):void{
    displayObject.x+=1
}

displayList僅在代碼執行后更新,這就是您的對象如此“快速”移動的原因。 鏈接可幫助您了解該過程。

此時您正在等待用戶按空格鍵,然后將符號向右移動一個像素200次。

但是,正如OXMO456所說的那樣,它向右移動了200次,就像你手動輸入“point.x + = 1;”一樣。 200次。

如果你的目的是讓它向右移動200次,那么你可以用if語句替換while語句:

if(counter<200){
  trace(counter);
  point.x+=1;
  counter+=1;
}

然后,您可以通過更改“point.x + =”之后的數字來更改其移動速度。

改變速度的更好方法是使用變量使數字更清楚。 這也使得更容易將該數字用於其他事物,例如以相同的速度向其他方向移動。

以下是使用這些更改完成的代碼和一些清理后的內容:

var counter:int = 0; // setting this variable as you define it saves space
var speed:Number = 1; // here's the speed variable  (declared as a number so you can have fractions)
var point:symbol1 = new symbol1();  
addChild(point);  
point.x = 75; // 25+50 is 75, one less thing for flash to work out
point.y = 75;  

stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler);

function move_handler(e) { 
  if (e.keyCode == Keyboard.SPACE) {
    if (counter < 200) 
    { 
      trace(counter);
      point.x += 1; 
      counter += 1;
    }
  }
}

那有意義嗎?

這樣做:Point.x + = 0.2; 而不是point.x + = 1;

這個事件類型是你想要的:

' stage.addEventListener(Event.ENTER_FRAME,enterFrameHandler)'

使用補間:

導入庫:

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var myTween:Tween = new Tween(ball, "x", Strong.easeOut, ball.x, ball.x + 100, 5, true);

此代碼在5秒內將對象(“球”)移動到“x”軸上的100。

你的while循環使它快速,如果你刪除你的while語句然后它將在SPACE DOWN工作

歡迎來到AS3的世界。

你對問題的描述有點模糊,但我想我知道你該怎么做。 你想在每次擊中空間時補間顯示對象(symbol1)200 px嗎? 如果是這樣,這是你如何做到的:

import flash.events.KeyboardEvent;
import flash.events.Event;

var destinationX:int = 0; // this contains the point's destination x 

var point:symbol1 = new symbol1(); // best practice is to name all your classes starting with upper case, like Symbol1, not symbol1
addChild(point);  
point.x = 25 + 50;  
point.y = 25 + 50;

stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler); 

stage.addEventListener(Event.ENTER_FRAME, render);// run render function every frame

function move_handler(e:KeyboardEvent):void{// another best practice, when injecting a variable into a function declare what type the variable is, in this case e is a KeyboardEvent. :void when not returning any values from the function, basically all functions you make in the beginning should look like this

    if (e.keyCode == Keyboard.SPACE) {  

            destinationX += 200;// add 200 to destinationX
    }
}

function render(e:Event):void{ // runs every frame, if you set your fps to 30, then this will run 30 times a second

    if(destinationX > point.x){//Check if point's destination x is more than the points current x position

        point.x += 1;// add 1 to points x. you can change this if you want it to go faster
    }
}

查看Greensock庫 - 它將為您帶來所有onEnterFrame復雜性,並具有一些很棒的功能。

http://www.greensock.com/上的完整文檔和示例

你需要這個

var counter:int = new int();
var vel = 1; //<------- Move 1 pixel by frame
counter = 0;
var point:symbol1 = new symbol1();  
addChild(point);  
point.x = 25 + 50;  
point.y = 25 + 50;  

stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler); 

function move_handler(e) { 
  if (e.keyCode == Keyboard.SPACE) {  
      stage.addEventListener(Event.ENTER_FRAME,moveEnterFrame);
      stage.removeEventListener(KeyboardEvent.KEY_DOWN, move_handler); 
  }
}


function moveEnterFrame(e:Event):void{
    point.x += vel; 
    counter ++;
    if(counter >= 200){
         stage.removeEventListener(Event.ENTER_FRAME,moveEnterFrame);

         counter = 0;
         stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler); 
    }
}

ENTER_FRAME與While相同。

stage.addEventListener(Event.ENTER_FRAME, nameFunction);   //this event execute fps ones on default 24 frames for seconds


var speed:int = 5;

function nameFunction(ev:Event){

   simbol.x += speed;

}

繪制任何內容並在實例名稱框中命名.....所以這很好地通過空格鍵加速和減速......我使用幀速率

    import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

 stage.addEventListener(Event.ENTER_FRAME,stageEnterFrame);
 var fremCount:int;
 var upDown:int;
 function stageEnterFrame(e:Event):void{

if(fremCount<30 && upDown==0){
    box.x+=1
    fremCount++
    }

if(fremCount==30){
    upDown=1;
    trace("For next : "+fremCount , upDown);
    }

if(upDown==1){
    box.x-=1
    fremCount--;
    }

if(upDown==1 && fremCount==0){
   upDown=0;
    }

    }

  stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
  function myKeyDown(e:KeyboardEvent):void{
  if (e.keyCode == Keyboard.SPACE){
  trace("Success!"+stage.frameRate);
  stage.frameRate += 5;
  if (stage.frameRate>150){stage.frameRate=0;}
 } 
}
import flash.events.Event;

var point:MovieClip = new Symbol1();  
addChild(point);  
point.x = 25 + 50;  
point.y = 25 + 50;  



stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler); 
function move_handler(e) 
{ 
      if (e.keyCode == Keyboard.SPACE)

      {  
        stage.addEventListener(Event.ENTER_FRAME, moveRight);
      }
}

 function moveRight(evt:Event):void
 {
     point.x+=1;
 }

我認為這正是你所需要的。 你創建並調用key_down函數。 在此功能中,您需要調用移動功能本身。 這是我在底部創建的功能。 為了讓它停在例如200px,我建議使用if語句和removeEventlistener。

請注意,我更改了一些小編碼,例如“var point:MovieClip = new Symbol1();”以使其適合我的符號。

為什么不將你的計數器變量聲明為Number(而不是int)

var counter:Number = new Number();

然后改變你的聲明

point.x += 0.1; 
counter += 0.1;

這將減慢你的Point動畫片段。 您可以通過將0.1更改為您想要的任何值來更改動作。

符號過快的原因是你的while loop只在一個循環中迭代你的point.x值200次。 要限制符號位置,必須使用if statement而不是while循環:

var point:symbol1 = new symbol1();
point.x = 75; // 25 + 50;
point.y = 75; // 25 + 50;
addChild(point);

const SPEED:Number = 0.7;
const DX:int = 200; // distance to cover
var counter:Number = 0; // counts the distance covered 

stage.addEventListener(KeyboardEvent.KEY_DOWN, move_handler);

function move_handler(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.SPACE && counter < DX)
    {
        point.x += SPEED;
        counter += SPEED;
        trace(counter); // stops at 200
    }
}

使用Enter Frame方法。

請不要硬編碼:P

如果您要開始,可能需要考慮提供眾多現有補間引擎中的一個,以便快速獲得平滑結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM