在Actionscript 3中分屏

时间:2012-02-18 17:36:39

标签: actionscript-3

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

有没有人知道这样做的好方法或方法?我似乎无法在这个主题上找到很多在线。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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添加到舞台中,其行为方式与原作完全相同(当然,除了静态)。希望这可以帮助遇到这个问题的其他人。

答案 2 :(得分:0)

你的理论走在正确的轨道上 - 你可能只是绊倒了你的实施。在这种情况下,组织和保持面向对象将是你最好的朋友。

很难根据对游戏的有限描述给出一个很好的例子,但总的来说,我有一个可以多次实例化的Screen类,我会跟踪每个实例化(给我们多个“玩家”)。每个Screen都有一个舞台,你在那个舞台上构建你的游戏世界。

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

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

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

答案 3 :(得分:0)

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

快乐的编码!

答案 4 :(得分:0)

我刚才在分屏幕上工作:

  • 屏蔽在DisplayObject树的2个分支中绘制1个世界(干净地分开),复制分割屏幕的像素是个坏主意
  • 数据对象来描述世界(不是Sprite或DisplayObject)

到目前为止效果很好。我有1个级别,2个玩家彼此独立移动,2个屏幕一次跟随一个玩家。我看到一个玩家屏幕中的其他玩家和另一个玩家屏幕中的一个玩家。

<小时/> 以下是我对数据对象部分的处理方式:

  

定义一个中央数据对象,它描述了世界及其所有世界对象。

     

写:让一些精灵能够操纵世界上的一个物体。

     

读取:通过检查世界对象的属性来更新精灵。 2个屏幕 - &gt;每个世界物体有2个精灵。每帧检查一次或尝试事件。