1. 程式人生 > >實驗五數據結構綜合應用 20162310

實驗五數據結構綜合應用 20162310

運動 auto 範圍 等於 交點 架構 map 獲取 完成

分析系統架構

技術分享圖片

Sprite精靈類

  • ISprite精靈類是所有類的父類

    CombatAircraft戰鬥機類

  • 首先確保戰鬥機完全位於Canvas範圍內,每隔7幀發射單發黃色子彈。

    protected void beforeDraw(Canvas canvas, Paint paint, GameView gameView) {
        if(!isDestroyed()){
            //確保戰鬥機完全位於Canvas範圍內
            validatePosition(canvas);
    
            //每隔7幀發射子彈
            if(getFrame() % 7 == 0){
                fight(gameView);
            }
        }

戰鬥機如果被擊中,執行爆炸效果,具體來說,首先隱藏戰鬥機,然後創建爆炸效果,爆炸用28幀渲染完成,爆炸效果完全渲染完成後,爆炸效果消失。然後戰鬥機會進入閃爍模式,戰鬥機閃爍一定次數後銷毀。

        //在飛機當前還沒有被擊中時,要判斷是否將要被敵機擊中
        if(!collide){
            List<EnemyPlane> enemies = gameView.getAliveEnemyPlanes();
            for(EnemyPlane enemyPlane : enemies){
                Point p = getCollidePointWithOther(enemyPlane);
                if(p != null){
                 //p為戰鬥機與敵機的碰撞點,如果p不為null,則表明戰鬥機被敵機擊中
                    explode(gameView);
                    break;
                }
            }
        }

        //beginFlushFrame初始值為0,表示沒有進入閃爍模式
        //如果beginFlushFrame大於0,表示要在第如果beginFlushFrame幀進入閃爍模式
        if(beginFlushFrame > 0){
            long frame = getFrame();
            //如果當前幀數大於等於beginFlushFrame,才表示戰鬥機進入銷毀前的閃爍狀態
            if(frame >= beginFlushFrame){
                if((frame - beginFlushFrame) % flushFrequency == 0){
                    boolean visible = getVisibility();
                    setVisibility(!visible);
                    flushTime++;
                    if(flushTime >= maxFlushTime){
                        //如果戰鬥機閃爍的次數超過了最大的閃爍次數,那麽銷毀戰鬥機
                        destroy();
                        //Game.gameOver();
                    }
                }
            }

AutolSprite

  • AutoISprite是一個走直線的精靈,其位置只能直上直下,且向下為正。在y軸方向移動speed像素,檢查Sprite是否超出了Canvas的範圍,如果超出,則銷毀Sprite。其中RectF為坐標類,判斷位置。

    //檢查Sprite是否超出了Canvas的範圍,如果超出,則銷毀Sprite
            RectF canvasRecF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());
            RectF spriteRecF = getRectF();
            if(!RectF.intersects(canvasRecF, spriteRecF)){
                destroy();

    敵機類EnemyPlane

  • 敵機類,從上向下沿直線運動。設置一個敵機的抗打擊能力(通俗說是血量)和打一個敵機的得分。敵機在繪制完成後要判斷是否被子彈打中,判斷方法為判斷敵機在坐標軸上是否與子彈相交。若敵機已經沒有能量了,執行爆炸效果。

    //創建爆炸效果,爆炸由敵機中心點開始爆炸
        float centerX = getX() + getWidth() / 2;   // 得到敵機中心坐標
        float centerY = getY() + getHeight() / 2;
        Bitmap bitmap = gameView.getExplosionBitmap();
        Explosion explosion = new Explosion(bitmap);
        explosion.centerTo(centerX, centerY);
        gameView.addSprite(explosion);
    
        //創建爆炸效果完成後,向GameView中添加得分並銷毀敵機
        gameView.addScore(value);
        destroy();

    爆炸類Explosion

  • 爆炸效果類Explosion,可以顯示動態的爆炸效果。爆炸效果由14個片段組成,每個爆炸片段繪制2幀。當繪制完所有的爆炸片段後,銷毀爆炸效果。得到繪制完整爆炸效果需要的幀數,即28幀。

    protected void afterDraw(Canvas canvas, Paint paint, GameView gameView) {
        if(!isDestroyed()){
            if(getFrame() % explodeFrequency == 0){
                //level自加1,用於繪制下個爆炸片段
                level++;
                if(level >= segment){
                    //當繪制完所有的爆炸片段後,銷毀爆炸效果
                    destroy();
                }
            }
        }

    編譯、運行、測試系統

第一步,將碼雲上的代碼克隆下來

技術分享圖片

第二步,編譯,運行

技術分享圖片

修改系統

技術分享圖片

分析數據結構,排序,查找算法的應用

List線性表

  • 主要使用了線性表來獲取處於活動狀態的敵機、存儲所有的精靈等。

    public List<EnemyPlane> getAliveEnemyPlanes(){
    List<EnemyPlane> enemyPlanes = new ArrayList<EnemyPlane>();
    for(ISprite s : sprites){
        if(!s.isDestroyed() && s instanceof EnemyPlane){
            EnemyPlane sprite = (EnemyPlane)s;
            enemyPlanes.add(sprite);
        }
    }
    return enemyPlanes;
    }
  • 將所有敵機存儲在list中,並進行for循環查找是否與戰鬥機有交點。若有交點則戰鬥機摧毀。

     List<EnemyPlane> enemies = gameView.getAliveEnemyPlanes();
            for(EnemyPlane enemyPlane : enemies){
                Point p = getCollidePointWithOther(enemyPlane);
                if(p != null){
                    //p為戰鬥機與敵機的碰撞點,如果p不為null,則表明戰鬥機被敵機擊中
                    explode(gameView);
                    break;
                }
            }

實驗五數據結構綜合應用 20162310