求2d游戏人物3d建模2d渲染图3*4格式

Pages: 1/2
主题 : 3DMAX导出的FBX模型,显示到COCOS2DX 3.4中,模型脑袋朝向屏幕,而不是身体朝向屏幕。
级别: 新手上路
可可豆: 159 CB
威望: 159 点
在线时间: 92(时)
发自: Web Page
来源于&&分类
3DMAX导出的FBX模型,显示到COCOS2DX 3.4中,模型脑袋朝向屏幕,而不是身体朝向屏幕。&&&
3DMAX导出的FBX模型,显示到COCOS2DX 3.4中,模型脑袋朝向屏幕,而不是身体朝向屏幕,这是为什么啊?如图,在3DMAX中,
,在引擎中, 可以看到,在游戏中显示的是模型的顶部,而不是模型的正面。附上资源:
(36 K) 下载次数:19 高手下下来,帮忙测试下吧!&&
级别: 新手上路
可可豆: 39 CB
威望: 39 点
在线时间: 35(时)
发自: Web Page
我也遇到了类似的问题!
级别: 新手上路
可可豆: 159 CB
威望: 159 点
在线时间: 92(时)
发自: Web Page
导出 c3b 加 -f 也试过了,没有任何用
级别: 新手上路
可可豆: 159 CB
威望: 159 点
在线时间: 92(时)
发自: Web Page
3DMAX导出模型有什么特殊要求么?用的3DMAX2014,导出方式也参照了
级别: 骑士
UID: 34816
可可豆: 468 CB
威望: 587 点
在线时间: 687(时)
发自: Web Page
模型Z和Y是反的,靠局部坐标系掰直,而3.4没有读那个矩阵。
级别: 新手上路
可可豆: 159 CB
威望: 159 点
在线时间: 92(时)
发自: Web Page
为什么官方的3D模型没有问题?感觉是导出模型时某些地方没有设置。有人遇到过同样的问题么?求解答!
级别: 骑士
UID: 369615
可可豆: 1046 CB
威望: 773 点
在线时间: 389(时)
发自: Web Page
我也遇到了&& 我只能用rotation调角度
级别: 新手上路
UID: 374036
可可豆: 38 CB
威望: 33 点
在线时间: 24(时)
发自: Web Page
会不会是3DMAX的Z轴朝上的,而cocos的Z轴是朝屏幕外的
级别: 新手上路
可可豆: 32 CB
威望: 32 点
在线时间: 35(时)
发自: Web Page
3.6也遇到了这个问题,求解决~
级别: 骑士
UID: 369615
可可豆: 1046 CB
威望: 773 点
在线时间: 389(时)
发自: Web Page
在建模的时候把模型的坐标调整一下
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。
上篇在状态层加入了血条,并添加了一个攻击按键
本篇将在前面的基础上添加敌人,并通过有限状态机(FSM)实现简单的AI
win64 : vs2010
Cocos2d-x v3.4Final
TexturePackerGUI
创建一个继承基础Role类,作为敌人.
typedef enum {
AI_IDLE = 0,
AI_PATROL,
AI_ATTACK,
AI_PURSUIT
作为AI类型
其他的代码和Hero大同小异
bool init();
void updateSelf();
CREATE_FUNC(Enemy);
CC_SYNTHESIZE(cocos2d::Vec2, m_moveDirection, MoveDirection);
CC_SYNTHESIZE(float, m_eyeArea, EyeArea);
CC_SYNTHESIZE(float, m_attackArea, AttackArea)
CC_SYNTHESIZE(AiState, m_aiState, AiState);
void decide(const cocos2d::Vec2& target, float targetBodyWidth);
void execute(const cocos2d::Vec2& target, float targetBodyWidth);
unsigned int m_nextDecisionT
由于敌人是AI,我们要给它设定一些区域,视野,最大攻击判定区,AI状态等.
Animation *idleAnim = this-&createNomalAnimation("bear_idle_%02d.png", 3, 6);
this-&setIdleAction(RepeatForever::create(Animate::create(idleAnim)));
然后是类似Hero的自更新函数updateSelf刷新自己状态
void Enemy()
this-&execute(global-&hero-&getPosition(), global-&hero-&getBodyBox().actual.size.width);
if(this-&getCurrActionState() == ACTION_STATE_WALK)
Vec2 location = this-&getPosition();
Vec2 direction = this-&getMoveDirection();
Vec2 expectP = location +
float maptileHeight = global-&tileMap-&getTileSize().
if(expectP.y & 0 || expectP.y & maptileHeight * 3 )
direction.y
this-&setFlippedX(direction.x & 0 ? true : false);
this-&setPosition(location + direction);
this-&updateBoxes();
this-&setLocalZOrder(this-&getPositionY());
if(this-&getCurrActionState() == ACTION_STATE_NOMAL_ATTACK_A)
this-&runNomalAttackA();
之后我们给它一个执行延时,这是为了防止过快判断,判读的太过频繁不止给CPU压力,还会使效果出现问题.比如我们的敌人死追着Hero不放,撞了墙还在向着Hero的方向执行动画等.
void Enemy::execute(const Vec2& target, float targetBodyWidth)
if(m_nextDecisionTime == 0)
this-&decide(target, targetBodyWidth);
-- m_nextDecisionT
接下来通过FSM设定敌人的AI
void Enemy::decide(const Vec2& target, float targetBodyWidth)
Vec2 location = this-&getPosition();
float distance = location.getDistance(target);
distance = distance - targetBodyWidth / 2;
bool isFlippedX = this-&isFlippedX();
bool isOnTargetLeft = (location.x & target.x ? true : false);
if((isFlippedX && isOnTargetLeft) || (!isFlippedX && !isOnTargetLeft)) {
this-&m_aiState = CCRANDOM_0_1() & 0.5f ? AI_PATROL : AI_IDLE;
if(distance & m_eyeArea)
this-&m_aiState = (distance & m_attackArea)&&((fabsf(location.y - target.y) & 15)) ? AI_ATTACK : AI_PURSUIT;
this-&m_aiState = CCRANDOM_0_1() & 0.5f ? AI_PATROL : AI_IDLE;
switch(m_aiState)
case AI_ATTACK:
this-&runNomalAttackA();
this-&m_nextDecisionTime = 50;
case AI_IDLE:
this-&runIdleAction();
this-&m_nextDecisionTime = CCRANDOM_0_1() * 100;
case AI_PATROL:
this-&runWalkAction();
this-&m_moveDirection.x = CCRANDOM_MINUS1_1();
this-&m_moveDirection.y = CCRANDOM_MINUS1_1();
m_moveDirection.x
= m_moveDirection.x & 0 ? (m_moveDirection.x + velocity.x) : (m_moveDirection.x -velocity.x);
m_moveDirection.y
= m_moveDirection.y & 0 ? (m_moveDirection.y +velocity.y) : (m_moveDirection.y -velocity.y);
this-&m_nextDecisionTime = CCRANDOM_0_1() * 100;
case AI_PURSUIT:
this-&runWalkAction();
this-&m_moveDirection = (target - location).getNormalized();
this-&setFlippedX(m_moveDirection.x & 0 ? true : false);
m_moveDirection.x
= m_moveDirection.x & 0 ? (m_moveDirection.x +velocity.x) : (m_moveDirection.x -velocity.x);
m_moveDirection.y
= m_moveDirection.y & 0 ? (m_moveDirection.y +velocity.y) : (m_moveDirection.y -velocity.y);
this-&m_nextDecisionTime = 10;
distance是为了判断这个敌人和目标Body之间的距离.
下面是几个AI的判断,里面用到几个宏是随机一个数,更真实的表现敌人.
Attack,攻击,每次攻击延时50
Idle,发呆,延时随机一个0-1的数字*100
Patrol,巡逻,延时时间也似随机出来的
Pursuit,追击,当发现Hero追击的判断
主要的AI是:
目标出现在正前方?(根据视野范围)发呆or巡逻
是否在攻击范围内?(根据攻击范围)追击or攻击
这个图片更好理解下
接下来在GameLayer加入他们
我们每次加入多个敌人,方便起见需要使用数组来实现它(链表更好)
void addEnemies(int number);
void updateEnemies(float dt);
__Array *m_pE
实现addEnemies,一次加入多个敌人通过这个数组创建.最后别忘了将这个数组注册到Global,下一章做攻击判断用
void GameLayer(int number)
m_pEnemies = __Array(number);
m_pEnemies-&retain();
for(int i=0;i&i++)
Enemy *pEnemy = Enemy();
pEnemy-&setPosition(Vec2(
random(_visibleSize.width/2,_visibleSize.width) ,
pEnemy-&runIdleAction();
pEnemy-&setLocalZOrder(_visibleSize.height - pEnemy-&getPositionY());
pEnemy-&setVelocity(Vec2(0.5f, 0.5f));
pEnemy-&setEyeArea(300);
pEnemy-&setAttackArea(80);
pEnemy-&setDamageStrenth(5);
pEnemy-&setSumLifeValue(100);
pEnemy-&setCurtLifeValue(m_pHero-&getSumLifeValue());
m_pEnemies-&addObject(pEnemy);
this-&addChild(pEnemy,0);
global-&enemies= m_pE
this-&addEnemies(5);
我们看到了几个敌人呆立在地图中.(截图帧数问题,刚好每次敌人都没动)
由于我们没有刷新敌人的状态,敌人是不会动的.
继续添加刷新敌人的代码
void GameLayer(float dt)
Ref *Obj = NULL;
Vec2 distance = Vec2;
CCARRAY_FOREACH(m_pEnemies, Obj)
Enemy *pEnemy = (Enemy*)O
pEnemy-&updateSelf();
if(pEnemy-&getDeadAction()-&isDone())
m_pEnemies-&removeObject(pEnemy);
跟新update方法
void GameLayer::update(float dt)
this-&updateHero(dt);
this-&updateEnemies(dt);
他们开始乱跑和执行攻击动画了
ok,我们已经达到了想要的效果
本片实现了添加多个敌人,并给敌人设定简单的AI让其何以自动随机巡逻或者追击或是攻击Hero.
但是目前只有各种动画,没有实现攻击判定.
下一章我们通过攻击判定,让Hero或者是Enemy受伤,生命到底还会死亡.具体的属性比如生命值,攻击力之类的.参阅上面的代码
本文已收录于以下专栏:
相关文章推荐
代码原创作品,允许转载。
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
否则将追究法律责任。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。上一篇: Co...
转载时请务必以超链接形式标明文章,原始出处 。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。上一篇: Cocos3.4 横版游戏制作-《KillBear》-攻击判定+伤害飘血
代码原创作品,允许转载。资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
否则将追究法律责任。此篇为第一篇,我们简单说...
代码原创作品,允许转载。
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
否则将追究法律责任。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。上一篇: Cocos...
转载时请务必以超链接形式标明文章,原始出处 。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。上一篇: Cocos3.4 横版游戏制作-《KillBear》-暂停层+屏蔽下层监听
代码原创作品,允许转载。
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
否则将追究法律责任。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。 上一篇:Coco...
转载时请务必以超链接形式标明文章,原始出处 。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。上一篇: Cocos3.4 横版游戏制作-《KillBear》-添加敌人 简单AI实现
    虽然整理这些东西很浪费时间,但是因为我平时研究和学习的东西实在是太多了,不经常整理的话很容易乱。而且自从上次电脑损坏之后,我一直都对数据备份这件事非常在意。稍微整理一些东西之后就会...
简易2D横版RPG游戏制作(二)
现在我们到了di
这一篇本来应该是在上一篇后面直接补进去的。
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)6422人阅读
Cocos2d(27)
说明这个系列只是提供函数的熟悉和方便查找,实在没什么技术含量- -
ImageView * imageView = ImageView::create(&cocosui/ccicon.png&);//新建图片
imageView-&setScale9Enabled(true);
//是否启用九宫格显示模式
imageViewChild-&setSizeType(Widget::SizeType::PERCENT);//设置大小类型
imageViewChild-&setSizePercent(Vec2::ANCHOR_MIDDLE);//设置大小比例
imageViewChild-&setPositionType(Widget::PositionType::PERCENT);//设置位置类型
imageViewChild-&setPositionPercent(Vec2::ANCHOR_MIDDLE);//设置位置比例
imageViewChild-&setPosition(Vec2(widgetSize.width / 2.0f,
& & & & & & & & & & & & & & & & & & widgetSize.height / 2.0f));//设置位置
imageView-&addTouchEventListener([=](Ref * sender, Widget::TouchEventType type){
if (type == Widget::TouchEventType::ENDED){
float width = CCRANDOM_0_1() * 200 + 50;
float height = CCRANDOM_0_1() * 80 + 30;
imageVIew-&setContentSize(Size(width, height));
imageViewChild-&setPositionPercent(Vec2(CCRANDOM_0_1(), CCRANDOM_0_1());
imageVIew-&setColor(Color3B(159, 168, 187);
//设置图片颜色
imageVIew-&setContentSize(Size(250, 115));
//设置图片大小
imageView-&setFilppedX(true);
//在X轴上翻转
imageView-&setScale(0.5);
//设置图片放大系数,当前系数+1
imageView-&ignoreContentAdaptWithSize(false);
//如果设置为true,忽略内容适应,使用系统默认的渲染大小,与实际的图片资源大小无关
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:216077次
积分:2720
积分:2720
排名:第13903名
原创:72篇
转载:32篇
评论:27条
(1)(1)(8)(2)(1)(1)(2)(1)(1)(2)(3)(8)(3)(4)(2)(17)(9)(4)(5)(7)(1)(3)(1)(5)(4)(5)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'主题 : 3.4中,3dmax模型转成c3b,默认看到的面如何设置
级别: 新手上路
UID: 152095
可可豆: 13 CB
威望: 14 点
在线时间: 14(时)
发自: Web Page
来源于&&分类
3.4中,3dmax模型转成c3b,默认看到的面如何设置&&&
弱弱的求解下。3.4中,3dmax模型转成c3b,默认看到的面如何设置?是顶置图,前视图,还是可以设置的呢?
级别: 骑士
UID: 34816
可可豆: 468 CB
威望: 587 点
在线时间: 687(时)
发自: Web Page
用这个查看
级别: 骑士
可可豆: 457 CB
威望: 417 点
在线时间: 323(时)
发自: Web Page
默认看到哪个面,跟相机的位置有关吧,把相机放到头顶正上方向下看就是“顶视图”呗!
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版

我要回帖

更多关于 2d建模 的文章

 

随机推荐