使用JustWeEngine开发微信打飞机:

作者博客: 博客园
引擎地址:JustWeEngine
示例代码:EngineDemo

JustWeEngine?

JustWeEngine是托管在Github 的一个开源的Android原生开发框架,可以让Android的开发人员
非常便捷,无需切换语言和编译器的制作Android原生游戏。

使用方法

  • 引入Engine作为Library进行使用。
  • 引入"/jar"文件夹下的jar包。
  • 使用Gradle构建:
    • Step 1. Add the JitPack repository to your build file
      Add it in your root build.gradle at the end of repositories:
    allprojects {repositories {...maven { url "https://jitpack.io" }}}
    
    • Step 2. Add the dependency
    dependencies {compile 'com.github.lfkdsk:JustWeEngine:v1.01'}
    
  • 使用Maven构建:
    • Step 1. Add the JitPack repository to your build file
    <repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories>
    
    • Step 2. Add the dependency
    <dependency><groupId>com.github.lfkdsk</groupId><artifactId>JustWeEngine</artifactId><version>v1.01</version></dependency>
    

1.Activity继承基类:

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

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

2.添加图片、文字、对象:

2.1 添加文字:

    printer = new GameTextPrinter();printer.setTextColor(Color.BLACK);printer.setTextSize(24);printer.setLineSpaceing(28);

初始化文字绘制printer,并设置颜色尺寸和图片。

@Override
public void draw() {canvas = super.getCanvas();printer.setCanvas(canvas);printer.drawText("Engine demo", 10, 20);
}

在draw中即可绘制。

2.2 使用图片:

首先添加一张大的图片,需要的敌军战机,和可控的飞机都在这张图上。

    GameTexture texture1 = new GameTexture(this);texture1.loadFromAsset("pic/shoot.png");

并且初始化敌人的图片和子弹的图片:

    shoot = new GameTexture(this);shoot.loadFromAsset("pic/flare.png");enemyPic = new GameTexture(this);enemyPic.loadFromAsset("pic/enemy.png");

2.3 对象:

我们要新建一个BaseSprite对象并设置一些基础属性。

    BaseSprite ship;// 新建对象,每张帧图片宽100高124ship = new BaseSprite(this, 100, 124, FrameType.COMMON);// 从刚才的那张图片取出帧ship.setTexture(texture1);// 添加两帧 参数是坐标ship.addRectFrame(0, 100, 100, 124);ship.addRectFrame(167, 361, 100, 124);// 添加动画 在两帧之间不断切换ship.addAnimation(new FrameAnimation(0, 1, 1));// 设定位置ship.setPosition(UIdefaultData.centerInHorizontalX - ship.getWidthWithScale() / 2,UIdefaultData.screenHeight + ship.getHeightWidthScale());// 设定拉伸后的大小ship.setDipScale(96, 96);// 添加固定动画 即小飞机出场ship.addfixedAnimation("start",new MoveAnimation(UIdefaultData.centerInHorizontalX - ship.getWidthWithScale() / 2,UIdefaultData.screenHeight - 2 * ship.getHeightWidthScale(), new Float2(10, 10)));// 设定名称和类别 对象分组ship.setName("SHIP");ship.setIdentifier(SHIP);// 添加到精灵组中addToSpriteGroup(ship);

2.4添加背景:

    GameTexture tex = new GameTexture(this);if (!tex.loadFromAsset("pic/background.png")) {fatalError("Error loading space");}backGround2X = Bitmap.createBitmap(UIdefaultData.screenWidth,UIdefaultData.screenHeight * 2,Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(backGround2X);Rect dst = new Rect(0, 0, UIdefaultData.screenWidth - 1,UIdefaultData.screenHeight);canvas.drawBitmap(tex.getBitmap(), null, dst, null);dst = new Rect(0, UIdefaultData.screenHeight,UIdefaultData.screenWidth,UIdefaultData.screenHeight * 2);canvas.drawBitmap(tex.getBitmap(), null, dst, null);bg_rect = new Rect(0, 0, UIdefaultData.screenWidth,         UIdefaultData.screenHeight);bg_scroll = new Point(0, 0);

这里获取了一张背景图片,并且创建了一张Bitmap包含两份的背景图片,这是为了让背景滚动起来。

2.5生成子弹、敌人:

public void fireBullet() {if (!shoottimer.stopWatch(300)) return;BaseSprite bullet;if (getTypeSizeFromRecycleGroup(BULLET) > 0) {bullet = (BaseSprite) recycleSubFromGroup(BULLET);bullet.clearAllAnimation();removeFromRecycleGroup(bullet);} else {bullet = new BaseSprite(this);bullet.setTexture(shoot);bullet.setDipScale(8, 18);bullet.setIdentifier(BULLET);}double angle = 270.0;float speed = 20.0f;int lifetime = 2500;bullet.addAnimation(new V elocityAnimation(angle, speed,lifetime));bullet.setPosition(ship.s_position.x +ship.getWidthWithScale() / 2- bullet.getWidthWithScale() / 2,ship.s_position.y - 24);bullet.setAlive(true);addToSpriteGroup(bullet);
}private void addEnemy() {BaseSprite enemy;if (getTypeSizeFromRecycleGroup(ENEMY) > 0) {enemy = (BaseSprite) recycleSubFromGroup(ENEMY);enemy.clearAllAnimation();removeFromRecycleGroup(enemy);} else {enemy = new BaseSprite(this);enemy.setTexture(enemyPic);enemy.setIdentifier(ENEMY);enemy.setDipScale(49, 36);}double angle = 90.0;float speed = 5.0f;int lifetime = 5000;enemy.addAnimation(new VelocityAnimation(angle, speed,lifetime));enemy.setPosition(random.nextInt(UIdefaultData.screenWidth),-enemy.getWidthWithScale());enemy.setAlive(true);addToSpriteGroup(enemy);enemyNum++;
}

2.6进行绘制:

更新draw 和 update的方法进行绘制:

@Override
public void draw() {canvas = super.getCanvas();canvas.drawBitmap(backGround2X, bg_rect, bg_rect, paint);printer.setCanvas(canvas);printer.drawText("Engine demo", 10, 20);
}@Override
public void update() {// if (timer.stopWatch(20)) {scrollBackground();}// 进行入场动画if (ship.getFixedAnimation("start").animating) {ship.fixedAnimation("start");} else {// 射击和新建敌人fireBullet();
//      int size = getTypeSizeFromRecycleGroup(ENEMY);
//      if (size > 0)
//      enemyNum -= size;if (enemyTimer.stopWatch(200)) {addEnemy();}}
}

2.7碰撞监测和touch事件:

@Override
public void touch(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_MOVE:offsetX = event.getX() - startX;offsetY = event.getY() - startY;if (Math.abs(offsetX) > Math.abs(offsetY)) {if (ship.s_position.x + offsetX > 0&& ship.s_position.x + offsetX +ship.getHeightWidthScale() < UIdefaultData.screenWidth) {ship.s_position.x += offsetX;resetEvent(event);}} else {if (ship.s_position.y + offsetY > 0&& ship.s_position.y + offsetY +ship.getHeightWidthScale() < UIdefaultData.screenHeight) {ship.s_position.y += offsetY;resetEvent(event);}}break;case MotionEvent.ACTION_DOWN:startX = (int) event.getX();startY = (int) event.getY();break;}
}@Override
public void collision(BaseSub baseSub) {BaseSprite other = (BaseSprite) baseSub.getOffender();if (baseSub.getIdentifier() == BULLET &&other.getIdentifier() == ENEMY) {other.setAlive(false);removeFromSpriteGroup(other);addToRecycleGroup(other);enemyNum--;}
}

2.8滚动背景:

private void resetEvent(MotionEvent event) {startX = (int) event.getX();startY = (int) event.getY();
}public void scrollBackground() {bg_scroll.y += 10.0f;bg_rect.top = bg_scroll.y;bg_rect.bottom = bg_rect.top + UIdefaultData.screenHeight - 1;if (bg_scroll.y + bg_rect.height() > backGround2X.getHeight()) {bg_scroll.y = bg_scroll.y - bg_rect.height();}
}

转载于:https://www.cnblogs.com/lfk-dsk/p/5134340.html

Android原生游戏开发:使用JustWeEngine开发微信打飞机相关推荐

  1. 极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”

    一.背景 鸿蒙的原生开发是无法支持到安卓原生配置的,导致鸿蒙直接嵌入安卓库需要做相应的改造.MobTech作为第三方SDK提供方,有必要为开发者提供更方便的接入解决方案.我们的目标是鸿蒙开发者和安卓开 ...

  2. android 原生游戏加速,享受原生安卓提供不了的开黑体验,OPPO R11全新游戏加速上线!...

    原标题:享受原生安卓提供不了的开黑体验,OPPO R11全新游戏加速上线! 许多人对于OPPO R11的印象,一般都是"拍照好看清晰的双摄手机",或者是"自拍神器&quo ...

  3. hjr-MUD游戏(三):android原生游戏编写

    wifi调试 手机数据线插电脑上,用android studio做IDE,手机和电脑连接到同一个wifi. 下面的xxx.xxx.x.xxx是手机ip,一般在wifi设置里就能看到.terminal里 ...

  4. 微信打飞机小游戏的尝试

    微信打飞机小游戏的尝试 问题:微信打飞机游戏出现不断跳出的问题 原因:未加return. ​

  5. Android原生(Native)C开发

    2019独角兽企业重金招聘Python工程师标准>>> 转载: Android原生(Native)C开发之一 环境搭建篇 转载: Android原生(Native)C开发之二 fra ...

  6. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)

    前篇<献给android原生应用层开发初学者技术架构选型和整合的方案思路(一)> 本篇侧重于安卓创建的创建和后续 demo 中用到的 lib 在 gradle 中的依赖配置,本文假设您已经 ...

  7. Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API

    目录 Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API 一.概述及API 1.JS-SDK是对之前的 WeixinJSBridge 的一个包装 2.JS-SD ...

  8. 视频教程-手机游戏开发 libGDX1.4.1项目实战 微信打飞机-其他

    手机游戏开发 libGDX1.4.1项目实战 微信打飞机 有十年的开发经验和十年的培训经验,熟悉以下技术: 开源技术:struts2.hibernate.mybatis.spring.ejb.jsf. ...

  9. 手机游戏开发 libGDX1.4.1项目实战 微信打飞机-肖师军-专题视频课程

    手机游戏开发 libGDX1.4.1项目实战 微信打飞机-12840人已学习 课程介绍         用libGDX1.4.1版本开发一个微信打飞机游戏 课程收益     从第一步第一行代码开始,到 ...

  10. Android原生(Native)C开发之二 framebuffer篇

    为什么80%的码农都做不了架构师?>>>    Android原生(Native)C开发之二 framebuffer篇 如对Android原生(Natvie)C开发还任何疑问,请参阅 ...

最新文章

  1. spring boot +QQmail
  2. 049_Image图片
  3. slowfast解读:用于计算机视觉视频理解的双模CNN
  4. Mybatis报错 TooManyResultsException
  5. GET_ROLE_BASED_PAGE_USAGES
  6. The type sun.management.ManagementFactory is not visible
  7. Django中使用缓存
  8. 真香!全场景AI计算开源框架MindSpore,我爱了
  9. jQuery EasyUI DataGrid Checkbox 数据设定与取值
  10. echarts画中国地图!
  11. ArcGIS初步 系列视频教程
  12. 计算机化分析原理波涛,证券期货投资计算机化技术分析原理(波涛).pdf.pdf
  13. 《犯罪心理学》读书笔记(part2)--犯罪心理学发展史
  14. 5.计算圆周长和面积的c代码
  15. EXCEL常用技巧总结
  16. java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.Ma
  17. element-ui 级联选择器el-cascader踩坑
  18. MATLAB矩阵基本运算的实现(一)
  19. WEB系列(四)_uploadfile笔记
  20. java基础(1~100以内的质数)

热门文章

  1. vs2015(激活密钥)
  2. Vue3下的视频直播流方法(RTSP和HLS流)
  3. 浅谈欧姆龙system studio和Cx-one软件编程上区别
  4. wps解密excel表格xlsx文件,excel表格xlsx权限密码多少?
  5. 使用61850网关实现modbus和电力iec61850协议的转换
  6. java2wsdl_Java2WSDL之java实现
  7. 求和函数java_java函数求和要怎么写?java求和代码实现
  8. Java学习笔记——StringBuffer类
  9. 知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3
  10. 指纹机和计算机无法连接,指纹考勤系统常见问题及解决办法