毕业论文-基于cocos2d-x跨平台游戏设计与实现内容摘要:

ion::SimpleAudioEngine::sharedEngine()preloadEffect(sound/big_spaceship_flying. mp3)。 CocosDenshion::SimpleAudioEngine::sharedEngine()preloadEffect(sound/achievement. mp3)。 图 5. 2 主页 11 CocosDenshion::SimpleAudioEngine::sharedEngine()preloadEffect(sound/out_porp. mp3)。 CocosDenshion::SimpleAudioEngine::sharedEngine()preloadEffect(sound/button. mp3)。 CocosDenshion::SimpleAudioEngine::sharedEngine()playBackgroundMusic(sound/game_music. mp3,true)。 ]7[ } 这是做一个检测,可以不添加,但是为了保证代码的健壮性要添加: bool bRet=false。 do { CC_BREAK_IF(!CCLayer::init())。 bRet=true。 } while (0)。 return bRet。 5. 2. 3 游戏主场景 游戏主场景是为添加的数 字方块提供一个层,所有的数字方块都是在这个层上进行添加 . 5. 2. 4 数字方块生成类 本文多次提到 90%的概率生成方块 2, 10%的概率生成方块 4. 具体实现方法如下: //背景层 auto bk=LayerColor::create(Color4B(200, 200, 200, 255),GAME_TILED_WIDTH,GAME_TILED_HEIGHT)。 thisaddChild(bk)。 //数字层 int n=rand()%10。 thism_number=n0?2:4。 auto label=Label::createWithSystemFont(StringUtils::format(%d,thism_number), 宋体 ,40)。 /*labelsetString(StringUtils::format(%d,thism_number))。 12 labelsetScale(4)。 */ labelsetColor(Color3B::RED)。 bkaddChild(label)。 5. 2. 5 数字方块合并类 游戏听过触摸事件,生成数字方块的同时, “触碰到相同的方块 ”,就会合并方块,并让 “触碰超过地方 ”的方块数值增加,让另一数字方块消失 . //初始化 void VisibleRect::lazyInit() { // no lazy init // Useful if we change the resolution in runtime s_visibleRect = Director::getInstance()getOpenGLView()getVisibleRect()。 } //数字方块合并类 Rect VisibleRect::getVisibleRect() { lazyInit()。 return s_visibleRect。 } Vec2 VisibleRect::left() { lazyInit()。 return Vec2(s_visibleRect. origin. x, s_visibleRect. origin. y+s_visibleRect. size. height/2)。 } Vec2 VisibleRect::right() { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width, s_visibleRect. origin. y+s_visibleRect. size. height/2)。 } Vec2 VisibleRect::top() 13 { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width/2, s_visibleRect. origin. y+s_visibleRect. size. height)。 } Vec2 VisibleRect::bottom() { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width/2, s_visibleRect. origin. y)。 } Vec2 VisibleRect::center() { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width/2, s_visibleRect. origin. y+s_visibleRect. size. height/2)。 } Vec2 VisibleRect::leftTop() { lazyInit()。 return Vec2(s_visibleRect. origin. x, s_visibleRect. origin. y+s_visibleRect. size. height)。 } Vec2 VisibleRect::rightTop() { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width, s_visibleRect. origin. y+s_visibleRect. size. height)。 } Vec2 VisibleRect::leftBottom() { lazyInit()。 return s_visibleRect. origin。 } 14 Vec2 VisibleRect::rightBottom() { lazyInit()。 return Vec2(s_visibleRect. origin. x+s_visibleRect. size. width, s_visibleRect. origin. y)。 } 5. 2. 6 得分管理 每次合并消除,就会把当前的分数累加下来,并在游戏主界面上浮一个方块专门用于显示分数 . void GameLayer::initBG() { auto drawNode = DrawNode::create()。 Vec2 points[] = { Vec2(0,0), Vec2(BG_WIDTH_HEIGHT,0), Vec2(BG_WIDTH_HEIGHT,BG_WIDTH_HEIGHT), Vec2(0,BG_WIDTH_HEIGHT) }。 drawNodedrawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(Color4B(200,190,180,255)),1,Color4F(222,190,180,255))。 thisaddChild(drawNode)。 drawNodedrawDot(Vec2::ZERO,4,Color4F(1,0,0,1))。 auto posx = BG_WIDTH_HEIGHT/4。 for (int idx = 0。 idx 4。 idx++) { for (int idy = 0。 idy 4。 idy++) { auto grid = GridItem::createItem(posx)。 gridsetPosition( idx*posx,idy*posx )。 thisaddChild(grid)。 _gridVec[idx][idy] = grid。 } } } bullet 是加到 ccspriteBatchNode 上的, ccspriteBatchNode 是加到 BulletLayer 上面的,ccspriteBatchNode 和 bulletLayer 都是铺满屏幕的 . 所以子弹调用 boundingbox 获得的矩形是以屏幕左下角为原点的 . 敌机的原理也是如此 . hero 是直接加到 herolayer 上的,父节点 15 同样是铺满屏幕的,所以他们的父节点的左下角的坐标都一样的,这就是通过 boundingbox 检测他们是否碰撞的前提 . 有些纹理周围有比较大的空白地方,这就会造成两个节点看起来还没有接触就会发生碰撞,这就需要对碰撞进行更精确的判断,可以通过什么像素判断法之类的 . 我这里采取最简单的处理方法,就是通过节点的 boundingbox 获取到一个 rect,然后对这个 rect 加工一下,这样子可以获取节点 boundingbox 里面的某一部分来作为碰撞的检测部分 . CCRect rectHero = thisheroLayergetHero()boundingBox()。 float x = rectHero. origin. x + rectHero. size. width * 0. 3。 float y = rectHero. origin. y + rectHero. size. height * 0. 4。 float width = rectHero. size. width * 0. 3。 float height = rectHero. size. height * 0. 6。 CCRect rect_HeroForCrash = CCRectMake(x, y, width, height)。 5. 2. 7 触摸事件 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)。 void GameLayer::onTouchEnded(Touch* touch,Event* event) 触摸事件;在次用到了 4 个触摸时间,即向上触摸、向下触摸、向左触摸、向右触摸 . 16 5. 2. 8 游戏结束场景 游戏最后结束需要保存分数并退出,退出界面如图 5. 3 所示 . 图 5. 3 游戏失败页面 //游戏失败判定 bool GameMenuLayer::init() { auto layer = LayerColor::create(Color4B(230,230,0,200))。 thisaddChild(layer)。 auto playmenu = MenuItemLabel::create(Label::create(play, Arial, 60),CC_CALLBACK_1(GameMenuLayer::callFun,this))。 auto resetmenu = MenuItemLabel::create(Label::create(reset, Arial, 60),CC_CALLBACK_1(GameMenuLayer::resetGameFun,this))。 auto menu = Menu::create(playmenu,resetmenu, NULL)。 menualignItemsVertically()。 17 thisaddChild(menu)。 return true。 } //加强游戏健壮性 static GameMenuLayer* _layer = nullptr。 GameMenuLayer* GameMenuLayer::getInstance() { if(!_layer) { _layer = GameMenuLayer::create()。 } return _la。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。