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 ...
随机推荐
- Docker——MacOS上安装运行docker
近几年来,Docker越来越流行,使用场景也越来越广泛.为了能尽快跟上时代步伐.学习并应用到实际工作中,我也开始了Docker之旅. Docker版本 Docker共有两种版本: 社区版(Commun ...
- web应用中文乱码问题的原因分析
为了让使用Java语言编写的程序能在各种语言的平台下运行,Java在其内部使用Unicode字符集来表示字符,这样就存在Unicode字符集和本地字符集进行转换的过程.当在Java中读取字符数据的时候 ...
- kubernetes生态圈
1:helm(部署工具,可以用来部署常用的应用,替代kubelet原生命令) https://github.com/kubernetes/helm 应用列表:https://github.com/ku ...
- Android AsyncTask 源代码分析
AsyncTask源代码分析 public abstract class AsyncTask<Params, Progress, Result> { //日志TAG private sta ...
- easyui Datagrid+searchbox 实现搜索功能
1.前台页面 <%@ page language="java" pageEncoding="utf-8" isELIgnored="false& ...
- (二)使用预定义模型 QStringListModel例子
使用预定义模型 QStringListModel例子 源代码如下 Main.cpp #include <QApplication> #include "teamleadersdi ...
- u方法传参
<a href="{:U('Del/mldel',array('id'=>$vo['id']))}">删除</a>
- e673. Getting Amount of Free Accelerated Image Memory
Images in accelerated memory are much faster to draw on the screen. However, accelerated memory is t ...
- PNG透明兼容IE6的几种方法(转)
png 透明针对 IE6 一直是件挺麻烦的事情,使用的方法也是各有不同,大多的原理是用 IE 的滤镜来解决的. 语法: filter:progid:DXImageTransform.Microsoft ...
- ScreenPointToRay - 近视口到屏幕的射线
正如题目所说,ScreenPointToRay可以计算从Camera的近视口nearClip向前发射一条射线到屏幕上的点的坐标. 函数原型为: public Ray ScreenPointToRay( ...