1. 程式人生 > >Phaserjs基礎教程第七節:Time和Timer物件

Phaserjs基礎教程第七節:Time和Timer物件

大家都是程式設計師,Time和Timer之間的不同肯定是知道的,不過我還是要再重複一遍,在Phaserjs中,Time(Phaser.Time)是時間物件,而Timer(Phaser.Timer)則是定時器物件。

       在Phaserjs中,Time物件雖然都是用來表示時間,可是卻可以細分為三類用途:

       遊戲時間(Game time):與現實時間執行速度相同的時間,和壁鐘時間不同的是,當遊戲停止時,時間也會停止。遊戲時間被應用在定時器Phaser.Timer中;

       物理時間(Physics time):代表了物理引擎計算的時間,比如使用慢鏡頭等操作時就是這類時間。物理時間經常被物理引擎計算和tween動畫中。

       壁鐘時間(Wall-clock time):代表了兩個事件在現實時間中持續時間,獨立於遊戲並且持續執行,無論遊戲是否停止。

       我們這節主要講的其實是第一類:遊戲時間,也就是timer定時器,為什麼要用到定時器,大家想象一下雷電這個遊戲:遊戲視窗上方一直在向下掉隕石等物體,那麼它們的出現時間是怎麼控制的?如果有了定時器,是不是就感覺簡單多了,檢視下面的程式碼:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, render: render });

function preload() {
    game.load.image('bisley', 'assets/pics/alex-bisleys_horsy_5.png');
}

var picture;
var counter = 0;
var text = 0;
function create() {
    game.stage.backgroundColor = '#6688ee';

    picture = game.add.sprite(100, 150, 'bisley');
    picture.scale.set(0.5);
    picture.anchor.setTo(0.5, 0.5);

	//延時執行
    game.time.events.add(Phaser.Timer.SECOND * 4, fadePicture, this);
    game.time.events.add(Phaser.Timer.SECOND * 8, fadePicture2, this);
    //重複執行(重複十次)
    game.time.events.repeat(Phaser.Timer.SECOND * 2, 10, createBall, this);
    
    //新增一行文字,顯示和
    text = game.add.text(32, 360, 'Counter: 0', { font: "64px Arial", fill: "#ffffff", align: "center" });
    text.anchor.setTo(0, 0.5);
    //迴圈執行
    game.time.events.loop(Phaser.Timer.SECOND, updateCounter, this);
}
function createBall() {
    //隨機位置新增新的物件
    var bisley2 = game.add.sprite(game.rnd.integerInRange(300, 800), game.world.randomY, 'bisley');
    bisley2.scale.set(0.2);
}
function fadePicture() {
    game.add.tween(picture).to( { alpha: 0 }, 2000, Phaser.Easing.Linear.None, true);
}
function fadePicture2() {
    game.add.tween(picture).to( { alpha: 1 }, 2000, Phaser.Easing.Linear.None, true);
}
function updateCounter() {
    counter++;
    text.setText('Counter: ' + counter);
}
function render() {
    game.debug.text("Time until event: " + game.time.events.duration, 32, 32);
    game.debug.text("Time until event: " + game.time.events.duration.toFixed(0), 32, 432);
    game.debug.text("Next tick: " + game.time.events.next.toFixed(0), 32, 464);
}

       這個例子中,包含了定時器的三種方式:add(執行一次)、repeat(重複一定次數)、loop(迴圈執行),雖然三種方式的操作沒有互相影響,但是game.time.events.duration這個物件確實以最後一次定義的一秒為單位的,而實際上,如果不加迴圈執行的話,它應該是以2秒為單位,如果也沒有重複,那麼單位就會變成4秒。也就是說,game.time.events.duration總是以最新的定時器為準。

       當我們用定時器定時了一個任務,在等待執行的過程中可能會碰到各種問題或需求要暫停執行或者銷燬,這些,就需要相對應的其他方法了,檢視程式碼:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, render: render });

function preload() {
    game.load.image('bisley', 'assets/pics/alex-bisleys_horsy_5.png');
}

var timer;
var counter = 0;
var text = 0;
function create() {
    game.stage.backgroundColor = '#6688ee';

    //新增一行文字,顯示和
    text = game.add.text(32, 132, 'Counter: 0', { font: "64px Arial", fill: "#ffffff", align: "center" });
    text.anchor.setTo(0, 0.5);
    //建立一個定時器,迴圈執行
    timer = game.time.create(true);
    timer.loop(2000, updateCounter, this);
    timer.start();
    console.log(timer);
    
    //暫停/繼續
    key_pause = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
    key_pause.onDown.add(funcPause, this);
	//停止
    keyStop = game.input.keyboard.addKey(Phaser.Keyboard.ESC);
    keyStop.onDown.add(funcStop, this);
    //開始
    keyStart = game.input.keyboard.addKey(Phaser.Keyboard.ENTER);
    keyStart.onDown.add(funcStart, this);
}
function updateCounter() {
    counter++;
    text.setText('Counter: ' + counter); 
    if(counter > 20){
    	timer.destroy();
    }
}
function funcPause(){
	if(timer.paused){
		timer.resume();
	}
	else{
		timer.pause();
	}
}
function funcStop(){
	timer.stop();
}
function funcStart(){
	timer.start();
}
function render() {
    game.debug.text("Time until event: " + timer.duration, 32, 32);
    game.debug.text("Next tick: " + timer.next.toFixed(0), 32, 64);
}

       這段程式碼中,實現了定時器的啟動、暫停、繼續、停止、銷燬等操作,和之前的動畫音訊視訊不一樣,當timer停止之後,就不能再次啟動了,也就是,start()方法就無效了,不信你可以試一下。

 怎麼樣?Phaserjs的定時器是不是很簡單,這一節就先到這裡,下一節我們來學習下Weapon物件的使用。

相關推薦

Phaserjs基礎教程TimeTimer物件

大家都是程式設計師,Time和Timer之間的不同肯定是知道的,不過我還是要再重複一遍,在Phaserjs中,Time(Phaser.Time)是時間物件,而Timer(Phaser.Timer)則是定時器物件。       在Phaserjs中,Time物件雖然都是用來表示

Scala 程式設計—物件(二)

前言:         類和物件第二節,主要介紹:單例物件、伴生物件與伴生類、apply方法、抽象類 1.單例物件 Java語言中,如果想直接使用類名點的方式呼叫方法或屬性,直接用static修飾即可。但Scala語言不支援靜態成員,而提供了object物件,這

NeHe OpenGL教程 光照鍵盤 程式碼

#include <windows.h> // Windows的標頭檔案 #include <glew.h> // 包含最新的gl.h,glu.h庫 #include <glut.h> // 包含OpenGL實用庫 #include <stdio.h

Scala入門到精通——物件(二)

本節主要內容 單例物件 伴生物件與伴生類 apply方法 應用程式物件 抽象類 單例物件 在某些應用場景下,我們可能不需要建立物件,而是想直接呼叫方法,但是Scala語言並不支援靜態成員,Scala通過單例物件來解決該問題。單例物件的建立方式如下:

建立裏程碑

blog pos wid div 9.png post nbsp image inf 第七節:建立裏程碑

手動安裝K8snode節點部署-kube-proxy

docker k8s kubernetes 容器 部署Kubernetes Proxy vim CentOS-Base.repo [base]name=CentOS-$releasever - Base#mirrorlist=http://mirrorlist.centos.org/?rele

SEO自學網體系教程怎麼發外鏈

  SEO自學體系教程系列裡,介紹過一篇和發外鏈相關的文章,是以東昱畫室為例,介紹了一些發外鏈的平臺以及如何檢視競爭對手在哪些平臺發了外鏈(這也是我們發外鏈的一個好辦法,看看別人都在哪發了外鏈,我們就也在哪發)   這篇文章更系統的介紹如何發外鏈,也許以後會有很

SEO自學網體系教程如何檢查自己網站的SEO做的是否到位

    如何檢查自己網站和別人網站SEO做的是否夠好,當然,之總結了一部分,像網站是否是.com / .cn域名,優化文章怎麼發這類零散的知識, 在本站其他文章裡也有詳細的介紹,就不在這裡說了。     一.目標關鍵詞的選擇

nginx教程ngx_http_core_module模組提供的變數

在記錄access_log訪問日誌檔案時, 可以使用ngx_http_core_module模組處理請求時所產 生的豐富的變數, 當然, 這些變數還可以用於其他HTTP模組。 例如: 當URI中的某個

框架搭建之頁面靜態化的剖析

1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" conten

Akka併發程式設計——Actor模型(六)

主要內容: 1. Typed Actor定義 2. Typed Actor建立 3. 訊息傳送 1. Typed Actor定義 Akka中的Typed Actor是Active Objects設計模式的實現,Active Objects模式將方法的執

Flask 教程 錯誤處理

這是Flask Mega-Tutorial系列的第七部分,我將告訴你如何在Flask應用中進行錯誤處理。 本章將暫停為microblog應用開發新功能,轉而討論處理BUG的策略,因為它們總是無處不在。為了幫助本章的演示,我故意在第六章新增的程式碼中遺留了一

Spring Cloud基礎教程路由閘道器使用(Zuul)

一、概述Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/client-a/轉發到到a服務,/client-b/轉發到到b服務。zuul預設和Ribbon結合實現了負載均衡的功能。二、準備將服務註冊與發現這篇部落格中的Eureka-Client-A工程,複

Spring Cloud系列教程 | 使用Spring Cloud Zuul實現過濾器或攔截器功能案例

推薦 Spring Cloud 視訊: 使用Spring Cloud Zuul實現過濾器或攔截器功能案例   Spring Cloud的API閘道器不但可以實現類似NGINX+Lua強大的路由分發,實現動靜頁面的分流,更重要可以實現對所有發往後端微服務請求的攔

pandas排序

index pandas style inf and spa ima value bsp pandas具有兩種排序方式:sort_index()和sort_values()。 第七節:pandas排序

【實驗篇】BurpSuite基礎教程四發Scanner模組應用之漏洞掃描

建議按照順序學習課程。前序課程:burpsuite實現漏洞掃描實驗目的掃描目標網站漏洞實驗內容BurpSuite Intruder模組應用,演示如何進行漏洞掃描。配合DVWA (Dam Vulnerable Web Application)進行實戰操作,本次我們測試使用的版本

Maven中的聚合與繼承

     Maven的聚合特性能夠把專案的各個模組聚合在一起構建,而Maven的繼承特性則能幫助抽取各模組間相同的依賴和外掛配置,還能促進各個模組之間配置的一致性。 聚合:      我們在開發過程中,將專案拆分成獨立的子模組,每個模組都是一個獨立的maven proje

Node.js進階教程koa框架(koa1,koa2)-何韜-專題視訊課程

Node.js進階教程第七步:koa框架(koa1,koa2)—6512人已學習 課程介紹        koa 致力於成為一個更小、更富有表現力、更健壯的 Web 框架。Koa 應用是一個包含一系列中介軟體 generator 函式的物件。Koa提供了一個輕量優雅的函式庫,

web爬蟲之urllib(四)

處理 info ima bsp 一個 合並 span 分享圖片 img 第三個 模塊parse :   是一個工具模塊,提供了許多 URL 處理方法,比如拆分、解析、合並等等的方法。 第七節:web爬蟲之urllib(四)

《C# 爬蟲 破境之道》第二境 爬蟲應用 — 併發控制與策略

我們在第五節中提到一個問題,任務佇列增長速度太快,與之對應的採集、分析、處理速度遠遠跟不上,造成記憶體快速增長,頻寬佔用過高,CPU使用率過高,這樣是極度有害系統健康的。 我們在開發採集程式的時候,總是希望能夠儘快將資料爬取下來,如果總任務數量很小(2~3K請求數之內),總耗費時長很短(1~2分鐘之內),那麼