一 目的
学习,并作为练习的一个案例
github 地址 https://github.com/baidang201/goldminer
教程地址:
麦子学院 cocos2dx 课程,黄金矿工
二 大纲
黄金矿工 大纲
1 试玩
//主菜单
2 使用cocos stu@R_301_410@制作菜单界面
3 使用cocos2dx加载游戏菜单界面
4 使用cocos stu@R_301_410@制作动画
5 游戏中播放动画效果
6 把设置界面添加到菜单界面中1,2,3
9 关闭设置界面
10 添加音效和背景音乐
11 使用UserDefault保存游戏数据
//主界面
12 调节游戏背景和金块布局界面
13 吧分数牌和倒计时牌添加到游戏中
14 制作矿工类Miner
15 添加关卡提示
16 添加矿工入场动画
17 添加倒计时入场动画
18 把钩子添加到矿工中
19 添加钩子摆动动画
20 添加放钩子事件监听器
21 添加抛绳子动作
22 在主游戏中添加物理世界和世界边界
23 添加碰撞监听器
24 添加拉绳子动作
游戏逻辑
25 获取游戏中的金块,并设置为PhysicsBody
26 钩子抓到金块后合拢
27 创建金块类
28 抓金块1,2
30 控制拉金块的速度
31 获取金块更新游戏数据1,2
33 创建暂停类,并在游戏中添加暂停设置功能
34 暂停和恢复游戏
35 实现退出关卡功能
36 添加退出关卡提示
37 添加矿工离开动画
38 更新下一关按钮状态,并注册点击事件
39 添加倒计时功能
40 游戏失败提示和保存数据
41 游戏成功提示和保存数据
42 添加多关卡
43 打包部署成apk,上线
三 小结
1 cocosstu@R_301_410@ csb层加载加载
《1 头文件
#include "cocostu@R_301_410@/CocoStu@R_301_410@.h"
#include "ui/CocosGUI.h"
《2 使用
auto levelTop = CSLoader::createNode("leveltop.csb");//使用csb创建层
addChild(levelTop);//层加入父节点使用
auto Image_1 = static_cast<ImageView*> (Helper::seekWidgetByName(static_cast<Widget*>(levelTop),"Image_1"));//查找层里面的应用
2 cocosstu@R_301_410@动画(配合csb层加载使用)
《1 头文件
#include "cocostu@R_301_410@/CocoStu@R_301_410@.h"
#include "ui/CocosGUI.h"
《2 命名空间
using namespace cocostu@R_301_410@::timeline;
《3使用
auto sysMenu = CSLoader::createNode("menu.csb");////使用csb创建层
addChild(sysMenu);//层加入父节点使用
auto actTimelineIn = CSLoader::createTimeline("menu.csb");//加载包含动画的csb层文件
actTimelineIn->gotoFrameAndPlay(0,60,false); //设置播放参数
sysMenu->runAction(actTimelineIn);//播放
3 骨骼动画
《1 头文件
#include "spine\spine-cocos2dx.h"
《2 命名空间
using namespace spine;
《3 使用
SkeletonAnimation* miner = SkeletonAnimation::createWithFile("iphonehd/miner.json","iphonehd/miner.atlas",0.6);//初始化骨骼动画对象
addChild(miner);
miner->addAnimation(0,"walk",true,0);//播放动画
miner->addAnimation(0,"wait",false,2);//播放动画
《4 创建骨骼动画工具 spine,cocosstu@R_301_410@
4 九宫格
原理,设置4个角不缩放,只缩放中间和不包含4个角区域的边缘。
《1 头文件
#include "cocos-ext.h" //包含cocos-ext.h头文件
《2 命名空间
using namespace cocos2d::extension; //引用cocos2d::extension命名空间
《3 使用
//第一个Rect是指定Scale9Sprite的区域,第二个是指定中间用于拉伸的区域
ui::Scale9Sprite *scale9Sprite = ui::Scale9Sprite::create("sample.png",Rect(0,142,80),Rect(10,10,122,60));
//目标大小
scale9Sprite -> setPreferredSize(visibleSize);
scale9Sprite -> setPosition(visibleSize * 0.5f);
this -> addChild(scale9Sprite);
5 物理世界
《1 概述
...1 一个物理世界,只有一个PhysicsWorld
...2 物理世界的body,要和cocos2dx事件的node绑定,才能触发碰撞事件
...3 碰撞有两个情况,互不干扰。
.....(1 A物体的碰撞测试码ContactTestBitmask和B物体的碰撞测试码ContactTestBitmask相与,不为0
.....(1 A物体的类别码CategoryBitmask和B物体的碰撞码CollisionBitmask相与,不为0
// 'scene' is an autorelease object
auto scene = Scene::createWithPhysics();//创建物理世界
PhysicsWorld* word = scene->getPhysicsWorld();
word->setGravity(Vec2::ZERO);//设置二维两个方向重力为0,0
word->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
// 'layer' is an autorelease object
auto layer = MainGame::create();
Size size = Director::getInstance()->getWinSize();
PhysicsBody* body = PhysicsBody::createEdgeBox(size);//创建边界
//设置碰撞掩码
body->setCategoryBitmask(10);
body->setCollisionBitmask(10);
body->setContactTestBitmask(10);
Node* node = Node::create();
node->setPosition(size/2);
node->setPhysicsBody(body);//物理世界的body和cocos世界的node绑定
node->setTag(WORLDTAG);
scene->addChild(node);
word->setGravity(Vec2::ZERO);//设置二维两个方向重力为0,0
word->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
// 'layer' is an autorelease object
auto layer = MainGame::create();
Size size = Director::getInstance()->getWinSize();
PhysicsBody* body = PhysicsBody::createEdgeBox(size);//创建边界
//设置碰撞掩码
body->setCategoryBitmask(10);
body->setCollisionBitmask(10);
body->setContactTestBitmask(10);
Node* node = Node::create();
node->setPosition(size/2);
node->setPhysicsBody(body);//物理世界的body和cocos世界的node绑定
node->setTag(WORLDTAG);
scene->addChild(node);
//创建碰撞事件监听
auto physicListener = EventListenerPhysicsContact::create();
physicListener->onContactBegin = [=](PhysicsContact& contact)
{
auto shapa = contact.getShapeA()->getBody()->getNode();
auto shapb = contact.getShapeB()->getBody()->getNode();
//添加碰撞逻辑代码
return true;
};
_eventDispatcher->addEventListenerWithSceneGraPHPriority(physicListener,this);
6 自定义事件
《1 使用_eventDispatcher->addCustomEventListener("pullcomplete",[=](EventCustom* evn)
{
//自定义事件监听代码
}
_eventDispatcher->dispatchCustomEvent("pullcomplete",String::createWithFormat("%d",_gold->getValue()) ); //发送自定义事件
_eventDispatcher->removeCustomEventListeners("pullcomplete");//删除自定义事件监听