2012-02-18 42 views
2

我试图制作一个纯粹的AS3游戏,并且需要一种方法来分割屏幕,以便两个玩家可以拥有跟随游戏世界的单个“相机”。问题是一个精灵不能有多个父母。我试图绕过这个问题,通过让类重复子图并管理所有更新,但我没有走得太远,我的代码变得非常非常难看。Actionscript中的分屏3

有没有人知道一个很好的解决方法或方法来做到这一点?我似乎无法在这个主题上找到很多在线内容。

+0

你的意思是你希望每个玩家能够在游戏世界中与其他玩家分开导航吗? – sch 2012-02-18 21:40:18

+0

是的,因为它们不必彼此靠近。 [This](http://www.youtube.com/watch?v=rBKDaGd68vw)就是我所说的那种事情的一个例子。 – 2012-02-20 00:29:35

回答

0

您的理论走在正确的轨道上 - 您可能只是在实施过程中蹒跚而行。在这种情况下,组织和保持面向对象将成为你最好的朋友。

很难给你一个很好的例子,基于你的游戏的有限描述,但总的来说,我会有一个可以多次实例化的类,并且我会跟踪每个实例化这给了我们多个“玩家”)。每个Screen都有一个阶段,并且您正在该阶段构建您的游戏世界。

这里的关键是数据组织和良好的沟通。记住,只有一个“世界”,你只是显示它的多个实例。所以你需要一个中央模型来存储你单数游戏世界中每个对象的数据。该模型将推动将这个世界渲染到多个屏幕。如果玩家改变屏幕上的对象(假设他们移动它),那么您将使用该对象的新位置更新模型。然后,您将向每个Screen实例广播这些新坐标,以便您的所有屏幕都会更新。

你如何“广播”这可能会有所不同(并且很大程度上取决于你的游戏的实时性)。如果你的游戏非常实时并且你正在运行一个游戏循环,那么你可能只想在每个循环中传递对象的数据,并且它们会以这种方式更新。如果您的游戏不是实时依赖的,那么您可以设置事件侦听器或自定义通知系统,它会提醒对象的所有实例进行更新。

我知道这是非常高级的,但如果没有关于游戏的更多信息,很难给出深入的答案。希望这可以帮助你指出正确的方向 - 你尝试的绝对不是简单的,所以不要灰心!

1

我认为你应该使用的BitmapData copyPixels方法

   .copyPixels(point_0, rectangle_0)---> FirstPlayerScreen 
World.Bitmap - 
       .copyPixels(point_0, rectangle_0)---> SecondPlayerScreen 
0

如果您在使用MVC建筑的原则,那么它应该是微不足道的画你的游戏两次,每个玩家有游戏中的“视图”的一个实例,开发自己的游戏但根据不同的角色定位。如果您为每个实例提供图层蒙版,则可以将这两个实例并排放置,从而创建分屏效果。

快乐编码!

1

感谢大家的建议。我最终得到的是一个World班,我可以添加常规的Sprite对象作为孩子。 World对象管理和更新这些精灵的副本,world.getCamera()可根据需要多次调用以显示游戏世界的自定义副本。

关键的部分是精灵的副本,这是我写的做到这一点的功能:

public function bitmapCopy(original:DisplayObject):Sprite 
{ 
    var returnSprite:Sprite = new Sprite(); 
    if (original.width == 0 || original.height == 0) return returnSprite 

    var x = original.x; var y = original.y 
    var rotation = original.rotation 
    original.x = 0; original.y = 0; original.rotation = 0 
    var bounds:Rectangle = original.getBounds(original.parent) 
    var m:Matrix = new Matrix() 
    m.tx = -bounds.x 
    m.ty = -bounds.y 

    var bitmapData:BitmapData = new BitmapData(bounds.width, bounds.height, true, 
     0xFF0000); 
    bitmapData.draw(original, m); 
    var bitmap:Bitmap = new Bitmap(bitmapData); 
    bitmap.x = bounds.x 
    bitmap.y = bounds.y 

    returnSprite.addChild(bitmap); 

    returnSprite.x = original.x = position.x 
    returnSprite.y = original.y = position.y 
    returnSprite.rotation = original.rotation = rotation 

    return returnSprite; 
} 

返回Sprite可以添加到舞台,并以完全相同的方式与作用原创(当然除了静态)。希望这可以帮助解决这个问题的其他人。

0

我正在分裂刚才筛选自己:

  • 屏蔽绘制1个世界在你的DisplayObject树(分离干净)的2个分支,复制像素的分屏是一个坏想法
  • 数据对象来描述世界(不雪碧或的DisplayObject)

工作得很好至今。我有1个关卡,2个独立移动的玩家和2个跟随一个玩家的屏幕。我在一个玩家的屏幕上看到另一个玩家,而在另一个玩家的屏幕上看到另一个玩家。


这里是我做的数据对象部分:

界定中央数据对象它描述了世界和它的所有世界中的物体。

写:使一些精灵能够操纵世界上的1个对象。

阅读:通过检查世界对象的属性来更新子图。 2个屏幕 - > 2个精灵为每个世界物体。检查他们的每一帧或尝试事件。