如何制作一个类似tiny wings 安卓的游戏 Cocos2d-x 2.1.4

如何制作一个类似tiny wings的游戏:第二部分(完)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何制作一个类似tiny wings的游戏:第二部分(完)
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩21页未读,继续阅读
你可能喜欢Cocos2d-x类似coverflow效果
发布时间: 17:01:52
由于镜面反射涉及到openGL,不会。
#ifndef __CoverView_H__&
#define __CoverView_H__&
#include "cocos2d.h"&
#include "cocos-ext.h"&
USING_NS_CC;&
USING_NS_CC_EXT;&
class CoverView : public CCNode , public CCScrollViewDelegate , public CCTouchDelegate&
&&&&CoverView();&
&&&&~CoverView();&
&&&&&* @param scrollView的rect
&&&&&* @param scrollView滚动size
&&&&&* @param card之间的距离
&&&&&* @param card之间的缩放
&&&&static CoverView* create(CCRect swBox, CCSize slSize ,float disDistance , float disScale );&
&&&&virtual bool init(CCRect swBox , CCSize slSize , float disDistance , float disScale);&
&&&&virtual void onEnter();&
&&&&virtual void onExit();&
&&&&virtual bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent);&&
&&&&virtual void ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent);&&
&&&&virtual void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent);&
&&&&void initData();&
&&&&void scrollViewDidScroll(CCScrollView* view);&&&
&&&&void scrollViewDidZoom(CCScrollView* view);&&
&&&&void adjustCardScale(CCPoint adjustPoint);&
&&&&void adjustScrollView(CCPoint adjustPoint);&
&&&&void adjusetEndScrollView();&
&&&&void cardViewEnd_callBack(CCNode* pSender);&
&&&&int getCurCardIndex();//当前中间card索引 从0开始&
&&&&void addCard(CCNode * card);&
&&&&void addCard(CCNode * card, int zOrder);&
&&&&void addCard(CCNode* card, int zOrder, int tag);&
&&&&CC_SYNTHESIZE(CCPoint , swPosition , SwPosition);//scrollView 位置&
&&&&CC_SYNTHESIZE(CCSize , swSize , SwSize);//scrollView大小&
&&&&CC_SYNTHESIZE(CCSize , slSize , SlSize);//scrollLayer 大小&
&&&&CC_SYNTHESIZE(float , disDistance , DisDistance);//card距离间隔&
&&&&CC_SYNTHESIZE(float , disScale , DisScale);//crad缩放间隔&
&&&&CC_SYNTHESIZE(CCRect , swBox , SwBox);//scrollview 边框&
&&&&CC_SYNTHESIZE(CCLayer* , scrollLayer , scrollLayer);//scrollView的containLayer&
&&&&CC_SYNTHESIZE(int , cardNum , CardNum);//card索引&
&&&&CC_PROPERTY(CCPoint , offsetPosition , OffsetPosition);//card起始位置&
&&&&CCSize wS&
&&&&CCArray* cardA&
&&&&CCScrollView* scrollV&
#include "CoverView.h"&
CoverView::CoverView()&
CoverView::~CoverView()&
&&&&CC_SAFE_RELEASE_NULL(cardArray);&
CoverView* CoverView::create(CCRect swBox, CCSize slSize , float disDistance , float disScale)&
&&&&CoverView* cover = new CoverView();&
&&&&if(cover && cover-&init(swBox,slSize,disDistance,disScale))&
&&&&&&&&cover-&autorelease();&
&&&&&&&&return &
&&&&CC_SAFE_DELETE(cover);&
&&&&return NULL;&
bool CoverView::init(CCRect swBox , CCSize slSize , float disDistance , float disScale)&
&&&&if(!CCNode::init()) return false;&
&&&&this-&swBox = swB&
&&&&this-&swPosition = swBox.&
&&&&this-&swSize = swBox.&
&&&&this-&slSize = slS&
&&&&this-&disDistance = disD&
&&&&this-&disScale = disS&
&&&&initData();&
&&&&return true;&
void CoverView::initData()&
&&&&wSize = CCDirector::sharedDirector()-&getWinSize();&
&&&&cardArray = CCArray::create();&
&&&&cardArray-&retain();&
&&&&cardNum = 0;&
&&&&offsetPosition = ccp(swSize.width/2,swSize.height/2);&
&&&&scrollLayer = CCLayer::create();&
&&&&scrollLayer-&setAnchorPoint(CCPointZero);&
&&&&scrollLayer-&setPosition(CCPointZero);&
&&&&scrollLayer-&setContentSize(slSize);&
&&&&scrollView = CCScrollView::create(swSize,scrollLayer);&
&&&&scrollView-&setAnchorPoint(CCPointZero);&
&&&&scrollView-&setContentOffset(ccp(0,0));&
&&&&scrollView-&setTouchEnabled(false);&&&
&&&&scrollView-&setDelegate(this);&&&
&&&&scrollView-&setDirection(kCCScrollViewDirectionHorizontal);&&&
&&&&addChild(scrollView,1);&
void CoverView::onEnter()&
&&&&CCNode::onEnter();&
&&&&CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate(this, 0 , false);&&&
void CoverView::onExit()&
&&&&CCDirector::sharedDirector()-&getTouchDispatcher()-&removeDelegate(this);&
&&&&removeAllChildren();&
&&&&CCNode::onExit();&
bool CoverView::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)&
&&&&return true;&
void CoverView::ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent)&
&&&&CCPoint scroll_prepoint = pTouch-&getPreviousLocation();&
&&&&CCPoint scroll_movepoint = pTouch-&getLocation();&
&&&&if(swBox.containsPoint(scroll_movepoint))&
&&&&&&&&CCPoint adjustPoint = scroll_movepoint-scroll_&
&&&&&&&&adjustScrollView(adjustPoint);&&&
&&&&&&&&adjustCardScale(adjustPoint);&
void CoverView::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent)&
&&&&CCPoint scroll_prepoint = pTouch-&getPreviousLocation();&
&&&&CCPoint scroll_endpoint = pTouch-&getLocation();&
&&&&float disX = scroll_endpoint.x - scroll_endpoint.x;&
&&&&adjusetEndScrollView();&
void CoverView::adjustCardScale(CCPoint adjustPoint)&
&&&&float disX = adjustPoint.x;&
&&&&CCObject* obj = NULL;&
&&&&CCARRAY_FOREACH(cardArray,obj)&
&&&&&&&&CCNode* card = (CCNode*)&
&&&&&&&&float offset = scrollView-&getContentOffset().x;&
&&&&&&&&float posX = card-&getPositionX() +&
&&&&&&&&float disMid = abs(swSize.width/2-posX);&
&&&&&&&&float scale = 1- disMid/disDistance*disS&
&&&&&&&&card-&setScale(scale);&
&&&&&&&&int zOr = (int) (1000-disMid*0.1);&
&&&&&&&&card-&setZOrder(zOr);&
void CoverView::adjustScrollView(CCPoint adjustPoint)&
&&&&CCPoint endPoint = ccpAdd(scrollView-&getContentOffset(),ccp(adjustPoint.x,0));&
&&&&scrollView-&unscheduleAllSelectors();&
&&&&scrollView-&setContentOffset(endPoint,false);&
void CoverView::adjusetEndScrollView()&
&&&&CCObject* obj = NULL;&
&&&&float minX = wSize.&
&&&&float midX = swSize.width/2;&
&&&&//获取距离中间最小值的card&
&&&&CCARRAY_FOREACH(cardArray,obj)&
&&&&&&&&CCNode* card = (CCNode*)&
&&&&&&&&float offset = scrollView-&getContentOffset().x;&
&&&&&&&&//转化父类坐标&
&&&&&&&&float posX = card-&getPositionX() +&
&&&&&&&&float disMid = midX-posX;&
&&&&&&&&if(abs(disMid) & abs(minX)) minX = disM&
&&&&CCARRAY_FOREACH(cardArray,obj)&
&&&&&&&&CCNode* item = (CCNode*)&
&&&&&&&&//转化父类坐标&
&&&&&&&&float offset = scrollView-&getContentOffset().x;&
&&&&&&&&float posX = item-&getPositionX() +&
&&&&&&&&//距离中间长度&
&&&&&&&&float disMid = abs(midX - posX - minX);&
&&&&&&&&//目标scale&
&&&&&&&&float scale = 1- disMid/disDistance*disS&
&&&&&&&&CCScaleTo* scaleBy = CCScaleTo::create(0.2f,scale);&
&&&&&&&&item-&runAction(scaleBy);&
&&&&&&&&int zOr = (int) (1000-disMid*0.1);&
&&&&&&&&item-&setZOrder(zOr);&
&&&&CCLayer* scrollLayer = (CCLayer*)scrollView-&getContainer();&
&&&&CCMoveBy* moveBy = CCMoveBy::create(0.2f,ccp(minX,0));&
&&&&//CCCallFuncN* callFuncN = CCCallFuncN::create(this,callfuncN_selector(CoverView::cardViewEnd_callBack));&
&&&&//CCSequence* seq = CCSequence::create(moveBy,callFuncN,NULL);&
&&&&//scrollLayer-&runAction(seq);&
&&&&scrollLayer-&runAction(moveBy);&
void CoverView::cardViewEnd_callBack(CCNode* pSender)&
&&&&getCurCardIndex();&
void CoverView::scrollViewDidScroll(CCScrollView* view)&
void CoverView::scrollViewDidZoom(CCScrollView* view)&
void CoverView::addCard(CCNode * card)&
&&&&int zOrder = 1000 - cardN&
&&&&this-&addCard(card, zOrder, 0);&
void CoverView::addCard(CCNode * card, int zOrder)&
&&&&this-&addCard(card, zOrder,0);&
void CoverView::addCard(CCNode* card, int zOrder, int tag)&
&&&&float positionX = offsetPosition.x + disDistance*cardN&
&&&&float scale = 1 - disScale*cardN&
&&&&card-&setPosition(ccp(positionX,offsetPosition.y));&
&&&&card-&setScale(scale);&
&&&&cardArray-&addObject(card);&
&&&&scrollLayer-&addChild(card , zOrder,tag);&
&&&&cardNum++;&
&&&&//CCLog("crad%d:[%f , %f]",cardNum,card-&getPositionX(),card-&getPositionY());&
int CoverView::getCurCardIndex()&
&&&&float distance1 = - scrollLayer-&getPositionX();&
&&&&float distance2 = swSize.width/2 - offsetPosition.x;&
&&&&//+5 浮点数误差&
&&&&int index = (distance1 + distance2 + 5) / (disDistance);&
&&&&//CCLog("card index:%d& distance1:%f",index,distance1);&
&&&&return &
void CoverView::setOffsetPosition(CCPoint var)&
&&&&offsetPosition = var;&
&&&&CCObject* obj = NULL;&
&&&&cardNum = 0;&
&&&&CCARRAY_FOREACH(cardArray,obj)&
&&&&&&&&CCNode* card = (CCNode*)&
&&&&&&&&float positionX = offsetPosition.x + disDistance*cardN&
&&&&&&&&card-&setPosition(ccp(positionX,offsetPosition.y));&
&&&&&&&&cardNum++;&
&&&&adjustCardScale(CCPointZero);&
CCPoint CoverView::getOffsetPosition()&
&&&&return offsetP&
在HelloWorld中调用:
bool HelloWorld::init()&
&&&&if ( !CCLayer::init() )&
&&&&&&&&return false;&
&&&&CCSpriteFrameCache::sharedSpriteFrameCache()-&addSpriteFramesWithFile("image/logoLayer.plist");&
&&&&float winWidth = CCDirector::sharedDirector()-&getWinSize().&
&&&&float winHeight = CCDirector::sharedDirector()-&getWinSize().&
&&&&CCRect swRect = CCRectMake(0.01f*winWidth,0.4f*winHeight,0.98f*winWidth,0.33f*winHeight);&
&&&&CCSize slSize = CCSizeMake(2.3f*winWidth,0.33f*winHeight);&
&&&&float disDistance = 0.2f*winW&
&&&&float disScale = 0.25f;&
&&&&CoverView* coverView = CoverView::create(swRect,slSize,disDistance,disScale);&
&&&&CCLog("add card");&
&&&&for(int i = 0 ; i& 11 ; i++)&
&&&&&&&&CCSprite* player = CCSprite::createWithSpriteFrameName("hero_bg.png");&
&&&&&&&&coverView-&addCard(player);&
&&&&//coverflow1.png默认第一张在coverView的正中间& coverflow2.png改变第一张的位置有卡片初始不一定在最中间 需要手动调整&
&&&&//coverView-&setOffsetPosition(ccp(0.1f*winWidth,swRect.size.height/2));&
&&&&coverView-&setPosition(swRect.origin);&
&&&&addChild(coverView);&
&&&&return true;&
原文链接:/news/111.html
来源:/wodehao0808/p/3654507.htmlcocos2d与html5什么区别?html5做游戏和用cocos2D做游戏有什么区别?_百度知道
cocos2d与html5什么区别?html5做游戏和用cocos2D做游戏有什么区别?
提问者采纳
cocos2d是一个游戏开发引擎,已经把大部分游戏需要旦丹测柑爻纺诧尸超建用到的功能都封装好,直接就可以使用html5是一个标准,所有功能都需要在这个标准下重新开发
提问者评价
其他类似问题
为您推荐:
cocos2d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4 - 推酷
如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇《
》基础上,增加创建动态山丘,原文《
》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。
步骤如下:
1.使用上一篇的工程;
2.添加地形类
代码如下:
#pragma once
&cocos2d.h&
#define kMaxHillKeyPoints&
class Terrain&:&
public cocos2d::CCNode
CREATE_FUNC(Terrain);
CC_SYNTHESIZE_RETAIN(cocos2d::CCSprite*,&_stripes,&Stripes);
int _offsetX;
cocos2d::CCPoint&_hillKeyPoints[kMaxHillKeyPoints];
这里声明了一个 _hillKeyPoints 数组,用来存储每个山丘顶峰的点,同时声明了一个 _offsetX 代表当前地形滚动的偏移量。文件
Terrain.cpp
代码如下:&
&Terrain.h&
namespace cocos2d;
Terrain::Terrain(
_stripes&=&
_offsetX&=&0;
Terrain::~Terrain(
CC_SAFE_RELEASE_NULL(_stripes);
增加如下方法:
void Terrain::generateHills()
CCSize&winSize&=&CCDirector::sharedDirector()-&getWinSize();
float x&=&
float y&=&winSize.height&/&
0 ;&i&&&kMaxHillKeyP&++i)
_hillKeyPoints[i]&=&ccp(x,&y);
x&+=&winSize.width&/&
y&=&rand()&%&(
int )winSize.
这个方法用来生成随机的山丘顶峰的点。第一个点在屏幕的左侧中间,之后的每一个点,x轴方向移动半个屏幕宽度,y轴方向设置为0到屏幕高度之间的一个随机值。添加以下方法:
bool Terrain::init()
bool bRet&=&
CC_BREAK_IF(!CCNode::init());
this -&generateHills();
void Terrain::draw()
CCNode::draw();
1 ;&i&&&kMaxHillKeyP&++i)
ccDrawLine(_hillKeyPoints[i&-&
1 ],&_hillKeyPoints[i]);
init 方法调用
generateHills
方法创建山丘,
方法简单地绘制相邻点之间的线段,方便可视化调试。添加以下方法:&
void Terrain::setOffsetX(
float newOffsetX)
_offsetX&=&newOffsetX;
this -&setPosition(ccp(-_offsetX&*&
this -&getScale(),&
英雄沿着地形的x轴方法前进,地形向左滑动。因此,偏移量需要乘以-1,还有缩放比例。打开
HelloWorldScene.h
文件,添加头文件引用:&
&Terrain.h&
添加如下变量:
Terrain&*_
HelloWorldScene.cpp
方法里,调用 genBackground 方法之前,加入如下代码:&
_terrain&=&Terrain::create();
this -&addChild(_terrain,&
方法里,最后面添加如下代码:&
_terrain-&setOffsetX(offset);
genBackground
方法为如下:&
void HelloWorld::genBackground()
if (_background)
_background-&removeFromParentAndCleanup(
ccColor4F&bgColor&=&
this -&randomBrightColor();
_background&=&
this -&spriteWithColor(bgColor,&
CCSize&winSize&=&CCDirector::sharedDirector()-&getWinSize();
_background-&setPosition(ccp(winSize.width&/&
2 ,&winSize.height&/&
ccTexParams&tp&=&{GL_LINEAR,&GL_LINEAR,&GL_REPEAT,&GL_REPEAT};
_background-&getTexture()-&setTexParameters(&tp);
this -&addChild(_background);
ccColor4F&color3&=&
this -&randomBrightColor();
ccColor4F&color4&=&
this -&randomBrightColor();
CCSprite&*stripes&=&
this -&spriteWithColor1(color3,&color4,&
ccTexParams&tp2&=&{GL_LINEAR,&GL_LINEAR,&GL_REPEAT,&GL_CLAMP_TO_EDGE};
stripes-&getTexture()-&setTexParameters(&tp2);
_terrain-&setStripes(stripes);
注意,每次触摸屏幕,地形上的条纹纹理都会随机生成一个新的条纹纹理,这方便于测试。此外,在
方法里_background调用setTextureRect方法时,可以将offset乘以0.7,这样背景就会比地形滚动地慢一些。编译运行,可以看到一些线段,连接着山丘顶峰的点,如下图所示:
当看到山丘滚动,可以想象得到,这对于一个Tiny&Wings游戏,并不能很好的工作。由于采用y轴随机值,有时候山丘太高,有时候山丘又太低,而且x轴也没有足够的差别。但是现在已经有了这些测试代码,是时候用更好的算法了。
3.更好的山丘算法。使用
的算法来进行实现。打开
Terrain.cpp
文件,修改
generateHills
方法为如下:&
void Terrain::generateHills()
CCSize&winSize&=&CCDirector::sharedDirector()-&getWinSize();
float minDX&=&
float minDY&=&
int rangeDX&=&
int rangeDY&=&
float x&=&-minDX;
float y&=&winSize.height&/&
float dy,&
float sign&=&
//&+1&-&going&up,&-1&-&going&&down
float paddingTop&=&
float paddingBottom&=&
0 ;&i&&&kMaxHillKeyP&++i)
_hillKeyPoints[i]&=&ccp(x,&y);
y&=&winSize.height&/&
x&+=&rand()&%&rangeDX&+&minDX;
dy&=&rand()&%&rangeDY&+&minDY;
ny&=&y&+&dy&*&
if (ny&&&winSize.height&-&paddingTop&&&&ny&&&paddingBottom)
这个算法执行的策略如下:
在范围160加上0-80之间的随机数进行递增x轴。
在范围60加上0-40之间的随机数进行递增y轴。
每次都反转y轴偏移量。
不要让y轴值过于接近顶部或底部(paddingTop,&paddingBottom)。
开始于屏幕外的左侧,硬编码第二个点为(0,&winSize.height/2),所以左侧屏幕外有一个山丘。
编译运行,现在可以看到一个更好的山丘算法,如下图所示:
4.一次只绘制部分。在更进一步之前,需要做出一项重大的性能优化。现在,绘制出了山丘的1000个顶峰点,即使每次都只有少数在屏幕上看得到。所以,可以根据屏幕区域来计算哪些顶峰点会被显示出来,然后只显示那些点,如下图所示:
文件,添加如下变量:&
int _fromKeyPointI;
int _toKeyPointI;
Terrain.cpp
文件,在构造函数里面添加如下代码:&
_fromKeyPointI&=&
_toKeyPointI&=&
添加如下方法:
void Terrain::resetHillVertices()
CCSize&winSize&=&CCDirector::sharedDirector()-&getWinSize();
int prevFromKeyPointI&=&-
int prevToKeyPointI&=&-
//&key&points&interval&for&drawing
while (_hillKeyPoints[_fromKeyPointI&+&
1 ].x&&&_offsetX&-&winSize.width&/&
this -&getScale())
_fromKeyPointI++;
while (_hillKeyPoints[_toKeyPointI].x&&&_offsetX&+&winSize.width&*&9&/&
this -&getScale())
_toKeyPointI++;
这里,遍历每一个顶峰点(从0开始),将它们的x轴值拿来做比较。无论当前对应到屏幕左边缘的偏移量设置为多少,只要将它减去winSize.width/8。如果顶峰点的x轴值小于结果值,那么就继续遍历,直到找到一个大于结果值的,这个顶峰点就是显示的起始点。对于 toKeypoint 也采用同样的过程。修改
方法,代码如下:&
void Terrain::draw()
CCNode::draw();
int i&=&MAX(_fromKeyPointI,&
1 );&i&&=&_toKeyPointI;&++i)
ccDrawColor4F(
ccDrawLine(_hillKeyPoints[i&-&
1 ],&_hillKeyPoints[i]);
现在,不是绘制所有点,而是只绘制当前可见的点,这些点是前面计算得到的。另外,也把线的颜色改成红色,这样更易于分辨。接着,在
方法里面,最后面添加如下代码:&
this -&resetHillVertices();
setOffsetX
方法里面,最后面添加如下代码:&
this -&resetHillVertices();
为了更容易看到,打开
HelloWorldScene.cpp
方法,最后面添加如下代码:
this -&setScale(
编译运行,可以看到线段出现时才进行绘制,如下图所示:
5.制作平滑的斜坡。山丘是有斜坡的,而不是这样直上直下的直线。一个办法是使用余弦函数让山丘弯曲。回想一下,余弦曲线就如下图所示:
因此,它是从1开始,每隔PI长度,曲线下降到-1。但怎么利用这个函数来创建一个漂亮的曲线连接顶峰点呢?先只考虑两个点的情况,如下图所示:
首先,需要分段绘制线,因此,需要每10个点创建一个区段。同样的,想要一个完整的余弦曲线,因此,可以将PI除以区段的数量,得到每个点的角度。然后,让cos(0)对应p0的y轴值,而cos(PI)对应p1的y轴值。要做到这一点,将调用cos(angle),乘以p1和p0之间距离的一半(图上的ampl)。由于cos(0)=1,而cos(PI)=-1,所以,ampl在p0,而-ampl在p1。将它加上中点坐标,就可以得到想要的y轴值。打开
文件,添加区段长度定义,如下代码:&
#define kHillSegmentWidth&
然后,打开
Terrain.cpp
方法里面, ccDrawLine 之后,添加如下代码:&
ccDrawColor4F(
CCPoint&p0&=&_hillKeyPoints[i&-&
CCPoint&p1&=&_hillKeyPoints[i];
int hSegments&=&floorf((p1.x&-&p0.x)&/&kHillSegmentWidth);
float dx&=&(p1.x&-&p0.x)&/&hS
float da&=&M_PI&/&hS
float ymid&=&(p0.y&+&p1.y)&/&
float ampl&=&(p0.y&-&p1.y)&/&
CCPoint&pt0,&pt1;
0 ;&j&&&hSegments&+&
pt1.x&=&p0.x&+&j&*&
pt1.y&=&ymid&+&ampl&*&cosf(da&*&j);
ccDrawLine(pt0,&pt1);
pt0&=&pt1;
HelloWorldScene.cpp
方法,设置scale为1.0,如下代码:&
this -&setScale(
编译运行,现在可以看到一条曲线连接着山丘,如下图所示:
6.绘制山丘。用上一篇文章生成的条纹纹理来绘制山丘。计划是对山丘的每个区段,计算出两个三角形来渲染山丘,如下图所示:
还将设置每个点的纹理坐标。对于x坐标,简单地除以纹理的宽度(因为纹理重复)。对于y坐标,将山丘的底部映射为0,顶部映射为1,沿着条带的方向分发纹理高度。打开
文件,添加如下代码:&
#define kMaxHillVertices&
#define kMaxBorderVertices&
添加类变量,代码如下:
int _nHillV
cocos2d::CCPoint&_hillVertices[kMaxHillVertices];
cocos2d::CCPoint&_hillTexCoords[kMaxHillVertices];
int _nBorderV
cocos2d::CCPoint&_borderVertices[kMaxBorderVertices];
Terrain.cpp
resetHillVertices
方法里面,最后面添加如下代码:&
if (prevFromKeyPointI&!=&_fromKeyPointI&||&prevToKeyPointI&!=&_toKeyPointI)
//&vertices&for&visible&area
_nHillVertices&=&
_nBorderVertices&=&
CCPoint&p0,&p1,&pt0,&pt1;
p0&=&_hillKeyPoints[_fromKeyPointI];
int i&=&_fromKeyPointI&+&
1 ;&i&&&_toKeyPointI&+&
p1&=&_hillKeyPoints[i];
//&triangle&strip&between&p0&and&p1
int hSegments&=&floorf((p1.x&-&p0.x)&/&kHillSegmentWidth);
float dx&=&(p1.x&-&p0.x)&/&hS
float da&=&M_PI&/&hS
float ymid&=&(p0.y&+&p1.y)&/&
float ampl&=&(p0.y&-&p1.y)&/&
_borderVertices[_nBorderVertices++]&=&pt0;
1 ;&j&&&hSegments&+&
pt1.x&=&p0.x&+&j&*&
pt1.y&=&ymid&+&ampl&*&cosf(da&*&j);
_borderVertices[_nBorderVertices++]&=&pt1;
_hillVertices[_nHillVertices]&=&ccp(pt0.x,&
_hillTexCoords[_nHillVertices++]&=&ccp(pt0.x&/&
_hillVertices[_nHillVertices]&=&ccp(pt1.x,&
_hillTexCoords[_nHillVertices++]&=&ccp(pt1.x&/&
_hillVertices[_nHillVertices]&=&ccp(pt0.x,&pt0.y);
_hillTexCoords[_nHillVertices++]&=&ccp(pt0.x&/&
_hillVertices[_nHillVertices]&=&ccp(pt1.x,&pt1.y);
_hillTexCoords[_nHillVertices++]&=&ccp(pt1.x&/&
pt0&=&pt1;
prevFromKeyPointI&=&_fromKeyPointI;
prevToKeyPointI&=&_toKeyPointI;
这里的大部分代码,跟上面的使用余弦绘制山丘曲线一样。新的部分,是将山丘每个区段的顶点用来填充数组,每个条纹需要4个顶点和4个纹理坐标。在
方法里面,最上面添加如下代码:&
CC_NODE_DRAW_SETUP();
ccGLBindTexture2D(_stripes-&getTexture()-&getName());
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position&|&kCCVertexAttribFlag_TexCoords);
ccDrawColor4F(
glVertexAttribPointer(kCCVertexAttrib_Position,&
2 ,&GL_FLOAT,&GL_FALSE,&
0 ,&_hillVertices);
glVertexAttribPointer(kCCVertexAttrib_TexCoords,&
2 ,&GL_FLOAT,&GL_FALSE,&
0 ,&_hillTexCoords);
glDrawArrays(GL_TRIANGLE_STRIP,&
0 ,&(GLsizei)_nHillVertices);
这里绑定条纹纹理作为渲染纹理来使用,传入之前计算好的顶点数组和纹理坐标数组,然后以 GL_TRIANGLE_STRIP 来绘制这些数组。此外,注释掉绘制山丘直线和曲线的代码。在
方法里面,调用 generateHills 方法之前,添加如下代码:&
this -&setShaderProgram(CCShaderCache::sharedShaderCache()-&programForKey(kCCShader_PositionTexture));
HelloWorldScene.cpp
spriteWithColor1
方法里面,注释 // Layer&4:&Noise 里,更改混合方式,代码如下:&
ccBlendFunc&blendFunc&=&{GL_DST_COLOR,&CC_BLEND_DST};
编译运行,可以看到不错的山丘了,如下图所示:
7.还不完善?仔细看山丘,可能会注意到一些不完善的地方,如下图所示:
增加水平区段数量,可以提高一些质量。打开
文件,修改 kHillSegmentWidth 为如下:&
#define kHillSegmentWidth&
通过减少每个区段的宽度,强制代码生成更多的区段来填充空间。编译运行,可以看到山丘看起来更好了。当然,代价是处理时间。效果如下图所示:
在第二部分,将会实现海豹飞翔。
参考资料:
1.How&To&Create&A&Game&Like&Tiny&Wings&with&Cocos2D&2.X&Part&1
2.(译)如何制作一个类似tiny&wings的游戏:第一部分
非常感谢以上资料,本例子源代码附加资源
如文章存在错误之处,欢迎指出,以便改正。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 tiny wings 安卓版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信