我正在学习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;
}
}
}
但是当我按空格时,符号就是快速的。如何编辑点的速度?
答案 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的复杂性,并具有一些很棒的功能。
上的完整文档和示例答案 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中的一个,以便快速获得平稳的结果。