3天打造一个 android 小游戏

简介:

十月二日日~十月四日,三天(对前两天没兴趣的,可以直接下拉到第三天)

第一天:小游戏的简单准备

竟然是小游戏…当然越简单越好了…

游戏策划---

游戏玩法:

玩家只需要把屏幕里面见到的人物全部消灭!

游戏需要的技术:

1,surfaceview 的用法.

2,游戏的线程循环.

3,坐标的居中.

素材:

人物:

这个网站可以帮我们生成我们需要的十二宫格人物

第二天:技术代码的实现

1,surfaceView

 
  1. public class GameViewSurface extends SurfaceView {       
  2. //1,声明我们的Bitmap对象       
  3. private Bitmap bitmap;       
  4. //2,声明一个holder对象       
  5. private SurfaceHolder holder;       
  6. //3,声明用于线程循环的对象       
  7. private GameThread gameThread;       
  8. //4,声明我们的精灵,下一章节用的       
  9. private List sprites = new ArrayList();             
  10. //5,初始我们的变量       
  11. public GameViewSurface(Context context) {           
  12. super(context);           
  13. gameThread = new GameThread(this);           
  14. holder = getHolder();           
  15. //用于调用运行的线程           
  16. holder.addCallback(new Callback() {                             
  17. @Override              
  18. public void surfaceDestroyed(SurfaceHolder holder) {                               
  19. //1退出时终止我们的run方法                   
  20. boolean retry = true;                 gameThread.setRunning(false);                   
  21. //2等待线程的终止                   
  22. while (retry) {                       
  23. try {                           
  24. gameThread.join();                           
  25. retry = false;                       
  26. } catch (InterruptedException e) {                           
  27. Log.d("sur""gua le ");                       
  28. }                 }                                 
  29. }               
  30. //添加我们的绘图线程               
  31. @Override              
  32. public void surfaceCreated(SurfaceHolder holder) {            
  33. //1,创建精灵                   
  34. createSprites();                   
  35. //2,开始我们的线程                    
  36. gameThread.setRunning(true);                 gameThread.start();                                          
  37. }                             
  38. @Override              
  39. public void surfaceChanged(SurfaceHolder holder, int format, int width,                       
  40. int height) {                                               
  41. }         });     }        
  42. //创建精灵方法       
  43. private void createSprites() {       
  44. sprites.add(createSprite(R.drawable.bad1)); }       private Sprite createSprite(int resouce) {         bitmap = BitmapFactory.decodeResource(getResources(), resouce);             
  45. return new Sprite(this, bitmap);     }     
  46. //绘图方法 protected void onDraw(Canvas canvas) {           
  47. //把背景画成黑色           
  48. canvas.drawColor(Color.BLACK);           
  49. //画出所有精灵           
  50. for (Sprite sprite : sprites) {               
  51. sprite.onDraw(canvas);         } }       
  52. //点了精灵消失的方法       
  53. //1,控制最后点击的时间       
  54. long lastClick;       
  55. @Override      
  56. public boolean onTouchEvent(MotionEvent event) {           
  57. // 当时间间隔太少不执行以下方法           
  58. if(System.currentTimeMillis() - lastClick > 500){               
  59. lastClick = System.currentTimeMillis();         synchronized (getHolder()) {               
  60. float tX = event.getX();               
  61. float tY = event.getY();               
  62. for(int i = sprites.size() -1; i >=0;i--){                   
  63. Sprite sprite = sprites.get(i);                   
  64. if(sprite.isCollison(tX,tY)){                       
  65. //精灵消失                       
  66. sprites.remove(i);                           break;                   
  67. }             }           
  68. }         }           
  69. return true;     } } 

2,接着就要写我们的game循环的线程

 
  1. public class GameThread extends Thread {          private GameView view;            
  2. private boolean running = false;                    public GameLoopThread(GameView view) {                this.view = view;          }                 
  3. public void setRunning(boolean run) {                running = run;          }               @Override           
  4. public void run() {                  
  5. while (running) {                         
  6. Canvas c = null;                         
  7. try {                                
  8. c = view.getHolder().lockCanvas();                                
  9. synchronized (view.getHolder()) {                                       
  10. view.onDraw(c);                              }                       } finally {                                
  11. if (c != null) {                                     view.getHolder().unlockCanvasAndPost(c);                              }                       }                }          }   } 

3,创建我们的精灵类

 
  1. public class Sprite {          
  2. //图片有四行          
  3. private static final int BMP_ROWS = 4;          
  4. //图片有三列          
  5. private static final int BMP_COLUMNS = 3;          private int x = 0;           
  6. private int y = 0;            
  7. private int xSpeed = 5;           
  8. private GameSurfaceView gameView;            
  9. private Bitmap bmp;         
  10. //当前片断          
  11. private int currentFrame = 0;            
  12. private int width;            
  13. private int height;                 
  14. public Sprite(GameSurfaceView gameView, Bitmap bmp) {                  
  15. this.gameView = gameView;                  
  16. this.bmp = bmp;                  
  17. this.width = bmp.getWidth() / BMP_COLUMNS;                  
  18. this.height = bmp.getHeight() / BMP_ROWS;          }                 
  19. private void update() {                  
  20. if (x > gameView.getWidth() - width - xSpeed) {                         
  21. xSpeed = -5;                }                  
  22. if (x + xSpeed < 0) {                         
  23. xSpeed = 5;                }                  
  24. x = x + xSpeed;                  
  25. currentFrame = ++currentFrame % BMP_COLUMNS;          }                 
  26. public void onDraw(Canvas canvas) {                  
  27. update();                
  28. //处理,人物的行走                
  29. int srcX = currentFrame * width;               
  30. //对于人物的动作先不处理                
  31. int srcY = 1 * height;                
  32. //1,画出我们要矩形                
  33. Rect src = new Rect(srcX, srcY, srcX + width, srcY + height);                
  34. //2,画到的具体目的                
  35. Rect dst = new Rect(x, y, x + width, y + height);                
  36. //3,画出..                
  37. canvas.drawBitmap(bmp, src, dst, null);          }     public boolean isCollison(float x2, float y2) {           
  38. //判断要消失的精灵位置           
  39. return x2 > x && x2 < x +width && y2 > y && y2 < y + height ;     } 

这三个类写好以后,应该就有这样的效果

4,剩下就是让多个精灵随机出现,这个我相信就不多说了,只需要在sprite的构造方法中x,y的坐标随机化就好了,人物的动作就是改变操纵srcY的坐标.

 
  1. //坐标随机参考代码   
  2. x = rnd.nextInt(gameView.getWidth() - width);           
  3. y = rnd.nextInt(gameView.getHeight() - height);   
  4. //人物动作参考代码       
  5. int srcY = getAnimationRow()* height;       
  6. private int getAnimationRow(){           
  7. double dirDouble = (Math.atan2(xSpeed, ySpeed)) / (Math.PI / 2) + 2;           
  8. int direction = (int)Math.round(dirDouble) % BMP_ROWS;           
  9. 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:以上提到的只是建议...没有实现...

本文转自 liam2199 博客,原文链接:  http://blog.51cto.com/youxilua/772684 如需转载请自行联系原作者


相关文章
|
Ubuntu Shell Android开发
微信小游戏跳一跳外挂教程(安卓版)
微信小游戏跳一跳外挂教程(安卓版)
150 0
|
Android开发 计算机视觉 容器
【Android】手撸抖音小游戏潜艇大挑战
Android端高仿抖音热门小游戏,潜艇大挑战
131 0
|
11天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
16天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
18天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
20天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
18天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!