實驗五數據結構綜合應用 20162310
阿新 • • 發佈:2017-12-18
運動 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