libgdx游戲引擎開發筆記(十)SuperJumper游戲例子的講解(篇四)---- 主游戲界面內部框架編寫...

上一講,我們已經實現了點擊play進入游戲界面但僅僅是個黑屏

130858313.png

?今天,我們就試著編寫代碼讓它出現游戲的一些簡單場景。還是在上一講的代碼基礎上,我們創建兩個類:World 和 WorldRenderer?


1.Word類:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package?com.zhf.mylibgdx;
/**
?* 統一管理世界中各個部分
?* @author ZHF
?*
?*/
public?class?World {
????/**世界監聽器接口**/
????public?interface?WorldListener {
????????//跳躍
????????public?void?jump ();
????????//高跳
????????public?void?highJump ();
????????//碰撞
????????public?void?hit ();
????????//收集金幣
????????public?void?coin ();
????}
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????//寬和高
????public?static?final?float?WORLD_WIDTH =?10;
????public?static?final?float?WORLD_HEIGHT =?15?*?20;
????//狀態
????public?static?final?int?WORLD_STATE_RUNNING =?0;??//運行
????public?static?final?int?WORLD_STATE_NEXT_LEVEL =?1;??//下一關
????public?static?final?int?WORLD_STATE_GAME_OVER =?2;??//游戲結束
????//世界監聽器
????public??WorldListener listener;
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????public?World(WorldListener listener) {
????????this.listener = listener;
????}
}


2.WorldRenderer類:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package?com.zhf.mylibgdx;
import?com.badlogic.gdx.graphics.OrthographicCamera;
import?com.badlogic.gdx.graphics.g2d.SpriteBatch;
import?com.badlogic.gdx.graphics.g2d.TextureRegion;
/**
?* 用來把每個對象關聯相應的圖片資源,同時控制相機,實現動畫。
?* @author ZHF
?*
?*/
public?class?WorldRenderer {
????//寬和高
????static?final?float?FRUSTUM_WIDTH =?10;
????static?final?float?FRUSTUM_HEIGHT =?15;
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????World world;??//世界
????OrthographicCamera cam;??//相機
????SpriteBatch batch;??//用于繪畫
????TextureRegion background;??//背景圖片
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????public?WorldRenderer(SpriteBatch batch, World world) {
????????this.world = world;
????????//OrthographicCamera 被定義成 寬度為10,高度為15,同樣的也把相機對準中心點。
????????this.cam =?new?OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT);
????????//它指定了和屏幕一樣大小的 OrthographicCamera ,并把相機對準屏幕的中心。
????????this.cam.position.set(FRUSTUM_WIDTH /?2, FRUSTUM_HEIGHT /?2,?0);
????????this.batch = batch;
????}
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????/**渲染**/
????public?void?render () {
????????cam.update();
????????//它的作用都是通過把映射矩陣綁定給SpritBatch,告訴SpritBatch怎么去繪制圖形
????????batch.setProjectionMatrix(cam.combined);
????????//渲染背景
????????renderBackground();
????????//渲染游戲中各種元素(Bob,跳板,松鼠,彈簧。。)下一講中會具體講到
//????? renderObjects();
????}
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????/**渲染背景**/
????public?void?renderBackground () {
????????batch.disableBlending();
????????batch.begin();
????????//繪制背景
????????batch.draw(Assets.backgroundRegion, cam.position.x - FRUSTUM_WIDTH /?2, cam.position.y - FRUSTUM_HEIGHT /?2, FRUSTUM_WIDTH,
????????????FRUSTUM_HEIGHT);
????????batch.end();
????}
}


? ?接下來,就是在GameScreen中調用這兩個類,完成框架的連接搭建。

聲明:

1
2
3
4
//游戲場景
World world;
WorldRenderer renderer;
WorldListener worldListener;

實例化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//實例化場景
????????worldListener =?new?WorldListener() {
????????????@Override
????????????public?void?jump () {
//????????????? Assets.playSound(Assets.jumpSound);
????????????}
????????????@Override
????????????public?void?highJump () {
//????????????? Assets.playSound(Assets.highJumpSound);
????????????}
????????????@Override
????????????public?void?hit () {
//????????????? Assets.playSound(Assets.hitSound);
????????????}
????????????@Override
????????????public?void?coin () {
//????????????? Assets.playSound(Assets.coinSound);
????????????}
????????};
????????world =?new?World(worldListener);
????????renderer =?new?WorldRenderer(batcher, world);

調用:在GameScreen的draw()方法中調用

1
2
//繪制游戲主場景
renderer.render();


運行一下代碼,發現我們的黑屏沒有了!

151946540.png151948511.png

? ? 這里我需要再啰嗦幾句,相機的掌握是比較抽象的,WorldRenderer 中 OrthographicCamera的定義就的得先說說游戲是怎么進行的:為什么要把 WorldRender中的OrthographicCamera ?定義10 *15,實際上就是把屏幕320*480 映射成每個單位為32像素。這是因為游戲中的素材基本都是基于32像素為單位構建,同時屏幕的分辨率也可以被分解成以32像素為單位。

游戲中,我們的主角Bob會不斷進行跳躍,但是他的最高點始終不會超過屏幕的中點,他停留在最高點的過程中會通過移動所有的物體來造成他看上去好像在往上跳,實際上他一直停留在屏幕中點的高度。同時,我們需要為每一關定義一個長度,也就是,需要‘跳’多高才能到達城堡,順利通關。并且要準備好整一關的過程中,哪里應該出現什么物體,然后根據Bob到達的高度不停的切換這些物體。


想象一下有一段被垂直放置的膠卷,這就是我們的一個關卡,也就是一個World,它準備好了一個關卡的長度,并且設置好了所有的物體。而我們的Bob和WorldRender中的OrthographicCamera 一開始被放置在膠卷的底部,Bob開始不斷的跳躍,當超過屏幕中點的高度時則OrthographicCamera 會被往上移動,并且所有進入OrthographicCamera 的物體都會被繪制。直到到達最高點,或Bob死亡。


所以 WorldRender中的OrthographicCamera 被設置成 10 *15 。

并且而在World類中,定義了兩個變量:

? ?public static final float WORLD_WIDTH = 10;

? ?public static final float WORLD_HEIGHT = 15 * 20;

同樣的關卡的寬帶也被定義為10個單位,與WorldRender中的一致(因為我們不需要在X方向進行移動);而高度定義成15*20 這就是一關的長度,也就是Bob要'跳'的高度。

從上面的分析可以得出,分別設置兩個不同 OrthographicCamera ?,就是因為不同場景的需求。并且 在WorldRender中的OrthographicCamera 其實也可以被設置成 320*480 只是為了簡便,才把單位設為32像素變成 10*15。 所以不管是哪個OrthographicCamera它提供的只是一個映射信息,而這個映射的信息真正的使用者是SpriteBatch,它會根據映射信息的不同來決定究竟要把圖片繪制在什么位置上,以及該不該繪制這些元素。

? ?即使GameScreen和WorldRender使用的是同一個SpriteBatch,只要在恰當的時候綁定相應的投影矩陣,兩者是互不影響的。


? ? 后面說了好多,全是文字,大家先理解著,在下一講中我們將加入各種對象:Bob、跳板,彈簧、松鼠、金幣、城堡,以及源碼是如何定義他們的。


源碼下載:http://down.51cto.com/data/895165





? ? ?本文轉自zhf651555765 51CTO博客,原文鏈接:http://blog.51cto.com/smallwoniu/1263323,如需轉載請自行聯系原作者




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286693.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

看看《System.CommandLine》

記得之前出過幾篇.net tool工具的文章,當時的做法是所有工具的語法分析全部自己解釋,自己執行,語法的解釋占了大部分時間,反而工具的功能被弱化了。其實微軟有一個CommandLine框架在緩慢的發展著,至今都沒有正式發布&a…

Sublime Text 3 import Anaconda 無法正常補全模塊名解決辦法

Sublime Text 3 Anaconda配置 在安裝Sublime Text3之后我們總會安裝一些插件,比如Python的Anaconda自動補全插件。但是,裝好之后發現import 時無法像別的IDE里面那樣自動補全模塊名,就像圖中一樣: 解決辦法在Sublime Text的git…

hdu - 2586 How far away ?(最短路共同祖先問題)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid2586 最近公共祖先問題~~LAC離散算法 題目大意:一個村子里有n個房子,這n個房子用n-1條路連接起來,接下了有m次詢問,每次詢問兩個房子a,b之間的距離是多少。 很明顯…

Android之添加固定圖標到桌面

我的QQ群 1 需求 Android之添加固定圖標到桌面 2 部分實現 在AndroidManifest.xml里面添加如下權限 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="com.android.launcher.perm…

想做程序員?不同方向入門路線全解

學習計算機編程有很多方向如果你沒有一個正確的路線&#xff0c;那么就會&#xff1a; 就會跟上面所說的那樣&#xff0c;被迫成為一個全棧&#xff0c;這是比較尷尬的。 若你想比較準確的針對某個方向學習&#xff0c;那就繼續往下看吧。 一、程序員分為哪幾個方向 隨著…

【轉】OpenGL超級寶典筆記——紋理映射Mipmap

原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感謝作者&#xff0c;若非法轉載請聯系本人。 目錄[-] MipmappingMipmap過濾構建Mip層Mipmaps 硬件生成LOD&#xff08;多細節層次&#xff09;偏好紋理對象管理多個紋理常駐紋理紋理優先級回顧Mipmapping Mipmap是一個…

【Microstation】第二章:Microstation三維建模基礎知識

本章的主要內容包括模型的顯示樣式(線框、光滑)、三維定位(V、T、S、F)、Microstation常見的坐標系統(世界坐標系、ACS輔助坐標系、精確繪圖坐標系、)和Microstation的工作區域(2D和3D)。 一、顯示樣式 二、三維定位 三維定位在Microstation中顯得尤為重要,常見…

xtrabackup對MySQL數據庫的備份及恢復教程

xtrabackup xtrabackup 是 percona 的一個開源項目&#xff0c;可以熱備份innodb &#xff0c;XtraDB,和MyISAM&#xff08;會鎖表&#xff09;。對MyISAM存儲引擎會鎖表&#xff0c;也是很郁悶的因為線上使用的是Innodb和MyISAM兩種存儲引擎&#xff0c;比較 頭疼&#xff01;…

實現 EF Core 6 自定義查詢標記

前言在《EF Core使用Simple Logging輸出日志》中&#xff0c;我們介紹了查詢標記 TagWith&#xff0c;它可以幫助我們快速定位到需要的日志&#xff1a;而在 .NET 6 中&#xff0c;新增了另外一個查詢標記 TagWithCallSite&#xff0c;它可以標記出代碼的位置&#xff1a;var u…

LeetCode: 14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings. 大意就是&#xff0c;寫一個函數可以找到一個數組字符串中的最長前綴。 分析&#xff1a; 最長前綴的最大值為數組字符串中長度最短的字符&#xff0c;由最短字符串由后向前遞減可以得…

jQuery選擇器和選取方法

我們已經使用了帶有簡單Css選擇器的jQuery選取函數:$()。現在是時候深入了解jQuery選擇器語法&#xff0c;以及一些提取和擴充選中元素集的方法了。 一、jQuery選擇器 在CSS3選擇器標淮草案定義的選擇器語法中&#xff0c;jQuery支持相當完整的一套子集&#xff0c;同時還添加了…

0運維?微信小程序云開發增刪查改【05】

在創建小程序時&#xff0c;選擇云開發&#xff1a; 隨后進入項目之后&#xff0c;此時整個目錄如下&#xff1a; 此時我們如圖目錄即可找到首頁位置&#xff1a; 接著咱們清除 index.wxml 代碼內容&#xff1a; 在 index.wxml 中加入如下代碼&#xff1a; <view> …

Android之解決卸載app后再次安裝提示room數據庫錯誤

1、問題 目前只有一個google手機之前安裝了app,里面有room寫的數據庫&#xff0c;后面把app卸載了&#xff0c;再次安裝新的app(修改了數據庫里面的字段)&#xff0c;啟動奔潰。 2、分析 提示數據庫錯誤&#xff0c;很明顯就像以前的app里面的數據庫沒有刪除一樣&#xff0c;…

【Microstation】第三章:Microstation三維模型構建與編輯

本章主要講述三維基本實體繪制、三維構造元素繪制、三維模型編輯。 一、三維基本體素繪制 對于立方體、圓柱、球、圓錐等這些基本立體單位,MS提供了專門的繪圖工具。 基本體素繪制有兩種方式: (1)精確繪圖工具 (2&

文件系統管理相關命令

查看文件系統相關屬性的命令&#xff1a;blkidblkid是一個查看磁盤設備屬性相關信息的命令行工具blkid -L LABEL | UUID :根據UUID查看對應的設備是哪個blkid [-ghlv] [-c file] [-w file] [-o format][-s tag] [-t NAMEvalue] device [device ...]-i&#xff1a;顯示io限制lsb…

CSharpFunctionalExtensions -函數式編程C#的功能擴展

簡介該庫有助于以更實用的方式編寫代碼安裝在NuGet上可用dotnet add package CSharpFunctionalExtensions或者PM> Install-Package CSharpFunctionalExtensions例子Maybe創建一個值Maybe<string> apple Maybe<string>.From("apple");// orMaybe<s…

Android之實現夸克瀏覽器書簽和歷史頁面滑動時候右上角圖標切換效果

1 需求 實現夸克瀏覽器書簽和歷史頁面滑動時候右上角圖標切換效果,頁面滑動的時候,圖標也左右滑動,但是只是顯示其中的一個 https://www.captainai.net/st/ 2 代碼實現 xml布局實現 <LinearLayoutandroid:id="@+id/mainLl"android:layout_width="24d…

ArcGIS 10.6字段計算器(Field Calculator)字段任意填充編碼序列(奇數、偶數序列、自定義間隔)

有關ArcGIS 10.x中屬性數據采集和字段計算器(Field Calculator)的文章,需要的讀者可以參照: 《ArcGIS實驗教程——實驗四:數字化屬性數據的采集》,文章中就屬性數據采集的多種方式做了說明,其中就有字段計算器的詳細說明;《【ArcGIS風暴】ArcGIS 10.2字段計算器(Field…

你都用 Python 來做什么?

你們都用python做些什么呢&#xff1f; 在開發中 python 這一個語言就像是小叮當&#xff0c;而 python 的第三方庫則是“百寶箱”&#xff0c;你只要想著對某一個方向進行開發&#xff0c;那么這個“百寶箱”就會給你想要的東西。 由于我是在開發多年后接觸到的 python&#…

DOS分區概述

雖然很多參考文檔對DOS分區進行介紹&#xff0c;但一直沒有一個統一的標準&#xff0c;也沒有統一的命名規則。Microsoft將使用DOS分區體系的磁盤稱為“主引導記錄(Master Boot Recorder---MBR)磁盤”&#xff0c;這是相對于使用“全局ID分區表(GUID Partition Table---GPT)磁盤…