Android 專案之飛機大戰
首先,我們要建立一個GameSurface()類;我們此次採用的是畫登入介面的方式,所以GameSurface()需要繼承SurfaceView類而且要執行SurfaceHolder.Callback的方法,並且實現其中的沒有完成的方法surfaceChanged、surfaceDestroyed、surfaceCreated、GameSurface。
第二步我們需要建立SurfaceHolder 的物件surfaceHolder,這個是包裝類;再建立畫布類Canvas的物件canvas和畫筆類Paint物件paint並用private修飾。
第三:在GameSurface類中初始化surfaceHolder;再新增回撥函式surfaceHolder = this.getHolder();接著我們初始化畫筆;再新增抗鋸齒paint.setAntiAlias();其中的引數為true。
第四:在surfaceCreated方法中新增一個新的執行緒,在run()方法中寫一個myDraw()方法並用快捷鍵實現。再在myDraw()方法中先將畫布加鎖surfaceHolder.lockCanvas();再判斷畫布是否為空如果不是則將畫布顯示在模擬器上;這是模擬器呈現的是一片黑色的背景。
第五:這時我們需要把製作飛機大戰的圖片拷貝至res中的deawable中;再在GameSurface()中建立bmpMenuBG,Logo:bmplogo,按鈕:bmpButton,文字:bmptext。再用private修飾,基於Bitmap類建立;接著我們在GameSurface()中建立一個方法initBitmap()匯入我們需要的圖片用bmpMenuBG=BitmapFactory.decodeResource(this.getResources(), R.drawable.mainmenu);
其中最後的mainmenu就是我們新增的圖片。 然後我們就可以開始畫了。
我們先建立一個GameMenu()類,將我們需要的頁面背景圖片物件:bmpMenuBG,Logo:bmplogo,按鈕:bmpButton,文字:bmptext。再用private修飾,基於Bitmap類建立
在建立構造方法GameMenu(),封裝我們建立的四個物件。
在建立一個普通的方法myDraw(),其中傳入畫布Canvas的物件canvas和畫筆Paint的物件paint就可以開始”畫”了。
第一步先將畫布背景換成我們需要的背景圖案
用canvas呼叫drawBitmap方法其中需要四個引數第一個是我們第一的背景圖片bmpMenuBG,第二個數字和第三個數字是圖片的位置,由於是背景圖片我們就填兩個0,第四個是畫筆物件paint。
接著我們要把飛機大戰遊戲Logo畫上去,但是現在我們不是背景圖了,所以我們要建立一個Rect()矩形方法物件r,將Logo填在這個矩形中,再將矩形放在畫布上的準確位置。初始化Rect()中也要填寫四個引數分別是矩形左邊距離螢幕左邊的距離、上邊距離螢幕上邊的距離、右邊距離螢幕右邊的距離、下邊距離螢幕下邊的距離。這時這四個引數需要我們好好斟酌。
ps:此次我們用的是小米5splus手機除錯
我們用int定義一個width=canvas.getWidth()來獲取模擬器寬,height=canvas.getHeight()獲取模擬器高;經過除錯在小米5Splus中需要填寫
(50,(int)(height*0.05),width-50,(int)(height*0.3+height*0.15)比較合適(根據手機不通引數不同),再用canvas呼叫drawBitmap
在第一個改為bmplogo物件,第二個引數時填寫null,第三個改為r,第四個依舊是paint。
接著我們畫按鈕先定義一個gao,kuan;再經過除錯gao= (int) (height*0.75);和kuan=width/2-bmpButton.getWidth()/2;;最後用canvas呼叫drawBitmap在第一個改物件bmpButton,第二個引數時填寫kuan,第三個改為gao,第四個依舊是paint。最後我們在按鈕上再加一個印有漢字:開始遊戲1的圖片再次定義gao和kuan,除錯後為gao= (int) (height*0.75)+20;kuan=width/2-bmpButton.getWidth()/2+40;最後用canvas呼叫drawBitmap
在第一個改為bmptext物件,第二個引數時填寫gao,第三個改為kuan,第四個依舊是paint。
至此我們完成了所有程式碼:
`package com.lenovo.myapplication;
import Android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.Surface;
import android.view.SurfaceHolder;
/**
* Created by HuangYong on 2017/5/24.
*/
public class GameMenu {
private Bitmap bmpMenuBG;//選單頁面背景圖片
private Bitmap bmplogo;//選單頁面LOGO
private Bitmap bmpButton;//選單頁面button
private Bitmap bmptext;//選單頁面文字
public GameMenu(Bitmap bmpMenuBG, Bitmap bmplogo, Bitmap bmpButton, Bitmap bmptext) {
this.bmpMenuBG = bmpMenuBG;
this.bmplogo = bmplogo;
this.bmpButton = bmpButton;
this.bmptext = bmptext;
}
public void myDraw(Canvas canvas, Paint paint){
//選單背景
canvas.drawBitmap(bmpMenuBG,0,0,paint);
//畫logo
int width = canvas.getWidth();//獲取螢幕寬
int height=canvas.getHeight();//獲取螢幕高
Rect r = new Rect(50,(int)(height*0.05),width-50,(int)(height*0.3+height*0.15));
int gao= (int) (height*0.10);
int kuan=width/2-bmplogo.getWidth()/2;
canvas.drawBitmap(bmplogo,null,r,paint);
//按鈕
gao= (int) (height*0.75);
kuan=width/2-bmpButton.getWidth()/2;
canvas.drawBitmap(bmpButton,kuan,gao,paint);
//文字
gao= (int) (height*0.75)+20;
kuan=width/2-bmpButton.getWidth()/2+40;
canvas.drawBitmap(bmptext,kuan,gao,paint);
}
}
`
package com.lenovo.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.lenovo.myapplication.R;
/**
* Created by HuangYong on 2017/5/24.
*/
public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;//包裝類
private Canvas canvas;//畫布
private Paint paint;//畫筆
private Bitmap bmpMenuBG;//選單頁面背景圖片
private Bitmap bmplogo;//選單頁面LOGO
private Bitmap bmpButton;//選單頁面button
private Bitmap bmptext;//選單頁面文字
public GameSurface(Context context) {
super(context);
// 初始化surfaceHolder
surfaceHolder = this.getHolder();
// 新增回撥函式
surfaceHolder.addCallback(this);
// 初始化畫筆
paint = new Paint();
paint.setAntiAlias(true); //抗鋸齒
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initBitmap();
new Thread(new Runnable() {
@Override
public void run() {
myDraw();
}
}).start();
}
private void initBitmap() {
// 圖片匯入
bmpMenuBG = BitmapFactory.decodeResource(this.getResources(), R.drawable.mainmenu);
bmplogo = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo);
bmpButton = BitmapFactory.decodeResource(this.getResources(), R.drawable.menustart);
bmptext = BitmapFactory.decodeResource(this.getResources(), R.drawable.starttext);
}
private void myDraw() {
// 畫布加鎖初始化
canvas = surfaceHolder.lockCanvas();
// 初始化遊戲啟動介面
new GameMenu(bmpMenuBG, bmplogo, bmpButton, bmptext).myDraw(canvas, paint);
// 釋放畫布
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
相關文章
- 飛機大戰和javaweb商城專案JavaWeb
- Python飛機大戰Python
- 飛機小專案
- python及pygame雷霆戰機遊戲專案實戰01 控制飛機PythonGAM遊戲
- Java小遊戲——飛機大戰Java遊戲
- 飛機大戰小程式(1)
- 微信5.0 Android版飛機大戰破解無敵模式手記Android模式
- Java實現飛機大戰遊戲Java遊戲
- 基於Flutter Canvas的飛機大戰(一)FlutterCanvas
- 基於Flutter Canvas的飛機大戰(二)FlutterCanvas
- canvas繪製“飛機大戰”小遊戲,真香!Canvas遊戲
- Unity飛機大戰 原始碼 分享 學習Unity原始碼
- 大資料專案實戰之 --- 使用者畫像專案分析大資料
- 飛機型號工程專案管理(轉)專案管理
- tkinter飛機大戰測試程式by李興球
- 微信飛機大戰小遊戲編寫分享(上)遊戲
- Android 大檔案上傳秒傳之實戰篇Android
- Android 專案實戰--手機衛士(實現splash)Android
- 微信demo小遊戲:飛機大戰從無到有遊戲
- Android MVP模式專案實戰AndroidMVP模式
- HTML5遊戲開發(四):飛機大戰之顯示場景和元素HTML遊戲開發
- HTML5遊戲開發(五):飛機大戰之讓所有元素動起來HTML遊戲開發
- cocos2dx實現經典飛機大戰
- [絕對原創] AKM專案軼事之FLYBACK飛機晚點索賠
- python 打飛機專案 ( 基類封裝 )Python封裝
- 13.5-全棧Java筆記:打飛機遊戲實戰專案|KeyEvent|Plane|live全棧Java筆記遊戲
- python 打飛機專案 ( 讓敵機發射子彈 )Python
- 微信小程式開發—專案實戰之聊天機器人微信小程式機器人
- java飛機大戰小遊戲作業二次開發Java遊戲
- Flutter路由專案實戰之fluroFlutter路由
- Docker實戰之執行專案Docker
- <Zhuuu_ZZ>Spark專案實戰-航班飛行網圖分析Spark
- Android:跟著實戰專案學快取策略之LruCache詳談Android快取
- Android:跟著實戰專案學快取策略之DiskLruCache詳談Android快取
- 專案管理的十大挑戰專案管理
- 飛機大戰中rect屬性儲存小數值解釋
- 實戰專案之自動簡歷
- 專案實戰之元件化架構元件化架構