2017-02-20 79 views
12

我在Starling编写棋盘游戏(动作脚本3)。我正在使用的Starling版本有一个名为Sprite3D的类,它允许我方便且容易地编写用于此游戏的卡片翻转代码。我感到困惑的是,我的卡在翻转时发生了尺寸变化,我无法找到变化的来源。什么原因导致此卡更改尺寸? [视频和代码]

所有帮助表示赞赏。

该问题可以在this youtube video上查看。

该代码可以在github上完整查看this github page

我会在这里继续了解更多详情...视频中涵盖了以下所有信息。

Card类不包含可视信息。它是一个控制器类。它拥有两个精灵。一个精灵填充正面,另一个精灵填充背面。卡类还具有应用蒙版和尺寸属性,以便面的大小和形状相同。

Card类还包含动画代码。动画片的代码与Starling博客中的视频代码非常相似,该视频展示了Stage3D如何在2D内存中非常快速和轻松地实现。 Card类通过使用补间将卡的rotationY属性从0更改为PI,并将触发事件中的PI更改为0,从而动画轮播。在翻转过程中出现的错误,所以我会包括弹射代码在这里:

public function flip() : void { 
    _state = !(this._state); 
    if(this.animations){ 
     var tween : starling.animation.Tween = new Tween(this, 2, starling.animation.Transitions.EASE_OUT_BOUNCE); 
     var card : Card = this; 
     var didFlip : Boolean = false; 
     tween.animate("rotationY", this._state == Card.FACE_UP ? Math.PI : 0); 
     tween.onUpdate = updateVisibility; 
     Starling.juggler.add(tween); 
    } 
} 
private function updateVisibility():void 
{ 
    var sHelper:Vector3D = new Vector3D(); 
    var card : Card = this; 
    stage.getCameraPosition(card, sHelper); 
    if(sHelper){ 
     this._front_face.visible = sHelper.z < 0; 
     this._back_face.visible = sHelper.z >= 0; 
    } 
} 

的FrontFace和背面类从类CardFace都派生。 CardFace类将卡片作为参考,并设置一个与卡片的蒙版尺寸和形状相同的蒙版。这可能是多余的,因为该卡片的遮罩应掩盖所有儿童的DisplayObject,但我们仍然要这样做。

BackFace具有文字,徽标,纹理和颜色。

FrontFace不做任何事情。它具有特定行为的子类,并将数据对象转换为显示布局。

在这种情况下,我们使用ProfileFrontFace对FrontFace进行子类化。 ProfileFrontFace将卡对象和一个配置文件数据对象作为构造函数参数。卡对象通过super()调用传递给CardFace,并且该配置文件对象被保存以供以后使用。

当ProfileFrontFace被添加到阶段时,类将从配置文件数据对象中提取标题,收入和费用。它为每个这些项目创建文本字段。它还计算现金流量并为此值创建文本字段。背景是使用PNG纹理创建的,该纹理是一个简单的白色正方形,可以在卡片的整个面上进行拉伸。在这个白色方块上,我们应用了一种颜色纹理。创建后,背景图像不会更改。代码如下所示:

//we remove the event listener so this function code is only executed once 
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
var width : int = this.cardWidth; /* 400 */ 
var height : int = this.cardHeight; /* 300 */ 
var bg : Image = new Image(Game.assets.getTexture("blank")); 
/* start the background in the top left */ 
bg.x = 0; 
bg.y = 0; 
/* have the background fill the card dimension space */ 
bg.width = width; 
bg.height = height; 
/* apply a color so that the background is not pure white */ 
bg.color = ColorScheme.OPAL; 
/* add the background to the stage */ 
this.addChild(bg); 

在函数的其余部分,我们创建文本并显示它。为了简单起见,我不在这个代码中。在测试中,我已经删除了这些代码,并且看到它不会影响卡片翻转到正面时会改变卡片尺寸的特殊行为。

有没有人看到过Sprite3D上的蒙版无法作为蒙版执行的情况?

有没有人见过面具不能在普通的Sprite对象上执行的情况?

Tween.animate()方法在使用Tween更改对象上的“rotationY”的值时可能会导致奇怪的行为?

任何和所有的答案将有所帮助。谢谢!

回答

5

固定!!!!!我找到了!

我发现问题不在前面。我已经为卡本身应用了一个面具,这是Sprite3D对象。这个面具造成了问题。当我移除它时,BackFace(一个Sprite对象)扩展到与正面相同的大小,现在当我设置卡片尺寸时,两个面都具有相同的尺寸。

我已将卡尺寸更新为400x250以匹配原始的BackFace布局,现在一切正常。

提示:尽可能在Sprite对象上设置遮罩,而不是Sprite3D对象。这可以保持2D对象上的2D操作。

相关问题