zoukankan      html  css  js  c++  java
  • 3天打造一个 android 小游戏

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

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

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

    游戏策划---

    游戏玩法:

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

    kill7gif

    游戏需要的技术:

    1,surfaceview 的用法.

    2,游戏的线程循环.

    3,坐标的居中.

    素材:

    人物:

    http://www.famitsu.com/freegame/tool/chibi/index2.html

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

    image

    第二天:技术代码的实现

    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 ;
    	}

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

    Kill4gif2

    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:以上提到的只是建议...没有实现...

  • 相关阅读:
    Ubuntu 16.04安装Eclipse
    Ubuntu 16.04安装Maven
    Ubuntu 16.04安装Tomcat 8
    CentOS 7安装过程
    CentOS 6.9安装过程
    Linux磁盘分区方案(转)
    CentOS 6.9使用sudo时出现:“...不在 sudoers 文件中,此事将被报告”的问题解决
    VMware 12安装CentOS 6.9时出现:The centos disc was not found in any of your drives.Please insert the centos disc and press OK to retry
    Ubuntu源码下载方法
    汇编教程书籍收集
  • 原文地址:https://www.cnblogs.com/youxilua/p/2199093.html
Copyright © 2011-2022 走看看