【Android遊戲開發之四】Android 遊戲架構(一個遊戲角色在螢幕行走的demo)

來源:互聯網
上載者:User

 

其實上一篇分析surfaceview的文章就是一個簡單的遊戲架構了,當然這裡再強調一下,簡單的遊戲架構,所以不要高手們不要亂噴~

 

 這個Demo是給群裡一童鞋寫的一個對圖片操作以及按鍵處理,遊戲簡單架構的一個demo,這裡放出給大家分享~

 

package com.himi; 

import android.content.Context; 

import android.content.res.Resources; 

import android.graphics.Bitmap; 

import android.graphics.BitmapFactory; 

import android.graphics.Canvas; 

import android.graphics.Color; 

import android.graphics.Paint; 

import android.util.Log; 

import android.view.KeyEvent; 

import android.view.SurfaceHolder; 

import android.view.SurfaceView; 

import android.view.SurfaceHolder.Callback; 

public class MySurfaceView extends SurfaceView implements Callback, Runnable { 

    private Thread th = new Thread(this); 

    private SurfaceHolder sfh; 

    private int SH, SW; 

    private Canvas canvas; 

    private Paint p; 

    private Paint p2; 

    private Resources res; 

    private Bitmap bmp; 

    private int bmp_x = 100, bmp_y = 100; 

    private boolean UP, DOWN, LEFT, RIGHT; 

    private int animation_up[] = { 3, 4, 5 }; 

    private int animation_down[] = { 0, 1, 2 }; 

    private int animation_left[] = { 6, 7, 8 }; 

    private int animation_right[] = { 9, 10, 11 }; 

    private int animation_init[] = animation_down; 

    private int frame_count; 

    public MySurfaceView(Context context) { 

        super(context); 

        this.setKeepScreenOn(true); 

        res = this.getResources(); 

        bmp = BitmapFactory.decodeResource(res, R.drawable.enemy1); 

        sfh = this.getHolder(); 

        sfh.addCallback(this); 

        p = new Paint(); 

        p.setColor(Color.YELLOW); 

        p2 = new Paint(); 

        p2.setColor(Color.RED); 

        p.setAntiAlias(true); 

        setFocusable(true);  //備忘1

    } 

    public void surfaceCreated(SurfaceHolder holder) { 

        SH = this.getHeight(); 

        SW = this.getWidth(); 

        th.start(); 

    } 

    public void draw() { 

        canvas = sfh.lockCanvas(); 

        canvas.drawRect(0, 0, SW, SH, p);   //備忘2

        canvas.save();   //備忘3

        canvas.drawText("Himi", bmp_x-2, bmp_y-10, p2); 

        canvas.clipRect(bmp_x, bmp_y, bmp_x + bmp.getWidth() / 13, bmp_y+bmp.getHeight()); 

        if (animation_init == animation_up) { 

            canvas.drawBitmap(bmp, bmp_x - animation_up[frame_count] * (bmp.getWidth() / 13), bmp_y, p); 

        } else if (animation_init == animation_down) { 

            canvas.drawBitmap(bmp, bmp_x - animation_down[frame_count] * (bmp.getWidth() / 13), bmp_y, p); 

        } else if (animation_init == animation_left) { 

            canvas.drawBitmap(bmp, bmp_x - animation_left[frame_count] * (bmp.getWidth() / 13), bmp_y, p); 

        } else if (animation_init == animation_right) { 

            canvas.drawBitmap(bmp, bmp_x - animation_right[frame_count] * (bmp.getWidth() / 13), bmp_y, p); 

        } 

        canvas.restore();  //備忘3

        sfh.unlockCanvasAndPost(canvas); 

    } 

    public void cycle() { 

        if (DOWN) { 

            bmp_y += 5; 

        } else if (UP) { 

            bmp_y -= 5; 

        } else if (LEFT) { 

            bmp_x -= 5; 

        } else if (RIGHT) { 

            bmp_x += 5; 

        } 

        if (DOWN || UP || LEFT || RIGHT) { 

            if (frame_count < 2) { 

                frame_count++; 

            } else { 

                frame_count = 0; 

            } 

        } 

        if (DOWN == false && UP == false && LEFT == false && RIGHT == false) { 

            frame_count = 0; 

        } 

    } 

    @Override 

    public boolean onKeyDown(int key, KeyEvent event) { 

        if (key == KeyEvent.KEYCODE_DPAD_UP) { 

            if (UP == false) { 

                animation_init = animation_up; 

            } 

            UP = true; 

        } else if (key == KeyEvent.KEYCODE_DPAD_DOWN) { 

            if (DOWN == false) { 

                animation_init = animation_down; 

            } 

            DOWN = true; 

        } else if (key == KeyEvent.KEYCODE_DPAD_LEFT) { 

            if (LEFT == false) { 

                animation_init = animation_left; 

            } 

            LEFT = true; 

        } else if (key == KeyEvent.KEYCODE_DPAD_RIGHT) { 

            if (RIGHT == false) { 

                animation_init = animation_right; 

            } 

            RIGHT = true; 

        } 

        return super.onKeyDown(key, event); 

    } 

    /* (non-Javadoc)

     * @see android.view.View#onKeyUp(int, android.view.KeyEvent)

     */ 

    @Override 

    public boolean onKeyUp(int keyCode, KeyEvent event) { 

        if (DOWN) { 

            DOWN = false; 

        } else if (UP) { 

            UP = false; 

        } else if (LEFT) { 

            LEFT = false; 

        } else if (RIGHT) { 

            RIGHT = false; 

        } 

        return super.onKeyUp(keyCode, event); 

    } 

    @Override 

    public void run() { 

        // TODO Auto-generated method stub 

        while (true) { 

            draw(); 

            cycle(); 

            try { 

                Thread.sleep(100); 

            } catch (Exception ex) { 

            } 

        } 

    } 

    @Override 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

        // TODO Auto-generated method stub 

    } 

    @Override 

    public void surfaceDestroyed(SurfaceHolder holder) { 

        // TODO Auto-generated method stub 

    } 

}  

 

 備忘1

 

   此方法是用來綁定按鍵,這裡不同於繼承view,如果是繼承view的畫是不需要綁定按鍵也能自響應事件

 

 備忘2

 

   這裡也是對螢幕進行刷屏操作,其實這也只是一種,之前文章裡我也用到drawRGB的方法同樣實現,當然也可以用fillRect等來刷屏。

 

    那麼這裡我想說下,在繼承view中,因為onDraw方法是系統自動調用的,不像在surfaceview這裡這樣去在run裡面自己去不斷調用,在view中我們可以抵用invalidate()/postInvalidate() 這兩種方法實現讓系統調用onDraw方法,這裡也是和surfaceview中的不同之一!

 

 備忘3

 

   這裡canvas.save();和canvas.restore();是兩個相互匹配出現的,作用是用來儲存畫布的狀態和取出儲存的狀態的。這裡稍微解釋一下,

 

   當我們對畫布進行旋轉,縮放,平移等操作的時候其實我們是想對特定的元素進行操作,比片,一個矩形等,但是當你用canvas的方法來進行這些操作的時候,其實是對整個畫布進行了操作,那麼之後在畫布上的元素都會受到影響,所以我們在操作之前調用canvas.save()來儲存畫布當前的狀態,當操作之後取出之前儲存過的狀態,這樣就不會對其他的元素進行影響

 

源碼:  http://www.bkjia.com/uploadfile/2011/1113/20111113073453808.rar

 

Himi  原創, 轉載請註明! 謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.