用SurfaceView制作简单的android游戏 : 重力小球(完)--------添加其他类型的障碍物以及胜利画面
三角形障碍物BarricadeTriangle.java (顶点座标计算原理如上图)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//三角形障碍物,参数为中心点x和y, 内切圆半径r public class BarricadeTriangle extends Barricade { public BarricadeTriangle(float x, float y, float r, BConf conf) { super(3, conf); for (int i = 0; i < 3; i++) { _pt[i].x = x + (float) (Math.cos(Math.PI * 2 / 3 * i) * r); _pt[i].y = y + (float) (Math.sin(Math.PI * 2 / 3 * i) * r); } _center.x = x; _center.y = y; } }
五角星障碍物BarricadeStar.java (顶点座标计算原理如上图)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//五角星障碍物, 中心点x和y, 内圆半径inR, 外圆半径outR public class BarricadeStar extends Barricade { private static final float PI2 = (float) (Math.PI * 2); public BarricadeStar(float x, float y, float inR, float outR, BConf conf) { super(10, conf); for (int i = 0; i < 5; i++) { // 内側 _pt[i * 2 + 0].x = (float) (x + Math.cos(PI2 / 5 * i) * inR); _pt[i * 2 + 0].y = (float) (y + Math.sin(PI2 / 5 * i) * inR); // 外側 _pt[i * 2 + 1].x = (float) (x + Math.cos(PI2 / 5 * i + PI2 / 10) * outR); _pt[i * 2 + 1].y = (float) (y + Math.sin(PI2 / 5 * i + PI2 / 10) * outR); } _center.x = x; _center.y = y; } }
然后像添加矩形的一样在barricadeAdd()方法里面添加就可以了(如果不想其旋转只要把最后一个参数变成null就可以)
制作GameOver画面
要制作GameOver画面的话只要修改一下GameMgr.java就可以了
在GameMgr.java中添加以下方法跟表示状态的枚举类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 输赢的状态 private enum eStatus { NORMAL, // normal GAMEOVER, // lose GAMECLEAR// win }; // 初始化状态为normal private eStatus _status = eStatus.NORMAL; // 玩家与障碍物的碰撞检测 private boolean Collision() { Vec vec = new Vec(); final Circle cir = _player.getPt(); for (Barricade barr : _barrList) { Def.eHitCode code = barr.isHit(cir, vec); switch (code) { case OUT: _status = eStatus.GAMEOVER; return true; case GOAL: _status = eStatus.GAMECLEAR; return true; } } return false; } // 在画面上画出胜负状态 private void drawStatus(Canvas c) { switch (_status) { case GAMEOVER: { Paint paint = new Paint(); paint.setTextSize(80); paint.setColor(Color.BLACK); c.drawText("LOSE", 40, 100, paint); } break; case GAMECLEAR: { Paint paint = new Paint(); paint.setTextSize(80); paint.setColor(Color.BLACK); c.drawText("WIN", 40, 100, paint); } break; } }
并在update方法中的for循环前面添加以下代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//如状态不为normal的话则停止更新游戏 if (_status != eStatus.NORMAL) { return true; } // 产生碰撞则停止更新并返回 if (Collision()) { return true; }
最后在onDraw方法的最后添加一句drawStatus(c);就大功告成了
制作胜利画面
而要制作胜利画面, 因为已经有了上面制作GameOver画面的代码
所以只需在GameMgr.java里的barricadeAdd()方法中添加一个表示胜利的障碍物就可以了
// 添加胜利点goal _barrList.add(new BarricadeSquare(25, 430, 25, 25, new BConf(eType.GOAL)));
至此游戏基本制作完成, 但是在碰到障碍物显示胜利或者失败的时候无法重新开始或者结束游戏,
于是把IrairaBarActivity改成加入手势识别,长按屏幕就重新开始游戏,按返回键就退出游戏代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class IrairaBarActivity extends Activity implements GestureDetector.OnGestureListener { //手势识别 private GestureDetector ges; GameSurfaceView _view; @Override protected void onCreate(Bundle savedInstanceState) { // 设置全屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); // 去除标题 requestWindowFeature(Window.FEATURE_NO_TITLE); // 确保屏幕不会自动关闭 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); super.onCreate(savedInstanceState); _view = new GameSurfaceView(this); setContentView(_view); // sensor的初始化 AcSensor.Inst().onCreate(this); //初始化GestureDetector ges = new GestureDetector(this, this); } @Override protected void onResume() { super.onResume(); // 游戏重开时使感应器也重开 AcSensor.Inst().onResume(); } @Override protected void onPause() { super.onPause(); // 游戏暂停时感应器也暂停 AcSensor.Inst().onPause(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 按返回键的话会重新开始 if (keyCode == KeyEvent.KEYCODE_BACK) { this.finish(); return false; } else { return super.onKeyDown(keyCode, event); } } // 手势识别的方法 // 接收触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { ges.onTouchEvent(event); return false; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent e) { _view = new GameSurfaceView(this); setContentView(_view); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } }
最后附上完整代码,点击这里下载.