天天看點

3天打造一個 android 小遊戲第一天:小遊戲的簡單準備第二天:技術代碼的實作第三天:思考與總結

竟然是小遊戲…當然越簡單越好了…

遊戲策劃---

遊戲玩法:

玩家隻需要把螢幕裡面見到的人物全部消滅!

<a target="_blank" href="http://blog.51cto.com/attachment/201202/213735480.gif"></a>

1,surfaceview 的用法.

2,遊戲的線程循環.

3,坐标的居中.

人物:

<a href="http://www.famitsu.com/freegame/tool/chibi/index2.html">http://www.famitsu.com/freegame/tool/chibi/index2.html</a>

這個網站可以幫我們生成我們需要的十二宮格人物

<a target="_blank" href="http://blog.51cto.com/attachment/201202/213742502.png"></a>

public class GameViewSurface extends SurfaceView {       

//1,聲明我們的Bitmap對象       

private Bitmap bitmap;       

//2,聲明一個holder對象       

private SurfaceHolder holder;       

//3,聲明用于線程循環的對象       

private GameThread gameThread;       

//4,聲明我們的精靈,下一章節用的       

private List&lt;Sprite&gt; sprites = new ArrayList&lt;Sprite&gt;();             

//5,初始我們的變量       

public GameViewSurface(Context context) {           

super(context);           

gameThread = new GameThread(this);           

holder = getHolder();           

//用于調用運作的線程           

holder.addCallback(new Callback() {                             

@Override              

public void surfaceDestroyed(SurfaceHolder holder) {                               

//1退出時終止我們的run方法                   

boolean retry = true;                 gameThread.setRunning(false);                   

//2等待線程的終止                   

while (retry) {                       

try {                           

gameThread.join();                           

retry = false;                       

} catch (InterruptedException e) {                           

Log.d("sur", "gua le ");                       

}                 }                                 

}               

//添加我們的繪圖線程               

public void surfaceCreated(SurfaceHolder holder) {            

//1,建立精靈                   

createSprites();                   

//2,開始我們的線程                    

gameThread.setRunning(true);                 gameThread.start();                                          

}                             

public void surfaceChanged(SurfaceHolder holder, int format, int width,                       

int height) {                                               

}         });     }        

//建立精靈方法       

private void createSprites() {       

sprites.add(createSprite(R.drawable.bad1)); }       private Sprite createSprite(int resouce) {         bitmap = BitmapFactory.decodeResource(getResources(), resouce);             

return new Sprite(this, bitmap);     }     

//繪圖方法 protected void onDraw(Canvas canvas) {           

//把背景畫成黑色           

canvas.drawColor(Color.BLACK);           

//畫出所有精靈           

for (Sprite sprite : sprites) {               

sprite.onDraw(canvas);         } }       

//點了精靈消失的方法       

//1,控制最後點選的時間       

long lastClick;       

@Override      

public boolean onTouchEvent(MotionEvent event) {           

// 當時間間隔太少不執行以下方法           

if(System.currentTimeMillis() - lastClick &gt; 500){               

lastClick = System.currentTimeMillis();         synchronized (getHolder()) {               

float tX = event.getX();               

float tY = event.getY();               

for(int i = sprites.size() -1; i &gt;=0;i--){                   

Sprite sprite = sprites.get(i);                   

if(sprite.isCollison(tX,tY)){                       

//精靈消失                       

sprites.remove(i);                           break;                   

}             }           

}         }           

return true;     } } 

public class GameThread extends Thread {          private GameView view;            

private boolean running = false;                    public GameLoopThread(GameView view) {                this.view = view;          }                 

public void setRunning(boolean run) {                running = run;          }               @Override           

public void run() {                  

while (running) {                         

Canvas c = null;                         

try {                                

c = view.getHolder().lockCanvas();                                

synchronized (view.getHolder()) {                                       

view.onDraw(c);                              }                       } finally {                                

if (c != null) {                                     view.getHolder().unlockCanvasAndPost(c);                              }                       }                }          }   } 

public class Sprite {          

//圖檔有四行          

private static final int BMP_ROWS = 4;          

//圖檔有三列          

private static final int BMP_COLUMNS = 3;          private int x = 0;           

private int y = 0;            

private int xSpeed = 5;           

private GameSurfaceView gameView;            

private Bitmap bmp;         

//目前片斷          

private int currentFrame = 0;            

private int width;            

private int height;                 

public Sprite(GameSurfaceView gameView, Bitmap bmp) {                  

this.gameView = gameView;                  

this.bmp = bmp;                  

this.width = bmp.getWidth() / BMP_COLUMNS;                  

this.height = bmp.getHeight() / BMP_ROWS;          }                 

private void update() {                  

if (x &gt; gameView.getWidth() - width - xSpeed) {                         

xSpeed = -5;                }                  

if (x + xSpeed &lt; 0) {                         

xSpeed = 5;                }                  

x = x + xSpeed;                  

currentFrame = ++currentFrame % BMP_COLUMNS;          }                 

public void onDraw(Canvas canvas) {                  

update();                

//處理,人物的行走                

int srcX = currentFrame * width;               

//對于人物的動作先不處理                

int srcY = 1 * height;                

//1,畫出我們要矩形                

Rect src = new Rect(srcX, srcY, srcX + width, srcY + height);                

//2,畫到的具體目的                

Rect dst = new Rect(x, y, x + width, y + height);                

//3,畫出..                

canvas.drawBitmap(bmp, src, dst, null);          }     public boolean isCollison(float x2, float y2) {           

//判斷要消失的精靈位置           

return x2 &gt; x &amp;&amp; x2 &lt; x +width &amp;&amp; y2 &gt; y &amp;&amp; y2 &lt; y + height ;     } 

這三個類寫好以後,應該就有這樣的效果

<a target="_blank" href="http://blog.51cto.com/attachment/201202/213749570.gif"></a>

//坐标随機參考代碼   

x = rnd.nextInt(gameView.getWidth() - width);           

y = rnd.nextInt(gameView.getHeight() - height);   

//人物動作參考代碼       

int srcY = getAnimationRow()* height;       

private int getAnimationRow(){           

double dirDouble = (Math.atan2(xSpeed, ySpeed)) / (Math.PI / 2) + 2;           

int direction = (int)Math.round(dirDouble) % BMP_ROWS;           

return direction;     } 

完成的源代碼下載下傳

http://115.com/file/aq7kzhff#

kill_them_all_by_tom.rar

還記得前兩天做的遊戲嗎?那個也能配得叫做做遊戲嗎?沒有華麗的畫面.沒有動聽的音樂,沒有動人的劇情,更沒有好玩的操作,還…

當然,前兩天隻是做一個例子,算不上真正的遊戲,那今天,我們想想什麼才算得上一個遊戲呢?

技術的發展,也同時帶動了遊戲畫面的發展,我們現在做一款FC年代的遊戲畫面的遊戲的話,估計,會被噴子們碰死,”這都啥年代了還做這種遊戲!”(當然,也有例外的情況),這年頭,大家真正願意掏錢購買的遊戲,如果,沒有在第一眼給人以震撼,估計很少人會去購買,這種作品就是我們俗稱的大作,例如,将要發售的戰地3,而那些小遊戲,隻是作為無聊的時候打發時間用的,如果,有标價的話,他們甯願玩另外一款免費的,因為,在他們看來,小遊戲就應該是免費的,無論這個遊戲做得多好.小遊戲的畫面,依然達不到值得他們購買的水準.當然,做得非常好的也會心甘情願的掏錢購買,例如,植物大戰僵屍,水果忍者,憤怒的小鳥等等,不過,要做到這種程度的話…不是可以複制的.(當然…在中國,你隻能看到這些遊戲是免費的…)

一個優秀的想法,也要有足以實作的技術…不然,就像達芬奇那樣…有着天才的想法,卻沒有相應實作的技術…

一個優秀的遊戲,必然有一個好的劇本支撐.你說,俄羅斯方塊這些沒有劇本也很好玩…如果,我告訴你如果加上劇本的話就更好玩了(NDS上有一款馬裡奧俄羅斯方塊),優秀的劇本,可以說得上遊戲的靈魂.

如果,我們做的遊戲想模拟飛行類那樣的操作,估計就隻有那些很少一部分人能夠享受其中的樂趣了.是以,我們在設計我們的遊戲的時候,要針對我們面對的人群,設計出一套最人性化的操作,這點我覺得很重要.

一個遊戲,最關鍵的是什麼?對于,一般玩家來說,應該就是好玩.雖然,他們玩玩說不出為什麼好玩,但是,他們就感覺好玩,然後,他們就會購買你的遊戲,這點,以我目前的水準還不足以闡述清楚.

綜合以上五點:我們能不能改進一下我們前兩天做的遊戲呢?

1,玩法不變,但是,我們可以加上一點遊戲背景

2,在一個晚上,你在睡覺的時候,有一隻蚊子在裡耳旁飛行,你忍無可忍,于是,打開燈,與蚊子進行一番搏鬥.

1,環境的視角設計,

1,用人的身體作為背景(有獵奇的性質)

2,用房間作為背景(普通)

2,追逐蚊子的方式

1,利用手機的重力感應,

2,利用手勢

3,蚊子的死亡與攻擊

1,拍的蚊子以後可以出現一灘鮮血

2,被蚊子咬到的時候,手機震動,或者螢幕變紅

4,蚊子AI的設計

1,蚊子躲避,

2,蚊子咬人的位置

如果,加上以上幾點,那麼前兩天做的遊戲是不是變成煥然一新呢?

PS:以上提到的隻是建議...沒有實作...

本文轉自 liam2199 部落格,原文連結:  http://blog.51cto.com/youxilua/772684 如需轉載請自行聯系原作者

繼續閱讀