我正在开始一个新项目,它在FlashDevelop中作为AS3项目100%完成。为了澄清,我不是在任何时候在Adobe Flash中创建FLA;永远不会使用Adobe Flash。
在我的AS3项目的文档类中,我需要创建和引用在单独的.as类文件中设置的动画片段。文档类将具有事件监视器,用于监视键盘按下并在需要时移动动画片段。设置动画片段并从文档类添加到舞台时,通过键盘输入的动作可以正常工作。但是,当从单独的类设置动画片段时,我遇到了问题。
除了我正在处理的项目之外,我已经创建了一个示例项目,该项目针对此Stack Overflow问题运行了三个测试。此示例项目包含三个文件,所有文件都存储在同一文件夹中:Main.as(文档类),createSquare.as(创建方形MC)和createCircle.as(创建圆MC)。
测试#1(蓝色矩形):在Main.as中,我创建了一个名为charRectangle的新MC。这里定义尺寸,尺寸,颜色等,然后将其添加到舞台上。当函数keyIsDown()执行时,蓝色矩形在舞台上向左或向右移动。这是一次成功的测试。
测试#2(绿色方块):现在我测试从单独的类文件创建一个movieclip。在Main.as中,我创建了一个名为charSquare的新变量,并将其定义为新的createSquare()。 createSquare.as定义特征并将子项添加到舞台。问题:测试项目时,舞台上看不到绿色方块;但是,跟踪输出显示左右箭头键实际上更新了charSquare的X位置。如何制作动画片段?我的解决方案是......
测试#3(黄圈):我为黄色圆圈开始的方式与绿色方块相同。我们将这个命名为charCircle。在Main.as中,当将变量定义为新的charCircle()时,我将单词“this”传递给createCircle.as中的函数。这反过来告诉函数createCircle将子项添加到“this”,即舞台上的父MC。现在我们可以看到一个可见的形状。问题:跟踪输出显示左右箭头键正在更新X位置,但黄色圆圈不移动。如何移动此影片剪辑?
主要目标:我想避免在Main.as中声明字符形状的所有属性,并将其与其他类文件隔离开来。在Main.as中我想创建一个新变量,将其定义为新的createSquare()/ createCircle(),然后在Main.as中使用键盘函数来处理移动。我稍后会在名为keyboardControls.as的第四个测试类中保留键盘控件。
从Adobe Flash中的FLA开始,说明文档类,在舞台上创建MC符号,为它们提供实例名称,然后处理FlashDevelop中的AS文件,我可以解决这些问题。但同样,这个项目要求我省略Adobe Flash / FLA,所以这不是我想要的解决方案..我需要在FlashDevelop AS3中创建它100%动态。
感谢您提供任何帮助。三个测试文件的源代码如下所示。
Main.as
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
public class Main extends MovieClip {
private var charRectangle:MovieClip;
private var charSquare:createSquare;
private var charCircle:createCircle;
public function Main() {
trace("Function: Main() has started.");
// Create rectangle character right here
charRectangle = new MovieClip();
charRectangle.graphics.beginFill(0x0000FF);
charRectangle.graphics.drawRect(200,20,250,100);
charRectangle.graphics.endFill();
stage.addChild(charRectangle);
// Create square character from class
charSquare = new createSquare();
// Create square character from class
charCircle = new createCircle(this);
// Event listener for user input
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
}
private function keyIsDown(e:KeyboardEvent):void {
// Left arrow key actions
if (e.keyCode == 37) {
charRectangle.x -= 5;
charSquare.x -= 5;
charCircle.x -= 5;
}
// Right arrow key actions
if (e.keyCode == 39) {
charRectangle.x += 5;
charSquare.x += 5;
charCircle.x += 5;
}
trace("charRectangle.x = " + charRectangle.x + ", charSquare.x = " + charSquare.x + ", charCircle.x = " + charCircle.x);
}
}
}
createSquare.as
package {
import flash.display.MovieClip;
public class createSquare extends MovieClip {
private var square:MovieClip;
public function createSquare() {
trace("Function: createSquare() has started.");
square = new MovieClip();
square.graphics.beginFill(0xFF0000);
square.graphics.drawRect(200,140,100,100);
square.graphics.endFill();
addChild(square);
}
}
}
createCircle.as
package {
import flash.display.MovieClip;
public class createCircle extends MovieClip {
private var circle:MovieClip;
public function createCircle(parentMC:MovieClip) {
trace("Function: createCircle() has started.");
circle = new MovieClip();
circle.graphics.beginFill(0x00FF00);
circle.graphics.drawCircle(200,350,75);
circle.graphics.endFill();
parentMC.addChild(circle);
}
}
}
答案 0 :(得分:1)
我猜你应该使用actionscript中的显示列表来玩更多来习惯操作显示对象(addChild / removeChild / nesting / etc.)
您创建charRectangle
并将其添加到舞台,以便您可以看到它。
您可以像这样初始化charCircle
charCircle = new createCircle(this);
并在内部将其添加到Main(在构造函数中传递),同时也会显示上面的两个剪辑。您创建的charSquare
不是这种情况(因此可以在跟踪中看到它),但您不会添加到显示列表中。
试试这个:
// Create square character from class
charSquare = new createSquare();
// add it to the display list
addChild(charSquare)
另外,你提到你想要一次移动所有剪辑,如果你只是将它们中的所有三个嵌套到一个单独的Sprite / MovieClip中,你可以这样做:
package {
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip {
private var char:Sprite;
public function Main() {
trace("Function: Main() has started.");
char = new Sprite();
addChild(char);
// Create rectangle character right here
var charRectangle:MovieClip = new MovieClip();
charRectangle.graphics.beginFill(0x0000FF);
charRectangle.graphics.drawRect(200,20,250,100);
charRectangle.graphics.endFill();
char.addChild(charRectangle);
// Create square character from class
var charSquare:MovieClip = new createSquare();
char.addChild(charSquare);
// Create square character from class
charCircle = new createCircle(char);
// Event listener for user input
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
}
private function keyIsDown(e:KeyboardEvent):void {
if(e.keyCode == Keyboard.LEFT) char.x -= 5;
if(e.keyCode == Keyboard.RIGHT) char.x += 5;
trace("char position",char.x,char.y);
}
}
}
(我没有测试过上面的代码,所以可能存在语法错误,但它应该清楚地说明这个想法)。
另外两个旁注:
我想你的createCircle和createSquare类会发生变化并变得更加复杂,但是如果要保持现状,它们可能更简单:
包{
import flash.display.Sprite;
public class Square extends Sprite {
public function Square() {
trace(this);
graphics.beginFill(0xFF0000);
graphics.drawRect(200,140,100,100);
graphics.endFill();
}
}
}
如果不需要在createSquare或createCircle中嵌套元素,您可以使用非常基本的Shape,尽管您可能会发现Sprite更灵活。还要注意我已经命名为Square类。开始使用大写字母(例如Sprite / MovieClip /等)的类名称,使用小写字母(例如x / alpha /等)的属性和方法,常量全部采用大写字母(例如KEY_DOWN,CLICK,等)等等。 按照这种惯例,createSquare听起来更像是一个函数名而不是一个类。 您没有义务遵循惯例,但可能会让其他人更容易在将来轻松扫描您的代码。主要思想是保持一致。