当前位置: 首页 > news >正文

临沂城乡建设管理局网站企业自建网站

临沂城乡建设管理局网站,企业自建网站,撩人的网站怎么做,外贸公司 如何做公司网站Cocos2d-x游戏实例-《跑跑跑》制作教程(第三篇)——让主角跑 笨木头花心贡献,啥?花心?不呢,是用心~转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8189386 正文…

Cocos2d-x游戏实例-《跑跑跑》制作教程(第三篇)——让主角跑

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址
http://blog.csdn.net/musicvs/article/details/8189386

正文:

注:本文使用到的资源请到这里下载:http://download.csdn.net/detail/musicvs/4769412

终于进入我们的游戏的主题了——跑!

来,我们开始让主角跑起来~

1.修改一下糟糕的代码

我们要给主角加一个动画,不断地播放跑步动作。我们来打开熟悉的TollgateScene.cpp文件,糟糕,我发现这个文件的init函数有点庞大了。

于是,我做了一个艰难的决定,把创建玩家精灵的工作移到Player类的init函数里:

//Player.h文件#ifndef __PLAYER_H__
#define __PLAYER_H__#include "Entity.h"class Player : public Entity {
public:bool initWithTiledMap(CCTMXTiledMap* map);static Player* createWithTiledMap(CCTMXTiledMap* map);
};#endif


//Player.cpp文件#include "Player.h"Player* Player::createWithTiledMap( CCTMXTiledMap* map )
{Player* mPlayer = new Player();if(mPlayer && mPlayer->initWithTiledMap(map)) {}else {CC_SAFE_DELETE(mPlayer);}return mPlayer;
}bool Player::initWithTiledMap( CCTMXTiledMap* map )
{/* 加载对象层 */CCTMXObjectGroup* objGroup = map->objectGroupNamed("objects");/* 加载玩家坐标对象 */CCDictionary* playerPointDic = objGroup->objectNamed("PlayerPoint");float playerX = playerPointDic->valueForKey("x")->floatValue();float playerY = playerPointDic->valueForKey("y")->floatValue();/* -------------- 加载玩家 --------------- */CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();CCSprite* playerSprite = CCSprite::create("sprite/player1.png");playerSprite->setPosition(ccp(playerX, playerY));/* 精灵添加到地图 */map->addChild(playerSprite);/* 绑定精灵对象 */setSprite(playerSprite);return true;
}


Player类改得有点多,把创建和初始化的函数加了一个参数:地图对象。这样我们就可以直接在playerinit函数中帮精灵对象添加到地图了。

然后现在TollgateScene.cppinit函数就好看多了:

bool TollgateScene::init()
{/* 加载地图 */CCTMXTiledMap* map = CCTMXTiledMap::create("map/level01.tmx");this->addChild(map); /* 创建玩家 */Player* mPlayer = Player::createWithTiledMap(map);return true;
}


2.主角跑动动画

现在开始真正给主角加一个动画了,我们先给Player类新增一个函数:

void Player::run()
{CCArray* framesList = CCArray::create();framesList->addObject(CCSpriteFrame::create("sprite/player1.png", CCRectMake(0, 0, 77, 134)));framesList->addObject(CCSpriteFrame::create("sprite/player2.png", CCRectMake(0, 0, 66, 129)));framesList->addObject(CCSpriteFrame::create("sprite/player3.png", CCRectMake(0, 0, 99, 132)));framesList->addObject(CCSpriteFrame::create("sprite/player4.png", CCRectMake(0, 0, 111, 135)));framesList->addObject(CCSpriteFrame::create("sprite/player5.png", CCRectMake(0, 0, 94, 132)));framesList->addObject(CCSpriteFrame::create("sprite/player6.png", CCRectMake(0, 0, 64, 128)));framesList->addObject(CCSpriteFrame::create("sprite/player7.png", CCRectMake(0, 0, 96, 133)));framesList->addObject(CCSpriteFrame::create("sprite/player8.png", CCRectMake(0, 0, 103, 138)));CCAnimation* animation = CCAnimation::createWithSpriteFrames(framesList, 0.2f);animation->setLoops(-1);mSprite->runAction(CCAnimate::create(animation));
}


我为了尽量减少教程里出现的代码量,以及尽量让素材简单,我采用最直接的方式来创建CCSpriteFrame对象,如果大家不喜欢的话,可以用CCSpriteFrameCache的方式来创建,这里就不多说了。创建动画的方式也不说了,我默认大家有了解过。

好吧,还是简单说一下,先创建一组CCSpriteFrame对象,然后用这组对象创建一个CCAnimation对象,这个对象还不能用来形成动画,还必须创建一个CCAnimate对象,然后精灵类通过runAction方法来执行动画。setLoops(-1)是为了循环播放动画。

然后,继续打开我们熟悉的TollgateScene.cppinit函数,加上一句代码:

OK,编译运行,精灵已经在跑动了!当然,只是原地跑。

/* 创建玩家 */Player* mPlayer = Player::createWithTiledMap(map);/* 让玩家跑起来 */mPlayer->run();


接下来要新增的代码有点多,慢慢来。

3.控制器

让主角向前跑,我想采用组合来实现,把向前跑作为一个功能单独写成一个类,主角只要增加一个成员变量(向前跑的类),就能实现向前跑的动作。而这个类,就是控制器。

因为考虑到不止一个控制器,我们来稍微写多几行代码,以便以后扩展。先来实现控制器的父类(在实体文件夹新建Controller.hController.cpp文件)

//Controller.h文件#ifndef __CONTROLLER_H__
#define __CONTROLLER_H__#include "cocos2d.h"
#include "ControllerListener.h"using namespace cocos2d;class Controller : public CCNode {
public:/* 设置监听对象 */void setControllerListener(ControllerListener* mControllerListener);protected:ControllerListener* mControllerListener;
};#endif


//Controller.cpp文件#include "Controller.h"void Controller::setControllerListener( ControllerListener* mControllerListener )
{this->mControllerListener = mControllerListener;
}


很简单的一个类,只有一个变量和一个方法,我们来看看ControllerListener是做什么用的。ControllerListener就是将要被控制的对象,比如我们主角,只要继承了ControllerListener接口,就能够被控制器控制。很方便吧~针对接口编程,使得代码稍微没有那么糟糕。

看看ControllerListener的代码:

//ControllerListener.h文件#ifndef __CONTROLLER_LISTENER_H__
#define __CONTROLLER_LISTENER_H__#include "cocos2d.h"using namespace cocos2d;class ControllerListener {
public:virtual void setSimplePosition(int x, int y) = 0;virtual CCPoint getCurPosition() = 0;
};#endif


也很简单,只有头文件,定义了两个虚函数,用来设置和获取被控制对象的坐标。我不太喜欢C++的编码,有点繁琐,我对Java中毒很深,嘻嘻,Java要定义一个接口的话就简单多了,啊喂,跑题了~

4.简单移动控制器

我们来实现我们的第一个控制器,控制物体只往前移动的控制器,看代码:

//SimpleMoveController.h文件#ifndef __SIMPLE_MOVE_CONTROLL_H__
#define __SIMPLE_MOVE_CONTROLL_H__#include "cocos2d.h"
#include "Controller.h"using namespace cocos2d;class SimpleMoveControll : public Controller {
public:CREATE_FUNC(SimpleMoveControll);virtual bool init();virtual void update(float dt);/* 设置移动速度 */void setiSpeed(int iSpeed);private:int iSpeed;
};#endif


// SimpleMoveControll.cpp文件#include "SimpleMoveControll.h"bool SimpleMoveControll::init()
{this->iSpeed = 0;/* 每一帧都要调用update函数,所以要这样设置 */this->scheduleUpdate();return true;
}void SimpleMoveControll::update( float dt )
{if(mControllerListener == NULL) {return;}CCPoint pos = mControllerListener->getCurPosition();pos.x += iSpeed;mControllerListener->setSimplePosition(pos.x, pos.y);
}void SimpleMoveControll::setiSpeed( int iSpeed )
{this->iSpeed = iSpeed;
}


SimplerMoveController继承了Controller类,也很简单,拥有一个成员变量iSpeed,用来设置移动速度。

这里简单介绍一下update(float dt)函数,update函数是CCNode节点的函数,有什么用呢?很强大的。我们都知道,游戏的画面是一帧帧的绘制,从而形成丰富多彩的世界。而程序只需要在每一帧里执行操作,绘制图形。

Update函数提供了一个入口,让我们可以在游戏的每一帧里执行我们自己想要做的事情。是的,就算你只是在里面放一个屁都是允许的(你不会当真了吧?= =)。

但是咯,不可能每个CCNode对象都执行一次update函数吧?(不是每个人都需要update不是么?),所以,默认情况下update函数是不会被调用的,需要对象通过scheduleUpdate方法来注册被调用的权限。

然后float dt参数是什么呢?我们都知道CPU是一个很忙的孩子(虽然它很聪明),CPU不可能让所有update函数同时进行的,只能是一个个执行,所以总有人先调用有人后调用,float dt参数就记录了某个update函数从最后一次被调用到本次调用时经过了多少毫秒。那这又有什么用呢?很有用,但是我们先不管~

然后,SimpleMoveControllerupdate函数里做了一件很伟大的事情,那就是改变被控制者的X坐标,使得被控制者往前移动了一段距离。

5.给主角绑定一个控制器吧

整了这么多代码,主角都还没有跑起来,太累了,我不写了!啊,才怪呢,现在写,现在写~

有个不幸的消息,我们需要稍微改改Entity类(好吧,不要恨我,代码总是逐步优化的嘛T^T:

//Entity.h文件
#ifndef __ENTITY_H__
#define __ENTITY_H__#include "cocos2d.h"
#include "Controller.h"
#include "ControllerListener.h"using namespace cocos2d;class Entity : public CCNode, public ControllerListener {
public:void setSprite(CCSprite* mSprite);void setController(Controller* controller);/* 实现SimpleMoveListener接口的方法 */virtual void setSimplePosition(int x, int y);virtual CCPoint getCurPosition();
protected:CCSprite* mSprite;Controller* mController;
};#endif


我们给Entity加了一个父类,那就是ControllerListener,大家都知道为什么了,因为我们的角色需要被当做一个被控制器控制的对象。继承了ControllerListener之后,当然就要实现它的方法了。

另外,我还为Entity新增了一个方法,那就是setController,当然了,因为我们需要绑定一个控制器。

三个方法的实现如下:

//Entity.cpp的部分代码void Entity::setController( Controller* controller )
{this->mController = controller;controller->setControllerListener(this);
}void Entity::setSimplePosition( int x, int y )
{if(mSprite) {mSprite->setPosition(ccp(x, y));}
}cocos2d::CCPoint Entity::getCurPosition()
{if(mSprite) {return mSprite->getPosition();}return CCPoint::CCPoint(0, 0);
}


好了,好了,最后了,大家坚持住,我们打开TollgateScene.cppinit函数吧,我们要开始跑喇~init函数最后加上:

/* ------------ 创建玩家简单移动控制器 -------------- */SimpleMoveControll* mSMoveControll = SimpleMoveControll::create();mSMoveControll->setiSpeed(1);/* 控制器要添加到场景中才能获得update事件 */this->addChild(mSMoveControll);mPlayer->setController(mSMoveControll);


简单说明一下哈,创建一个移动控制器,设置移动速度为1,然后把控制器添加到场景中(这样它才能获得update函数的调用),最后把控制器添加到主角身上。

来,编译运行,看主角疯狂地跑动吧!

太帅了,简直就是一个流氓冲着良民狂奔啊喂~= =

下一篇我们将会让地图也动起来,我们的地图可是很长的不是么,不能浪费啊喂~

http://www.lbrq.cn/news/2631637.html

相关文章:

  • 国外一个做ppt的网站做seo推广公司
  • 自己做视频网站的流程sem投放
  • 网站如何做内链成都新闻最新消息
  • 鞍山做网站的百度收录软件
  • 连江县建设局网站烟台seo外包
  • 西宁网站制作费用是多少钱什么是新媒体营销
  • 二级网站建设方案模板搜索引擎优化自然排名
  • 做网站要的图片斗鱼知名的seo快速排名多少钱
  • 个人在国外网站做电商北京搜索引擎优化seo
  • 做ppt找图片在哪个网站好百度退推广费是真的吗
  • 厦门网站建设高级课程天堂网
  • 广州2022年疫情时间表seo岗位有哪些
  • 郑州做网站zzmshlseo排名优化培训怎样
  • 网站建设开发哪家质量好百度sem推广具体做什么
  • 男女做爰全过程网站完美动力培训价格表
  • 自己开发一个网站应该怎么做百度公司地址
  • 网站开发先找UI吗英文网站seo发展前景
  • 旅游网站项目计划书产品软文范例软文
  • 个人网站有备案吗企业网站建设论文
  • 做网站运营工作有前景吗收录网站排名
  • 橙子建站和今日头条今天高清视频免费播放
  • html教程 pdf邯郸网站seo
  • 网站建设 广州珠海网站设计
  • 企业网站开发哪家专业深圳最好的外贸seo培训
  • 网站备案信息如何注销百度官网认证多少钱一年
  • 网站聚合搜索怎么做湖南长沙今日疫情
  • 做b2c网站多少钱拉新推广平台
  • 网站广告链接怎么做濮阳市网站建设
  • 武汉做网站推广哪家好广告收益平台
  • 网站推广seo软件找个免费网站这么难吗
  • DM8数据库服务正常,但是登录报错 [-70019]:没有匹配的可登录服务器
  • 哈希表——指针数组与单向链表的结合
  • (附源码)基于Web的物流信息管理系统
  • W25Q64模块
  • 2025最新国内服务器可用docker源仓库地址大全(2025年8月更新) · DockerHub镜像加速全面指南
  • 数据结构(4)