日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4.帧循环(游戏主循环),schedule

發布時間:2024/9/27 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.帧循环(游戏主循环),schedule 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1 概述

游戲乃至圖形界面的本質是不斷地繪圖,然而繪圖并不是隨意的,任何游戲都需要遵循一定的規則來呈現出來,這些規則就體現為游戲邏輯。游戲邏輯會控制游戲內容,使其根據用戶輸入和時間流逝而改變。因此,游戲可以抽象為不斷地重復。

2 以下動作:

A 處理用戶輸入

B 處理定時事件

C 繪圖

游戲主循環就是這樣的一個循環,它會反復執行以上動作,保持游戲進行下去,直到玩家退出游戲。

CCDirector::mainLoop()方法,這個方法負責調動定時器,繪圖,發送全局通知,并處理內存回收池。該方法按幀調用,每幀調用一次,而幀間間隔取決于兩個因素,一個是預設的幀率,默認為60幀每秒:另一個是每幀的計算大小。當邏輯處理與繪圖計算過大時,設備無法完成每秒60次繪制,此時幀率就會降低。

3 實現

mainLoop()方法是定義在CCDirector中的抽象方法,它的實現位于同一個文件中的CCDisplayLinkDirector類。代碼如下:

上述代碼主要包含如下3個步驟。

判斷是否需要釋放CCDirector,如果需要,則刪除CCDirector占用的資源,通常,游戲結束時才會執行這個步驟。

調用drawScene()發方法,繪制當前場景并進行其他必要的處理。

彈出自動回收池,使得這一幀被放入自動回收池的對象全部釋放。

?

在主循環中drawScene(),主要進行3個操作:

調用了定時調度器的update方法,引發定時器事件。

如果場景需要被切換,則調用setNextStage方法,在顯示場景前切換場景。

調用當前場景的visit方法,繪制當前場景。

4 定時器

Schedule.h

#ifndef __Schedule_H__

#define __Schedule_H__

?

#include "cocos2d.h"

USING_NS_CC;

class Schedule :public CCLayer {

public:

??? static CCScene * scene();

??? CREATE_FUNC(Schedule);

??? bool init();

?

??? void update(float) override;

?

??? void mySchedule(float dt);

};

?

#endif

Schedule.cpp

#include "Schedule.h"

#include "AppMacros.h"

?

CCScene *Schedule::scene()

{

??? CCScene * scene = CCScene::create();

??? Schedule * layer = Schedule::create();

??? scene->addChild(layer);

??? return scene;

}

?

bool Schedule::init()

{

??? CCLayer::init();

??? //scheduleUpdate();

??? //unscheduleUpdate();

?

??? //scheduleOnce(schedule_selector(Schedule::mySchedule), 2);

??? schedule(schedule_selector(Schedule::mySchedule));

??? //功能等同scheduleUpdate();回調函數可以自定義

??? //schedule(schedule_selector(Schedule::mySchedule), 3);

??? //CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);

??? //schedule(schedule_selector(Schedule::mySchedule),1,10,4);

??? //4s以后,每隔1s執行一次回調,共執行10

?

??? CCSprite * spr = CCSprite::create("p_2_01.png");

??? spr->setPosition(ccp(100,winSize.height / 2));

??? addChild(spr);

??? spr->setTag(100);

?

??? //CCMoveBy * by = CCMoveBy::create(2, ccp(300, 0));

??? //CCMoveBy * by1 = (CCMoveBy *)by->reverse();

??? //CCSequence *seq = CCSequence::create(by, by1, NULL);

??? //spr->runAction(CCRepeatForever::create(seq));

?

??? return true;

}

?

void Schedule::update(float dt)

{

??? CCLOG("dt = %g",dt);

??? static int i = 0;

??? i++;

??? if (i == 120)

??? {

??????? //結束定時器

??????? unscheduleUpdate();

??????? CCLog("schedule is over");

??? }

}

?

void Schedule::mySchedule(float dt) {

??? CCSprite * spr = (CCSprite *)getChildByTag(100);

??? float v = 300 / 2;

?

??? static int count = 0;

??? count++;

?

??? static bool flag = true;

??? if (flag)

??? {

??????? if ((spr->getPositionX() + v*dt) < 400)

??????? {

??????????? spr->setPositionX(spr->getPositionX() + v*dt);

??????? }

??????? else

??????? {

??????????? flag = !flag;

??????? }

??? }

??? if (!flag)

??? {

??????? if ((spr->getPositionX() - v*dt) > 100)

??????? {

??????????? spr->setPositionX(spr->getPositionX() - v*dt);

??????? }

??????? else

??????? {

??????????? flag = !flag;

??????? }

??? }

?

??? if (count == 1000)

??? {

??????? unschedule(schedule_selector(Schedule::mySchedule));

??? }

}

運行結果:

?

5 定時器Schedule

A 幀循環定時器

scheduleUpdate();//幀循環定時器,每一幀都會被調動,對實時性要求非常高的,比如碰撞檢測

void update(float delta);

unscheduleUpdate();//關閉定時器

B 一次性定時器

參數解析:

scheduleOnce(SEL_SCHEDULE selector, float delay)

//第一個參數表示要回調的函數,第二個參數表示延時

typedef void (CCObject::*SEL_SCHEDULE)(float);

#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR);

scheduleOnce (schedule_selector(Schedule::updateOnce),2);

void updateOnce(float delta);

?

C 自定義定時器

自定義定時器有3個重載函數,底層都默認調用了scheduleSelector,它的幾個參數分別表示,scheduleSelector回調函數,interval時間間隔,repeat重復次數,delay延時執行。

void CCNode::schedule(SEL_SCHEDULE selector) {

this->schedule(selector, 0.0f, kCCRepeatForever, 0.0f);

}

?

/本質同scheduleUpdate 但是可以自己寫回調函數

void CCNode::schedule(SEL_SCHEDULE selector, float interval) {

this->schedule(selector, interval, kCCRepeatForever, 0.0f);

}

?

void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay){

m_pScheduler->scheduleSelector(selector, this, interval , repeat,delay, !m_bRunning);

}

?

D 定時器停止

void CCNode::unschedule(SEL_SCHEDULE selector);

void CCNode::unscheduleAllSelectors();

注意:多個定時器,可并存,可彼此開始與停止。

?

?

?

?

?

?

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的4.帧循环(游戏主循环),schedule的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品无码天天爽视频 | 亚洲欧美系列 | 欧美日韩在线免费观看视频 | 日韩av色图| 少妇精品久久久一区二区三区 | 国产精品久久久久久久成人午夜 | 又黄又爽的视频在线观看 | 色伊人 | 国产精品福利一区二区三区 | 狠狠躁夜夜躁 | 女同亚洲精品一区二区三 | 久操操| 草啪啪| 五月婷婷六月综合 | av导航大全| 亚洲黄色中文字幕 | 手机av在线播放 | 黄色污小说 | 青娱乐99 | 日本不卡一区在线观看 | 欧美日韩在线免费视频 | 黄色在线a| 国内精品国产成人国产三级 | 亚洲熟妇av一区二区三区漫画 | 久久综合第一页 | 男人的天堂免费 | 自拍偷拍亚洲欧美 | 一区二区福利电影 | 999国产在线 | 日韩激情国产 | 丁香婷婷综合激情 | 亚洲国产欧美在线观看 | 国产精品久久久久野外 | 中文视频在线观看 | 日本人性爱视频 | 亚洲激情短视频 | 国产精品久久久久999 | 日韩免费黄色 | 女人扒开屁股让我添 | 在线视频 91| av日韩一区| 久热在线| 毛片2| 一区二区在线免费观看 | 一级成人免费视频 | 久草热在线视频 | 麻豆久久久 | 国产精品高潮呻吟久久av黑人 | 国产一级片视频 | 亚洲激情中文 | 亚洲成人精品在线播放 | 一个人在线观看www软件 | 欧美在线天堂 | 午夜在线一区二区 | 日韩三级不卡 | 国产精品一区二区三区免费视频 | 国产伦一区二区 | 少妇荡乳情欲办公室456视频 | 丝袜av网站 | 狠狠影院| 天天射一射 | 日本高清不卡在线观看 | 婷婷国产成人精品视频 | 亚洲综合欧美 | 日韩在线你懂的 | 亚洲精品成人av | 亚洲图片小说视频 | 亚洲国产精品成人va在线观看 | 亚洲精品国产精品国自产 | 久久99精品久久久久久水蜜桃 | 国产学生美女无遮拦高潮视频 | 日本韩国在线播放 | 激情伊人网 | 欧美 日韩 人妻 高清 中文 | 欧美暧暧视频 | 精品国产91久久久久久 | 精品国产69 | 亚洲黄色成人 | 欧美91在线| 欧美a级片视频 | 91超碰在线播放 | 亚洲精品一区二 | 日韩不卡视频在线观看 | 大乳女喂男人吃奶视频 | 无码国产精品高潮久久99 | wwwav网站| 日本少妇一区 | 香蕉伊思人视频 | 网站免费视频www | 五月在线 | 精品国产aⅴ麻豆 | 亚洲乱熟女一区二区 | 美女脱得一干二净 | 精品aaa | 国产视频二区三区 | 国产精品久久久久999 | 亚洲欧洲av | 国产免费一区二区三区网站免费 | 在线精品视频播放 |