cocos2dx ver3.3 的Sprite3DTest 例子中可以学到啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2dx ver3.3 的Sprite3DTest 例子中可以学到啥相关的知识,希望对你有一定的参考价值。

参考技术A 1. Sprite3DBasicTest Sprite3D 两种基本创建方式

(1). 直接使用一个带有素材的obj (3dmax对象)

Sprite3D::create("sprite3dTest/scene01.obj");

(2). 使用不带素材的对象,自己设置素材

auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");

sprite->setScale(3.f);

sprite->setTexture("Sprite3DTest/boss.png");

(3)

auto sprite = EffectSprite3D::createFromObjFileAndTexture("Sprite3DTest/boss1.obj", "Sprite3DTest/boss.png");

2. Sprite3DHitTest 拖拽

(1) 点击 在onTouchBegan 中设置透明度 target->setOpacity(100);

放手在 onTouchEnded中还原透明度 target->setOpacity(255);

(2) 移动 onTouchMoved

target->setPosition(target->getPosition() + touch->getDelta());

(3) addEventListenerWithSceneGraphpriority 更具sprite的z order决定丢用先后

3. Sprite3DEffectTest 一些shader 的运用例子

将具体实现封装到了Effect3DOutline中

4.加载3dmax导出的文件,使用fbx-conv.exe转化

std::string fileName = "Sprite3DTest/orc.c3b";

auto sprite = EffectSprite3D::create(fileName);

5. Sprite3DWithSkinOutlineTest shader特效在c3b的运用

6. Animate3DTest 动画的播放和切换 小乌龟的demo

(1) 同一个c3b既可以创建sprite也可以创建action

std::string fileName ="Sprite3DTest/tortoise.c3b";

auto sprite = Sprite3D::create(fileName);

sprite->setScale(0.1f);

auto s =Director::getInstance()->getWinSize();

sprite->setPosition(Vec2(s.width *4.f / 5.f, s.height /2.f));

addChild(sprite);

_sprite = sprite;

auto animation = Animation3D::create(fileName);

(2) animation 可以通过 时间来分拆,这个时间是在3Dmax中定义的

if (animation)

//2个动画的时间不同,这些在3Dmax中定义

auto animate = Animate3D::create(animation, 0.f,1.933f);

_swim = RepeatForever::create(animate);

sprite->runAction(_swim);

_swim->retain();

_hurt = Animate3D::create(animation,1.933f, 2.8f);

_hurt->retain();

_state = State::SWIMMING;



(3)乌龟游到尽头 调用 reachEndCallBack

通过reverse获得相反的action

auto inverse = (MoveTo*)_moveAction->reverse();

沿y轴180度转向

auto rot = RotateBy::create(1.f, Vec3(0.f, 180.f, 0.f));

(4)在onTouchesEnded中实现播放乌龟的 hurt动作 ,但是这里没法实现hurt动作的结束回调,所以采用_hurt->getDuration()

来获得其结束时间,并且做一个renewCallBack来回到_swim 动作

auto delay = DelayTime::create(_hurt->getDuration() - Animate3D::getTransitionTime());

auto seq = Sequence::create(delay, CallFunc::create(CC_CALLBACK_0(Animate3DTest::renewCallBack, this)), nullptr);

疑问? Animate3D::getTransitionTime() 用来干嘛

为啥会用void Animate3DTest::update(float dt) 来维护一个中间状态 HURT_TO_SWIMMING 和SWIMMING_TO_HURT

7. AttachmentTest 装武器

获取某个骨骼,Bip001 R Hand是在3Dmax定义的

auto sp = Sprite3D::create("Sprite3DTest/axe.c3b");

sprite->getAttachNode("Bip001 R Hand")->addChild(sp);

点击后去掉附加节点

_sprite->removeAllAttachNode();

8. Sprite3DReskinTest 皮肤换装, 动态更换材质(mesh)

(1)字号字体

TTFConfig ttfConfig("fonts/arial.ttf", 20);

auto label1 = Label::createWithTTF(ttfConfig,"Hair");

应该是在3dm中定义好了mesh的名称?

_girlPants[0]= "Girl_LowerBody01";

_girlPants[1]= "Girl_LowerBody02";

_girlUpperBody[0] = "Girl_UpperBody01";

_girlUpperBody[1] = "Girl_UpperBody02";

_girlShoes[0] = "Girl_Shoes01";

_girlShoes[1] = "Girl_Shoes02";

_girlHair[0]= "Girl_Hair01";

_girlHair[1]= "Girl_Hair02";

(2) 初始化的时候隐藏备选的部分,点击切换的时候再 交换显示

auto girlPants = sprite->getMeshByName(_girlPants[1]);

if(girlPants)



girlPants->setVisible(false);



9.Sprite3DWithOBBPerfromanceTest 包围盒与3D模型碰撞的实现

10.Sprite3DMirrorTest 3D模型的镜像

常用总结:

1. 3d 纬度的朝向设置

sprite->setRotation3D(Vec3(0,180,0));

2. sprite->setEffect() 添加特效

3.sprite->getAttachNode("Bip001 R Hand") 获取某个骨骼

4. sprite->getMeshByName(_girlPants[1]); 获取材质

Java Protobuf (ver. 2.4.1) 和 Protobuf-net (ver. r480) 继承兼容性

【中文标题】Java Protobuf (ver. 2.4.1) 和 Protobuf-net (ver. r480) 继承兼容性【英文标题】:Java Protobuf (ver. 2.4.1) and Protobuf-net (ver. r480) inheritance compatibility 【发布时间】:2012-05-20 19:25:27 【问题描述】:

是否可以使用 Java Protobuf 反序列化以下使用 Protobuf-net 序列化的 DerivedMessage?

namespace Test.Protobuf

  [ProtoBuf.ProtoContract]
  [ProtoBuf.ProtoInclude(2550, "Test.Protobuf.DerivedMessage")]
  class BaseMessage
  
    [ProtoBuf.ProtoMember(1)]
    public string MessageId  get; set; 

    [ProtoBuf.ProtoMember(2)]
    public int CommandId  get; set; 
  

  [ProtoBuf.ProtoContract]
  class DerivedMessage : BaseMessage
  
    [ProtoBuf.ProtoMember(1)]
    public int ClientId  get; set; 

    [ProtoBuf.ProtoMember(2)]
    public string Message  get; set; 

    [ProtoBuf.ProtoMember(3)]
    public string Description  get; set; 
  

DerivedMessage 扩展 BaseMessage,阅读文档解决方案似乎是在 proto 文件中使用嵌套消息 但它不起作用,这是我的原型文件:

package protobuf;

option java_package = "test.protobuf";
option java_outer_classname = "Proto";

message BaseMessage 
    optional string message_id = 1;
    optional int32 command_id = 2;


message DerivedMessage 
    optional int32 client_id = 1;
    optional string token = 2;
    optional string message = 3;
    optional string description = 4;
    optional BaseMessage base_message = 5;

有解决办法吗?

谢谢

【问题讨论】:

【参考方案1】:

派生类是否可能不应该也有一个与父类具有相同 ID 的字段?在您的示例中,messageId 和 clientId 都具有相同的标识符:1.

【讨论】:

不,这根本不是问题【参考方案2】:

字段编号必须匹配,并且进入 BaseMessage,而不是 DerivedMessage。

在不相关的新闻中,您在 DerivedMessage 中的其他字段看起来很无聊; "token" 来自数字,后面的 2 个字段是一对一的。

message BaseMessage 
    optional string message_id = 1;
    optional int32 command_id = 2;
    optional DerivedMessage derived_message = 2550;


message DerivedMessage 
    optional int32 client_id = 1;
    optional string message = 2;
    optional string description = 3;

【讨论】:

嗨,马克,按照你的指示,我现在可以反序列化由 Protobuf-net 序列化的消息。现在的问题是 Protobuf-net 无法反序列化由 Java Protobuf 序列化的消息,它会抛出“无法将类型为 'Test.Protobuf.BaseMessage' 的对象转换为类型 'Test.Protobuf.DerivedMessage'”。例外。问题似乎是写入字节的顺序。实际上设置 ClientId = 3, CommandId = 5 Protobuf-net 序列化 b2 9f 01 02 08 03 10 05 而不是 Java Protobuf 序列化 10 05 b2 9f 01 02 08 03 不幸的是我无法更改 .Net 端类。 @user1406564 v2,对吧?烦人的 v1 解决了这个问题(尽管效率略低)。不可否认,这是 protobuf-net 的失败;它应该(并且确实)接受无序的伪继承。我可以尝试解决这个问题,但这不会是即时的。不幸的是,protobuf 根本不支持继承根本,对于 protobuf-net 实现必须有点厚颜无耻。我怪我。

以上是关于cocos2dx ver3.3 的Sprite3DTest 例子中可以学到啥的主要内容,如果未能解决你的问题,请参考以下文章

layabox 3d 入手

关于cocos2dx触摸的问题

cocos2dx android 代码混淆

cocos2dx3.3 csb帧动画怎么加载

cocos2dx android 代码混淆

cocos2dx 用啥工具开发