AS3
AS3

Reputation: 11

Movement in AS3

I am learning AS3. How can I move a symbol?

My Code

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

But when I press space the symbol is to fast. How can edit the speed of the point?

Upvotes: 1

Views: 852

Answers (16)

Moynul
Moynul

Reputation: 635

Use the Enter Frame method.

Please don't hardcode as well :P

Upvotes: 0

helloflash
helloflash

Reputation: 2455

The reason why your symbol is too fast is that your while loop iterates your point.x value 200 times in only one loop. To limit your symbol position, you must use an if statement instead of a while loop:

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

Upvotes: 0

salil
salil

Reputation: 1

why not declare your counter variable as Number (not as int)

var counter:Number = new Number();

then change your statment as

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

this will slow down your Point movieclip. you can change motion by changing 0.1 to any value you want.

Upvotes: 0

Niels Vanhorenbeeck
Niels Vanhorenbeeck

Reputation: 164

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

I think this is exactly what you need. Firtly you create and call upon the key_down function. Inside this function you want to call for the move function itself. This is the function I created at the bottom. To make it stop at for example 200px I suggest to work with an if-statement and a removeEventlistener.

Please note that I changed some small codings eg "var point:MovieClip = new Symbol1(); " to make it appropriate for my symbol.

Upvotes: 0

phantomjia
phantomjia

Reputation: 76

this event type is what you want:

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

Upvotes: 1

George Carlin
George Carlin

Reputation: 447

Do it like this: Point.x += 0.2; instead of point.x += 1;

Upvotes: 1

Hadi Omary
Hadi Omary

Reputation: 45

Draw anything and name it in the instance name box ..... so this well speed up and down by the space key ...... i use the frame rate

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

Upvotes: 0

Peter Lavey
Peter Lavey

Reputation: 1

ENTER_FRAME is the same of 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;

}

Upvotes: 0

esdebon
esdebon

Reputation: 2739

You need this

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

Upvotes: 0

Nick Wood
Nick Wood

Reputation: 680

Check out the Greensock library - it will take all the onEnterFrame complexity out for you and has some great features.

Full doc and examples at http://www.greensock.com/

Upvotes: 0

Michell Mors&#248;
Michell Mors&#248;

Reputation: 55

Welcome to the world of AS3.

Your description of your problem is a little vague, but i think i know what you what to do. You want to tween a display object (symbol1) 200 px right everytime you hit space? if so, here is how you do it:

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

Upvotes: 0

justnajm
justnajm

Reputation: 4534

Your while loop is making it fast, if you remove your while statement then it will work on SPACE DOWN

Upvotes: 0

skrystian
skrystian

Reputation: 1

Use tween:

import libraries:

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

This code moving your object ("ball") to 100 on "x" axis in 5s.

Upvotes: 0

Kris Welsh
Kris Welsh

Reputation: 334

At the moment you are waiting for the user to press the space bar and then moving the symbol to the right by one pixel 200 times.

But as OXMO456 has said all 200 times that it moves to the right happen at the same time as if you had manually typed "point.x += 1;" 200 times.

if your intention is to only let it move to the right 200 times then you could replace the while statement with an if statement:

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

You could then change the speed it moves at by changing the number after "point.x+=".

An even better way of changing the speed would be by using a variable to make it clearer what the number does. This also makes it easier to use that number for other things, like moving in other directions at the same speed.

Here's what the finished code would look like with these changes and a bit of clean up:

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

Does that make sense?

Upvotes: 1

Theo.T
Theo.T

Reputation: 9267

If you are starting you may want to consider giving one of the many existing tween engines in order to get smooth results quickly.

Upvotes: -1

OXMO456
OXMO456

Reputation: 3548

You need to use an ENTER_FRAME event :

stage.addEventListener(Event.ENTER_FRAME,stageEnterFrame);

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

The displayList is updated only after code execution, that's why your object move so 'fast'. This link may help you understand the process.

Upvotes: 2

Related Questions