淺談Android游戲開(kāi)發(fā)基礎(chǔ)和經(jīng)驗(yàn)
Android游戲開(kāi)發(fā)基礎(chǔ)和經(jīng)驗(yàn)是本文要介紹的內(nèi)容,主要是來(lái)了解并學(xué)習(xí)Android游戲開(kāi)發(fā)的內(nèi)容實(shí)例,具體關(guān)于Android游戲開(kāi)發(fā)內(nèi)容的詳解來(lái)看本文。
做一個(gè)類似俄羅斯方塊的android游戲開(kāi)發(fā),游戲完全又觸屏來(lái)實(shí)現(xiàn)還有音樂(lè)播放等等一些基本的功能,游戲是基于 android sdk1.6完成。由于初識(shí)android,這個(gè)游戲也是本人第一個(gè)android游戲開(kāi)發(fā),所以還有很多不足,這里只是想分享一下在開(kāi)發(fā)過(guò)程中一些自己總結(jié)的經(jīng)驗(yàn)和小技巧,希望對(duì)新手有所幫助,高手也請(qǐng)不吝賜教。
一、首先我們應(yīng)該知道android游戲開(kāi)發(fā)的一些基本框架。
Android游戲開(kāi)發(fā)中首先是View類開(kāi)發(fā)框架。在Android游戲開(kāi)發(fā)中,任何一個(gè)View類都只需要重寫(xiě)onDraw方法來(lái)實(shí)現(xiàn)界面顯示。游戲的核心是不斷的繪圖和刷新界面,在 Android中最常用的方法是利用Handler來(lái)實(shí)現(xiàn)UI線程的更新,也可以直接在run方法中使用postInvalidate()方法在線程中更新界面。其次,是SurfaceView類開(kāi)發(fā)框架。
當(dāng)需要開(kāi)發(fā)復(fù)雜的游戲,而且對(duì)程序的執(zhí)行效率很高時(shí),View類就不能滿足需求了,這是必須用 SurfaceView類進(jìn)行開(kāi)發(fā),這也是主流開(kāi)發(fā)框架。在使用時(shí)需要對(duì)其進(jìn)行創(chuàng)建、銷毀,情況改變時(shí)進(jìn)行監(jiān)視,這就要實(shí)現(xiàn) SurfaceHOlder.Callback接口,如果要對(duì)被繪制的花布進(jìn)行裁減,控制其大小時(shí)都需要使用SurfaceHOlder來(lái)完成處理。在程序中,SurfaceHOlder對(duì)象需要通過(guò)getHolder方法來(lái)獲得,同時(shí)還需要addCallback方法來(lái)添加“回調(diào)函數(shù)”。
例如下面一個(gè)簡(jiǎn)單的SurfaceView類框架:
- public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable {
- SurfaceHolder mSurfaceHolder = null;
- public GameSurfaceView(Context context) {
- super(context);
- mSurfaceHolder = this.getHolder();
- mSurfaceHolder.addCallback(this);
- this.setFocusable(true);
- }
- public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
- }
- public void surfaceCreated(SurfaceHolder holder ){
- new Thread(this).start();
- }
- public void surfaceDestroyed(SurfaceHolder holder){
- }
- public void run(){
- while (true){
- try{
- Thread.sleep(1000);
- }
- catch(Exception e){
- }
- synchronized(mSurfaceHolder){
- Draw();
- }
- }
- }
- private void Draw() {
- Canvas canvas= mSurfaceHolder.lockCanvas();
- ......
- mSurfaceHolder.unlockCanvasAndPost(canvas);
- }
- }
然后在activity類中 :setContentView(GameSurfaceView的對(duì)象)。
二、游戲開(kāi)發(fā)中常用到的基本類
Android游戲開(kāi)發(fā)中通過(guò)graphics類來(lái)顯示2D圖形,graphics中包括了Canvas(畫(huà)布)、Paint(畫(huà)筆)、Color(顏色)、Bitmap(圖片)等常用類。
例如繪制字符串用canvas類的drawText方法來(lái)實(shí)現(xiàn),drawRect用來(lái)繪制矩形,設(shè)置透明度可以用paint類的setAlpha,同時(shí) Color.rgb方法可以直接獲得整形數(shù)值代表的顏色。此外在繪制圖片時(shí)應(yīng)該首先從資源文件中裝載圖片,然后才能繪制到屏幕上去。具體代碼如下:Bitmap mypic = null; mypic=((BitmapDrawable)getResources().getDrawable(R.drawable.pic)).getBitmap(); Canvas canvas = new Canvas(); canvas.drawBitmap(mypic,x,y,null);
三、關(guān)于自適應(yīng)屏幕分辨率的問(wèn)題
Android游戲開(kāi)發(fā)中每款手機(jī)分辨率的不同注定是程序員開(kāi)發(fā)游戲必須考慮的問(wèn)題,怎樣才能寫(xiě)一個(gè)程序而達(dá)到可以在不同分辨率的機(jī)子上運(yùn)行良好,這將是決定一個(gè)游戲好壞的重要因素之一。在游戲資源res下有三個(gè)和圖片存儲(chǔ)有關(guān)的文件夾:drawable-hdpi、drawable-mdpi、drawable-ldpi。
drawable-hdpi里面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854),drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480),drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320),系統(tǒng)會(huì)自動(dòng)根據(jù)機(jī)器的分辨率來(lái)分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。當(dāng)然,除了準(zhǔn)備好幾組不同分辨率的圖片以外,在代碼中圖片坐標(biāo)和觸屏事件的坐標(biāo)都要靈活的處理,這樣才能實(shí)現(xiàn)一個(gè)程序多機(jī)型運(yùn)行的目標(biāo)。
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
- int screenWidth = dm.widthPixels;
- int screenHeight = dm.heightPixels;
通過(guò)以上代碼可以獲得當(dāng)前機(jī)型的屏幕像素,然過(guò)比列換算可以實(shí)現(xiàn)代碼中坐標(biāo)的靈活應(yīng)用。
四、如何鎖定屏幕是橫屏還是豎屏
一款游戲通常不會(huì)設(shè)計(jì)成橫屏豎屏都可玩,會(huì)固定成橫屏或豎屏。Android游戲開(kāi)發(fā)中只需在AndroidManifest.xml里面配置一下就可以了,加入這一行
- android:screenOrientation="landscape"
例如(landscape是橫向,portrait是縱向)。
五、view與view之間的跳轉(zhuǎn)
Android游戲開(kāi)發(fā)中一個(gè)游戲不會(huì)只有一個(gè)view,比如歡迎動(dòng)畫(huà),游戲畫(huà)面,菜單頁(yè)面等等,如何實(shí)現(xiàn)它們之間的跳轉(zhuǎn),這里有一個(gè)方法,就是用Handler類實(shí)現(xiàn)。直接看代碼:
- Handler myHandler = new Handler(){
- public void handleMessage(Message msg){
- if(msg.what == 1){
- //控制頁(yè)面的顯示...
- }
- if(msg.what == 2){
- //控制頁(yè)面的顯示...
- }
- }
- };
然后用:myHandler.sendEmptyMessage(1)來(lái)實(shí)現(xiàn)切換。
小結(jié):淺談Android游戲開(kāi)發(fā)基礎(chǔ)和經(jīng)驗(yàn)的內(nèi)容介紹完了,希望通過(guò)Android游戲開(kāi)發(fā)內(nèi)容的學(xué)習(xí)能對(duì)你有所幫助!