c++游戏别踩白块课程设计

来源:互联网 发布:php教程网源码 编辑:程序博客网 时间:2024/05/22 06:33

摘 要:
别踩白块儿游戏是一款非常好玩的游戏。游戏课程设计提供了游戏的说明,设计者的简介,游戏功能的实现。游戏中实现音效,动画。
关键词:音乐,动画,功能
一、概述
《别踩白块儿 Don’t Tap The WhiteTile》是由 Umoni Studio (Umoni Entertainment Limited 的前身) “制作的一款休闲益智游戏。游戏于2014年4月16日上线App Store。并在全球40多个国家、地区免费游戏榜登顶榜首 ,超过一百个国家或地区排名前十,5月份荣登全球游戏下载总榜(iOS + Android)第一宝座,游戏上线3个月累计下载达1亿 。
《别踩白块儿 Don’t Tap The White Tile》是一款非常耐玩的休闲益智游戏,别踩白块儿,这就是这个游戏唯一的一个规则。游戏简单易上手,这个游戏唯一的一个规则,我们只需要不断踩着黑色方块前进即可,很简单吧?谁都可以会玩,但并不是谁都能玩得很好噢,你呢?快来挑战看看吧!
点击运行游戏进入游戏的主界面,这时你就会听到游戏开始的欢快音乐。主界面有设置按钮,退出游戏按钮,play按钮,关于游戏按钮。点击play按钮开始玩游戏,玩游戏的时候你会听到另一首音乐,伴随着游戏的进行,设置了计时,可以检验你玩游戏的厉害程度哦!点击关于我们会出来我们课设的组成员以及分工;关于游戏是有关游戏的说明。
二、目录
1)主界面
1开始按钮,结束按钮,游戏设置按钮
2动画
2)游戏设置界面
音效按钮,音乐按钮,新手教程按钮,关于我们按钮
3)新手教程
4)关于我们
5)音乐背景
6)游戏开始代码
7)黑白块代码
8)游戏计时代码
三、游戏代码详解
1)主界面
1开始按钮,结束按钮,游戏设置按钮
在cocostudio上制作场景界面
搜集一张别踩百块的背景图,用ps制作一张你想要的开始按钮,结束按钮,游戏设置按钮的图片,以及别踩百块四个字
代码如下:

//添加设置界面点击    btnOption = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(SysMenu), "btnOption"));    btnOption->addTouchEventListener(CC_CALLBACK_2(GameMenu::showOption, this));    //开始按钮    start = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(SysMenu), "btnStart"));    start->addTouchEventListener(CC_CALLBACK_2(GameMenu::showStart, this));    void GameMenu::showOption(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {        auto menusetting = GameSetting::create();        addChild(menusetting);    }}void GameMenu::showStart(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {        auto menusetting = GameStart::create();        addChild(menusetting);    }}

这里写图片描述
○2动画
用cocostudio使别踩百块四个字动起来
代码如下:

 //设置主界面以及其动画    auto SysMenu = CSLoader::createNode("menu.csb");    addChild(SysMenu);    //别踩白块动态    auto aniEnterGame = CSLoader::createTimeline("menu.csb");    SysMenu->runAction(aniEnterGame);    aniEnterGame->gotoFrameAndPlay(0, 60,false);

2)游戏设置界面
○1音效按钮,音乐按钮,新手教程按钮,关于我们按钮

size = Director::getInstance()->getVisibleSize();    menuSetting = CSLoader::createNode("menuSetting.csb");    addChild(menuSetting);    //设置    menuSetting->setAnchorPoint(Vec2(0.5, 0.5));//位置(锚点)    menuSetting->setPosition(Vec2(-200,size.height/2));    auto show = MoveTo::create(0.5, size / 2);    menuSetting->runAction(EaseBackInOut::create(show));//音乐播放按钮btnSound = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnSound"));//音乐音效按钮busing = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "busing"));//音乐按钮    //关闭按钮btnClose = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnClose"));    btnClose->addTouchEventListener(CC_CALLBACK_2(GameSetting::close, this));    //游戏介绍按钮btnLesson = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnLesson"));    btnLesson->addTouchEventListener(CC_CALLBACK_2(GameSetting::showLesson, this));    //游戏关于我们btnus = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnus"));    btnus->addTouchEventListener(CC_CALLBACK_2(GameSetting::showUs, this));void GameSetting::close(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {        auto leave = MoveTo::create(0.5, Vec2(size.width + 300, size.height / 2));auto seq = Sequence::create(leave, CallFuncN::create(CC_CALLBACK_1(GameSetting::removeSetting, this)), nullptr);        runAction(EaseBackInOut::create(seq));    }}void GameSetting::toggleSound(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {    }}void GameSetting::toggleBusing(Ref *pSender, Widget::TouchEventType type) {//切换背景音乐,播放,暂停    if (type == Widget::TouchEventType::ENDED)     {bool isPlayBusing = UserDefault::getInstance()->getBoolForKey("isPlayBusing", true);//正在播放音乐    if (!isPlayBusing)//播放    {SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Pianoboy - The Truth That You Leave.mp3",true);    UserDefault::getInstance()->getBoolForKey("isPlayBusing", true);//存储记录    }    else//暂停{    SimpleAudioEngine::getInstance()->stopBackgroundMusic();    //数据存储UserDefault::getInstance()->getBoolForKey("isPlayBusing", false);//停止音乐    }    }}void GameSetting::removeSetting(Ref *pSender) {        removeFromParentAndCleanup(true);}void GameSetting::showLesson(Ref *pSender, Widget::TouchEventType type) {        if (type == Widget::TouchEventType::ENDED) {        auto menusetting = GameIntroduce::create();        addChild(menusetting);    }}

这里写图片描述
3)新手教程

size = Director::getInstance()->getVisibleSize();    menuSetting = CSLoader::createNode("gameIntroduce.csb");    addChild(menuSetting);    //设置    menuSetting->setAnchorPoint(Vec2(0.5, 0.5));//位置(锚点)    menuSetting->setPosition(Vec2(-200, size.height / 2));    auto show = MoveTo::create(0.5, size / 2);    menuSetting->runAction(EaseBackInOut::create(show));    //关闭按钮btnClose = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnclose"));    btnClose->addTouchEventListener(CC_CALLBACK_2(GameIntroduce::close, this));void GameIntroduce::close(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {        auto leave = MoveTo::create(0.5, Vec2(size.width + 300, size.height / 2));auto seq = Sequence::create(leave, CallFuncN::create(CC_CALLBACK_1(GameIntroduce::removeSetting, this)), nullptr);        runAction(EaseBackInOut::create(seq));        }}void GameIntroduce::removeSetting(Ref *pSender) {        removeFromParentAndCleanup(true);}

这里写图片描述
4)关于我们

size = Director::getInstance()->getVisibleSize();    menuSetting = CSLoader::createNode("aboutus.csb");    addChild(menuSetting);    //设置    menuSetting->setAnchorPoint(Vec2(0.5, 0.5));//位置(锚点)    menuSetting->setPosition(Vec2(-200, size.height / 2));    auto show = MoveTo::create(0.5, size / 2);    menuSetting->runAction(EaseBackInOut::create(show));        //关闭按钮btnClose = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>(menuSetting), "btnclose1"));    btnClose->addTouchEventListener(CC_CALLBACK_2(AboutUs::close, this));void AboutUs::close(Ref *pSender, Widget::TouchEventType type) {    if (type == Widget::TouchEventType::ENDED) {        auto leave = MoveTo::create(0.5, Vec2(size.width + 300, size.height / 2));auto seq = Sequence::create(leave, CallFuncN::create(CC_CALLBACK_1(AboutUs::removeSetting, this)), nullptr);        runAction(EaseBackInOut::create(seq));        }}void AboutUs::removeSetting(Ref *pSender) {        removeFromParentAndCleanup(true);}

5)音乐背景

//音乐背景          bool isPlayBusing = UserDefault::getInstance()->getBoolForKey("isPlayBusing");          if (isPlayBusing) {         SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Pianoboy -            The Truth That You Leave.mp3", true);//默认播放背景音乐            }           //音乐播放按钮         btnSound=static_cast<Button*>(Helper::seekWidgetByName(static_cast<Layout*>         (menuSetting),"btnSound"));//音乐音效按钮         busing = static_cast<Button *>(Helper::seekWidgetByName(static_cast<Layout *>        (menuSetting),  "busing"));//音乐按钮        void GameSetting::toggleBusing(Ref *pSender, Widget::TouchEventType type) {//切换背景音乐,   播放,暂停        if (type == Widget::TouchEventType::ENDED) {        bool isPlayBusing = UserDefault::getInstance()->getBoolForKey("isPlayBusing", true);         //正在播放音乐        if (!isPlayBusing)//播放{            SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/music.mp3",true);            busing->loadTextureNormal("sing.png", TextureResType::PLIST);//正常状态            busing->loadTextureNormal("sing.png", TextureResType::PLIST);//点击时候的状态            UserDefault::getInstance()->getBoolForKey("isPlayBusing", true);//存储记录        }        else{//暂停            SimpleAudioEngine::getInstance()->stopBackgroundMusic();            busing->loadTextureNormal("jie.png", TextureResType::PLIST);//正常状态            busing->loadTextureNormal("jie.png", TextureResType::PLIST);//点击时候的状态            //数据存储            UserDefault::getInstance()->getBoolForKey("isPlayBusing", false);//停止音乐        }       }}

6)游戏开始代码

 //开始游戏          void GameStart::startGame(){             linesCount = 0;            showEnd = false;            timeRunning = false;            addStartLine();            addNormalLine(1);            addNormalLine(2);            addNormalLine(3);}//添加开始的黄色栏void GameStart::addStartLine(){            auto b = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,             visibleSize.height/ 4), "", 10, Color4B::BLACK);            gameLayer->addChild(b);            b->setLineIndex(0);}//添加结束的绿色栏,占满屏幕void GameStart::addEndLine(){        auto b = Block::createWithArgs(Color3B::GREEN, visibleSize, "Game Over", 30, Color4B::BLACK);        gameLayer->addChild(b);        b->setLineIndex(4);}

这里写图片描述
7)黑白块代码

//添加普通的黑白块栏void GameStart::addNormalLine(int lineIndex){            linesCount++;            Block *b;            int blackIndex = rand() % 4;            for (int i = 0; i<4; i++){             b = Block::createWithArgs(blackIndex == i ? Color3B::BLACK : Color3B::WHITE, Size(visibleSize.width / 4 - 1, visibleSize.height / 4 - 1), "", 20, Color4B::BLACK);            b->setPosition(i*visibleSize.width / 4, lineIndex*visibleSize.height / 4);            b->setLineIndex(lineIndex);            gameLayer->addChild(b);    }}//方块下移void GameStart::moveDown(){            if (linesCount<30){                addNormalLine(4);            }            else if (!showEnd){                addEndLine();                showEnd = true;            }            auto bs = Block::getBlocks();            for (auto it = bs->begin(); it != bs->end(); it++){                (*it)->moveDowm();            }}void GameStart::update(float dt){            long offset = clock() - startTime;            timerLabel->setString(StringUtils::format("%g", ((double)offset) / 1000));}

8)游戏计时代码

//开始计时void GameStart::startTimer(){            if (!timeRunning){            scheduleUpdate();            startTime = clock();            timeRunning = true;        }}//结束计时void GameStart::stopTimer(){            if (timeRunning){                unscheduleUpdate();                timeRunning = false;            }}

这里写图片描述
这里写图片描述
五、待完成
我们的游戏仍然存在许多不足,有许多未实现的功能,例如:
1)游戏代码块不能自己向下移动
2)游戏的设置界面中的音乐,点击关闭后不能重新打开
3)缺少暂停游戏,保存游戏分数
六、结束语
课程设计是一次非常珍贵的机会,这是一次可以让我们所学的理论与实际相结合的机会。我们选择了别踩白块一题目。通过这次一个程序的设计,我走出了纯理论的学习,从一种全新的角度去学习。并且在小团队实现的游戏过程中,除去知识的大量更新,我学到了很多东西。
其实个人而言,我体会较深的一点是团队互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。
由于没有深入接触C++,因而一开始对进行别踩白块这个课程设计这一还算陌生的领域感到有些吃力。尽管在同组的同学没有很强的C++实力,在进行编程的过程中,我们相互学习,探讨和查阅资料,学习到了很多知识,交流中也得到比书本上更多的知识。在自己琢磨游戏各种陌生知识的时候,队友们都很有耐心,充满了对知识的渴求。我们在交流中,迸发出了很多设计灵感,互相建议改进的过程中,我们分别从各个方面共同改进着,这个已经不能仅仅称作课程设计的作品。
从知识获得方面来说,各种已经学习到的C++知识以及各种从网上搜索来的案例,我们都是随着设计的不断深入而不断熟悉的。和同学的沟通交流更使我对程序整体的规划与设计有了新的认识,也对自己提出了新的要求。提高是有限的但提高也是全面的。正是这一次设计让我积累了许多实际经验。也必然会让我在未来的工作学习中表现出更高的耐力、理解力、实践力。本次课程设计给了我很大的信心,但是也为我指出很多不足的地方。学习其实就是一个不断完善的过程,正视自己的不足之处。在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断地完善自己。
课程设计就要这样画上一个句号了。尽管我们的作品还有待改善,但从中得到了我获得了知识,学到了研究的坚持与韧性,这不仅仅是交出了一份作业,还对自己有了新的认识,实在是难得的机遇与经历。
参考资料
[1]《cocos2d-x 3.x游戏开发之旅》电子工业出版社
[2]http://baike.so.com/doc/7371321-7638970.html
[3]《cocos2d-x游戏开发实战精解》清华大学出版社
[4] 极客学院中《黄金矿山》

0 0
原创粉丝点击