《飞机大战》安卓游戏开发源码(三)
為什么80%的碼農都做不了架構師?>>> ??
本文章屬于原創性文章,珍惜他人勞動成果,轉載請注明出處:http://www.pm-road.com/index.php/2014/11/06/161/
?
前言:最 近閑來無事,而且也是因為剛接觸安卓不久,所以萌生了以后在開發web 項目的過程中同樣開發安卓手游,因前一段時間項目需要獨立完成了一款功能型手機app ,該App比較簡單,全是按鈕操作,也就是Activity之間的相互傳值與過渡,所以對安卓的基本知識有了一定了解,在我的印象當中,感覺安卓手游是比 較困難的,但是有困難就要克服,所以有了開發游戲的念頭。
?
接著上一篇文章,把實體類和線程實體類創建之后,我們把代碼和安卓的xml進行整合一下:目前涉及的只有一個MainActivity.java和一個MySurfaceView類,layout 中的xml 目前只一個activity_main.xml 文件
?
按照安卓開發流程,先把MainActivity.java中的代碼補充一下,首先在這個activity中應該有你控制的飛機實體類,還有 MySurfaceView這個類,考慮到可能需要屏幕的高度和寬度,所以還應該有兩個屬性,一個寬度,一個高度:,以下是代碼:但是此activity 繼承了一個BaseActivity(該類沒有做一些具體操作,只是在創建activity的時候,把屏幕全屏化)
?
package com.pm_road.fireair.base;import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager.LayoutParams;/**** @ClassName: BaseActivity* @Description: 基類* @author lipeng* @date 2014-11-4 上午10:46:01**/ public class BaseActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 將游戲界面設置為全屏requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN,LayoutParams.FLAG_FULLSCREEN);}}?
以下是主界面代碼:
?
?
?
package com.pm_road.fireair;import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.ImageButton;import com.pm_road.fireair.base.BaseActivity; import com.pm_road.fireair.bean.YourPlane; import com.pm_road.fireair.common.CommonUtil; import com.pm_road.fireair.view.MySurfaceView;/**** @ClassName: MainActivity* @Description: 空中大戰進口頁面* @author lipeng* @date 2014-11-4 上午10:42:51**/ public class MainActivity extends BaseActivity {// private WelcomeView welcomeView;// 歡迎頁面//這里要解釋一下原因:這里定義了一個飛機圖片,和一個飛機實體類,目的是把飛機的圖片和實體類進行了分離,在界面上移動飛機的時候//只是移動 了該圖片,并未移動飛機,只是在移動圖片的過程中,會把飛機圖片的xY坐標賦值給飛機實體類,(這里的飛機實體類是不可見///的,只是和圖片進行綁定, 獲取坐標而已)// 飛機圖片private ImageButton yourPlanImg;// 控制的飛機實體private YourPlane yourPlane;private MySurfaceView surfaceView;// 上下文private Context context;private int windowHeight;private int windowWidth;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);context = this;setContentView(R.layout.activity_main);/** 初始化頁面 */initView();/** 初始化實體類 */initBean();/** 增加事件 */initListener();/** 初始化子視圖類 */initSubView();}/*** 初始化子視圖*/private void initSubView() {this.addContentView(surfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));Log.i(CommonUtil.TAG, “初始化子視圖”);}/*** 初始化實體類*/private void initBean() {yourPlane = new YourPlane();yourPlane.setLife(CommonUtil.YOUR_PLAN_LIFE);yourPlane.setShot(true);/** 將飛機的位置設置和圖標相同 */setPlanPosition(yourPlanImg);// 初始化surfaceViewsurfaceView = new MySurfaceView(context);// 將其置頂surfaceView.setZOrderOnTop(true);// 控制的飛機surfaceView.setYourPlane(yourPlane);surfaceView.setYourPlaneImg(yourPlanImg);Log.i(CommonUtil.TAG, “初始化實體類”);}/*** 設置飛機的位置** @param view*/private void setPlanPosition(View view) {yourPlane.setX(view.getX());yourPlane.setY(view.getY());Log.i(CommonUtil.TAG, “控制的飛機坐標X:” + view.getX() + “;Y:” + view.getY());}/*** 初始化綁定事件*/private void initListener() {// 飛機綁定事件yourPlanImg.setOnTouchListener(new YourPlaneTouch());Log.i(CommonUtil.TAG, “控制的飛機綁定移動事件”);}/*** 初始化View*/private void initView() {// 初始化飛機圖片,這里涉及一個飛機圖片,這個圖片隨便在網上找一個類似的小飛機就可以,這里我就不上傳了。yourPlanImg = (ImageButton) findViewById(R.id.yourplane);// 得到屏幕高度windowHeight = getResources().getDisplayMetrics().heightPixels;windowWidth = getResources().getDisplayMetrics().widthPixels;Log.i(CommonUtil.TAG, “初始化view”);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {//退出按鈕if ((keyCode == KeyEvent.KEYCODE_BACK)) {Dialog alert = new AlertDialog.Builder(context).setTitle(R.string.exit).setMessage(R.string.sureexit).setPositiveButton(R.string.sure,new ExitListener()).setNeutralButton(R.string.cancel, null).create();// 點擊周邊,不關閉提示框alert.setCanceledOnTouchOutside(false);alert.show();}return super.onKeyDown(keyCode, event);}class ExitListener implements OnClickListener{@Overridepublic void onClick(DialogInterface dialog, int which) {//退出程序之前,將飛機停止射擊yourPlane.setShot(false);finish();}}/**** @ClassName: YourPlaneTouch* @Description: 飛機綁定事件* @author liPeng* @date 2014-11-5 上午11:23:25**/class YourPlaneTouch implements OnTouchListener {int lastX, lastY;@Overridepublic boolean onTouch(View v, MotionEvent event) {int eventAction = event.getAction();switch (eventAction) {case MotionEvent.ACTION_DOWN:lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE:int dx = (int) event.getRawX() – lastX;int dy = (int) event.getRawY() – lastY;int left = v.getLeft() + dx;int top = v.getTop() + dy;int right = v.getRight() + dx;int bottom = v.getBottom() + dy; //在這里進行判斷是防止飛機在托動過程中超出屏幕的范圍if (left < 0) {left = 0;right = left + v.getWidth();}if (right > windowWidth) {right = windowWidth;left = right – v.getWidth();}if (top < 0) {top = 0;bottom = top + v.getHeight();}if (bottom > windowHeight) {bottom = windowHeight;top = bottom – v.getHeight();}v.layout(left, top, right, bottom);lastX = (int) event.getRawX();lastY = (int) event.getRawY();/** 將飛機的位置設置和圖標相同 */setPlanPosition(v);v.postInvalidate();break;case MotionEvent.ACTION_UP:break;}return false;}}}?
以下是surfaceView 的代碼:該代碼做了一個橋梁的作用,用來搭建xml 和線程之間的功能 。
package com.pm_road.fireair.view;import android.content.Context; import android.graphics.PixelFormat; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.widget.ImageButton;import com.pm_road.fireair.bean.YourPlane; import com.pm_road.fireair.common.CommonUtil; import com.pm_road.fireair.thread.PlaneRunnable;public class MySurfaceView extends SurfaceView implements Callback {// 上下文private Context context;// 控制的飛機private YourPlane yourPlane;private ImageButton yourPlaneImg;// 飛機Runnableprivate PlaneRunnable planeRunnable;// 飛機線程private Thread shotThread;private SurfaceHolder holder;public MySurfaceView(Context context) {super(context);this.context = context;holder = getHolder();holder.addCallback(this);// 設置透明度holder.setFormat(PixelFormat.TRANSLUCENT);}/*** 執行線程*/private void threadRun() {// 控制飛機線程planeRunnable = new PlaneRunnable(context,holder);//將控制的飛機綁定到該線程中planeRunnable.setPlane(yourPlane);planeRunnable.setPlaneImg(yourPlaneImg);shotThread = new Thread(planeRunnable);//控制的飛機 開始射擊shotThread.start();Log.i(CommonUtil.VIEW_TAG, “控制的飛機射擊”);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {/** 啟動線程 */threadRun();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (shotThread != null && shotThread.isAlive()) {try {// 當繪圖線程結束后自動銷毀shotThread.join();Log.i(CommonUtil.VIEW_TAG, “射擊線程destroy”);} catch (InterruptedException e) {e.printStackTrace();}}}public YourPlane getYourPlane() {return yourPlane;}public void setYourPlane(YourPlane yourPlane) {this.yourPlane = yourPlane;}public ImageButton getYourPlaneImg() {return yourPlaneImg;}public void setYourPlaneImg(ImageButton yourPlaneImg) {this.yourPlaneImg = yourPlaneImg;}}在activity中涉及了一個Util工具類:代碼如下:主要用來定義一些常量package com.pm_road.fireair.common;public class CommonUtil {/** 飛機生命 */public static final int YOUR_PLAN_LIFE = 5;/** 敵機生命 */public static final int ENEMY_PLAN_LIFE = 5;public static final String TAG = “com.pm_road.fireair.mainActivity”;public static final String VIEW_TAG = “com.pm_road.fireair.view”;public static final String THREAD_TAG = “com.pm_road.fireair.thread”;public static final String BULLET = “o”;}?
完成以上代碼之后:大概的工作也就差不多了,可以使用真機或ADT運行一下:
?
接下來我們就是寫敵機和敵機發射子彈了 《飛機大戰》安卓游戲開發源碼(四)
?
在這里我的運行效果如下:
?
本文章屬于原創性文章,珍惜他人勞動成果,轉載請注明出處:http://www.pm-road.com/index.php/2014/11/06/161/
?
飛機大戰源碼
轉載于:https://my.oschina.net/pmroad/blog/357078
總結
以上是生活随笔為你收集整理的《飞机大战》安卓游戏开发源码(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动终端测试进化论
- 下一篇: java 类的加载、连接和初始化