JustWeEngine - 轻量级游戏框架

An easy open source Android game engine.

Github地址

引擎核心类流程图

使用方法

引入Engine作为Library进行使用。

引擎初步封装完毕

以之开发的微信打飞机游戏Demo:Demo地址

快速入门

1.基础功能

1.1继承引擎核心类:

由于框架全部使用SurfaceView进行绘制,不使用诸如Button、Layout等原生控件,所以应该首先新建类继承引擎核心类Engine,负责游戏的流程,注释中已有明确的标明功能。


public class Game extends Engine {
// 一般在构造函数完成变量的初始化
public Game() {
// 控制debug模式是否开始,debug模式打印日志、帧数、pause次数等信息
super(true); } // 载入一些UI参数和设置屏幕放向,默认背景色,设定屏幕的扫描方式等
@Override
public void init() {
// 初始化UI默认参数,必须调用该方法,其中有一些用于多机型适配的参数需要初始化
UIdefaultData.init(this);
} // 通常用于精灵,背景,图片等物体的设置和载入
@Override
public void load() { } // draw 和 update 在线程中进行不断的循环刷新
// draw 负责绘制 update 负责更新数据和对象信息
@Override
public void draw() { } @Override
public void update() { } // 将touch 事件传回 功能和所设定的屏幕扫描方式有关
@Override
public void touch(MotionEvent event) { } // 将碰撞事件传回 传回精灵和物品的基类
// 用于处理碰撞事件 默认使用矩形碰撞
@Override
public void collision(BaseSub baseSub) { }
}

1.2绘制文字:

使用GamePrinter进行文字绘制,除此以外还有多种方法绘制:


@Override
public void draw() {
Canvas canvas = getCanvas();
GameTextPrinter printer = new GameTextPrinter(canvas);
printer.drawText("哈哈哈", 100, 100);
}

效果图:

1.3绘制图片:

建议图片存放在Asset中:

GameTexture texture = new GameTexture(this);
texture.loadFromAsset("pic/logo.jpg")
texture.draw(canvas, 100, 100);

效果图:

另外也可使用loadFromAssetStripFrame从一个大的图片中取出对应位置的图片。


/**
* get bitmap from a big bitmap
*
* @param filename
* @param x
* @param y
* @param width
* @param height
* @return
*/
public boolean loadFromAssetStripFrame(String filename,
int x, int y,
int width, int height)

比如可以通过这四个参数把这个小飞机取出来:



PicUtils中提供了在Bitmap处理中很有用的各种特效和压缩方法,大家可以一试。

1.4使用精灵:

使用精灵可以使用BaseSprite也可以继承该类使用,BaseSprite封装了很多方法供各种动画使用,这些功能很多都是需要结合动画系统来使用的,动画系统会在后面介绍。

新建精灵:

1.简单初始化:


sprite = new BaseSprite(this);

2.初始化连续帧动画:

连续帧的初始化需要这样的连续帧图片:


GameTexture texture = new GameTexture(this);
texture.loadFromAsset("pic/zombie.png");
// 长宽以及列数
sprite = new BaseSprite(this, 96, 96, 8);
sprite.setTexture(texture);
sprite.setPosition(100, 100);
sprite.setDipScale(100, 100);
// 帧切换动画是关键
sprite.addAnimation(new FrameAnimation(0, 63, 1));
addToSpriteGroup(sprite);

效果图:

3.使用从大图取出的多帧图片:


// 新建图片资源(此图为上图的大图)
GameTexture texture = new GameTexture(this);
texture.loadFromAsset("pic/shoot.png");
// 初始化设定模式和长宽
ship = new BaseSprite(this, 100, 124, FrameType.COMMON);
// 设定资源
ship.setTexture(texture);
// 从大图中取出两帧
ship.addRectFrame(0, 100, 100, 124);
ship.addRectFrame(167, 361, 100, 124);
ship.addAnimation(new FrameAnimation(0, 1, 1));

效果图(两帧图片不断切换):

4.一些重要的其他设定:


// 图片资源
ship.setTexture(texture);
// 大图取帧模式
ship.addRectFrame(0, 100, 100, 124);
// 设定位置
ship.setPosition(x, y);
// 设置dp大小
ship.setDipScale(96, 96);
// 设定dp位置
ship.setDipPosition(x, y);
// 设定透明度
ship.setAlpha(...);
// 只有将精灵添加到SpriteGroup中框架才会自行绘制,否则需要手动调用
addToSpriteGroup(ship);
...

1.5使用按钮:

使用的按钮可以继承BaseButton进行拓展,也可以直接使用TextureButton和TextButton进行使用。

Button设定功能的方式和原生一样,通过设定接口回调的方式进行:


button.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
Log.e("button", "onClick");
}
});

1.TextureButton:


TextureButton button;
// 初始化并设定名字
button = new TextureButton(this, "logo");
texture = new GameTexture(this);
texture.loadFromAsset("pic/logo.jpg");
// 添加图片资源
button.setTexture(texture);
// button的接口回调,不是View的那个接口
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
Log.e("button", "onClick");
}
});
button.setPosition(200, 300);
button.setDipScale(100, 150);
// 添加到ButtonGroup进行绘制和处理
addToButtonGroup(button);

效果图:

结合PicUtil中的各种Bitmap处理方法可以很容易的做出各种样式的Button:

2.TextButton:


TextButton button;
button = new TextButton(this, "logo");
button.setText("刘丰恺");
addToButtonGroup(button);
// 余略见源码
...

效果图:

2.动画系统

目前的动画系统可以使用已经封装好的继承了BaseAnimation的动画,也可以继承BaseAnim进行自我定义动画类进行使用。

2.1绑定在BaseSub物品及精灵基类上的动画类

AnimType中保存了Animation的应用类型。

Animation method function
AliveAnimation adjustAlive(boolean ori) 碰撞检测的时候进行判断存活状态
AlphaAnimation adjustAlpha(int ori) 修改物体透明度
CircleMoveAnimation adjustPosition(Float2 ori) 沿某一圆心进行圆周运动
FenceAnimation adjustPosition(Float2 ori) 使用围栏动画防止出界
FrameAnimation adjustFrame(int ori) 逐帧动画
MoveAnimation adjustPosition(Float2 ori) 位移动画
SpinAnimation adjustRotation(float ori) 旋转动画
ThrobAnimation adjustScale(Float2 ori) 跳跃动画
VelocityAnimation adjustPosition/adjustAlive 线性加速度计
WrapMoveAnimation adjustPosition(Float2 ori) 围栏动画防止出界
ZoomAnimation adjustScale(Float2 ori) 放大缩小动画
待续 ... ...

绑定动画分为两类,ListAnimation和FixedAnimation,ListAnimation将动画存储到固定的一个List中,用于重复更新的动画,

而FixedAnimation存储在Map中,使用名字进行调用,用于点击或者非自动更新的动画。

比如前面精灵类动画的就是添加到ListAnimation。

下面的这种写法就是FixedAnimation,这个动画是小飞机入场,因为只使用了一次,所以使用了FixedAnimation。


ship.addfixedAnimation("start",
new MoveAnimation(UIdefaultData.centerInHorizontalX - ship.getWidthWithScale() / 2,
UIdefaultData.screenHeight - 2 * ship.getHeightWidthScale(), new Float2(10, 10)));

效果图:

2.2绑定在Button上的动画类

BaseButtonAnimation是BaseButton的动画类继承了BaseAnim的动画基类,通过提供Button的状态,设定Button的动画。

Animation method function
ZoomCenterButtonAnim adjustButtonRect(Rect ori,boolean touchType) 按钮放缩动画
ColorAnimation adjustButtonBackGround(int ori,boolean type) TextButton点击变色
待续 ... ...

为Button设定放缩动画:


// 设定中心放缩
button.setZoomCenter(true);
// 三个参数 初始值/放大值/帧数
button.setAnimation(new ZoomCenterButtonAnim(10, 30, 3));

效果图:

为Button设定颜色动画:


// 初始颜色 / 按下颜色
button.setAnimation(
new ColorAnimation(UIdefaultData.colorAccent,
UIdefaultData.colorPressed));

效果图:

3.碰撞检测和死亡判定

只要使用了addToSpriteGroup(sprite)的精灵对象就会自动进行碰撞检测,而对碰撞检测的结果会从

collision中进行发回。


@Override
public void collision(BaseSub baseSub) {
// 获取与之碰撞的对象
BaseSprite other = (BaseSprite) baseSub.getOffender();
// 获取ID分组处理
if (baseSub.getIdentifier() == BULLET &&
other.getIdentifier() == ENEMY) {
// 设定死亡
other.setAlive(false);
// 回收
removeFromSpriteGroup(other);
addToRecycleGroup(other);
}
}

其中getOffender()获得与之碰撞的对象,通过getIdentifier()获取设定的对象分组,实行逻辑判断。

开启Debug模式会看见碰撞线。

效果图:

4.屏幕扫描模式

屏幕扫描模式是用来优先响应屏幕点击、Button点击、和多点触控而设的,放置在不同情况下都能优化屏幕的刷新。


// 检测单一移动
SINGLE,
// 检测Button
BUTTON,
// 多点检测
FULL,
// 单击+Button
SINGLE_BUTTON

5.工具类

  • NetUtils 网络状态工具类
  • PicUtils 图片处理工具类
  • ServiceUtils 服务工具类
  • ImageHelper 图型处理类
  • DisplayUtils 数据转换类
  • SpUtils Sp简化工具类(可存储list和map
  • ValidatorsUtils 正则表达式处理类

有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

License

Copyright 2015 刘丰恺

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

JustWeEngine - 轻量级游戏框架的更多相关文章

  1. 基于cocos2d-x的游戏框架设计——李成

    视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...

  2. Phaser开源2d引擎 javascript/html5游戏框架

    功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash C ...

  3. C#游戏框架uFrame

    C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到 ...

  4. 主流HTML5游戏框架的分析和对比

    本文主要选取了Construct2.ImactJS.LimeJS.GameMaker.CreateJS.lycheeJS.Crafty.three.js.melonJS.Turbulenz.Quint ...

  5. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

  6. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  7. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  8. JS写小游戏(一):游戏框架

    前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...

  9. 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎

    战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...

随机推荐

  1. 基于 jQuery 实现的精致作品集图片导航效果

    今天,我们要用 jQuery 来创建一个作品集图像的导航模板.我们的想法是,以分组的方式显示一组作品集,并通过二维的方式(水平/垂直)来浏览.任一箭头或当前图像下方的小盒子可以作为导航使用. 在线演示 ...

  2. SlidesJS - 老牌的响应式 jQuery 幻灯片插件

    SlidesJS 是一款老牌的 jQuery 幻灯片插件,经过多年的发展,已经成为一款功能齐全,设计精巧的幻灯片插件.支持循环.自动播放功能和淡入淡出过渡效果,并且能够自动生成分页,可以帮助开发者制作 ...

  3. sublime text3 之snippet编写代码片段

    sublime text 3 中有个强大的功能就是可以编写各种文件类型的snippet代码片段,可以节省大量的时间. 文件名为:jekyll-top.sublime-snippet(.sublime- ...

  4. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  5. 如何查找SAP的事务代码清单

    SAP系统中,为了省去输入程序名称等繁琐步骤,SAP提供一种命令,称作‘事务代码’,通过执行事务代码达到快速进入相应程序的目的.那么在系统中如何去查找事务代码,事务代码和程序的对应关系如何呢?我们可以 ...

  6. Android 查看手机中所有进程

    真机测试的时候发现DDMS对进程的显示很不给力,一些进程管理工具又不显示包名. 所以就自己写了一个小程序,查看自己手机中的进程,显示当前时间和进程的包名: 程序运行截图: 布局: <Linear ...

  7. Java继承中的转型及其内存分配

    看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; ...

  8. swift 中手势的使用

    swift 中手势的使用 /**点击手势*/ func tapGestureDemo() { //建立手势识别器 let gesture = UITapGestureRecognizer(target ...

  9. Android 手机卫士--解析json与消息机制发送不同类型消息

    本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址. 1.解析json数据 解析json的代码很简单 JSONObject jso ...

  10. Web应用程序系统的多用户权限控制设计及实现-页面模块【9】

    前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的基本模块-页面模块.页面模块涉及到的数据表为页面表. 1.1页面域 为了更规范和方便后期系统的二次开发和维护 ...