• 用SurfaceView制作简单的android游戏 : 重力小球(完)添加其他类型的障碍物以及胜利画面


    三角形障碍物BarricadeTriangle.java (顶点座标计算原理如上图)

    View Code
    //三角形障碍物,参数为中心点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 (顶点座标计算原理如上图)

    View Code
    //五角星障碍物, 中心点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中添加以下方法跟表示状态的枚举类型

    View Code
    // 输赢的状态
        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循环前面添加以下代码

    View Code
    //如状态不为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改成加入手势识别,长按屏幕就重新开始游戏,按返回键就退出游戏代码如下

    View Code
    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;
        }
    
    }

     最后附上完整代码,点击这里下载.

  • 相关阅读:
    竞赛入门经典 3.2竖式问题
    竞赛入门经典 3-4竖式
    hdu 3547 (polya定理 + 小高精)
    浅入 dancing links x(舞蹈链算法)
    计算阶乘的另一些有趣的算法(转载)
    莫比乌斯反演
    STL的常用用法、函数汇总(不定时更新)
    博弈论的总结
    14年安徽省赛数论题etc.
    CCF 第六次计算机职业认证 第四题 收货 stl动态存储和fleury算法的综合应用
  • 原文地址:https://www.cnblogs.com/tomboy/p/2685842.html
Copyright © 2020-2023  润新知