3天打造一个 android 小游戏
2011-10-04 20:46 youxiachai 阅读(8110) 评论(9) 编辑 收藏 举报十月二日日~十月四日,三天(对前两天没兴趣的,可以直接下拉到第三天)
第一天:小游戏的简单准备
竟然是小游戏…当然越简单越好了…
游戏策划---
游戏玩法:
玩家只需要把屏幕里面见到的人物全部消灭!
游戏需要的技术:
1,surfaceview 的用法.
2,游戏的线程循环.
3,坐标的居中.
素材:
人物:
http://www.famitsu.com/freegame/tool/chibi/index2.html
这个网站可以帮我们生成我们需要的十二宫格人物
第二天:技术代码的实现
1,surfaceView
public class GameViewSurface extends SurfaceView { //1,声明我们的Bitmap对象 private Bitmap bitmap; //2,声明一个holder对象 private SurfaceHolder holder; //3,声明用于线程循环的对象 private GameThread gameThread; //4,声明我们的精灵,下一章节用的 private List<Sprite> sprites = new ArrayList<Sprite>(); //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 "); } } } //添加我们的绘图线程 @Override public void surfaceCreated(SurfaceHolder holder) { //1,创建精灵 createSprites(); //2,开始我们的线程 gameThread.setRunning(true); gameThread.start(); } @Override 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 > 500){ lastClick = System.currentTimeMillis(); synchronized (getHolder()) { float tX = event.getX(); float tY = event.getY(); for(int i = sprites.size() -1; i >=0;i--){ Sprite sprite = sprites.get(i); if(sprite.isCollison(tX,tY)){ //精灵消失 sprites.remove(i); break; } } } } return true; } }
2,接着就要写我们的game循环的线程
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); } } } } }3,创建我们的精灵类
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 > gameView.getWidth() - width - xSpeed) { xSpeed = -5; } if (x + xSpeed < 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 > x && x2 < x +width && y2 > y && y2 < y + height ; }这三个类写好以后,应该就有这样的效果
4,剩下就是让多个精灵随机出现,这个我相信就不多说了,只需要在sprite的构造方法中x,y的坐标随机化就好了,人物的动作就是改变操纵srcY的坐标.
//坐标随机参考代码 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
第三天:思考与总结
还记得前两天做的游戏吗?那个也能配得叫做做游戏吗?没有华丽的画面.没有动听的音乐,没有动人的剧情,更没有好玩的操作,还…
当然,前两天只是做一个例子,算不上真正的游戏,那今天,我们想想什么才算得上一个游戏呢?
1,好的画面,音乐,特效
技术的发展,也同时带动了游戏画面的发展,我们现在做一款FC年代的游戏画面的游戏的话,估计,会被喷子们碰死,”这都啥年代了还做这种游戏!”(当然,也有例外的情况),这年头,大家真正愿意掏钱购买的游戏,如果,没有在第一眼给人以震撼,估计很少人会去购买,这种作品就是我们俗称的大作,例如,将要发售的战地3,而那些小游戏,只是作为无聊的时候打发时间用的,如果,有标价的话,他们宁愿玩另外一款免费的,因为,在他们看来,小游戏就应该是免费的,无论这个游戏做得多好.小游戏的画面,依然达不到值得他们购买的水平.当然,做得非常好的也会心甘情愿的掏钱购买,例如,植物大战僵尸,水果忍者,愤怒的小鸟等等,不过,要做到这种程度的话…不是可以复制的.(当然…在中国,你只能看到这些游戏是免费的…)
2,足以支持第一点的技术
一个优秀的想法,也要有足以实现的技术…不然,就像达芬奇那样…有着天才的想法,却没有相应实现的技术…
3,优秀的剧本
一个优秀的游戏,必然有一个好的剧本支撑.你说,俄罗斯方块这些没有剧本也很好玩…如果,我告诉你如果加上剧本的话就更好玩了(NDS上有一款马里奥俄罗斯方块),优秀的剧本,可以说得上游戏的灵魂.
4,人性化的操作
如果,我们做的游戏想模拟飞行类那样的操作,估计就只有那些很少一部分人能够享受其中的乐趣了.所以,我们在设计我们的游戏的时候,要针对我们面对的人群,设计出一套最人性化的操作,这点我觉得很重要.
5,能够提供给人以好玩的感受
一个游戏,最关键的是什么?对于,一般玩家来说,应该就是好玩.虽然,他们玩玩说不出为什么好玩,但是,他们就感觉好玩,然后,他们就会购买你的游戏,这点,以我目前的水平还不足以阐述清楚.
综合以上五点:我们能不能改进一下我们前两天做的游戏呢?
1,游戏的玩法,剧情,
1,玩法不变,但是,我们可以加上一点游戏背景
2,在一个晚上,你在睡觉的时候,有一只蚊子在里耳旁飞行,你忍无可忍,于是,打开灯,与蚊子进行一番搏斗.
2,设计与相应技术.
1,环境的视角设计,
1,用人的身体作为背景(有猎奇的性质)
2,用房间作为背景(普通)
2,追逐蚊子的方式
1,利用手机的重力感应,
2,利用手势
3,蚊子的死亡与攻击
1,拍的蚊子以后可以出现一滩鲜血
2,被蚊子咬到的时候,手机震动,或者屏幕变红
4,蚊子AI的设计
1,蚊子躲避,
2,蚊子咬人的位置
3,图片,音乐,特效的设计
如果,加上以上几点,那么前两天做的游戏是不是变成焕然一新呢?
PS:以上提到的只是建议...没有实现...
作者:游戏阿柴
出处:http://www.cnblogs.com/youxilua
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微博联系:新浪微博
用支付宝赞助博主:http://me.alipay.com/youxilua