(Cocos-2.2.6 & Framework-3.5)
唔,做个简单的卡牌游戏吧,叫做记忆大考验。游戏模仿自【冒险岛OL】 。嗯,我也是老岛民了,不过已经肝不动了。
游戏大概是这样子
戏规则很简单,有若干张卡片,每次翻到两张相同的就能翻出卡牌,翻出所有卡牌则结束。
那么问题来了,我们要一个卡牌(类),而且能让它翻转。
我们先找找精灵的翻转效果。
很幸运,cocos2dx里面有个RotateTo和RotateBy类。RotateTo和RotateBy类的构造器类似。区别就在XxxxTo和XxxxBy的区别。
我们常用的应该是这个:
* @param durationDuration time, in seconds.
* @param deltaAngleIn degreesCW.
static RotateBy*create(float duration, float deltaAngle);
RotateBy* myRotate =RotateBy::create(1.0f, 90);
既然是翻牌,那就只要沿着Y轴或者X轴转就可以了,比较符合常规的是绕着Y轴转,就是左右翻牌。我们选择这个构造器
* @param durationDuration time, in seconds.
* @paramdeltaAngleZ_X In degreesCW.
* @paramdeltaAngleZ_Y In degreesCW.
static RotateBy*create(float duration, const Vec3& deltaAngle3D);
RotateBy* myRotate =RotateBy::create(1.0f, Vec3(0, 90, 0));
很好,转起来了,不过稍微有点不合预期。
第一, 这是3D旋转,我们可以看到有消失点了。
第二,这个旋转是绝对地旋转,我们的这个精灵转一次之后,图案就左右镜面对称了。可以想象,如果我们的卡牌上面有文字的话,那就不好了。
我们稍微改造一下,不能无脑使用RotateBy了。
RotateTo* myRotate =RotateTo::create(1.0f, Vec3(0, 90, 0));
RotateTo* myRotate2= RotateTo::create(0, Vec3(0, 270, 0));
RotateTo* myRotate3= RotateTo::create(1.0f, Vec3(0, 0, 0));
auto sq =Sequence::create(myRotate, myRotate2, myRotate3, nullptr);
mySprite->runAction(RepeatForever::create(sq));
很好,对称问题可以解决了。不过消失点问题是改变不了的了,因为他是基于3D坐标系旋转的。
我们另辟蹊径。翻牌的视觉效果上看,有点像把卡牌压扁了再伸展出来&#x