AS3的运动

时间:2010-12-30 17:46:05

标签: actionscript-3

我正在学习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;
  }
}
}

但是当我按空格时,符号就是快速的。如何编辑点的速度?

16 个答案:

答案 0 :(得分:2)

您需要使用ENTER_FRAME事件:

stage.addEventListener(Event.ENTER_FRAME,stageEnterFrame);

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

displayList仅在代码执行后更新,这就是你的对象如此“快速”移动的原因。 这个link可以帮助您了解该过程。

答案 1 :(得分:1)

此时您正在等待用户按空格键,然后将符号向右移动一个像素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;
    }
  }
}

这有意义吗?

答案 2 :(得分:1)

这样做: Point.x + = 0.2;而不是point.x + = 1;

答案 3 :(得分:1)

此事件类型是您想要的:

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

答案 4 :(得分:0)

使用补间:

导入库:

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。

答案 5 :(得分:0)

你的while循环使它变得很快,如果你删除你的while语句然后它将在空格键下工作

答案 6 :(得分:0)

欢迎来到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
    }
}

答案 7 :(得分:0)

查看Greensock库 - 它将为您带来所有onEnterFrame的复杂性,并具有一些很棒的功能。

http://www.greensock.com/

上的完整文档和示例

答案 8 :(得分:0)

你需要这个

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

答案 9 :(得分:0)

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;

}

答案 10 :(得分:0)

绘制任何内容并在实例名称框中命名.....所以这样可以通过空格键加快速度......我使用帧速率

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

答案 11 :(得分: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。

请注意我改变了一些小编码,例如&#34; var point:MovieClip = new Symbol1(); &#34;使它适合我的符号。

答案 12 :(得分:0)

为什么不将你的计数器变量声明为Number(而不是int)

var counter:Number = new Number();

然后将您的声明更改为

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

这将减慢你的Point动画片段。您可以通过将0.1更改为您想要的任何值来更改动作。

答案 13 :(得分:0)

你的符号太快的原因是你的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
    }
}

答案 14 :(得分:0)

使用Enter Frame方法。

请不要硬编码:P

答案 15 :(得分:-1)

如果您要开始,可能需要考虑提供现有的tween engines中的一个,以便快速获得平稳的结果。