(游戏)打飞机01:前言  传送门

(游戏)打飞机02:游戏背景滚动  传送门

(游戏)打飞机03:控制玩家飞机   传送门

(游戏)打飞机04:绘画敌机、添加子弹    传送门

(游戏)打飞机05:处理子弹,击中敌机,添加计分板   传送门

(游戏)打飞机06:后续  传送门

  

程序已放到Github上托管 : 传送门

打飞机游戏效果

游戏中的二级缓存

  android之surfaceView学习:传送门

  制作游戏时,为了时刻渲染游戏场景,涉及到一个实时画图的问题了,对于实时更新UI这个问题,android的UI更新都需要在主线程中更新,但是如果将一个实时绘图的操作放在主线程,必定会出现阻塞主线程的问题,即便是不阻塞主线程,也会降低程序运行的速度

  surfaceView提供了UI线程。可以自己更新UI,因此,这样我们在surfaceView中进行实时的绘画,然后通过更改其中的绘画的数据,既可以实现我们想要的实时的更新UI的这个问题了,并且消耗较小的资源

  

  surfaceCreated:创建时需要执行的操作

  surfaceView:大小改变时需要执行的操作

  surfaceDestroyed:销毁时进行的操作

  

    //视图创建时通知public void surfaceCreated(SurfaceHolder holder) {this.holder = holder;runState = true;//视图创建时开始线程new Thread(this).start();}//界面发生改变的时候通知public void surfaceChanged(SurfaceHolder holder, int i, int i1, int i2) {}//销毁时通知public void surfaceDestroyed(SurfaceHolder holder) {runState = false;}

  线程中的方法

    public void run() {Random ran = new Random();try{while(true) {//获得绘画的画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}}catch (Exception e){}}

  锁住画布时,开始编辑要绘画的内容

             //锁住画布Canvas canvas =  holder.lockCanvas();            

  

  内容绘画好后,开始解锁

              //把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁

 

   制作游戏时,为了时时渲染游戏画面,线程中常用死循环

  while(true) {//锁住画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}

实现效果:

  

package com.example.administrator.myapplication;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import java.util.Random;/*** Created by Administrator on 2018/8/9.*/public class GameView extends SurfaceView implements Runnable, SurfaceHolder.Callback{public GameView(Context context) {super(context);getHolder().addCallback(this);  //注册回调方法
    }private boolean runState = false;private SurfaceHolder holder = null;@Overridepublic void run() {Random ran = new Random();try{while(true) {//获得绘画的画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}}catch (Exception e){}}//视图创建时通知public void surfaceCreated(SurfaceHolder holder) {this.holder = holder;runState = true;new Thread(this).start();}//界面发生改变的时候通知public void surfaceChanged(SurfaceHolder holder, int i, int i1, int i2) {}//销毁时通知public void surfaceDestroyed(SurfaceHolder holder) {runState = false;}}

GameView.java

package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new GameView(this));}}

MainActivity.java

  随之而来有一个问题。产生新线条的时候会让原本存在线条也会发生位置、颜色的改变,这样绘制游戏时这样不仅会产生大量的游戏内存,也容易使玩家造成晕眩效果

  制作游戏常用二级缓存来解决这个问题(减少游戏运行时内存开销!!!)

二级缓存工作机制所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存)。注意:内存缓存会造成堆内存泄露,所有一级缓存通常要严格控制缓存的大小,一般控制在系统内存的1/4。

二级缓存

  

  二级缓存:当游戏需要产生新动画时,不改变原场景游戏画面,只要把新加入的绘画内容先放到二级缓存中,绘画好后从二级缓存取出来绘画到游戏界面上

  运用Bitmap实现二级缓存

        private Bitmap gameBitmap = null;gameBitmap = Bitmap.createBitmap(500,500, Bitmap.Config.ARGB_8888);

  

public void run() {Random ran = new Random();try{while(true) {//获得绘画的画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();Canvas c = new Canvas(gameBitmap);//  p.setColor(Color.WHITE);// c.drawRect(new Rect(0,0,500,500),p);    //白色背景
p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));c.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);canvas.drawBitmap(gameBitmap,0,0,new Paint());//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}}catch (Exception e){}

实现效果:

  产生新线条时,原本绘画线条不会发生改变

二级缓存加载图片

package com.example.administrator.myapplication;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** Created by Administrator on 2018/8/9.*/public class GameView extends SurfaceView implements Runnable, SurfaceHolder.Callback{public GameView(Context context) {super(context);getHolder().addCallback(this);  //注册回调方法
gameBitmap = Bitmap.createBitmap(1200,1024, Bitmap.Config.ARGB_8888);bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a3));bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a4));bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a5));}private List<Bitmap> bitmaps = new ArrayList<Bitmap>();private boolean runState = false;private SurfaceHolder holder = null;private Bitmap gameBitmap = null;@Overridepublic void run() {Random ran = new Random();int index = 0;try{while(true) {//获得绘画的画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();Canvas c = new Canvas(gameBitmap);c.drawBitmap( bitmaps.get(index++),0,0,p);if(index==bitmaps.size()){index=0;}//  p.setColor(Color.WHITE);// c.drawRect(new Rect(0,0,500,500),p);    //白色背景//  p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));//c.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);
canvas.drawBitmap(gameBitmap,0,0,new Paint());//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}}catch (Exception e){}}//视图创建时通知public void surfaceCreated(SurfaceHolder holder) {this.holder = holder;runState = true;new Thread(this).start();}//界面发生改变的时候通知public void surfaceChanged(SurfaceHolder holder, int i, int i1, int i2) {}//销毁时通知public void surfaceDestroyed(SurfaceHolder holder) {runState = false;}}

GameView.java

package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new GameView(this));}}

MainActivity.java

添加图片进二级缓存中

      private List<Bitmap> bitmaps = new ArrayList<Bitmap>();

      bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a3));bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a4));bitmaps.add(BitmapFactory.decodeResource(getResources(),R.drawable.a5));

运行程序时

public void run() {Random ran = new Random();int index = 0;try{while(true) {//获得绘画的画布Canvas canvas =  holder.lockCanvas();Paint p = new Paint();Canvas c = new Canvas(gameBitmap);c.drawBitmap( bitmaps.get(index++),0,0,p);if(index==bitmaps.size()){index=0;}//  p.setColor(Color.WHITE);// c.drawRect(new Rect(0,0,500,500),p);    //白色背景//  p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));//c.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);
canvas.drawBitmap(gameBitmap,0,0,new Paint());//把绘画好的内容提交上去holder.unlockCanvasAndPost(canvas);//解锁Thread.sleep(1000);}}catch (Exception e){}}

转载于:https://www.cnblogs.com/1138720556Gary/p/9451757.html

Android_(游戏)打飞机01:前言相关推荐

  1. Android_(游戏)打飞机04:绘画敌机、添加子弹

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  2. 安卓小游戏:飞机大战

    安卓小游戏:飞机大战 前言 前面写了十二篇自定义view的博客,说实话写的还是有点无聊了,最近调整了一下,觉得还是要对开发有热情,就写了点小游戏,现在抽时间把博客也写一写,希望读者喜欢. 需求 这里就 ...

  3. python飞机大战资料-Python之游戏开发-飞机大战

    Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...

  4. Swing游戏开发——飞机大战

    本章讲解利用javax.swing包下的Swing技术来开发一个飞机大战. 完整源码:https://download.csdn.net/download/JavaFanHuman/12713192 ...

  5. 《Unity Shader入门精要》笔记01 前言

    <Unity Shader入门精要>笔记01 前言 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发 ...

  6. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  7. Python小游戏之 - 飞机大战 !

    用Python写的"飞机大战"小游戏 源代码如下: # coding=utf-8 import random import os import pygame# 用一个常量来存储屏幕 ...

  8. 微信小游戏《飞机打方块》源码分享

    微信小游戏<飞机打方块>源码分享 游戏使用CocosCreator v2.4.2开发 源码:https://gitee.com/propertygame/cocos-creator3.x- ...

  9. [原创]四大开源3d游戏引擎探究(前言上)

    [声明] 本人水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想.程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步. 引擎名称: 1.       ...

最新文章

  1. 注意python函数参数的可变变量的传递
  2. 二分类minst0-1到0-9近似迭代次数公式和准确率公式汇总
  3. window10 mysql5.7 解压版 安装
  4. 工作261:ele-layont布局使用
  5. android activity透明主题,Android应用的全透明效果--Activity及Dialog的全透明
  6. IDEA工具开发必备设置-极大提高开发效率
  7. java 强制走catch_java – IDE强制使用try / catch包围但不抛出异常
  8. niginx之虚拟主机和域名解析
  9. VC2010常见问题的解决方案
  10. 流畅的Python笔记
  11. 李沐-动手学深度学习
  12. 重庆天象网络科技:UI设计的图标概述,新手必看的设计基础
  13. 科技论文写作之时态问题
  14. python读取多张图片_Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片
  15. c语言霍夫变换圆检测,Hough Transform(霍夫变换)检测Circle(圆)的几种方法
  16. Hive3详细教程(四)beeline的使用
  17. 计算机前置usb无法使用,电脑前置usb3.0接口没反应怎么办
  18. 独享服务器做系统,独享服务器的含义与好处
  19. 美丽乡村——大堰镇南溪村
  20. 计算机职业生涯规划书演讲稿,计算机专业职业生涯规划书.doc

热门文章

  1. mklink命令 详细使用
  2. USB TO SPI / USB TO I2C 软件概要 6--- 专业版调试器
  3. PBR物理光照计算公式推导详解
  4. linux查看端口情况
  5. 华为鸿蒙os什么时候应用上线,华为正式发布鸿蒙系统
  6. JS中parentNode和parentElement的区别
  7. java sse_后端向前端推送数据 SSE java
  8. 在线生成彩字在线制作动态特效文字的2个网站
  9. 心理学中寓意很深的的60句话
  10. Linux pinctrl子系统分析之三 数据结构分析