版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第三章 顯示文字和圖片從 本章開始,讀者就要編寫代碼了。按照作者的原則少一些理論,多一些實(shí)踐,代碼中可能會有跳躍的地方。但是請大家不要著急,隨著學(xué)習(xí)的深入,你很快就會 了解其中的奧秘。不過在開始之前,我們還是要先來理順一下思路,看看完成一個(gè)坦克大戰(zhàn)游戲需要哪些工作:首先,我們需要一個(gè)基本的程序,這個(gè)程序能夠在 Android上運(yùn)行;這個(gè)程序要能夠顯示圖形包括地圖,主角和NPC等等;程序能夠接受用戶的輸入,控制主角移動(dòng);程序要能夠控制NPC和子彈的移動(dòng); 程序還能對各種事件做出判斷,比如擊中敵人,獲得物品,勝利或者失敗?,F(xiàn)在我們就從基本程序開始,一步一步實(shí)現(xiàn)它。首先,讓我們看一下剛剛生成的文件目
2、錄在源文件目錄下,只有Main.java和R.java兩個(gè)文件,剛剛被我們命名成Main.java的文件就是程序的入口文件。而R.java是由插件來維護(hù)的資源定義文件,我們先不管它。Main.java內(nèi)容如下:package org.yexing.android.games.tank;import android.app.Activity;import android.os.Bundle;public class Main extends Activity /* Called when the activity is first created. */Overridepublic void o
3、nCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);很 幸運(yùn),Main.java的代碼非常之少,而且還有一段注釋,以致我們很容易知道函數(shù)onCreate的作用,需要解釋的只是 setContentView()。先不要管注釋中提到的Activity和setContentView的參數(shù)R.layout.main,我們使用 setContentView的另一種形式:setContentView(View view)。setContentView的作用是設(shè)
4、定當(dāng)前使用的視圖即View(依此理解,可以有很多個(gè)View,需要用哪個(gè)就可以把他作為 setContentView的參數(shù)顯示出來)。View是一個(gè)非常重要的組件,它可以用來顯示文字,圖片,也可以接收客戶的操作,比如觸摸屏,鍵盤等 等,而我們的游戲中正是需要繪圖和交互,看來View很符合我們的需要(但是請注意,使用View并不是我們的最終方案,原因會在后面說明。此處介紹 View是為了講解基礎(chǔ)的圖形和用戶控制)。下面我們就要訂制一個(gè)屬于自己的View,可以通過繼承自系統(tǒng)提供的View,并重載相關(guān)的函數(shù)來實(shí)現(xiàn)。創(chuàng)建類的方法如下:右擊包名 New -> Class我們將這個(gè)View類命名為Ga
5、meView,并且由android.view.View繼承點(diǎn) 擊Finish,一個(gè)View類就創(chuàng)建好了。這里是第一次創(chuàng)建類,以后就不會有圖片演示了,請大家記住的這個(gè)方法。GameView創(chuàng)建好了,但是代碼還 有一些錯(cuò)誤,這里介紹一下eclipse的使用技巧,將鼠標(biāo)懸停在有錯(cuò)誤的位置,或者將光標(biāo)停在有錯(cuò)誤的行,然后按Ctrl+1鍵,就會出現(xiàn)修改建議,大 部分時(shí)候,使用修改建議都可以改正我們的錯(cuò)誤,如圖可以看出來,剛剛的錯(cuò)誤是因?yàn)闆]有創(chuàng)建構(gòu)造函數(shù),選擇修改建議的第二項(xiàng),增加一個(gè)構(gòu)造函數(shù)public GameView(Context context) super(context);/ TODO Au
6、to-generated constructor stub我們的View就創(chuàng)建好了?;氐組ain.java,剛剛說了,只要將View作為setContentView的參數(shù),這個(gè)View就可以被顯示出來:public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(new GameView(this);現(xiàn)在讓我們運(yùn)行模擬器,看看程序變成什么樣子了(啟動(dòng)模擬器的方法見第二章)。不要意外,屏幕上就是一片空白,因?yàn)槲覀儎?chuàng)建了一個(gè)View,但是沒有讓它顯示任何內(nèi)容。下面我
7、們就會在View上顯示一段文字和一張圖片。讓View顯示內(nèi)容也很簡單,只需要重載View的onDraw函數(shù),把相應(yīng)的語句寫入onDraw中即可。打開GameView.java,點(diǎn)擊菜單 Source -> Override/Implement Method選中onDraw點(diǎn)擊OK下面這段代碼就會被加入到程序當(dāng)中,所有與顯示有關(guān)的代碼都會在這里面完成Overrideprotected void onDraw(Canvas canvas) / TODO Auto-generated method stubsuper.onDraw(canvas);這 里我們遇到了又一個(gè)非常重要的類Canvas
8、,Canvas一般翻譯成畫布,所有的繪圖操作都是通過Canvas中的函數(shù)來完成的,比如顯示文字的函數(shù) Canvas.drawText(),顯示位圖的函數(shù)Canvas.drawBitmap(),以及各種繪制圖形的函數(shù)如 Canvas.drawRect(),Canvas.drawArc()等等。下面讓我們顯示一段文字在屏幕上:protected void onDraw(Canvas canvas) / TODO Auto-generated method stubsuper.onDraw(canvas);canvas.drawText("坦克大戰(zhàn)", 50, 50, new P
9、aint();坦克大戰(zhàn)四個(gè)字已經(jīng)出現(xiàn)在了屏幕上。讓我們來詳細(xì)看一下這條語句:canvas.drawText("坦克大戰(zhàn)", 50, 50, new Paint();第 一個(gè)參數(shù)是要顯示的文字,第二、第三個(gè)參數(shù)是文字在屏幕上的坐標(biāo),說到坐標(biāo)得多講兩句。在2D編程中,屏幕坐標(biāo)的原點(diǎn)是屏幕的左上角,橫向向右增大,縱向 向下增大,如上圖所示。最后一個(gè)參數(shù)是Paint,通常翻譯成畫筆,它決定了文字或圖形的顏色,字體,線條粗細(xì)等等,后面用到相應(yīng)屬性的時(shí)候會詳細(xì)介紹。 那么這條語句就是在屏幕上(50,50)的位置用缺省的畫筆寫出“坦克大戰(zhàn)”四個(gè)字。另外如果eclipse提示代碼錯(cuò)誤,不要
10、忘了用Ctrl+1。有了文字,下面就是圖像了。顯示圖像比顯示文字略微復(fù)雜一些,首先我們要準(zhǔn)備一張位圖,圖片必須是png格式的,文件名只能是小寫字母,數(shù)字和下劃線。battlecity.png然后將這張圖片copy到工程的res/drawable目錄下??梢灾苯釉趀clipse的目錄樹中粘貼。顯示位圖的函數(shù)是Canvas.drawBitmap(),drawBitmap有很多種形態(tài),我們先看其中最簡單的一種canvas.drawBitmap(bitmap, left, top, paint)乍 一看似乎和drawText差不多,4個(gè)參數(shù)有三個(gè)都相同,但這第一個(gè)參數(shù)bitmap要比文本復(fù)雜得多。首先
11、,他是一個(gè)Bitmap類實(shí)例,因?yàn)槲覀儸F(xiàn) 在還不需要這個(gè)類的其他功能,所以不過多介紹Bitmap,只考慮它是怎么來的。得到Bitmap實(shí)例的方法也有很多種,這里只介紹其中的一種BitmapFactory.decodeResource(res, id);此 方法可以返回一個(gè)bitmap實(shí)例,但是這個(gè)函數(shù)還需要兩個(gè)參數(shù)res和id。res是Resources實(shí)例,而id是一個(gè)整數(shù),下面讓我們分別了解這 兩個(gè)參數(shù)。res的地位跟bitmap差不多,只需要作為參數(shù)被使用,因此,只要得到實(shí)例就可以了,獲得Resources實(shí)例的方法如下:res = context.getResources();天哪,事
12、情越來越復(fù)雜了,因?yàn)檫@段代碼里面有多了一個(gè)陌生面孔context。context是Context實(shí)例,Context通常翻譯做上下文,這個(gè)名稱似乎有點(diǎn)晦澀,他究竟是什么呢?讓我們回頭看看寫好的程序public GameView(Context context) super(context);/ TODO Auto-generated constructor stub這時(shí)候我們有一個(gè)context實(shí)例,繼續(xù)朔源而上,在Main.java中public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceStat
13、e);setContentView(new GameView(this);原來,context指向Main類。好了,我們終于找到res的源頭了。還有另外一個(gè)分支第二個(gè)參數(shù)id。BitmapFactory.decodeResource(res, id);id是一個(gè)整形,它到底是誰的id呢?我們還是得往前面找,還記得我們第一次見到函數(shù)setContentView時(shí)什么樣子么setContentView(R.layout.main);對,他的參數(shù)是R.layout.main,后來被我們替換成了GameView實(shí)例。R.layout.main就是一個(gè)整數(shù)。它被定義在文件R.java中,我們前面講過R.
14、java是由插件維護(hù)的資源定義文件。說到這里大家應(yīng)該猜到了吧。讓我們打開R.java文件public final class R public static final class attr public static final class drawable public static final int battlecity=0x7f020000;public static final int icon=0x7f020001;public static final class layout public static final int main=0x7f030000;public sta
15、tic final class string public static final int app_name=0x7f040001;public static final int hello=0x7f040000;果然,位圖文件battlecity.png在這里面也被分配了一個(gè)id:R.drawable.battlecity,沒錯(cuò),就是它了,這就是我們要找的id。至此為止,我們終于可以使用drawBitmap了。對于一次創(chuàng)建,多次使用的資源,我們把他放到構(gòu)造函數(shù)里面。增加了圖形顯示的GameView如下:public class GameView extends View Bitmap bmp;public GameView(Context context) super(context);/ TODO Auto-generated constructor stubResources res = context.getResources();bmp = BitmapFactor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年綠色建筑材料交易合同規(guī)范匯編3篇
- 2025版微粒貸逾期8萬元債權(quán)轉(zhuǎn)讓服務(wù)合同3篇
- 2025版外債借款合同匯率風(fēng)險(xiǎn)與應(yīng)對措施3篇
- 二零二五年度菜鳥驛站快遞業(yè)務(wù)數(shù)據(jù)分析合同3篇
- 二零二五年度多功能木方模板設(shè)計(jì)與制造服務(wù)合同4篇
- 2025年學(xué)生就業(yè)實(shí)習(xí)合同
- 2025年名譽(yù)權(quán)質(zhì)押合同
- 2025年合作加盟代理合資經(jīng)營合同
- 二零二五版國際貨物檢驗(yàn)鑒定服務(wù)合同(木材)3篇
- 2025年家居中介代理協(xié)議
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場平臺規(guī)劃建設(shè)方案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 01J925-1壓型鋼板、夾芯板屋面及墻體建筑構(gòu)造
- 近五年重慶中考物理試題及答案2023
- 乳腺導(dǎo)管原位癌
- 冷庫管道應(yīng)急預(yù)案
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(共250余題)
- 網(wǎng)易云音樂用戶情感畫像研究
評論
0/150
提交評論