cocos2dx游戏--欢欢英雄传说--添加人物
接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz文件和一个.plist文件,但是我试用版生成的.pvr.ccz文件里面是加码的,所以我决定这里还是先通过一张图片一张图片添加的方式把图片资源加入到SpriteFrameCache当中。
附:原来添加plist的方式是继续在init函数中加入:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("image/role.plist","image/role.pvr.ccz");
我画了两张图片用于表示hero和enemy,名为hero-0.png和enemy-0.png,同样放在Resources/images/目录下。
hero-0.png:
enemy-0.png:
在使用plist的方法中,我们需要在HelloWorld::init()方法中将图片加入到SpriteFrameCache中,方法如下:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("images/hero-0.png", "images/enemy-0.png");
但是因为还没有获得TexturePacker的license key,所以这里现不使用这种方法。
我们将游戏中的人物分为两类,一类就是我们将要控制的玩家,另一类就是敌人,我们可以定义一个枚举类型PlayerType,然后再定义一个Player类,在Player的构造函数中通过传入参数PlayerType来确定Player的类型。
Player.h:
#ifndef __Palyer__
#define __Player__
#include "cocos2d.h"
USING_NS_CC; class Player : public Sprite
{
public:
enum PlayerType
{
HERO,
ENEMY
};
bool initWithPlayerType(PlayerType type);
static Player* create(PlayerType type);
}; #endif
Player.cpp:
#include "Player.h"
bool Player::initWithPlayerType(PlayerType type)
{
std::string spName = "";
switch (type)
{
case PlayerType::HERO:
spName = "hero-0.png";
break;
case PlayerType::ENEMY:
spName = "enemy-0.png";
break;
}
this->initWithSpriteFrameName(spName);
return true;
}
Player* Player::create(PlayerType type)
{
Player* player = new Player();
if (player && player->initWithPlayerType(type))
{
player->autorelease();
return player;
}
else
{
delete player;
player = NULL;
return NULL;
}
}
还需要在CMakeLists.txt中添加有关Player的信息:
set(GAME_SRC
Classes/AppDelegate.cpp
Classes/HelloWorldScene.cpp
Classes/Player.cpp
${PLATFORM_SPECIFIC_SRC}
) set(GAME_HEADERS
Classes/AppDelegate.h
Classes/HelloWorldScene.h
Classes/Player.h
${PLATFORM_SPECIFIC_HEADERS}
)
因为我们没有从plist中读取图片,而是一张图片一张图片地将图片加入到SpriteFrameCache中,所以我们在HelloWorld::init()函数中加入如下代码来将图片加入到SpriteFrameCache中:
SpriteFrame *spriteFrame = CCSpriteFrame::create("images/hero-0.png", CCRectMake(, , , ));
Sprite *sprite = CCSprite::createWithSpriteFrame(spriteFrame);
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-0.png", CCRectMake(, , , ));
sprite = CCSprite::createWithSpriteFrame(spriteFrame);
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-0.png");
然后根据PlayerType将Hero和Enemy两个精灵加入到游戏当中:
Player* player = Player::create(Player::PlayerType::HERO);
player->setPosition(origin.x + player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(player);
Player* enemy = Player::create(Player::PlayerType::ENEMY);
enemy->setPosition(origin.x + visibleSize.width - player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(enemy);
程序运行效果:

完整的HelloWorldScene.cpp:
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
#include "Player.h" USING_NS_CC; Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create(); // 'layer' is an autorelease object
auto layer = HelloWorld::create(); // add layer as a child to scene
scene->addChild(layer); // return the scene
return scene;
} // on "init" you need to initialize your instance
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
} auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); Sprite* background = Sprite::create("images/background.png");
background->setPosition(origin + visibleSize/);
this->addChild(background); SpriteFrame *spriteFrame = CCSpriteFrame::create("images/hero-0.png", CCRectMake(, , , ));
Sprite *sprite = CCSprite::createWithSpriteFrame(spriteFrame);
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-0.png", CCRectMake(, , , ));
sprite = CCSprite::createWithSpriteFrame(spriteFrame);
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-0.png"); Player* player = Player::create(Player::PlayerType::HERO);
player->setPosition(origin.x + player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(player);
Player* enemy = Player::create(Player::PlayerType::ENEMY);
enemy->setPosition(origin.x + visibleSize.width - player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(enemy); return true;
} void HelloWorld::menuCloseCallback(Ref* pSender)
{
Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit();
#endif
}
完整的HelloWorldScene.cpp
cocos2dx游戏--欢欢英雄传说--添加人物的更多相关文章
- cocos2dx游戏--欢欢英雄传说--添加游戏背景
经过一段时间的学习cocos2dx,接下来我想要实践开发一个小游戏,我把它命名为“欢欢英雄传说”,项目名将取为HuanHero.环境:cocos2dx环境:cocos2d-x 3.11.1IDE:Co ...
- cocos2dx游戏--欢欢英雄传说--添加动作
添加完人物之后接着给人物添加上动作.我们为hero添加4个动作:attack(由3张图片构成),walk(由2张图片构成),hit(由1张图片构成),dead(由1张图片构成):同样,为enemy添加 ...
- cocos2dx游戏--欢欢英雄传说--添加攻击按钮
接下来添加攻击按钮用于执行攻击动作.同时修复了上一版移动时的bug.修复后的Player::walkTo()函数: void Player::walkTo(Vec2 dest) { if (_seq) ...
- cocos2dx游戏--欢欢英雄传说--添加触摸响应
主要的调整就是将HelloWorldScene改成了MainSecne,然后将Player作为了MainScene的私有成员变量来处理.修改了人物图片,使用了网上找到的三国战纪的人物素材代替我之前画的 ...
- cocos2dx游戏--欢欢英雄传说--为敌人添加移动和攻击动作
这里主要为敌人添加了一个移动动作和攻击动作.移动动作是很简略的我动他也动的方式.攻击动作是很简单的我打他也打的方式.效果:代码: #ifndef __Progress__ #define __Prog ...
- cocos2dx游戏--欢欢英雄传说--添加血条
用一个空血槽图片的Sprite做背景,上面放一个ProgressTimer, 通过设置ProgressTimer的进度来控制血条的长短.建立一个Progress类来实现.Progress.h: #if ...
- 【Cocos2dx游戏开发】Cocos2d-x简介
一.简介 最近在做一个Android下的卡牌游戏--<九州幻想>开发项目,而我们使用的引擎是Cocos2dx,所以想要写写笔记来记录一下项目中的收获.当然首先稍微介绍一下Cocos2d-x ...
- 转载:Cocos2D-x 游戏接入 Windows 设备所需做的六件事
原文地址:http://msopentech.com/zh-hans/blog/2014/05/09/cocos2d-x-%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%85%A5-wi ...
- 解决 Cocos2d-x 中 Android.mk 手动添加源文件
转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...
随机推荐
- C中数组与指针【转】
在这里随便定义一个数组 int arr[5]; arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) == 4), arr 里的内 ...
- 基于CSS3自定义美化复选框Checkbox组合
今天我们要来分享一组非常漂亮的CSS3自定义复选框checkbox,每一个checkbox都有其各自的特点.有几款checkbox在选中的情况下还会出现动画效果,非常不错的CSS3自定义美化check ...
- oracle 制定定时任务
本节摘要:本节介绍使用oracle自带的job来实现oracle定制定时执行任务. 1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以 ...
- am335x PDK3.0 设置为单网口配置记录
原来的配置是双网口的,现在要配置为单网口. 一直以为这个配置是在 make menuconfig 里面, 没想到是在设备树里面. 修改设备树 // vim arch/arm/boot/dts/am33 ...
- [状态机]嵌入式设计模式:有限状态自动机的C语言实现
转自:http://www.cnblogs.com/autosar/archive/2012/06/22/2558604.html 状态机模式是一种行为模式,在<设计模式>这本书中对其有详 ...
- 文件服务器和web应用分离的思路(转)
目前在做一个应用,有不同的客户端,包括web应用的客户端,其他的客户端,都要访问我的文件服务器,通过文件服务程序提供的服务来访问文件,但是对文件管理服务器这个应用,没有什么思路,请大家给点思路,谢谢: ...
- AT command常用中文简解
1.常用操作1.1 AT命令解释:检测 Module 与串口是否连通,能否接收 AT 命令:命令格式:AT<CR>命令返回:OK (与串口通信正常) (无返回,与串 ...
- Mysql 常用工具
mysqladmin:用于管理MySQL服务器的客户端 mysqladmin是一个执行管理操作的客户程序.可以用它来检查服务器的配置和当 前的状态,创建并删除数据库等等. 这样调用mysqladmin ...
- EasyUI效果--DataGrid的编辑效果
DataGrid的编辑效果是我目前使用的easyUI的第三个效果,相对于前两个,这个算是比较复杂点了. 运行起来的效果,大概就是这样,任意点击某行,然后该行变为可以编辑的,失去焦点之后,该行恢复 ...
- sparkr——报错
> sc <- sparkR.init() Re-using existing Spark Context. Please stop SparkR with sparkR.stop() o ...