Cocos2d-x的学习之旅(七)更新函数Update

Cocos2d-x的学习之旅(七)更新函数Update,第1张

概述声明 本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey ,461679592。 端午节,周一不上班!!今天要写两篇博文。原因很简单上周才出了一篇。实在惭愧,周六日出去嗨了~~  今天我们要讲的是更新函数,什么是更新函数?Code

声明

本教程仅用于初学cocos2dx同学使用,内容由本人(Code-Man)编写,此教程使用cocos2dx版本为3.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。QQ群:Cocos2d-CodeMonkey,461679592

端午节,周一不上班!!今天要写两篇博文。原因很简单上周才出了一篇。实在惭愧,周六日出去嗨了~~

今天我们要讲的是更新函数,什么是更新函数?Code-Man的介绍是:“死循环”。可是为什么我们游戏需要存在死循环呢?其实每个游戏引擎都必须有这个一个东西,在我们创建出一个HelloWorld的时候,其实就已经存在着一个“死循环”了,只是你没感觉到。

还记得我们之前介绍HelloWorld界面左下角的那几个英文其中一项就是指:每一个帧所处理的顶点数吗?每一帧执行,也就是说。1/60s=0.016666/s,约等于0.0167秒执行一次那个更新函数。

为什么要存在?你试想一下游戏无非就是图片的不断渲染,图片的各种形变各种运动,才使得我们觉得它动起来了。或者说,一个微信版的打飞机,如果没有一个“死循环”那游戏顶部的飞机要如何重复产生?我只有不断循环一个产生飞机的函数即可生成出各种飞机。

更新函数的种类:

1:scheduleUpdate(); 默认执行目标为update(float dt),默认无限循环,默认每一帧执行一次,默认无等待时间。

2.[1]:schedule("更新目标"); 自定义更新目标,其他为默认。

2.[2]:schedule("更新目标",“更新时间f”); 自定义更新目标,自定义每一帧的更新函数,其余为默认。

2.[3]:schedule("更新目标","更新时间","更新次数",“更新等待时间”); 一切为自定义。

3:scheduleOnce("更新目标","更新等待时间"); 等待多少秒后,执行一次自定义函数。

暂停函数:有执行就有暂停

1.unscheduleUpdate(); //与scheduleUpdate()是一对,默认停止目标update(float dt);

2.unschedule("更新目标") //与上面的2的三种类型对应。参数为要停止目标更新函数。


@H_403_113@示例:


素材:


我选了三个最有代表性的来做,其余两个Monkey们可以自己尝试。


我们让黄色球每一帧X轴+7,绿色球等待2秒后每一秒中X轴+100,蓝色球等待两秒后透明度设置为150。



效果图:


总结:调度器是我们游戏开发过程中经常会使用的东西,所有一定要熟练掌握。提醒,在能不用调度器的情况下就不要用,如果不是必要永远存在,用完一定要关闭。调度器既然是一个"死循环"那必定会存在比较大的性能消耗。所有一定要谨慎的使用这东西。

////  LessonSevenScene.cpp//  MyCppGame////  Created by He_bi on 15/6/17.////#include "LessonSevenScene.h"//这个函数在此次不累赘、越往后面,对于前面的知识不会做无谓的讲解。//忘记的可以复习前面的只是Scene* LessonSevenScene::createScene(){    auto Myscene=Scene::create();        auto MyLayer=LessonSevenScene::create();        Myscene->addChild(MyLayer);        return Myscene;}bool LessonSevenScene::init(){    if (!Layer::init()) {        return false;    }        WinSize=Director::getInstance()->getVisibleSize();    //背景    auto bg=Sprite::create("LessonOne_Bg.png");    bg->setposition(WinSize/2);    this->addChild(bg);            //黄色球     yellowBall=Sprite::create("ball_1001.png");    yellowBall->setposition(yellowBall->getContentSize().wIDth/2,WinSize.height/3/2);    this->addChild(yellowBall);            //绿色球     greenBall=Sprite::create("ball_1002.png");    greenBall->setposition(greenBall->getContentSize().wIDth/2,WinSize.height/3/2*3);    this->addChild(greenBall);        //蓝色球     blueBall=Sprite::create("ball_1003.png");    blueBall->setposition(blueBall->getContentSize().wIDth/2,WinSize.height/3/2*5);    this->addChild(blueBall);        //第一种更新函数(也叫调度器),每一帧执行一次    this->scheduleUpdate();        //第二种更新函数(也叫调度器),每1秒执行一次,无限循环,等待2秒后执行    this->schedule(schedule_selector(LessonSevenScene::myUpData1),1,-1,2);        //第三种更新函数(也叫调度器),三秒后执行一次    this->scheduleOnce(schedule_selector(LessonSevenScene::myUpData2),3);            //停止按钮    auto stopUpdatebutton=MenuItemFont::create("停止默认更新",[&](Ref*){        //停止默认的更新函数        this->unscheduleUpdate();    });    stopUpdatebutton->setposition(WinSize.wIDth/2-100,stopUpdatebutton->getContentSize().height/2);            //停止按钮    auto stopUpData1button=MenuItemFont::create("停止自定义更新",[&](Ref*obj){        //停止自定义的更新函数        this->unschedule(schedule_selector(LessonSevenScene::myUpData1));    });    stopUpData1button->setposition(WinSize.wIDth/2+100,stopUpData1button->getContentSize().height/2);        //按钮菜单    auto men=Menu::create(stopUpdatebutton,stopUpData1button,NulL);    men->setposition(Vec2::ZERO);    this->addChild(men);        return true;}voID LessonSevenScene::update(float dt){        //每帧X轴前进7个像素    if (yellowBall->getpositionX()<WinSize.wIDth+yellowBall->getContentSize().wIDth/2) {        yellowBall->setpositionX(yellowBall->getpositionX()+7);    }else{        yellowBall->setpositionX(-yellowBall->getContentSize().wIDth/2);    }}voID LessonSevenScene::myUpData1(float d){        //等待2秒后,每秒X轴前进100个像素    if (greenBall->getpositionX()<WinSize.wIDth+greenBall->getContentSize().wIDth/2) {        greenBall->setpositionX(greenBall->getpositionX()+100);    }else{        greenBall->setpositionX(-greenBall->getContentSize().wIDth/2);    }}voID LessonSevenScene::myUpData2(float d){        //等待2秒后,设置透明度为150    blueBall->setopacity(150);}
本节课Demo素材:http://pan.baidu.com/s/1hlsdg 总结

以上是内存溢出为你收集整理的Cocos2d-x的学习之旅(七)更新函数Update全部内容,希望文章能够帮你解决Cocos2d-x的学习之旅(七)更新函数Update所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存