跟着BOY学习开发cocos2d-x 游戏 实战篇(5)之 游戏主界面 -----主界面美化--魔法阵和自定义弹出框
2013-07-29 09:37
573 查看
from:http://blog.csdn.net/wuyakenihao/article/details/9416067
大家这里两天等这个等的时间也算长了,今天被群里面的朋友给吐槽了说我,速度太慢。在这里给大家说声对不起。在写博客的时候我本来决定每天都发布一篇新的博客 可是我在做这个游戏的时候有些问题我 我解决花了很长时间,有些是我个人私事给当误了。导致进度减慢。其实今天的给大家写的这篇博客没多少东西。不过我感觉应该写一篇出来。废话不多说了
这一章包含的内容有 添加魔法阵的CD 动画 其实就是游戏中的技能的CD 在一个重要的一点就是自定义弹出框。还有一点就是给主城添加气血和魔法。在这里给大家说下我添加的这些东西 有些具体的功能还没实现 例如魔法阵 这一块我感觉是比较重要的一块,我准备放到下一章来专门讲解 魔法阵的实现,在游戏中如何使用魔法消灭怪物,呵呵是不是很期待啊。还有一个就是在弹出框中我 我重新开始游戏这一点我还没实现,别看这么一个简单的小功能 这个牵涉到关卡系统,这个游戏写到这里我还没写到关卡系统 因为我感觉这个比较重要。所以也放到后面的章节中讲解
下面讲解一下魔法阵的CD 的实现由于 目前魔法阵不具有 释放魔法的能力所以 有些功能我还没实现后面专门一张讲解魔法阵大家 关注我的博客啊。
贴出魔法阵的代码
[cpp] view
plaincopy
#ifndef __MAGICMATRIX_SPRITE_H__
#define __MAGICMATRIX_SPRITE_H__
#include "cocos2d.h"
//此类是魔法矩阵
class MagicMatrixSprite:public cocos2d::CCNode{
public:
MagicMatrixSprite();
~MagicMatrixSprite();
CC_SYNTHESIZE(float,hurt,Hurt);// 伤害值
CC_SYNTHESIZE(bool,avail,Avail);//是否可用
CC_PROPERTY(bool,activation,Activation);// 是否激活魔法阵
// 注意一点图片必须放在缓存里面
static MagicMatrixSprite* createWithPic(char* pMagicPic,char* pMagicPicBg); // 第一个参数CD 的比较暗淡的图片 第二个是比亮的动画
CC_SYNTHESIZE(float,mana,Mana);// 消耗魔法值
void runMagicCDAnimation();// 执行魔法CD 动画
private:
bool setUpdateView(char* pMagicPic,char* pMagicPicBg );
cocos2d::CCProgressTimer *ptss;// 魔法阵的CD 动画
void runMagicCDAnimationCallBack(cocos2d::CCNode* pSed);
};
#endif
这个代码大家都能看懂吧 其实技能的CD 实现就是一张暗色的图片在下面 一张明亮的图片在上面 用
[cpp] view
plaincopy
CCProgressTimer
来实现技能的CD 效果
看主要代码
[cpp] view
plaincopy
bool MagicMatrixSprite::setUpdateView(char* pMagicPic,char* pMagicPicBg ){
bool isRet=false;
do
{
CCSprite *s2=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPicBg));//pa2.png是较暗的图片
CC_BREAK_IF(!s2);
s2->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));
addChild(s2,0);
CCSprite *s=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPic));//pa1.png是较亮的图片
CC_BREAK_IF(!s);
ptss=CCProgressTimer::create(s);
CC_BREAK_IF(!ptss);
if(!this->getActivation()){
ptss->setVisible(false);
}
ptss->setPercentage(0);
ptss->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));
//转圈的CD实现
ptss->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeRadial));
//从中间到外的出现
//pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeBar));
this->addChild(ptss,1);
isRet=true;
} while (0);
return isRet;
}
初始化技能CD
动画代码
[cpp] view
plaincopy
void MagicMatrixSprite::runMagicCDAnimation(){
if (ptss)
{
if (avail==false&&this->activation)
{
ptss->stopAllActions();
CCProgressTo *t=CCProgressTo::create(8,100);
CCCallFuncN *onComplete = CCCallFuncN::create(this, callfuncN_selector(MagicMatrixSprite::runMagicCDAnimationCallBack));
CCSequence* pse=CCSequence::create(t,onComplete,NULL);
ptss->runAction(pse);
}
}
}
这代码大家都能懂吧
当大家实现以上代码的时候 就可以看到这样的效果
看到下面的魔法阵了的CD 动画了吧 是不是帅 不帅我也没法了 这是我在网上找到图片,今天群里面人吐槽我弄的图片丑 在这里给大家说声对不起 本人PS 水平真不行。
下面就是今天压轴戏了 自定义弹出框 大家要是想 建立一个自己的弹出框 首先去了解一下cocos2d-x 触摸等级 这个东西。龙灵修大哥的视频中有讲解,大家可以去看看这里也谢谢龙灵修和无脑码农。
弹出框主要代码
[cpp] view
plaincopy
#ifndef __PAUSEGAMEDIALOG_LAYER_H__
#define __PAUSEGAMEDIALOG_LAYER_H__
#include "BaseLayer.h"
class PauseGameDialogLayer : public BaseLayer
{
public:
PauseGameDialogLayer();
~PauseGameDialogLayer();
virtual bool init();
// 初始化对话框内容
bool setUpdateView();
CREATE_FUNC(PauseGameDialogLayer);
void onEnter();
void onExit();
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void homeMenuItemCallback(cocos2d::CCObject *pSender); //点击家按钮回调函数
void retyMenuItemCallback(cocos2d::CCObject *pSender); //点击重新开始游戏回调函数
void resumeMenuItemCallback(cocos2d::CCObject *pSender);//点击继续游戏按钮 回调函数
cocos2d::CCMenu *m_pMenu; // 模态对话框菜单
bool m_bTouchedMenu;// 记录菜单点击
};
#endif
这里的弹出框我是继承我自己自定义的layer
主要是这句代码
[cpp] view
plaincopy
void PauseGameDialogLayer::onEnter()
{
BaseLayer::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
this,//在那个类中实现触屏回调函数
-128, //优先级
true);//触摸时间是否被该目标截获
}
看到优先等级了吗我把这个层 等级设成成 -128 可以说是最高了
[cpp] view
plaincopy
bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent);
return true;
}
void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchMoved(pTouch, pEvent);
}
}
void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchEnded(pTouch, pEvent);
m_bTouchedMenu = false;
}
}
void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchEnded(pTouch, pEvent);
m_bTouchedMenu = false;
}
}
大家看到这一段代码时候或许会疑惑 其实总体的思路是这样的 当这个层接受到 触摸事件的时候吧把他接受到的时间传递给你要接受的按钮 让下面的那个层的按钮无法接受触摸时间就OK 了
然后退出这个层的时候 把这个层的触摸时间给移除掉
[cpp] view
plaincopy
void PauseGameDialogLayer::onExit()
{
BaseLayer::onExit();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
上面的都是我自己摸索弄的 理解上可能有偏差,如果那里不对希望大家给我留言我会更正一下 省的误导大家
当上面的代码都实现的时候 就可以看到下面这个弹出层的界面
哈哈一个漂亮的弹出框就出来 至于按钮上的时间 最后一个没实现其都以实现 。别说我懒啊。
最后给大家一点忠告 就一句话 好记心不如烂笔头,就是劝大家多练练别扯没用的东西。
下一章预告 魔法系统 虽然我还没实现不过思路有了是不是很强大 哈哈。关注boy 提升能力 哈哈。欢迎大家来拍砖啊。
本节源码下载
大家这里两天等这个等的时间也算长了,今天被群里面的朋友给吐槽了说我,速度太慢。在这里给大家说声对不起。在写博客的时候我本来决定每天都发布一篇新的博客 可是我在做这个游戏的时候有些问题我 我解决花了很长时间,有些是我个人私事给当误了。导致进度减慢。其实今天的给大家写的这篇博客没多少东西。不过我感觉应该写一篇出来。废话不多说了
这一章包含的内容有 添加魔法阵的CD 动画 其实就是游戏中的技能的CD 在一个重要的一点就是自定义弹出框。还有一点就是给主城添加气血和魔法。在这里给大家说下我添加的这些东西 有些具体的功能还没实现 例如魔法阵 这一块我感觉是比较重要的一块,我准备放到下一章来专门讲解 魔法阵的实现,在游戏中如何使用魔法消灭怪物,呵呵是不是很期待啊。还有一个就是在弹出框中我 我重新开始游戏这一点我还没实现,别看这么一个简单的小功能 这个牵涉到关卡系统,这个游戏写到这里我还没写到关卡系统 因为我感觉这个比较重要。所以也放到后面的章节中讲解
下面讲解一下魔法阵的CD 的实现由于 目前魔法阵不具有 释放魔法的能力所以 有些功能我还没实现后面专门一张讲解魔法阵大家 关注我的博客啊。
贴出魔法阵的代码
[cpp] view
plaincopy
#ifndef __MAGICMATRIX_SPRITE_H__
#define __MAGICMATRIX_SPRITE_H__
#include "cocos2d.h"
//此类是魔法矩阵
class MagicMatrixSprite:public cocos2d::CCNode{
public:
MagicMatrixSprite();
~MagicMatrixSprite();
CC_SYNTHESIZE(float,hurt,Hurt);// 伤害值
CC_SYNTHESIZE(bool,avail,Avail);//是否可用
CC_PROPERTY(bool,activation,Activation);// 是否激活魔法阵
// 注意一点图片必须放在缓存里面
static MagicMatrixSprite* createWithPic(char* pMagicPic,char* pMagicPicBg); // 第一个参数CD 的比较暗淡的图片 第二个是比亮的动画
CC_SYNTHESIZE(float,mana,Mana);// 消耗魔法值
void runMagicCDAnimation();// 执行魔法CD 动画
private:
bool setUpdateView(char* pMagicPic,char* pMagicPicBg );
cocos2d::CCProgressTimer *ptss;// 魔法阵的CD 动画
void runMagicCDAnimationCallBack(cocos2d::CCNode* pSed);
};
#endif
这个代码大家都能看懂吧 其实技能的CD 实现就是一张暗色的图片在下面 一张明亮的图片在上面 用
[cpp] view
plaincopy
CCProgressTimer
来实现技能的CD 效果
看主要代码
[cpp] view
plaincopy
bool MagicMatrixSprite::setUpdateView(char* pMagicPic,char* pMagicPicBg ){
bool isRet=false;
do
{
CCSprite *s2=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPicBg));//pa2.png是较暗的图片
CC_BREAK_IF(!s2);
s2->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));
addChild(s2,0);
CCSprite *s=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey(pMagicPic));//pa1.png是较亮的图片
CC_BREAK_IF(!s);
ptss=CCProgressTimer::create(s);
CC_BREAK_IF(!ptss);
if(!this->getActivation()){
ptss->setVisible(false);
}
ptss->setPercentage(0);
ptss->setPosition(ccp(this->getContentSize().width/2,this->getContentSize().height/2));
//转圈的CD实现
ptss->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeRadial));
//从中间到外的出现
//pt->setType(cocos2d::CCProgressTimerType(kCCProgressTimerTypeBar));
this->addChild(ptss,1);
isRet=true;
} while (0);
return isRet;
}
初始化技能CD
动画代码
[cpp] view
plaincopy
void MagicMatrixSprite::runMagicCDAnimation(){
if (ptss)
{
if (avail==false&&this->activation)
{
ptss->stopAllActions();
CCProgressTo *t=CCProgressTo::create(8,100);
CCCallFuncN *onComplete = CCCallFuncN::create(this, callfuncN_selector(MagicMatrixSprite::runMagicCDAnimationCallBack));
CCSequence* pse=CCSequence::create(t,onComplete,NULL);
ptss->runAction(pse);
}
}
}
这代码大家都能懂吧
当大家实现以上代码的时候 就可以看到这样的效果
看到下面的魔法阵了的CD 动画了吧 是不是帅 不帅我也没法了 这是我在网上找到图片,今天群里面人吐槽我弄的图片丑 在这里给大家说声对不起 本人PS 水平真不行。
下面就是今天压轴戏了 自定义弹出框 大家要是想 建立一个自己的弹出框 首先去了解一下cocos2d-x 触摸等级 这个东西。龙灵修大哥的视频中有讲解,大家可以去看看这里也谢谢龙灵修和无脑码农。
弹出框主要代码
[cpp] view
plaincopy
#ifndef __PAUSEGAMEDIALOG_LAYER_H__
#define __PAUSEGAMEDIALOG_LAYER_H__
#include "BaseLayer.h"
class PauseGameDialogLayer : public BaseLayer
{
public:
PauseGameDialogLayer();
~PauseGameDialogLayer();
virtual bool init();
// 初始化对话框内容
bool setUpdateView();
CREATE_FUNC(PauseGameDialogLayer);
void onEnter();
void onExit();
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void homeMenuItemCallback(cocos2d::CCObject *pSender); //点击家按钮回调函数
void retyMenuItemCallback(cocos2d::CCObject *pSender); //点击重新开始游戏回调函数
void resumeMenuItemCallback(cocos2d::CCObject *pSender);//点击继续游戏按钮 回调函数
cocos2d::CCMenu *m_pMenu; // 模态对话框菜单
bool m_bTouchedMenu;// 记录菜单点击
};
#endif
这里的弹出框我是继承我自己自定义的layer
主要是这句代码
[cpp] view
plaincopy
void PauseGameDialogLayer::onEnter()
{
BaseLayer::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
this,//在那个类中实现触屏回调函数
-128, //优先级
true);//触摸时间是否被该目标截获
}
看到优先等级了吗我把这个层 等级设成成 -128 可以说是最高了
[cpp] view
plaincopy
bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent);
return true;
}
void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchMoved(pTouch, pEvent);
}
}
void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchEnded(pTouch, pEvent);
m_bTouchedMenu = false;
}
}
void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (m_bTouchedMenu) {
m_pMenu->ccTouchEnded(pTouch, pEvent);
m_bTouchedMenu = false;
}
}
大家看到这一段代码时候或许会疑惑 其实总体的思路是这样的 当这个层接受到 触摸事件的时候吧把他接受到的时间传递给你要接受的按钮 让下面的那个层的按钮无法接受触摸时间就OK 了
然后退出这个层的时候 把这个层的触摸时间给移除掉
[cpp] view
plaincopy
void PauseGameDialogLayer::onExit()
{
BaseLayer::onExit();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
上面的都是我自己摸索弄的 理解上可能有偏差,如果那里不对希望大家给我留言我会更正一下 省的误导大家
当上面的代码都实现的时候 就可以看到下面这个弹出层的界面
哈哈一个漂亮的弹出框就出来 至于按钮上的时间 最后一个没实现其都以实现 。别说我懒啊。
最后给大家一点忠告 就一句话 好记心不如烂笔头,就是劝大家多练练别扯没用的东西。
下一章预告 魔法系统 虽然我还没实现不过思路有了是不是很强大 哈哈。关注boy 提升能力 哈哈。欢迎大家来拍砖啊。
本节源码下载
相关文章推荐
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(5)之 游戏主界面 -----主界面美化--魔法阵和自定义弹出框
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(2)之 欢迎 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(3)之 游戏主界面 -----武器系统---散花弹
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(1)之 loading 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(1)之 loading 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(6)之 游戏主界面 -----绚丽的魔法特效
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(2)之 欢迎 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(4)之 游戏主界面 -----怪物系统---赌徒来袭
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(6)之 游戏主界面 -----绚丽的魔法特效
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(3)之 游戏主界面 -----武器系统---散花弹
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(4)之 游戏主界面 -----怪物系统---赌徒来袭
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(1)之 loading 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(7)之 关卡系统的基本设计
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(8)之 升级系统的基本设计--终结篇
- 跟着BOY学习开发cocos2d-x 游戏 (前提篇 一)
- 开发cocos2d-x 游戏 实战篇(5)之魔法阵和自定义弹框
- 学习开发cocos2d-x 游戏 实战篇(2)之 欢迎 界面编写
- 跟着BOY学习开发cocos2d-x 游戏 (前提篇 一)
- 跟着BOY学习开发cocos2d-x 游戏 (前提篇 一)
- 跟着BOY学习--史上最通俗易懂的连连看算法--cocos2d-x 环境下开发