如何制作一个简单的游戏 Cocos2d-x 2.0.4
本文实践自 Ray Wenderlich 的文章《 How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.0.4进行学习和移植,前者是用Object-C所写,所以移植到Cocos2D-x会有些差异,比如某些函数、某些功能不能跟原文一样直接实现,需另转换方法实现。之前已经对Cocos2D-x的安装以及简单使用进行了介绍,这里不再介绍,直接进入主题。
步骤如下:
1.新建Cocos2d-win32工程,工程名为" SimpleGame",去除" Box2D"选项,勾选" Simple Audio Engine in Cocos Denshion"选项;
2.编译运行,可以看到如下图所示:
3.下载本游戏所需的资源,将资源放置" Resources"目录下;
4.游戏需要一个白色的背景,最简单的方法是使用CCLayerColor,将 HelloWorldScene.h文件"HelloWorld"类改为如下:
1
|
class HelloWorld : public cocos2d::CCLayerColor
|
首先添加玩家,让玩家位于左边屏幕中间,将 HelloWorldScene.cpp文件的 init函数,改为如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
bool HelloWorld::init()
{ bool bRet = false; do { CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(255, 255, 255, 255))); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); bRet = true; return bRet; |
5.编译运行,可以看到玩家精灵在白色背景上,如下图所示:
6.接下来添加怪物,并且让怪物可以移动,我们在屏幕右边创建怪物,建立动作让它们向左移动,增加addMonster方法,代码如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void HelloWorld::addMonster()
{ CCSprite *monster = CCSprite::create("monster.png"); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); monster->setPosition(ccp(winSize.width + monster->getContentSize().width / 2, actualY)); int minDuration = 2.0; CCMoveTo *actionMove = CCMoveTo::create(actualDuration, ccp(-monster->getContentSize().width / 2, actualY)); |
在右边屏幕以随机的位置添加怪物精灵,注意计算精灵的位置坐标,默认描点在中心,不要让怪物截断了。然后再以2~4秒的随机总时间,让怪物从右边移动到左边,移动出边界后,即回调函数spriteMoveFinished,进行删除精灵对象,增加的spriteMoveFinished方法如下:
1
2 3 4 5 |
void HelloWorld::spriteMoveFinished(CCNode *sender)
{ CCSprite *sprite = (CCSprite*)sender; this->removeChild(sprite, true); } |
接下去就是定时创建怪物,在 init函数返回之前,安装定时器,每秒执行一次,代码如下:
1
|
this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
|
增加 gameLogic方法,代码如下:
1
2 3 4 |
void HelloWorld::gameLogic( float dt )
{ this->addMonster(); } |
7.编译运行,可以看到右边怪物定时增加,并且以不同的速度向左边移动,如下图所示:
8.接着让玩家可以射击子弹,当用户在屏幕点击时,就让玩家往点击的方向进行发送子弹,用户的屏幕点击点并不是子弹移动的最终地,借用原文的一张图片来说明:
要让层可以支持触摸,需要在 init方法,添加如下代码:
1
|
this->setTouchEnabled(true);
|
然后重载 ccTouchesEnded方法,代码如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{ CCTouch *touch = (CCTouch*)pTouches->anyObject(); CCPoint location = this->convertTouchToNodeSpace(touch); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCPoint offset = ccpSub(location, projectile->getPosition()); if (offset.x <= 0) this->addChild(projectile); int realX = winSize.width + projectile->getContentSize().width / 2; int offRealX = realX - projectile->getPosition().x; projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, realDest), |
首先,得到触摸点,然后创建子弹精灵,算出触摸点与子弹初始位置之差,若触摸点在初始位置的前方(即玩家前方),则添加子弹到层上。以同比例方法,计算出子弹飞向屏幕右边的最终坐标。然后再用勾股定理计算飞行长度,假定速度为每秒480像素,则计算出飞行总时间。之后就是让子弹执行给定的飞行动作,以及之后的删除自身调用。
9.编译运行,往屏幕点击,可以看到子弹发射出去,如下图所示:
10.当子弹碰到怪物时,怪物被消灭,子弹消失,即碰撞检测。需要在场景中跟踪目标和子弹,在HelloWorldScene.h声明如下:
1
2 |
cocos2d::CCArray *_monsters;
cocos2d::CCArray *_projectiles; |
在构造函数和析构函数,添加如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
HelloWorld::HelloWorld()
{ _monsters = NULL; _projectiles = NULL; } HelloWorld::~HelloWorld() |
然后在init函数中初始化这两个数组:
1
2 3 4 |
this->_monsters = CCArray::create();
this->_monsters->retain(); this->_projectiles = CCArray::create(); this->_projectiles->retain(); |
修改 addMonster函数,为怪物精灵添加标签,并加入到数组,代码如下:
1
2 |
monster->setTag(1);
_monsters->addObject(monster); |
修改 ccTouchesEnded函数,为子弹精灵添加标签,并加入到数组,代码如下:
1
2 |
projectile->setTag(2);
_projectiles->addObject(projectile); |
然后修改 spriteMoveFinished函数,增加如下代码:
1
2 3 4 5 6 7 8 |
if (sprite->getTag() == 1)
{ _monsters->removeObject(sprite); } else if (sprite->getTag() == 2) { _projectiles->removeObject(sprite); } |
添加如下方法:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
void HelloWorld::update(float dt)
{ CCArray *projectilesToDelete = CCArray::create(); CCObject *pObject = NULL; CCObject *pObject2 = NULL; CCARRAY_FOREACH(_projectiles, pObject) { CCSprite *projectile = (CCSprite*)pObject; CCArray *monstersToDelete = CCArray::create(); CCARRAY_FOREACH(_monsters, pObject2) CCARRAY_FOREACH(monstersToDelete, pObject2) if (monstersToDelete->count() > 0) CCARRAY_FOREACH(projectilesToDelete, pObject) |
遍历子弹数组,计算每一个子弹所可能遇到的怪物,用它们各自的边界框进行交叉检测,检测到交叉,则将怪物对象放入ToDelete(待删除)数组,不能在遍历的时候删除一个对象。若是子弹遇到了怪物,也需要放入ToDelete(待删除)数组。然后从场景和数组中移动掉。同样,也在init函数,安装定时器,代码如下:
1
|
this->schedule(schedule_selector(HelloWorld::update));
|
11.编译运行,这时当子弹和怪物碰撞时,它们就会消失;
12.添加音效,在 init函数添加背景音乐,代码如下:
1
|
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav");
|
在 ccTouchesEnded函数,添加子弹音效,代码如下:
1
|
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
|
13.接下来,创建一个新的场景,来指示"You Win"或者"You Lose"。右键 工程,"Add"→"Class..."→"C++"→"Add","Base class"为CCLayerColor,"Class name"为 GameOverLayer,如下图所示:
GameOverLayer.h文件代码为:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#pragma once
#include "cocos2d.h" class GameOverLayer : static cocos2d::CCScene* sceneWithWon(bool won); |
GameOverLayer.cpp文件代码为:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include "GameOverLayer.h"
#include "HelloWorldScene.h" using namespace cocos2d; GameOverLayer::GameOverLayer(void) GameOverLayer::~GameOverLayer(void) GameOverLayer* GameOverLayer::createWithWon(bool won) bool GameOverLayer::initWithWon(bool won) char *message; this->runAction(CCSequence::create(CCDelayTime::create(3), return bRet; cocos2d::CCScene* GameOverLayer::sceneWithWon(bool won) GameOverLayer *layer = GameOverLayer::createWithWon(won); scene->addChild(layer); return scene; void GameOverLayer::gameOverDone() |
游戏结束时,切换到以上所建的场景,场景上的层显示一个文本,在3秒之后返回到HelloWorld场景中。
14.最后,为游戏添加一些游戏逻辑。记录玩家消灭怪物的数量,进而决定该玩家输赢。在HelloWorldScene.h文件中,添加如下:
1
|
int _monstersDestroyed;
|
在 HelloWorldScene.cpp文件,HelloWorld()构造函数,添加如下代码:
1
|
_monstersDestroyed = 0;
|
添加头文件引用:
1
|
#include "GameOverLayer.h"
|
在 update定时函数中,monstersToDelete循环removeChild(monster, true)的后面添加被消灭怪物的计数,并判断胜利条件,代码如下:
1
2 3 4 5 6 |
_monstersDestroyed++;
if (_monstersDestroyed > 30) { CCScene *gameOverScene = GameOverLayer::sceneWithWon(true); CCDirector::sharedDirector()->replaceScene(gameOverScene); } |
最后为玩家添加失败条件,规定只要有一只怪物跑到左边屏幕里,则玩家失败,在 spriteMoveFinished函数里,sprite->getTag() == 1条件的后面,添加如下:
1
2 |
CCScene *gameOverScene = GameOverLayer::sceneWithWon(false);
CCDirector::sharedDirector()->replaceScene(gameOverScene); |
14.编译并运行,到此已完成了一个简单的游戏,包含音效,并带有胜利和失败的结束。游戏效果如下:
参考资料:
1.How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial http://www.raywenderlich.com/25736/how-to-make-a-simple-iphone-game-with-cocos2d-2-x-tutorial
2.如何用Cocos2d来开发简单的IPhone游戏教程 http://www.cocoachina.com/bbs/read.php?tid-15554.html
3.Cocos2d Classic Tutorial Demo Revisit:(1) http://www.zilongshanren.com/cocos2d-classic-tutorial-demo-revisit-1/
非常感谢以上资料,本例子源代码附加资源下载地址:http://download.csdn.net/detail/akof1314/4857315
如文章存在错误之处,欢迎指出,以便改正。
如何制作一个简单的游戏 Cocos2d-x 2.0.4相关推荐
- 如何制作一个简单的游戏 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 如何制作一个塔防游戏 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 怎样用HTML5 Canvas制作一个简单的游戏
为了让大家清楚HTML5制作游戏的简单流程,所以先了制作一个非常简单的游戏,来看一看这个过程. 游戏非常简单,无非就是英雄抓住怪物就得分,然后游戏重新开始,怪物出现在地图的随机位置,英雄初始化在地 ...
- [译]怎样用HTML5 Canvas制作一个简单的游戏
这是我翻译自LostDecadeGames主页的一篇文章,原文地址:How To Make A Simple HTML5 Canvas Game. 下面是正文: 自从我制作了一些HTML5游戏(例如C ...
- html5上色游戏制作,怎样用HTML5 Canvas制作一个简单的游戏
原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...
- 如何利用Construct 2制作一个简单的游戏
Construct 2 是一款专门制作游戏的软件,它的存在,让没有编程基础的人也可以轻松的制作游戏,享受其中的快乐. 这是一款几乎没有门槛的软件,任何人都可以快速上手.作为广大游戏爱好者之一,我希望将 ...
- 使用pygame制作一个简单的游戏
翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...
- python自己制作节奏大师游戏_使用pygame制作一个简单的游戏
翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...
- 制作一个简单HTML游戏网页(HTML+CSS)_英雄联盟 lol 7页
⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIV+CSS 布局制作,HTML+CSS网页设计期末课程大作业 |游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站的 ...
最新文章
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
- 『转载』Debussy快速上手(Verdi相似)
- Excel函数应用教程:数据库函数
- 说一说阿里云弹性公网IP那些事
- WSS 3.0 和 sharepoint 2007 中文SDK
- Javascript 创建书签小工具 (bilibili视频下载为例)
- mysql ssl jdbc_【MySQLSSLJAVA】关于MySQL开启SSL后,jdbc的配置
- linux系统有界面么,linux系统界面详情介绍
- tomcat修改http长度限制_解决浏览器与服务器请求url长度限制
- Java开源框架 iBase4J 搭建笔记
- 用php建站_九个常用的php建站系统
- 辽宁计算机专业大学排名及分数线,辽宁一本大学排名及分数线2021
- 阿文的《Java从入门到精通(第二版)》学习日记DAY1
- FastGCN: fast learning with graph convolutional networks via importance sampling 论文详解 ICLR 2018
- win10中sql plus中文乱码
- 计算两个日期之间的天数,你知道哪些函数能够计算呢?
- 【观点】如何度过自己的研究生生涯,看看院士的回答,兴许会有一些收获。
- 白帽子,强大的XSS钓鱼漏洞,怎么获取用户的真实ip
- 【深度学习入门】——亲手实现图像卷积操作
- 传智健康产品需求说明书
热门文章
- 用Python做一个人脸识别系统,简单操作又实用~
- php 获取月份的周数,PHP获取当前月份的周数只能使用php
- 夜间模式 css,网页夜间模式,CSS样式
- python3 教程 下载图片资源
- 这个空指针异常我是一脸懵逼的
- 在线生鲜订购配送系统,生鲜订购系统 生鲜配送系统 前端+后台 Android源码+SSH后台管理系统+MySQL数据库
- 邮箱和手机号粗略验证
- 哈工大计算机系统2022大作业:程序人生-Hello‘s P2P
- 医学影像开源数据集汇总
- [渝粤教育] 西南科技大学 英语泛读 在线考试复习资料