天天看点

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 如需转载请自行联系原作者

继续阅读