上一篇講過(guò)游戲背景圖的加載以及場(chǎng)景運(yùn)動(dòng)效果草姻,如果還需要了解的請(qǐng)<a href="http://www.reibang.com/p/a87a9ed6a8b2">移駕這里</a>
今天要研究的是游戲主角戰(zhàn)機(jī)的運(yùn)動(dòng)以及邏輯的實(shí)現(xiàn)。
1.創(chuàng)建一個(gè)主角的類(lèi)DrawPlayer虑灰。
package com.tangyx.game.holder;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import com.tangyx.game.R;
import com.tangyx.game.util.BitmapUtils;
import com.tangyx.game.util.ScreenUtils;
import com.tangyx.game.util.SizeUtils;
/**
* Created by tangyx on 2016/12/22.
*
*/
public class DrawPlayer extends DrawGame {
/**
* 主角
*/
private Bitmap mPlayer;
private float mPlayerX;
private float mPlayerY;
/**
* 主角的控制位置
*/
private Bitmap mCollect;
private float mCollectX;
private float mCollectY;
private int mCollectCount;
private Paint mCollectPaint;
/**
* 尾氣噴氣
*/
private Bitmap mPlayerBlow;
private float mSpeedAngle=0.05f;
private float mBlowAngle = 1;
private Matrix mBlowMatrix;
public DrawPlayer(Context context,int player) {
super(context,player);
}
@Override
void initialize(Object... objects) {
mPlayer = BitmapUtils.ReadBitMap(getContext(), (Integer) objects[0]);
int wh = SizeUtils.dp2px(getContext(),20);
mPlayer = BitmapUtils.getBitmap(mPlayer,wh,wh);
mPlayerBlow = BitmapUtils.ReadBitMap(getContext(), R.drawable.playblow0);
mPlayerBlow = BitmapUtils.getBitmap(mPlayerBlow,wh,wh);
mCollect = BitmapUtils.ReadBitMap(getContext(),R.drawable.collect);
wh = SizeUtils.dp2px(getContext(),30);
mCollect = BitmapUtils.getBitmap(mCollect,wh,wh);
int screenW = ScreenUtils.getScreenWidth(getContext());
int screenH = ScreenUtils.getScreenHeight(getContext());
//初始化戰(zhàn)機(jī)的位置
mPlayerX = screenW/2-mPlayer.getWidth()/2;
mPlayerY = screenH-mPlayer.getHeight()-screenH/10;
mCollectX = screenW/2-mCollect.getWidth()/2;
mCollectY = mPlayerY+mPlayer.getHeight()+mCollect.getHeight()/2;
mBlowMatrix = new Matrix();
mCollectPaint = new Paint();
mCollectPaint.setAntiAlias(true);
}
@Override
void onDraw(Canvas canvas) {
mPaint.setAlpha(255);
canvas.drawBitmap(mPlayer,mPlayerX,mPlayerY,mPaint);
canvas.drawBitmap(getBlowAnimation(), (mPlayerX-mPlayerBlow.getWidth()/4),mPlayerY+mPlayerBlow.getHeight()/1.5f,mPaint);
}
/**
* 尾氣噴氣動(dòng)畫(huà)
*/
private Bitmap getBlowAnimation(){
mBlowAngle += mSpeedAngle;
float sx =1.5f;
float sy = mBlowAngle;
mBlowMatrix.reset();
mBlowMatrix.postScale(sx,sy);
if(mBlowAngle>=1.2||mBlowAngle<1){
mSpeedAngle=-mSpeedAngle;
}
return Bitmap.createBitmap(mPlayerBlow,0,0,mPlayerBlow.getWidth(),mPlayerBlow.getHeight(),mBlowMatrix,true);
}
/**
* 繪制操作的位置按鈕
*/
public void onDrawCollect(Canvas canvas,String text){
if(mCollectCount==(Integer.MAX_VALUE-1)){
mCollectCount=0;
}
mCollectPaint.setTextSize(20f);
mCollectCount++;
if(mCollectCount%2==0){
mCollectPaint.setAlpha(0);
}else{
mCollectPaint.setAlpha(255);
}
mCollectX = mPlayerX-(mCollect.getWidth()-mPlayer.getWidth())/2;
mCollectY = mPlayerY+mPlayer.getHeight()+mCollect.getHeight()/2;
canvas.drawBitmap(mCollect,mCollectX,mCollectY,mCollectPaint);
String fire = getContext().getString(R.string.fire);
Rect rect = getTextRect(fire,mCollectPaint);
float tx = mCollectX+(mCollect.getWidth()-rect.width())/2;
float ty = mCollectY+mCollect.getHeight()/2+rect.height()/2;
//點(diǎn)擊這個(gè)地方游戲繼續(xù)
canvas.drawText(fire, tx, ty, mCollectPaint);
int w = ScreenUtils.getScreenWidth(getContext());
int h = ScreenUtils.getScreenHeight(getContext());
mPaint.setTextSize(SizeUtils.sp2px(getContext(),20));
//游戲暫停提示語(yǔ)
rect = getTextRect(text,mPaint);
canvas.drawText(text,(w-rect.width())/2 ,h/3, mPaint);
}
@Override
void updateGame() {
}
public void setPlayerX(float mPlayerX) {
this.mPlayerX = mPlayerX-mPlayer.getWidth()/1.5f;
}
public void setPlayerY(float mPlayerY) {
this.mPlayerY = mPlayerY-mPlayer.getHeight() * 2.5f;
}
public float getCollectX() {
return mCollectX;
}
public float getCollectY() {
return mCollectY;
}
public Bitmap getCollect() {
return mCollect;
}
}
主角戰(zhàn)機(jī)組成部分:飛機(jī)+尾部噴氣+手指操作按鈕钝凶。
1.戰(zhàn)機(jī)部分就跟簡(jiǎn)單,默認(rèn)開(kāi)始坐標(biāo)在屏幕底部中心位置甫何。
canvas.drawBitmap(mPlayer,mPlayerX,mPlayerY,mPaint);
2.因?yàn)槭菓?zhàn)機(jī)出吹,肯定需要尾部火焰噴氣效果嘛,不然不夠炫辙喂。
火焰的位置就是位于戰(zhàn)機(jī)的尾部捶牢,所以前面繪制完成戰(zhàn)機(jī)以后鸠珠,通過(guò)得到戰(zhàn)機(jī)的x,y計(jì)算出噴氣的位置秋麸。
canvas.drawBitmap(getBlowAnimation(), (mPlayerX-mPlayerBlow.getWidth()/4),mPlayerY+mPlayerBlow.getHeight()/1.5f,mPaint);
其中有一個(gè)getBlowAnimation的方法渐排,通過(guò)它實(shí)時(shí)更改火焰圖片的高度來(lái)給人一種噴射的感覺(jué)。
其中主要是通過(guò)Matrix類(lèi)來(lái)完成一些特效灸蟆,這個(gè)類(lèi)也是非常非常非常的重要驯耻,在<a >官網(wǎng)</a>有詳細(xì)的介紹,可自行查看炒考。
3.戰(zhàn)機(jī)是通過(guò)我們用手按住屏幕來(lái)移動(dòng)可缚,所以我們需要提供一個(gè)可操控的位置,操控的位置也是一張圖片斋枢,它的位置一直緊隨著噴氣的底部帘靡,而噴氣是緊隨戰(zhàn)機(jī),所以操作動(dòng)作就是去移動(dòng)戰(zhàn)機(jī)在屏幕的位置瓤帚。
操作按鈕中心就是一個(gè)FIRE的字體描姚,字體和按鈕通過(guò)<a >Paint</a>設(shè)置透明度的變化產(chǎn)生一個(gè)閃爍的效果,并且手離開(kāi)屏幕的時(shí)候操作按鈕就會(huì)出現(xiàn)戈次,并且提示游戲狀態(tài)以及下一步操作轩勘,手按下屏幕的時(shí)候就按鈕就會(huì)消失并且游戲繼續(xù)。
---------我是分割線(xiàn)----------
這里只是把戰(zhàn)機(jī)繪制出來(lái)朝扼,那怎么讓?xiě)?zhàn)機(jī)跟隨我的手指運(yùn)動(dòng)呢赃阀?
回到<b>GameView</b>類(lèi),既然是手勢(shì)操作擎颖,你想到的是什么榛斯?我想到就是實(shí)現(xiàn)onTouchEvent。
1.暫時(shí)給游戲定義三個(gè)狀態(tài)
2.默認(rèn)是游戲加載到可操作狀態(tài)READY搂捧。
當(dāng)游戲可以操作的時(shí)候驮俗,這時(shí)候把手放到操作按鈕的位置(上圖的白色圓圈),就可以變更游戲狀態(tài)為ING允跑。點(diǎn)擊其他位置不做任何變化王凑。
3.手指移動(dòng)變更戰(zhàn)機(jī)的位置x,y聋丝。
4.手離開(kāi)屏幕索烹,游戲進(jìn)入暫停狀態(tài)。
5.在GameView的onGameDraw方法中調(diào)用主角繪制弱睦。
/**
* 繪制內(nèi)容以及更新內(nèi)容
*/
private void onGameDraw(){
if(mCanvas==null)return;
mCanvas.drawColor(Color.WHITE);
//背景
mDrawBackground.onDraw(mCanvas);
mDrawBackground.updateGame();
//主角
mPlayer.onDraw(mCanvas);
mPlayer.updateGame();
//判斷當(dāng)前游戲狀態(tài)
switch (GAME_STATE){
case ING:
break;
case READY:
mPlayer.onDrawCollect(mCanvas,getContext().getString(R.string.reading));
break;
case PAUSE:
mPlayer.onDrawCollect(mCanvas,getContext().getString(R.string.conution));
break;
}
}```
![player.gif](http://upload-images.jianshu.io/upload_images/3982371-222c5de5c612988b.gif?imageMogr2/auto-orient/strip)
主角戰(zhàn)機(jī)的核心思路就是以上部分百姓,最后是提供持續(xù)更新的源碼。
<a >源碼傳送門(mén)</a>
<a href="http://www.reibang.com/p/a87a9ed6a8b2">上一篇</a> <a href="http://www.reibang.com/p/966a3e9d8bdf">下一篇</a>