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

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

本文主要介绍了用C开发Cocos2d-x游戏过程中的关键点分析,主要集中在屏幕变化和触摸响应上。有需要的朋友可以参考一下。

总结一下,新手指导要点如下:

画面的变化。

和触摸按钮响应。

逻辑处理和代码组织。

下面就来详细说说这几点:

一.画面的变化.

对于这种不同的游戏有不同的方法,可以总结如下:

1.画面整体变暗

这个比较简单。cocos2d有现成的接口:

cc size visibleSize=cc director:shared director()-getVisibleSize();

//第一个参数是color ccc4(r,g,b,a) a (0~255)的值。参数越大,越不透明。下面两个参数是宽度和高度,默认是屏幕尺寸。

CCLayerColor * pLayer=CCLayerColor:create(cc C4(0,0,0,200),visibleSize.width,visible size . height);

//CCLayerColor * pLayer=CCLayerColor:create(cc C4(0,0,0,200));

addChild(播放器,100);

效果如下:

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

注:图片来自网络。如果有版权问题~去死吧!请联系我!

2.局部高亮

比较简单的方法是准备几张局部高亮的图片,随着开机进度的变化进行切换!优点是可以做的很漂亮,缺点是资源量会比较大!另一种方法是在使整个画面变暗的基础上,把一些区域剪掉。好在cocos2d提供了CCClippingNode接口(2.1版)!

CCClippingNode类比较复杂,但是我们只需要了解两件事:一是CCClippingNode的模版,二是CCClippingNode的子。怎么才能理解呢?请看下图:

这个东西相信大家都有印象。上面的图案(空心部分)是CCCIPPINGNODE的蜡纸(模板),实心部分是CCCIPPINGNODE的子(底板)。容易理解吗?让我们用代码来实现它:

//创建一个剪辑器对象

CCClippingNode * pClip=CCClippingNode:create();

addChild(pClip);

//添加灰色底板。

CCLayerColor * p color=CCLayerColor:create(cc C4(0,0,0,200));

pClip-addChild(pColor);

让我加入模板:

//创建一个drawnode对象

CCDrawNode * m _ pAA=CCDrawNode:create();

静态ccColor4F green={0,1,0,1 };

静态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-set position(visibleSize.height/2 origin . y CCP(visible size . width/2 origin . x));

//模板设置为pclip

pClip-set stencil(m _ pAA);

CCDrawNode用于绘制几何图形,drawPolygon用于绘制多边形。参数是顶点数组、顶点数、边框宽度和填充颜色!这里要注意一点:千万不要addChild(m _ pAA);因为一旦addchild,就会画出m_pAA,我们准备用它来进行裁剪!他将在CCClippingNode内部使用!

我们会看到这样的效果:

嗯,好像和我们想的不一样。为什么?那是因为CCClippingNode有一个是否反转的选项,也就是显示stencils还是子减stencils的部分!默认情况下,会显示模具(false),因此我们必须更改选项:

//反了吗?

pClip-set inverted(true);

效果如下,是不是很棒:

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

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

让我们达到类似的效果,所用的资源:

//创建剪辑器

CCClippingNode * pClip=CCClippingNode:create();

pClip-set inverted(true);

addChild(pClip);

//添加背板

CCLayerColor * p color=CCLayerColor:create(cc C4(0,0,0,200));

pClip-addChild(pColor);

//画一个圆形区域

静态ccColor4F green={0,1,0,1 };//顶点颜色,这里我们没有实质上没有画,所以我们看不到颜色

float fRadius=55.0f//圆的半径

const int nCount=100//圆其实可以看作正多边形。这里,我们使用一个规则的100面图案来模拟花园。

const float coef=2.0f *(float)M _ PI/nCount;//计算每两个相邻顶点与中心之间的角度

静态cc point circle[nCount];//顶点数组

for(无符号int I=0;我不算;i ) {

float rads=i * coef//弧度

圈[i]。x=fRadius * cosf(拉德);//X对应的顶点

圈[i]。y=fRadius * sinf(拉德);//Y对应的顶点

}

CCDrawNode * psten cil=CCDrawNode:create();

pStencil-drawPolygon(圆形,nCount,绿色,0,绿色);//画这个多边形!

//移动它

psten cil-run action(CCRepeatForever:create(cc sequence:createwithtowactions(CCScaleBy:create(0.05 f,0.95f)),

CCScaleTo:create(0.125f,1))));

psten cil-set position(visibleSize.height/2 origin . y CCP(visible size . width/2 origin . x));

//设置此模板

pClip-set stencil(psten cil);

//添加圆圈和手的图片

cc sprite * PCI rcle=cc sprite:create(' circle . png ');

pCircle-set position(visibleSize.height/2 origin . y CCP(visible size . width/2 origin . x));

pCircle-run action(CCRepeatForever:create(cc sequence:createwithtowactions(CCScaleBy:create(0.05 f,0.95f)),

CCScaleTo:create(0.125f,1))));

addChild(pCircle);

cc sprite * pHand=cc sprite:create(' hand . png ');

pHand-setAnchorPoint(ccp(0.0f,1.0f));

pHand-set position(CCP(pCircle-get contentsize()。width/2,pCircle-getContentSize()。高度/2));

pCircle-addChild(pHand);

以上是全部代码,不加圈和手的前后效果图如下(动态的会更好):

那么如何改变高亮区域的位置呢?很简单,把pStencil的位置换一下就行了!考虑将cctouchesbeanden中的位置更改为一个成员变量,这样突出显示的区域将跟随您的鼠标!

二.触摸和按钮响应

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

我们继续看下图:

此图中,只有右下角的“冒险”按钮可以响应。想法是这样的:

为了防止其他区域的按钮响应,我们要把CClayer的响应优先级提高到-128,和按钮的响应优先级一样。这样,如果CClayer加入游戏addchild,就会先收到触摸消息。

当接收到触摸消息ccTouchBegan时,判断被点击的地方是否在黄色矩形区域内,如果是,则返回false给下方按钮响应,否则返回true阻止消息继续传递。

以下是代码片段:

1).开启触摸

bool CTeachLayer:init()

{

如果(!CCLayer:init())

{

返回false

}

setTouchEnabled(真);

返回true

}

2).将触摸响应优先级提高到-128

void CTeachLayer:registerwithtuchdispatcher()

{

//使用与CCMenu相同优先级的-128,并吞掉事件true//

cc director:shared director()-getTouchDispatcher()-addTargetedDelegate(this,-128,true);

cc layer:registerWithTouchDispatcher();

}

3).在ccTouchBegan判断触点

bool CTeachLayer:cctouchbegin(cc touch * p touch,CCEvent* pEvent)

{

//获取触摸位置

cc point touch point=p touch-get location();

//声明右下角为100x50的矩形

CCRect m_obRect=CCRectMake(

cc director:shared director()-getVisibleSize()。宽度-100,

cc director:shared director()-getVisibleSize()。身高-50,

100,

50);

//确定该点是否在矩形中

if(m _ obrect . contains point(touch point))

{

返回false

}

返回true

}

做完了,去试试吧!

2.精确命中

手机和电脑上的触摸事件的区别在于,在电脑上,我们用鼠标点击,而在手机上,我们用手指按压。触摸的准确性不言而喻!我们来看下图:

我们来看看右上角的X按钮。在手机上点击应该很难吧!他的真实尺寸应该是一个红色的矩形区域(假设:50x50)。为了方便玩家在开机时点击,我们将实际可触摸区域设置为蓝色区域(假设:100x100),应该是个不错的点!

会有新的问题。如果你点击红色和蓝色之间的区域,而下面的X按钮没有反应,你该怎么办?我们需要修改touch的数据(设置到按钮中央),然后touch事件会用新的数据传下来!下面这个按钮可以响应!

让我们看看代码:

bool CTeachLayer:cc touch begin(cc touch * p touch,CCEvent* pEvent)

{

cc point touch point=p touch-get location();

如果(!CGlobal:s_bTeach)

{

返回false

}

//假设按钮在(300,200)的位置,那么蓝色矩形如下:

CCRect m_obRect=CCRectMake(

250,

150,

100,

100);

if(m _ obrect . contains point(touch point))

{

//获取蓝色矩形的中心点(300,200)

cc point pos=CCP(m _ obrect . getmidx(),m _ obrect . getmidy());

//这里要转换成UI坐标系(左上角0,0点)

pos=cc director:shared director()-convert toui(pos);

//设置触摸信息

p touch-setTouchInfo(p touch-getID()、pos.x、pos . y);

返回false

}

返回true

}

三.逻辑处理及代码组织

在这里,我大概会说一下新手引导的架构。代码肯定贴不出来,又多又乱。如果说的不对,欢迎大家拍砖吐槽!_

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

2.用枚举写下你要引导的所有步骤,然后根据枚举值设置高亮位置和触摸区域!可以记下当前开机的进度,方便下次开机!

3.游戏逻辑中难免要判断引导(比如第三波怪物出来时引导玩家使用清屏道具),使用全局指针设置引导步骤!

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: