我在Starling编写棋盘游戏(动作脚本3)。我使用的Starling版本有一个名为Sprite3D的类,它允许我方便,轻松地编码在这个游戏中使用的卡片的翻转。我很困惑的事实是我的卡片在翻转时会改变尺寸,而我找不到改变的来源。
感谢所有帮助。
可以在this youtube video上查看问题。
可以在this github page的github上完整地看到代码。
我将继续更详细地介绍......视频中包含以下所有信息。
Card类不包含可视信息。它是一个控制器类。它确实拥有两个精灵。一个精灵填充正面,另一个精灵填充背面。 Card类还应用了蒙版和尺寸属性,以使面具有相同的大小和形状。
Card类还包含动画代码。设置卡片动画的代码与在starling博客上发现的视频中使用的代码非常相似,该视频显示了如何在2D内存游戏中快速,轻松地实现Stage3D。 Card类通过使用补间来动画旋转,以将卡的rotationY
属性从0更改为PI,并在触摸事件上将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和BackFace类都来自CardFace类。 CardFace类将卡片作为参考,并设置一个等于卡片面具大小和形状的面具。这可能是多余的,因为卡的掩码应该掩盖所有子DisplayObject,但我们仍然这样做。
BackFace有文字,徽标,纹理和颜色。
FrontFace什么都不做。它具有特定行为的子类,并将数据对象转换为显示布局。
在这种情况下,我们使用ProfileFrontFace为FrontFace创建子类。 ProfileFrontFace将卡对象和配置文件数据对象作为构造函数参数。卡对象通过super()调用传递给CardFace,并保存配置文件对象供以后使用。
将ProfileFrontFace添加到舞台后,该类将从配置文件数据对象中提取标题,收入和费用。它为每个项目创建文本字段。它还会计算现金流量并为此值创建文本字段。使用PNG纹理创建背景,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用于更改&#34; rotationY&#34;的值时,Tween.animate()方法会导致奇怪的行为。在一个物体上?
任何和所有答案都会有所帮助。谢谢!
答案 0 :(得分:5)
FIXED !!!!!我找到了它!
我发现问题不是正面。我已经在卡本身上应用了一个掩码,它是Sprite3D对象。那面具造成了问题。当我删除它时,BackFace(一个Sprite对象)扩展到与正面相同的大小,现在当我设置卡片尺寸时,两个面具有相同的大小。
我已将卡尺寸更新为400x250以匹配原始BackFace布局,现在一切正常。
提示:尽可能在Sprite对象上设置遮罩,而不是Sprite3D对象。这使2D操作保持在2D对象上。