我已经采用了一种新的编码技术并且让我有点搁浅,我以前应用的很多概念现在采用新的语法,有时会产生不可预知的问题。
好的,所以我制作多人Flash游戏。为了减少混乱,我不再使用多个class.as文件,相反,我有我的舞台,还有一个名为触发器的库对象,我放置在舞台的左上方。然后我为这个movieclip对象创建一个class.as文件,然后从那里我实例化我程序中的其他所有东西 - 到目前为止,登录启动画面动画片段,游戏窗口动画片段,大厅动画片段,最后是游戏实例影片剪辑。它们适当地进出.visible,并且在不使用时它们存储在屏幕外的x和y值,它们根据用户输入顺序进行。另外我有公共数组存储importantMessages [],myplayerarray [],myArrowsarray [],myenemyarray []
现在我最大的问题是我将从服务器接收到我需要构建一个新箭头和怪物单元的变量 - 所以像使用orc.speed,orc.xstartlocation orc那样生成像movieclip orc。 hp等等,并且有一个类似箭头的动画片段,带有arrow.speed,arrow.gravity,等等。这些具有附加属性的动画片段然后被推送到适当的公共阵列,而不添加到舞台上,而是被添加到stage.add(gamewindow:Movieclip)(推理)这背后是如果我想立刻在舞台上移动一切,他们已经面向一个有凝聚力的电影剪辑,然后我可以移动这个电影剪辑)
好吧现在问题的东西,当我有两个gamewindow.movieclips碰撞,像箭头与兽人(让我们说arrow13 hittest orc42 == true)我从游戏窗口删除箭头movieclip对象:movieclip并从中拼接然而,即使图形消失,它仍继续移动其当前的轨迹并在其途中击中其他一切。我相信这背后的原因是因为在使用变量创建movieclip期间,我在enterframe上包含了一个eventlistener,我认为它删除了剪辑而不是事件监听器(请参阅底部的实例化箭头Movieclip类)
所以这让我想到了一个简明的问题: 问题一: 有可能不仅gamewindow.removeChild(arrow13)而且还有gamewindow.removeChild(arrow13 [以及所有变量和eventlisteners一次])
QUESTIONTWO: 我的第二个问题有点容易:因为切换到movieclip()而不是object()我一直在使用暴力,这将是一行代码来执行以下所有操作:
var newarrow:MovieClip = new playerarrow();
newarrow.theowner =用户名
newarrow.thespeed = speed
newarrow.thegravity = gravity
newarrow.thepower = power
newarrow.arrownumber = arrowid
我的第三个问题可以追溯到我的flashscreen movieclips想法,我在使用它们的z值时遇到了麻烦
基本上当我调用importantmessage()时,它会在左下角创建一个新的动画片段,alpha会逐渐消失并自动删除,但是我有一个问题,我的新动画片段窗口会覆盖这些消息,因为它们被添加了分裂后,我的程序中的示例是我将有2条消息吐出stage.add“尝试连接到服务器”“已连接”然后调用下一个主要函数并实例化loginsplash:movieclip = new loginwindow - i尝试过这个新的stage.addchild(loginsplash)并执行setChildIndex(loginsplash,0)以及-1和1.两个1都超出范围而0产生:提供的DisplayObject必须是调用者的子节点。 问题三: 所以,如果我有gamemsg z = 0 gamemsg2 z = 1和loginsplash z =(0?),我怎样才能让游戏信息始终位于最前面(我认为它更像是一个引用问题,然后其他任何东西
========================================
connection.addMessageHandler(“newarrow”,
功能(m:消息,用户名,速度,重力,功率,箭头)
{
var newarrow:MovieClip = new playerarrow();
newarrow.theowner = username
newarrow.thespeed = speed
newarrow.thegravity = gravity
newarrow.thepower = power
newarrow.arrownumber = arrowid
for each(var p in myplayerarray)
if (p.mpname == username){
newarrow.x = p.theanimation.x + 100
newarrow.y = p.theanimation.y + 100
}
myarrowarray.push(newarrow)
gw.addChild(newarrow)
newarrow.addEventListener(Event.ENTER_FRAME, arrowenterframe)
function arrowenterframe(e:Event){
newarrow.thegravity = 0 //+=.6
speed = 5
newarrow.x = newarrow.x+speed
newarrow.y = newarrow.y + newarrow.thegravity
//ROTATE FUNCTION
newarrow.rotation = Math.atan(newarrow.thegravity / speed ) /(Math.PI/180)
if (speed < 0) {newarrow.rotation +=180}
for each(var d in myenemyarray){
if (newarrow.hitTestObject(d.orcicon)){
connection.send("arrowhitmonster", newarrow.arrownumber, d.monsternumber)
trace("hitting monster")
}
}
if(newarrow.hitTestObject(gw.theground)){
}
}
})
答案 0 :(得分:0)
Q1 ...是可能的,但不能使用单个命令。我建议你使用casalib(我倾向于经常推荐)如果你使用CasaMovieClip而不是MovieClip,它会通过添加一些处理这些问题的附加函数来扩展它,例如removeEventListeners()
和{{1 (删除侦听器)。使用事件侦听器时,请注意它只会销毁此对象正在侦听的事件,而不会销毁其他对象对此mc的侦听器。您可以只查看代码并在类/ MC之上实现它,而不是尝试转换资产以使用CasaMovieClip
处理事件监听器的另一种方法是切换到Robert Penner使用signals。这是一种更优雅的方式来处理事件通知,以及您的设置声音(依赖于几个具有大范围的类),当对象之间的所有通信都通过单个通道进行而不是由每个通道处理时,它可能会更好单独对象。
Q2 - 您可以创建工厂功能。
removeAllChildrenAndDestroy()
或
public function createMC($mc:MovieClip,$owner:String,$speed:int,...etc):MovieClip{
$mc.theowner = $owner;
// etc.
return $mc;
}
您可以调用此函数public function createMC($mc:MovieClip,$properties:Object):MovieClip{
$mc.theowner = $owner;
for (var $property:String in $properties)
if ($mc.hasOwnProperty($property))
$mc[$property] = $properties[$property];
return $mc;
}
但我不确定你为什么要真的
Q3 - 我处理这些的方式是设置影片剪辑持有者。关键信息将始终位于顶部,游戏菜单低于标准,游戏背景始终位于底部。在主视图中,我将拥有一个游戏拥有者MC,在菜单上方以及criticalMessage持有者之上,添加和删除的任何对象都只在适当的持有者中。