本文主要介绍了用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。