飞机大战
以下是程序代码的下载地址:http://download.csdn.net/detail/u010878441/6490515
好了,下面就开始进行游戏的总体设计
游戏的界面主要有三个界面组成,分别为:游戏开始前的准备界面ReadyView,游戏进行时的界面MainView和游戏结束时的界面EndView。
界面视图分别如下:
因为JAVA编程是面向对象的思想,所以我们要对游戏中的对象进行抽象。该游戏中的所有能够移动的物体都可看做是一个对象,它们有共同的属性和方法,如:横坐标、纵坐标、宽度、高度、逻辑方法、绘图方法等。因此我们把它们的所有共同的属性和方法封装成一个抽象的GameObject类,该类将会是游戏中所有对象的父类。
GameObject类:
/*游戏对象类*/
abstract public class GameObject {
protected int currentFrame; // 当前动画帧
protected int speed; // 对象的速度
protected float object_x; // 对象的横坐标
protected float object_y; // 对象的纵坐标
protected float object_width; // 对象的宽度
protected float object_height; // 对象的高度
protected float screen_width; // 屏幕的宽度
protected float screen_height; // 屏幕的高度
protected boolean isAlive; // 判断是否存活
protected Paint paint; // 画笔对象
protected Resources resources; // 资源类
// 构造函数
public GameObject(Resources resources) {
this.resources = resources;
this.paint = new Paint();
}
// 设置屏幕宽度和高度
public void setScreenWH(float screen_width, float screen_height) {
this.screen_width = screen_width;
this.screen_height = screen_height;
}
// 初始化数据//参数分别为:速度增加的倍数,x中心坐标,y中心坐标
public void initial(int arg0,float arg1,float arg2){}
// 初始化图片资源的
protected abstract void initBitmap();
// 对象的绘图方法
public abstract void drawSelf(Canvas canvas);
// 释放资源的方法
public abstract void release();
// 检测碰撞的方法
public boolean isCollide(GameObject obj) {
return true;
}
// 对象的逻辑方法
public void logic(){}
//getter和setter方法
public int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
public float getObject_x() {
return object_x;
}
public void setObject_x(float object_x) {
this.object_x = object_x;
}
public float getObject_y() {
return object_y;
}
public void setObject_y(float object_y) {
this.object_y = object_y;
}
public float getObject_width() {
return object_width;
}
public void setObject_width(float object_width) {
this.object_width = object_width;
}
public float getObject_height() {
return object_height;
}
public void setObject_height(float object_height) {
this.object_height = object_height;
}
public boolean isAlive() {
return isAlive;
}
public void setAlive(boolean isAlive) {
this.isAlive = isAlive;
}
}
接着我们要看下,游戏中对象有玩家控制的飞机、小型的敌机、中型的敌机、大型的敌机、BOSS敌机、单发子弹、双发子弹、BOSS的子弹、导弹物品和子弹物品。所以我们又可以将它们分成:玩家的飞机类(因为玩家飞机的实现和敌机的实现有些不同,所以分开实现)、敌机类EnemyPlane(包括小型的、中型的、大型的和BOSS)、子弹类Bullet和物品类GameGoods,这些游戏对象类都是继承GameObject类。
敌机类EnemyPlane:
/*敌机类*/
public class EnemyPlane extends GameObject{
protected int score; // 对象的分值
protected int blood; // 对象的当前血量
protected int bloodVolume; <span style="white-space:pre"> </span> // 对象总的血量
protected boolean isExplosion; // 判断是否爆炸
protected boolean isVisible; // 对象是否为可见状态
public EnemyPlane(Resources resources) {
super(resources);
// TODO Auto-generated constructor stub
initBitmap(); // 初始化图片资源
}
//初始化数据
@Override
public void initial(int arg0,float arg1,float arg2){
}
// 初始化图片资源
@Override
public void initBitmap() {
// TODO Auto-generated method stub
}
// 对象的绘图函数
@Override
public void drawSelf(Canvas canvas) {
// TODO Auto-generated method stub
}
// 释放资源
@Override
public void release() {
// TODO Auto-generated method stub
}
// 对象的逻辑函数
@Override
public void logic() {
// TODO Auto-generated method stub
}
// 被攻击的逻辑函数
public void attacked(int harm) {
// TODO Auto-generated method stub
}
// 检测碰撞
@Override
public boolean isCollide(GameObject obj) {
return true;
}
// 判断能否被检测碰撞
public boolean isCanCollide() {
// TODO Auto-generated method stub
return false;
}
//getter和setter方法
public int getScore() {
// TODO Auto-generated method stub
return score;
}
public void setScore(int score) {
// TODO Auto-generated method stub
this.score = score;
}
public int getBlood() {
// TODO Auto-generated method stub
return blood;
}
public void setBlood(int blood) {
// TODO Auto-generated method stub
this.blood = blood;
}
public int getBloodVolume() {
// TODO Auto-generated method stub
return bloodVolume;
}
public void setBloodVolume(int bloodVolume) {
// TODO Auto-generated method stub
this.bloodVolume = bloodVolume;
}
public boolean isExplosion() {
// TODO Auto-generated method stub
return isExplosion;
}
}
敌机类增加了分值、血量、两个判断标记属性及其getter和setter方法。
子弹类Bullet:
/*子弹基类*/
public class Bullet extends GameObject{
protected int harm;
public Bullet(Resources resources) {
super(resources);
// TODO Auto-generated constructor stub
initBitmap();
}
@Override
protected void initBitmap() {
// TODO Auto-generated method stub
}
@Override
public void drawSelf(Canvas canvas) {
// TODO Auto-generated method stub
}
@Override
public void release() {
// TODO Auto-generated method stub
}
// 检测碰撞的方法
@Override
public boolean isCollide(GameObject obj) {
return true;
}
//getter和setter方法
public int getHarm() {
// TODO Auto-generated method stub
return harm;
}
public void setHarm(int harm) {
// TODO Auto-generated method stub
this.harm = harm;
}
}
子弹类增加了伤害值及其getter和setter方法。
物品类GameGoods:
/*物品类*/
public class GameGoods extends GameObject{
protected Bitmap bmp;
private int direction; //物品的方向
public GameGoods(Resources resources) {
super(resources);
// TODO Auto-generated constructor stub
initBitmap();
}
// 初始化数据
@Override
public void initial(int arg0,float arg1,float arg2){
}
// 初始化图片资源的
@Override
protected void initBitmap() {
// TODO Auto-generated method stub
}
// 对象的绘图方法
@Override
public void drawSelf(Canvas canvas) {
// TODO Auto-generated method stub
}
// 释放资源的方法
@Override
public void release() {
// TODO Auto-generated method stub
}
// 对象的逻辑函数
@Override
public void logic() {
}
// 检测碰撞
@Override
public boolean isCollide(GameObject obj) { return false;
<span style="white-space:pre"> </span>}
}
玩家的飞机类除了继承GameObject类以外,还要实现一个IMyPlane接口。
IMyPlane接口
public interface IMyPlane {
public float getMiddle_x();
public void setMiddle_x(float middle_x);
public float getMiddle_y();
public void setMiddle_y(float middle_y);
public boolean isChangeBullet();
public void setChangeBullet(boolean isChangeBullet);
//发射子弹的方法
public void shoot(Canvas canvas,List<EnemyPlane> planes);
//初始化子弹的方法
public void initButtle();
//更换子弹的方法
public void changeButtle();
}
玩家飞机类MyPlane:
/*玩家飞机的类*/
public class MyPlane extends GameObject implements IMyPlane{
private float middle_x; // 飞机的中心坐标
private float middle_y;
private long startTime; // 开始的时间
private long endTime; // 结束的时间
private boolean isChangeBullet; // 标记更换了子弹
private Bitmap myplane; // 飞机飞行时的图片
private Bitmap myplane2; // 飞机爆炸时的图片
private List<Bullet> bullets; // 子弹的序列
private MainView mainView;
private GameObjectFactory factory;
public MyPlane(Resources resources) {
super(resources);
// TODO Auto-generated constructor stub
}
public void setMainView(MainView mainView) {
this.mainView = mainView;
}
// 设置屏幕宽度和高度
@Override
public void setScreenWH(float screen_width, float screen_height) {
}
// 初始化图片资源的
@Override
public void initBitmap() {
// TODO Auto-generated method stub
}
// 对象的绘图方法
@Override
public void drawSelf(Canvas canvas) {
// TODO Auto-generated method stub
}
// 释放资源的方法
@Override
public void release() {
// TODO Auto-generated method stub
}
//发射子弹
@Override
public void shoot(Canvas canvas,List<EnemyPlane> planes) {
// TODO Auto-generated method stub
}
//初始化子弹
@Override
public void initButtle() {
// TODO Auto-generated method stub
}
//更换子弹
@Override
public void changeButtle() {
// TODO Auto-generated method stub
}
//判断子弹是否超时
public void isBulletOverTime(){
}
//getter和setter方法
public void setStartTime(long startTime) {
this.startTime = startTime;
}
@Override
public boolean isChangeBullet() {
return isChangeBullet;
}
@Override
public void setChangeBullet(boolean isChangeBullet) {
this.isChangeBullet = isChangeBullet;
}
@Override
public float getMiddle_x() {
return middle_x;
}
@Override
public void setMiddle_x(float middle_x) {
this.middle_x = middle_x;
this.object_x = middle_x - object_width/2;
}
@Override
public float getMiddle_y() {
return middle_y;
}
@Override
public void setMiddle_y(float middle_y) {
this.middle_y = middle_y;
this.object_y = middle_y - object_height/2;
}
}
以上列出的类除GameObject类以外,其它类中的一些方法都省略了其实现,这会在接下来讲的。
android游戏开发——微信打飞机(二):
http://blog.csdn.net/u010878441/article/details/12564871
- 2017.10.25水题大作战题解
- Angular开发实践(四):组件之间的交互
- Leetcode-Easy 70. Climbing Stairs
- Angular开发实践(八): 使用ng-content进行组件内容投射
- Angular开发实践(六):服务端渲染
- Leetcode-Easy 657. Judge Route Circle
- 洛谷P1138 第k小整数
- Leetcode-Easy 796. Rotate String
- 2017.10.23解题报告
- Leetcode-Easy 461.Hamming Distance
- 洛谷P1439 最长公共子序列(LCS问题)
- Leetcode-Easy 575. Distribute Candies
- 洛谷P2115 [USACO14MAR]破坏Sabotage
- 修改nw.js的exe文件使其请求管理员权限
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vue 设置环境变量和模式
- 你真的掌握了Python基本语法了吗?
- Mybatis-Generator 代码生成器的使用
- 提高数据分析工作效率-Sublime如何设置默认打开文件格式
- 使用 freemarker 制作代码生成器
- 假期闲的慌,不如做一点SQL基础练习吧
- Vue 中全局过滤器的使用
- 游戏-CSP201712-2-Java
- Mybatis generator 生成 Mapper 方法不全
- Vue 中使用 JQuery 插件不起作用
- 公共钥匙盒-CSP数组排序练习
- 疫情这么严重,还不待家里学Numpy和Pandas?
- CSP-201812-2-小明放学-Java
- Mac怎么设置docker国内镜像源来加速下载?
- 适合数据分析面试笔试入门的编程题