歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android游戲開發教程:手教你寫跳躍類游戲

Android游戲開發教程:手教你寫跳躍類游戲

日期:2017/3/1 10:30:59   编辑:Linux編程

前言:

看了不少Andriod游戲開發方面的博客,發現大多都是講解某一方面的知識,沒有一個完整的開發教程。

所以我就寫了這樣一個系列的博客,完整的描述整個游戲的開發過程。

希望能給大家一點幫助,同時也希望大家能給出好的建議。我們共同學習~

作者只是一個普普通通的andriod初學者,如有錯誤的地方,麻煩聯系我。我會修改的~

好了進入正題:

這是第一篇,裡面涉及到的東西都比較基礎~~~

1.游戲介紹:這次編寫的游戲是一款跳躍類游戲,類似與塗鴉跳躍。我們通過小球觸碰方塊,完成小球的跳躍。我們將在這一列的博客中來實現這款游戲的開發。

2.最終成品展示

這個是程序的最終效果。每個小方塊都有許多運動方式,水平的,垂直的,靜止的,圓周運動的。。。同時每個小方塊都有不同的屬性。有的碰到會消失,有的彈性更好等等。。。具體的設計方法我會後面幾篇文章詳細介紹。童鞋們也可以先自己想想看,怎麼設計這個游戲。

3.這節課主要完成基本框架的搭建:我們采用SurfaceView實現游戲,(View一般用來做那些不需要一直刷新的游戲:如五子棋,連連看之類的)。

SurfaceView默認實現雙緩沖。所以在效率上會高一點。

所謂雙緩沖簡單的理解就是把要畫在屏幕上的圖案,先畫到一張畫布(如Bitmap)上,然後再把這張畫布直接畫到屏幕上,這樣就可以避免閃爍現象。

我們先建一個Android project。

然後建一個GameView。也就是SurfaceView的子類。項目的機構圖:

附上代碼:

GameActivity.java

[java] view plaincopyprint?
  1. package jumpball.game;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.DisplayMetrics;
  5. import android.view.Window;
  6. import android.view.WindowManager;
  7. public class GameActivity extends Activity {
  8. GameView mView;
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. requestWindowFeature(Window.FEATURE_NO_TITLE);// 設置無標題
  12. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  13. WindowManager.LayoutParams.FLAG_FULLSCREEN);// 設置全屏模式
  14. //獲取系統的屏幕屬性
  15. DisplayMetrics dm = new DisplayMetrics();
  16. getWindowManager().getDefaultDisplay().getMetrics(dm);
  17. mView = new GameView(this, dm.widthPixels, dm.heightPixels);
  18. //應用這個布局
  19. setContentView(mView);
  20. }
  21. }
[java] view plaincopyprint?
  1. GameView.java
[java] view plaincopyprint?
  1. package jumpball.game;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.view.SurfaceHolder;
  7. import android.view.SurfaceView;
  8. import android.view.SurfaceHolder.Callback;
  9. //本身就是一個Runnable接口
  10. public class GameView extends SurfaceView implements Callback, Runnable {
  11. public int width, height;
  12. private Canvas mCanvas;
  13. //刷新界面線程
  14. private Thread mThread;
  15. //處理者
  16. private SurfaceHolder mSurfaceHolder;
  17. private boolean mIsRunning = false;
  18. private int TIME_IN_FRAME = 50;
  19. GameActivity gameActivity;
  20. public GameView(Context context, int width, int height) {
  21. super(context);
  22. //setFocusable(true);
  23. //activity是 context的一個子類。
  24. gameActivity = (GameActivity) context;
  25. this.width = width;
  26. this.height = height;
  27. mSurfaceHolder = getHolder();
  28. mSurfaceHolder.addCallback(this);
  29. }
  30. public void mDraw() {
  31. //設置畫布的顏色
  32. mCanvas.drawColor(Color.WHITE);
  33. drawBG(mCanvas);
  34. }
  35. public void drawBG(Canvas mCanvas) {
  36. Paint mPaint = new Paint();
  37. mPaint.setColor(Color.BLACK);
  38. //設置透明度
  39. mPaint.setAlpha(50);
  40. //設置抗鋸齒
  41. mPaint.setAntiAlias(true);
  42. float h = height * 0.01666667f;
  43. for (int i = 0; i < height; i += h) {
  44. mCanvas.drawLine(0, i, width, i, mPaint);
  45. }
  46. }
  47. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  48. int height) {
  49. }
  50. public void surfaceCreated(SurfaceHolder holder) {
  51. mIsRunning = true;
  52. //新建一個刷屏線程
  53. mThread = new Thread(this);
  54. mThread.start();
  55. }
  56. public void surfaceDestroyed(SurfaceHolder holder) {
  57. //銷毀這個,
  58. mIsRunning=false;
  59. }
  60. public void run() {
  61. //決定線程是否繼續執行
  62. while (mIsRunning) {
  63. long startTime = System.currentTimeMillis();
  64. //調用mDraw進行繪制
  65. synchronized (mSurfaceHolder) {
  66. mCanvas = mSurfaceHolder.lockCanvas();
  67. mDraw();
  68. mSurfaceHolder.unlockCanvasAndPost(mCanvas);
  69. }
  70. long endTime = System.currentTimeMillis();
  71. int diffTime = (int) (endTime - startTime);
  72. while (diffTime < TIME_IN_FRAME) {
  73. diffTime = (int) (System.currentTimeMillis() - startTime);
  74. Thread.yield();
  75. }
  76. }
  77. }
  78. }

上一個最終的運行效果圖:

源碼下載地址 http://www.linuxidc.com/Linux/2012-02/54645p4.htm

Copyright © Linux教程網 All Rights Reserved