版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第三章 顯示文字和圖片從 本章開始,讀者就要編寫代碼了。按照作者的原則少一些理論,多一些實踐,代碼中可能會有跳躍的地方。但是請大家不要著急,隨著學習的深入,你很快就會 了解其中的奧秘。不過在開始之前,我們還是要先來理順一下思路,看看完成一個坦克大戰(zhàn)游戲需要哪些工作:首先,我們需要一個基本的程序,這個程序能夠在 Android上運行;這個程序要能夠顯示圖形包括地圖,主角和NPC等等;程序能夠接受用戶的輸入,控制主角移動;程序要能夠控制NPC和子彈的移動; 程序還能對各種事件做出判斷,比如擊中敵人,獲得物品,勝利或者失敗?,F(xiàn)在我們就從基本程序開始,一步一步實現(xiàn)它。首先,讓我們看一下剛剛生成的文件目
2、錄在源文件目錄下,只有Main.java和R.java兩個文件,剛剛被我們命名成Main.java的文件就是程序的入口文件。而R.java是由插件來維護的資源定義文件,我們先不管它。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);很 幸運,Main.java的代碼非常之少,而且還有一段注釋,以致我們很容易知道函數(shù)onCreate的作用,需要解釋的只是 setContentView()。先不要管注釋中提到的Activity和setContentView的參數(shù)R.layout.main,我們使用 setContentView的另一種形式:setContentView(View view)。setContentView的作用是設
4、定當前使用的視圖即View(依此理解,可以有很多個View,需要用哪個就可以把他作為 setContentView的參數(shù)顯示出來)。View是一個非常重要的組件,它可以用來顯示文字,圖片,也可以接收客戶的操作,比如觸摸屏,鍵盤等 等,而我們的游戲中正是需要繪圖和交互,看來View很符合我們的需要(但是請注意,使用View并不是我們的最終方案,原因會在后面說明。此處介紹 View是為了講解基礎的圖形和用戶控制)。下面我們就要訂制一個屬于自己的View,可以通過繼承自系統(tǒng)提供的View,并重載相關的函數(shù)來實現(xiàn)。創(chuàng)建類的方法如下:右擊包名 New -> Class我們將這個View類命名為Ga
5、meView,并且由android.view.View繼承點 擊Finish,一個View類就創(chuàng)建好了。這里是第一次創(chuàng)建類,以后就不會有圖片演示了,請大家記住的這個方法。GameView創(chuàng)建好了,但是代碼還 有一些錯誤,這里介紹一下eclipse的使用技巧,將鼠標懸停在有錯誤的位置,或者將光標停在有錯誤的行,然后按Ctrl+1鍵,就會出現(xiàn)修改建議,大 部分時候,使用修改建議都可以改正我們的錯誤,如圖可以看出來,剛剛的錯誤是因為沒有創(chuàng)建構造函數(shù),選擇修改建議的第二項,增加一個構造函數(shù)public GameView(Context context) super(context);/ TODO Au
6、to-generated constructor stub我們的View就創(chuàng)建好了?;氐組ain.java,剛剛說了,只要將View作為setContentView的參數(shù),這個View就可以被顯示出來:public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(new GameView(this);現(xiàn)在讓我們運行模擬器,看看程序變成什么樣子了(啟動模擬器的方法見第二章)。不要意外,屏幕上就是一片空白,因為我們創(chuàng)建了一個View,但是沒有讓它顯示任何內(nèi)容。下面我
7、們就會在View上顯示一段文字和一張圖片。讓View顯示內(nèi)容也很簡單,只需要重載View的onDraw函數(shù),把相應的語句寫入onDraw中即可。打開GameView.java,點擊菜單 Source -> Override/Implement Method選中onDraw點擊OK下面這段代碼就會被加入到程序當中,所有與顯示有關的代碼都會在這里面完成Overrideprotected void onDraw(Canvas canvas) / TODO Auto-generated method stubsuper.onDraw(canvas);這 里我們遇到了又一個非常重要的類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)四個字已經(jīng)出現(xiàn)在了屏幕上。讓我們來詳細看一下這條語句:canvas.drawText("坦克大戰(zhàn)", 50, 50, new Paint();第 一個參數(shù)是要顯示的文字,第二、第三個參數(shù)是文字在屏幕上的坐標,說到坐標得多講兩句。在2D編程中,屏幕坐標的原點是屏幕的左上角,橫向向右增大,縱向 向下增大,如上圖所示。最后一個參數(shù)是Paint,通常翻譯成畫筆,它決定了文字或圖形的顏色,字體,線條粗細等等,后面用到相應屬性的時候會詳細介紹。 那么這條語句就是在屏幕上(50,50)的位置用缺省的畫筆寫出“坦克大戰(zhàn)”四個字。另外如果eclipse提示代碼錯誤,不要
10、忘了用Ctrl+1。有了文字,下面就是圖像了。顯示圖像比顯示文字略微復雜一些,首先我們要準備一張位圖,圖片必須是png格式的,文件名只能是小寫字母,數(shù)字和下劃線。battlecity.png然后將這張圖片copy到工程的res/drawable目錄下??梢灾苯釉趀clipse的目錄樹中粘貼。顯示位圖的函數(shù)是Canvas.drawBitmap(),drawBitmap有很多種形態(tài),我們先看其中最簡單的一種canvas.drawBitmap(bitmap, left, top, paint)乍 一看似乎和drawText差不多,4個參數(shù)有三個都相同,但這第一個參數(shù)bitmap要比文本復雜得多。首先
11、,他是一個Bitmap類實例,因為我們現(xiàn) 在還不需要這個類的其他功能,所以不過多介紹Bitmap,只考慮它是怎么來的。得到Bitmap實例的方法也有很多種,這里只介紹其中的一種BitmapFactory.decodeResource(res, id);此 方法可以返回一個bitmap實例,但是這個函數(shù)還需要兩個參數(shù)res和id。res是Resources實例,而id是一個整數(shù),下面讓我們分別了解這 兩個參數(shù)。res的地位跟bitmap差不多,只需要作為參數(shù)被使用,因此,只要得到實例就可以了,獲得Resources實例的方法如下:res = context.getResources();天哪,事
12、情越來越復雜了,因為這段代碼里面有多了一個陌生面孔context。context是Context實例,Context通常翻譯做上下文,這個名稱似乎有點晦澀,他究竟是什么呢?讓我們回頭看看寫好的程序public GameView(Context context) super(context);/ TODO Auto-generated constructor stub這時候我們有一個context實例,繼續(xù)朔源而上,在Main.java中public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceStat
13、e);setContentView(new GameView(this);原來,context指向Main類。好了,我們終于找到res的源頭了。還有另外一個分支第二個參數(shù)id。BitmapFactory.decodeResource(res, id);id是一個整形,它到底是誰的id呢?我們還是得往前面找,還記得我們第一次見到函數(shù)setContentView時什么樣子么setContentView(R.layout.main);對,他的參數(shù)是R.layout.main,后來被我們替換成了GameView實例。R.layout.main就是一個整數(shù)。它被定義在文件R.java中,我們前面講過R.
14、java是由插件維護的資源定義文件。說到這里大家應該猜到了吧。讓我們打開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在這里面也被分配了一個id:R.drawable.battlecity,沒錯,就是它了,這就是我們要找的id。至此為止,我們終于可以使用drawBitmap了。對于一次創(chuàng)建,多次使用的資源,我們把他放到構造函數(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇州站施工組織設計方案(幕墻)
- 二零二五年度金融行業(yè)IT運維安全保障協(xié)議3篇
- 專業(yè)化海路物流合作合同(2024版)版B版
- 2025年度環(huán)保建筑材料推廣合作框架協(xié)議4篇
- 2025年度購物中心場地合作開發(fā)及商業(yè)運營合同4篇
- 二零二四圖書購置項目與圖書館無障礙閱讀服務合同3篇
- 2025年度智能攤位管理系統(tǒng)開發(fā)與實施合同4篇
- 2025年度劇本創(chuàng)作與版權授權管理合同3篇
- 二零二五版4S店汽車銷售合同樣本圖2篇
- 2025年度農(nóng)產(chǎn)品質量安全追溯體系服務合同4篇
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護理安全用氧培訓課件
- 《三國演義》中人物性格探析研究性課題報告
- 注冊電氣工程師公共基礎高數(shù)輔導課件
- 土方勞務分包合同中鐵十一局
- 乳腺導管原位癌
- 冷庫管道應急預案
- 司法考試必背大全(涵蓋所有法律考點)
- 公共部分裝修工程 施工組織設計
- 《學習教育重要論述》考試復習題庫(共250余題)
- 裝飾裝修施工及擔保合同
評論
0/150
提交評論