[英]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.