-1

嗨,我采用了一种新的编码技术,这让我有点束手无策,我以前应用的许多概念现在采用了新的语法,有时会产生无法预料的问题。

好的,所以我制作多人Flash游戏。为了减少混乱,我不再使用多个 class.as 文件,而是拥有我的舞台和一个名为触发器的库对象,我将它放在舞台左上角的视线之外。然后我为这个movieclip对象创建一个class.as文件,并从那里实例化我程序中的所有其他内容——到目前为止,一个登录启动画面movieclip、一个游戏窗口movieclip、一个大厅movieclip,最后是游戏实例影片剪辑。它们适当地进出 .visible,当不使用时,它们存储在屏幕外的 x 和 y 值中,它们会根据用户输入顺序进行。另外我有存储importantMessages []、myplayerarray []、myArrowsarray []、myenemyarray []的公共数组

现在我目前最大的问题是我将从服务器接收我需要构建一个新的箭头和怪物单元的变量——所以我不喜欢movieclip orc,使用orc.speed、orc.xstartlocation orc.hp等等on,并且我有一个类似的箭头动画剪辑,带有 arrow.speed、arrow.gravity 等等。然后将这两个带有附加属性的影片剪辑推送到适当的公共数组中,而不是添加到舞台,而是添加到 stage.add(gamewindow:Movieclip) (这背后的原因是稍后如果我想一次移动舞台上的所有东西,它们已经定位在一个有凝聚力的影片剪辑上,然后我可以移动这个影片剪辑)

好的,现在解决问题,当我有两个 gamewindow.movi​​eclips 碰撞时,就像一个箭头与一个兽人(让我们说 arrow13 hittest orc42 == true)我从 gamewindow:movieclip 中删除箭头movieclip对象并从它的 myarrowarray 中拼接它,然而,即使图形消失了,它仍会继续移动其当前轨迹并在途中撞击其他所有物体。我相信这背后的原因是因为在创建带有变量的movieclip期间,我在enterframe上包含了一个事件监听器,我认为它删除了剪辑而不是事件监听器(参见最底部的实例化箭头Movieclip类)

所以这让我想到了我的简洁问题:问题一:是否不仅可以使用 gamewindow.removeChild(arrow13),还可以使用 gamewindow.removeChild(arrow13[and all variables and eventlisteners])

问题二:我的第二个问题要简单一些:因为切换到movieclip()而不是object()我一直在使用蛮力,那么执行以下所有操作的1行代码将是什么:

var newarrow:MovieClip = new playerarrow();

newarrow.theowner = 用户名

newarrow.thespeed = 速度

newarrow.thegravity = 重力

newarrow.thepower = 力量

newarrow.arrownumber = 箭头

我的第三个问题可以追溯到我的闪屏电影剪辑的想法,我在玩他们的 z 值时遇到了麻烦

基本上,当我调用importantmessage()时,它会在左下角创建一个新的movieclip,它的alpha会淡化为0并且它会自行删除,但是我有一个问题,我的新movieclip窗口将覆盖这些消息,因为它们是在之后的瞬间添加的,我的程序中的示例是我将有 2 条消息吐出阶段。添加“尝试连接到服务器”“已连接”然后调用下一个主要功能并实例化 loginsplash:movieclip = new loginwindow - 我已经尝试过采用这个新的 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)){


               }

        }
    })
4

1 回答 1

0

Q1 ... 是可能的,但不能使用单个命令。我建议您使用casalib(我倾向于经常推荐)如果您使用 CasaMovieClip 而不是 MovieClip,它会通过添加一些处理这些问题的附加函数来扩展它,例如removeEventListeners()removeAllChildrenAndDestroy()(删除侦听器)。使用事件侦听器,请注意它只销毁该对象正在侦听的事件,而不是其他对象对该 mc 具有的侦听器。除了尝试将资产转换为使用 CasaMovieClip,您还可以只查看代码并在您的类/MC 之上实现它

处理事件侦听器的另一种方法是改用Robert Penner 的信号。这是处理事件通知的一种更优雅的方式,并且根据您的设置的声音(依赖于几个大范围的类),当对象之间的所有通信都通过单个通道发生而不是由每个通道处理时,它可能会更好地工作单独对象。

Q2 - 你可以创建一个工厂函数。

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;
}

你在哪里调用这样的函数var newarrow:MovieClip = createMC(new playerarrow(), { theowner:username});

但我不确定你为什么真的想要

Q3 - 我处理这些的方式是设置影片剪辑持有人。关键信息将始终位于顶部,游戏菜单位于下方,游戏背景始终位于底部。在主视图中,我将有一个游戏持有者 MC,在菜单上方和关键消息持有者上方,添加和删除的任何对象都仅在适当的持有者内。

于 2013-07-26T21:02:11.427 回答