我有一个问题:AS 3.我制作了一个可拖动的便利贴电影剪辑。我想创建一整个音符,或至少模拟这个。我认为最好的方法是在触发startDrag()时添加另一个Post-It。
我首先尝试用符号创建Post-It但不认为我可以用这种方式动态创建新的。然后我创建了一个类并将其添加到舞台上:
... addChild(new PostItNote());
但我无法(或不知道如何)在舞台上设置x,y位置。
任何人都有关于实现这个目标的最佳方式的建议,甚至完全是另一种方式?
编辑:
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.text.TextField;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextFormat;
public class CoinHitTest extends MovieClip {
var count:Number = 0;
var total_count:TextField;
var hitting:Boolean = false;
var coinSnd:Sound = new coin_drop();
var myMoney:TextFormat = new TextFormat();
var noteStack:Vector.<PostItNotes> = new Vector.<PostItNotes>();
public function CoinHitTest(){
for(var $i:int = 0; $i <5;$i++)
{
var newPostIt:PostItNotes = new PostItNotes();
this.addChild(newPostIt);
this.noteStack.push(newPostIt);
}
// constructor code
coin.addEventListener(MouseEvent.MOUSE_DOWN, __handleCoinDown);
coin.addEventListener(MouseEvent.MOUSE_UP, __handleCoinUp);
total_count = new TextField();
total_count.x = 795.20;
total_count.y = 506.15;
total_count.mouseEnabled = false;
myMoney.size = 28;
total_count.defaultTextFormat = myMoney;
total_count.text = String("$" + count);
addChild(total_count);
}
private function __handleCoinDown($evt:MouseEvent):void {
coin.startDrag(true);
coin.scaleX = 1.5;
coin.scaleY = 1.5;
addEventListener(Event.ENTER_FRAME, __checkHit);
}
private function __handleCoinUp($evt:MouseEvent):void {
coin.stopDrag();
coin.scaleX = 1;
coin.scaleY = 1;
removeEventListener(Event.ENTER_FRAME, __checkHit);
}
private function __checkHit($evt:Event):void {
if (this.coffee.hitTestPoint(coin.x,coin.y, false))
{
// do our in-circle check
if((coffee.x - coin.x) * 2 + (coffee.y - coin.y) * 2 <= (coffee.width/2 + coin.width/2) * 2)
{
stopDrag();
coin.scaleX = 1;
coin.scaleY = 1;
removeChild(coin);
coin.x = 116;
coin.y = 380.1;
addChild(coin);
}
}
else
{
trace("Didn't Hit Mug");
}
if (this.coin.hitTestObject(target)) {
if (!hitting) {
coinSnd.play();
count++;
total_count.text = String("$" + count);
coin.stopDrag();
removeChild(coin);
hitting = !hitting;
coin.x = 116;
coin.y = 380.1;
addChild(coin);
coin.scaleX = 1;
coin.scaleY = 1;
}
} else {
hitting = false;
}
}
}
}
编辑:
package {
import flash.display.MovieClip;
public class PostItNotes extends Sprite{
public function PostItNotes() {
// constructor code
}
}
}
答案 0 :(得分:0)
尝试创建一个向量来保存对PostItNote对象的引用......
这样的事情:
var noteStack:Vector.<PostItNote> = new Vector.<PostItNote>();
for(var $i:int = 0; $i <5;$i++)
{
var newPostIt:PostItNote = new PostItNote();
this.addChild(newPostIt);
this.noteStack.push(newPostIt);
}
然后,只要您希望能够修改PostItNote的属性(x / y / z /其他),就可以引用向量中的元素
this.noteStack[0].x = 24;
答案 1 :(得分:0)
顺便说一句:您可以将AS3类与Symbol结合使用,以便您可以在同一个类中使用代码和图形。
当你必须将PostIt作为图形元素和用ActionScript编写的所有逻辑处理时,这可能会更容易。
这样你就可以处理PostIt类本身的所有拖动动作。
答案 2 :(得分:0)
关于这部分问题:
然后我创建了一个类并将其添加到 阶段:
... addChild(new PostItNote());
但我无法(或不知道 如何)设置x,y位置 阶段。
设置你添加的新对象的x和y的最基本和最常用的方法可能就是做这样的事情:
var newPostIt:PostItNote = new PostItNote();
newPostIt.x = 100;
newPostIt.y = 200;
addChild(newPostIt);
换句话说,要保持对您创建的新对象的引用,而不是执行addChild(new PostItNote()),并在之前(或之后)设置x和y以及其他属性,将其添加到舞台。 / p>
答案 3 :(得分:0)
问题是你将PostItNotes设置为BaseClass而不是Class本身。
这意味着你添加到舞台的是一个只有逻辑而不是图形元素的类。
您需要做的是返回库中的符号 - &gt;右键单击 - &gt;属性并将BaseClass更改为flash.display.MovieClip(如果您不需要时间轴,则更改为flash.display.Sprite)并将PostItNotes设置为Class。
编辑:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class PostItNotes extends Sprite {
public function PostItNotes() {
super();
addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
}
protected function onStartDrag (event:MouseEvent):void {
stage.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
startDrag(false);
}
protected function onStopDrag (event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_UP, onStopDrag);
stopDrag();
}
}
}
我将拖动动作添加到你的PostItNotes类中,因为我认为这是它所属的位置,因为拖动实际上只涉及它本身。
您可能需要删除以前使用过的拖动代码。
您是否也需要有关创建新PostIt的帮助?