使用C++进行Cocos2d-x游戏开发入门过程中的要点解析

总结了下,新手引导的要点有以下几个:

  • 画面的变化.
  • 触摸和按钮响应.
  • 逻辑处理及代码组织.

下面我们就详细讲述这几个要点:

一.画面的变化.

对个这个不同的游戏的做法不尽相同,归结起来大概有这么几种:

1.画面整体变暗

这个比较简单,cocos2d就有现成接口:

CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
//第一个参数是颜色ccc4(r,g,b,a) a取值(0~255),越大越不透明 下面两个参数为宽高,不传默认为屏幕大小
CCLayerColor* pLayer=CCLayerColor::create(ccc4(0,0,0,200),visibleSize.width,visibleSize.height);
//CCLayerColor* pLayer=CCLayerColor::create(ccc4(0,0,0,200));
addChild(pLayer,100);

效果如下:

然后你可以在这层之上添加精灵,最后的效果可能是这个样子的:

注:图片源自网络,如果有版权问题~你丫去死吧! 请联系我!

2.局部高亮

比较简单的方法是准备几张张局部高亮的图片,随着引导进度变化而切换!优点是可以做的比较精美,缺点是资源量会比较大!另一种方法是在画面整体变暗的基础上抠掉部分区域,还好cocos2d提供了CCClippingNode接口(2.1+版)!

CCClippingNode类比较复杂,但我们只用明白两个东西就好:一个是CCClippingNode的Stencil,一个CCClippingNode的Child,怎么理解呢?请看下图:

这个东西相信大家都有印象吧,上面的图案(镂空部分)就是 CCClippingNode的Stencil(模板),实体部分就是CCClippingNode的child(底板),是不是很好明白,让我们用代码来实现吧:

//创建cliper对象
CCClippingNode* pClip=CCClippingNode::create();
addChild(pClip);
//加入灰色的底板
CCLayerColor* pColor=CCLayerColor::create(ccc4(0,0,0,200));
pClip->addChild(pColor);

让我来加入模板:

//创建drawnode对象
CCDrawNode *m_pAA=CCDrawNode::create();
static ccColor4F green = {0, 1, 0, 1};
static CCPoint rect[4]={ccp(-50,50),ccp(50,50),ccp(50,-50),ccp(-50,-50)};
//用上面的数据保存一个100x100的矩形
m_pAA->drawPolygon(rect, 4, green, 0, green);
//设置到屏幕的中心
m_pAA->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
//设置为pclip的模板
pClip->setStencil(m_pAA);

CCDrawNode是用来绘制几何图形的,drawPolygon使用绘制多边形,参数为顶点数组,顶点数量,边框宽度,和填充颜色!这里要注意一点:千万不要addChild(m_pAA);因为一旦addchild,m_pAA就会被绘制出来,我们是要用它做剪裁!他会在CCClippingNode内部被使用!

我们会看到这样的效果:

额,貌似和我们想想的不太一样啊,为什么呢?那是因为CCClippingNode有一个选项是是否反向,既显示Stencil呢还是child减去Stencil的部分!默认为显示显示镂空(Stencil)部分(false),因此我们要改变选项:

//是否反向?
pClip->setInverted(true);

效果如下,是不是很棒:

3.组合效果(将2的矩形改成圆,再加上图片)

让我们先看这张图片,是不是很棒?右下角黄色矩形区域是高亮的,在配上图片说明,很不错的效果!

让我们来实现类似的效果吧,用到的资源:

//创建cliper
CCClippingNode* pClip=CCClippingNode::create();
pClip->setInverted(true);
addChild(pClip);
//添加底板
CCLayerColor* pColor=CCLayerColor::create(ccc4(0,0,0,200));
pClip->addChild(pColor);

//绘制圆形区域
static ccColor4F green = {0, 1, 0, 1};//顶点颜色,这里我们没有实质上没有绘制,所以看不出颜色
float fRadius=55.0f;//圆的半径
const int nCount=100;//圆形其实可以看做正多边形,我们这里用正100边型来模拟园
const float coef = 2.0f * (float)M_PI/nCount;//计算每两个相邻顶点与中心的夹角
static CCPoint circle[nCount];//顶点数组
for(unsigned int i = 0;i <nCount; i++) {
 float rads = i*coef;//弧度
 circle[i].x = fRadius * cosf(rads);//对应顶点的x
 circle[i].y = fRadius * sinf(rads);//对应顶点的y
}
CCDrawNode *pStencil=CCDrawNode::create();
pStencil->drawPolygon(circle, nCount, green, 0, green);//绘制这个多边形!

//动起来
pStencil->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f, 0.95f),
 CCScaleTo::create(0.125f, 1))));
pStencil->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

//设这模板
pClip->setStencil(pStencil);

//添加圆和手的图片
CCSprite*pCircle=CCSprite::create("circle.png");
pCircle->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
pCircle->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCScaleBy::create(0.05f, 0.95f),
 CCScaleTo::create(0.125f, 1))));
addChild(pCircle);

CCSprite* pHand=CCSprite::create("hand.png");
pHand->setAnchorPoint(ccp(0.0f,1.0f));
pHand->setPosition(ccp(pCircle->getContentSize().width/2,pCircle->getContentSize().height/2));
pCircle->addChild(pHand);

上面是全部的代码,效果图如下(动态的会更好)没有加圆圈和手之前和之后:

那么如何改变高亮区域得位置呢?很简单,只用改变pStencil的位置即可!可以考虑记为成员变量在ccTouchesBegan中改变位置,这样就会高亮区域就会跟着你的鼠标走啦!

二.触摸和按钮响应

1.开启触摸 阻止穿透响应 判断落点

让我们继续看下面的这张图片:

这张图片中应该只有右下角的”冒险”按钮能够响应的到,在这里说下思路:

为了让其他区域的按钮响应不到,我们应该提高上层(CClayer)的响应优先级为-128和按钮一样,这样的话如果上层(CClayer)后加入游戏addchild的话,会先收到触摸消息.
在收到触摸消息ccTouchBegan时,判断点击的地方是否在黄色矩形区域中,在的话return false 交给下层的按钮去响应,否则return true 阻止消息继续传递.
下面是代码片段:
1).开启触摸

bool CTeachLayer::init()
{
 if (!CCLayer::init())
 {
 return false;
 }
 setTouchEnabled(true);
 return true;
}

2).提升触摸响应优先级为-128

void CTeachLayer::registerWithTouchDispatcher()
{
//使用-128和CCMenu优先级相同,并且吞掉事件true//
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true);
CCLayer::registerWithTouchDispatcher();
}

3).在ccTouchBegan判断触点

bool CTeachLayer::ccTouchBegan( CCTouch* pTouch, CCEvent* pEvent )
{
    //得到触摸位置
 CCPoint touchPoint = pTouch->getLocation();
    //声明一个右下角100x50的矩形
 CCRect m_obRect=CCRectMake(
 CCDirector::sharedDirector()->getVisibleSize().width-100,
 CCDirector::sharedDirector()->getVisibleSize().height-50,
 100,
 50);
    //判断点是否在矩形中
 if (m_obRect.containsPoint(touchPoint))
 {
 return false;
 }
 return true;
}

大功告成,快去试一下吧!

2.精确命中

手机上和电脑上的触摸事件的区别在于:电脑上我们是用鼠标点击,而手机上使用手指去摁,触摸的精度的高低不言而喻!让我们来看下面这张图片:

让我们看右上角的X号按钮,在手机上点击它来说应该是很困难的!他的真实尺寸应该是红色矩形的区域(假设:50x50),为了让玩家在引导时,能够很方便的点击到它,我们将实际的可触摸区域设置为蓝色区域(假设:100x100),这样应该很好点到了吧!

这样会有一个新的问题,如果点击到红色和蓝色之间的区域,下面的x按钮时响应不到的,那么怎么办呢?我们需要修改touch的数据(设置为按钮的正中心),然后touch事件将会以新的数据向下传递!这样下面的按钮就能响应到了!

让我们看看代码吧:

bool CTeachLayer::ccTouchBegan( CCTouch* pTouch, CCEvent* pEvent )
{
 CCPoint touchPoint = pTouch->getLocation();

 if (!CGlobal::s_bTeach)
 {
 return false;
 }
    //假设按钮在(300,200)的位置,那么蓝色矩形如下:
 CCRect m_obRect=CCRectMake(
 250,
 150,
 100,
 100);

 if (m_obRect.containsPoint(touchPoint))
 {
        //得到蓝色矩形的中心点(300,200)
 CCPoint pos=ccp(m_obRect.getMidX(),m_obRect.getMidY());
        //这里要转化为UI坐标系(左上角为0,0点)
 pos=CCDirector::sharedDirector()->convertToUI(pos);
        //设置触摸信息
 pTouch->setTouchInfo(pTouch->getID(),pos.x,pos.y);
 return false;
 }

 return true;
}

三.逻辑处理及代码组织

这里我大概说下新手引导的架构,代码肯定贴不出来,太多太乱,说的不对的地方,欢迎大家拍砖吐槽!>_<

1.首先创建了一个CTeachLayer继承自CCLayer,添加到游戏的最上层(UI层之上),记住,要先添加游戏的其层,最后添加CTeachLayer,可以保存全局指针!

2.用一个枚举记下你要引导的所有步骤,在根据枚举值去设置高亮的位置及触摸区域!可以记下当前引导的进度,以方便下次继续引导!

3.游戏逻辑中免不了要判断引导(例:出第3波怪的时候引导玩家使用清屏道具),用全局的指针去设置引导的步骤!

4.引导完成后移除CTeachLayer,游戏开始!

(0)

相关推荐

  • Cocos2d-x 3.x入门教程(二):Node节点类

    千里之行,始于足下 上一篇文章<菜鸟学习Cocos2d-x 3.x--基础概念>中介绍了以下Cocos2d-x的基本结构和一些重要的类,而这里开始对这些重要的类进行单独的介绍与分析.开始吧~~~ Node节点类 Node类是Cocos2d-x中一个非常重要的类,它继承自类Ref,关于Ref类,Ref类是一个内存管理的类,我后续也会总结的,这里就不做多说了. Node类在Cocos2d-x中有多重要呢?任何需要画在屏幕上的对象都是节点类.最常用的节点类包括场景类(Scene).布景层类(Laye

  • Cocos2d-x 3.x入门教程(一):基础概念

    前言 接触游戏开发时间不长,之前一直都是写Lua,写Lua肯定是没有什么发展的啦,至少你要会写的.写客户端,肯定要看看Cocos2d-x了.从今天起,正式开始Cocos2d-X的学习之旅. 之前一直都是做C++开发的,转过来看Cocos2d-x,从语言上来说,没有多少问题.对于我来说,Cocos2d-x就是一个类库,就类似于MFC.ATL和QT一样,就是一个游戏类库,而我就按照学习类库使用的方法去学习Cocos2d-x.这篇文章叫基础概念,但是还是从整体来说说Cocos2d-x这个类库的. 基础

  • Cocos2d-x中使用CCScrollView来实现关卡选择实例

    类似关卡选择的这种功能游戏中经常看到,比如帮助场景,选择关卡,通过滑动的方式选择一些其他的东西等等.今天我们实现关卡的选择是使用CCScrollView这个类.当然还有一些其他的方法,比如使用cocostudio的page view也可以.我先说下整体的思路,CCScrollView这个类是继承自CCLayer的,本身的触摸事件有些bug,所以网上一般将这个层的touch事件处理为false,而使用它的父节点来处理触摸事件,我们也是采用这个做法.先定义一个LevelScene类,将CCScrol

  • Cocos2d-x中CCEditBox文本输入框的使用实例

    文本输入框这个东西相信大家不论做什么游戏总会用到吧,今天我们就来看看这个东西如何使用.文本输入框同样属于扩展库中的内容,所以你知道怎么做了吧.当用户要在文本框中输入内容,这一系列的过程我们需要一些函数的调用来获得我们想要的东西,包含这些函数的类需要实现CCEditBoxDelegate这个接口,下面我们来看看具体如何使用吧. #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h"

  • 使用C++进行Cocos2d-x游戏开发入门过程中的要点解析

    总结了下,新手引导的要点有以下几个: 画面的变化. 触摸和按钮响应. 逻辑处理及代码组织. 下面我们就详细讲述这几个要点: 一.画面的变化. 对个这个不同的游戏的做法不尽相同,归结起来大概有这么几种: 1.画面整体变暗 这个比较简单,cocos2d就有现成接口: CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //第一个参数是颜色ccc4(r,g,b,a) a取值(0~255),越大越不透明 下面两个参数为

  • 网页游戏开发入门教程三(简单程序应用)

    网页游戏开发入门教程二(游戏模式+系统)http://www.jb51.net/article/20724.htm 一.选择开发语言 后台:java .net php 前台:flex javascript ajax 数据库:mysql mssql 用哪种组合,真的不重要.重要的是时间和成本.复杂的地方在数据的交互和完善,而不在技术或效果的实现.往往遇到一些问题.比如地图如何编?人物移动如何实现?其实这些问题从技术上实现都比较容易.难在实现后,数据如何交互.没有解决数据交互的问题,实现这些技术点的

  • Android 游戏开发入门简单示例

    在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬.那怎样开发Android游戏呢?下面介绍一个简单的入门实例.        一.创建新工程 首先,我们在Eclipse中新建一个名为Movement的工程,并且选择合适的Android SDK,在这里,我们选用的API是比较低的1.5版本,这样可以让其适应性更强.接下来,我们新建两个类,一个是UpdateThread类,一个是SurfaceView类,它们在项目中分别是负责处理线程和画面的两

  • 网页游戏开发入门教程二(游戏模式+系统)

    一.游戏模式目前webgame游戏模式大体上可以分为以下四类:1.玩家拥有一个城市,不断的升级城市内建筑,建筑可以自动获得物资,可以生产军队,军队之间进行对比数值的战斗.这里我简单的称为Ogame模式. 比较优秀的代表:战神世界II,Travian,Ogame,武林三国,纵横天下,领主online,乱舞春秋,热血三国,方便面三国等等.这是一个比较成熟的模式, 但正因为成熟.因此,玩家接触到这类游戏比较的多,除非你能超过这些优秀的代表,否则就只是简单的重复开发. 对玩家来说:优点:Ogame模式模

  • php 网页游戏开发入门教程一(webgame+design)

    一.简单的程序框架. webgame程序构成: 三大部分. 第一是数据流程.第二是程序.第三是美术. 其中,数据流程包括了功能.也只有在功能中才能体现数据流程. 数据流程相当的麻烦,后面再讨论. 比如最简单的卖买产品. 要实现这个功能. 那么需要有产品基础表.产品详细表.商店表.背包表.如果扩展性更强,相应的双表是少不不了的. 表的问题都简单了.关键是这个物品有什么用.这样物品的来源,一大堆数据,物品的走向,又是一大堆数据. 最后,这些数据得绕成一个圈. 绕圈是一件困难的事情.特别是功能和道具多

  • Android数字华容道小游戏开发

    目的 上周新一期的最强大脑出来了,虽然上季被称为最强黑幕,不过呢.我决定还是看看= =.它里面第一关是叫做数字华容道.说白了,就是和拼图差不多.一开始我准备下一个玩玩的.结果没搜到.所以决定写了一个.最后效果差不多是这样: 思路以及实现 首先,我们应该考虑如何去实现这个效果.细想一下,其实和之前的2048有点像,但是又不是完全一直.于是,便又折腾了一波.这次布局和内容项参考之前2048的,下面放上代码: 自定义一个frame layout,我们先绘制里面的数字: private void ini

  • javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图

    小时候我们玩过拼图游戏,是用自己的手去拼的.今天我们来研究研究用javascript来拼图.同样是拼图,但用js拼图要比用手拼图麻烦多了,因此以后我要把它优化成引擎. 一.前言 以上是一段导语,话不扯远,对<三国志曹操传>熟悉的玩家知道,<三国志曹操传>的地图是由小地图块拼成的,那要实现它就和导语说得一样:很麻烦.不过即使麻烦也是一门技术,因此在此分享给大家,希望大家喜欢. 二.代码讲解 今天我要换换讲解方式,先不给代码,我们先来想想原理.现在,假如你有一幅图片,把它裁开成若干份,

  • python使用pgzero进行游戏开发

    目录 1. pgzero python在各个领域都有着丰富的第三方库,pygame是python在游戏领域的应用库,可以用来开发各种不同的游戏.但是对于初学者来说,还是存在一定的门槛.pgzero是在pygame基础上做了进一步的封装,使得设计一款游戏十分的方便. pgzero的安装 pip install pygame pip install pgzero 2. 游戏设计的过程 我们可以简单梳理下开发一款简单游戏需要的过程: 游戏的故事设计 游戏的场景绘制(背景图片和声音) 游戏的角色 如何控

  • 初学者的福音:游戏开发新手入门指南

    我经常被问及:一个具有很少甚至没有编程经验的人要如何开始游戏制作.直到目前为止,我总是尽我所能一个一个解答.然而,问题的数量已经增长到了一个难以处理的水平,于是,我便决定把所有的建议汇总在一篇文章里作为参考提供给人们. 这篇文章主要面向那些想开发自己的游戏,但仅有一点点或没有半点编程经验的人们.实际上,我也假定读者根本没有任何的编程知识.我将把重点放在游戏开发的编程和设计方面,而不是艺术方面.我也不准备对游戏行业进行论述(因为这个话题的资料太多了),但是,我会带你浏览一下在制作游戏之前需要做的一

  • Pygame游戏开发之太空射击实战入门篇

    目录 视频 入门 游戏循环 1. 处理输入(或事件) 2. 更新游戏 3. 渲染(或绘制) 时钟 构建 Pygame 模板 渲染/绘制部分 输入/事件部分 控制屏幕刷新频率 结束语 本部分代码 视频 观看视频 入门 pygame 这是我们教程系列“使用 Pygame 进行游戏开发”的第 1 部分.它适用于对游戏开发和提高Python编码技能感兴趣的初学者/中级程序员. 什么是Pygame Pygame是一个“游戏库” - 一套帮助程序员制作游戏的工具.其中一些内容是: 图形和动画 声音(包括音乐

随机推荐