百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Flutter开发游戏初体验,喜大普奔

toyiye 2024-05-19 19:35 19 浏览 0 评论

今天来给大家带来一个更劲爆的知识点——Flutter开发游戏。是的,没错,Flutter也可以用来开发游戏了。有人会问不懂Unity或者Cocos2d也能用Flutter开发游戏吗???是的,你没看错,Flutter就是这么666。

我在pub.dev上面找到了一些有关游戏的第三方开源库,使用它们你就可以轻而易举的实现你的游戏梦(你要说开发王者荣耀、吃鸡那种大型游戏的话就当我前面的话没说)。下面开始今天的干货分享。

添加依赖包

首先在pubspec.yaml 里面添加依赖包,如下所示:

dependencies:
??flutter:
????sdk:?flutter

??flame:?^0.17.2
??box2d_flame:?^0.4.4
??sensors:?^0.4.1+1

在main.dart中添加相关设置要素

接下来看看 main.dart 里面的代码,如下所示:

 1   import?'dart:async';
 2   import?'package:flame/util.dart';
 3   import?'package:flutter/material.dart';
 4   import?'package:flutter/services.dart';
 5   import?'game.dart';
 6
 7   void?main()?async?{
 8?   ?//?启动游戏前要先设置flame的相关属性
 9??   await?setupFlame();
10??   var?game?=?new?FlutterGame();
11??   runApp(game.widget);
12   }
13
14   ///?构建Flame所需要的属性设置
15   Future?setupFlame()?async?{
16??   //?创建?Util对象
17??   var?flameUtil?=?Util();
18??  //?设置全屏
19??await?flameUtil.fullScreen();
20??//?固定为纵向位置,不允许旋转
21??await?flameUtil.setOrientation(DeviceOrientation.portraitUp);
22}

首先解释一下每个包的作用:

//?MD组件
import?'package:flutter/material.dart';

//?我们需要Flame构建游戏
import?'package:flame/util.dart';

//?setupFlame()?方法中需要用到
import?'package:flutter/services.dart';

//?异步支持
import?'dart:async';

//?具体的游戏界面
import?'FlutterGame.dart';

main()函数用了一个async表示异步,因为这涉及到里面的“setupFlame()”函数。setupFlame()函数是一个异步的,它里面主要是构建Flame所需要的属性设置,我们在启动游戏前要先设置flame的相关属性。

setupFlame() 函数里面做了3件事:

● 创建 Util对象

● 设置全屏

● 固定为纵向位置,不允许旋转

游戏部分的代码

接下来看看 game.dart 里面的代码,如下所示:

 1   import?'dart:ui';
 2
 3   import?'package:box2d_flame/box2d.dart';
 4   import?'package:flame/flame.dart';
 5   import?'package:flame/game.dart';
 6
 7   class?FlutterGame?extends?Game?{
 8??   static?const?int?WORLD_POOL_SIZE?=?100;
 9??   static?const?int?WORLD_POOL_CONTAINER_SIZE?=?10;
10
11??   World?world;
12
13   ??final?Vector2?_gravity?=?Vector2.zero();
14
15??   FlutterGame()?{
16???   ?world?=?new?World.withPool(
17??????   _gravity,
18??????   DefaultWorldPool(WORLD_POOL_SIZE,?WORLD_POOL_CONTAINER_SIZE),
19????   );
20????   initialize();
21??   }
22
23??   Future?initialize()?async?{
24????    resize(await?Flame.util.initialDimensions());
25??   }
26
27??   void?resize(Size?size)?{
28????   super.resize(size);
29??   }
30
31??    @override
32?   ?void?render(Canvas?canvas)?{
33??  }
34
35??   @override
36??   void?update(double?t)?{
37??   }
38   }

解释一下上面的代码的意思:

FlutterGame类是具体游戏功能的实现,继承了Flame提供的Game类,所以可以放心大胆的写我们自己的功能,比如游戏循环或者调整大小事件等。Box2D将负责我们所有与物理相关的操作,这包括处理碰撞,加速/减速物体/质量以及模拟我们游戏中的不同形状/材料。

World是主要物理对象。

gravity 设置向量为0 表示无重力(gravity),Vector2你可以把它看做是平面二维坐标系统内的一个点,每个Vector2都有一个X和一个Y值。我们的gravity向量坐标值为(0,0)手机坐标系统左上角为(0,0),上部水平向右x轴正方向,左侧垂直向下位y轴正方向重力设置位(0,1)表示元素从屏幕顶部掉落到底部。

Box2D 需要用到 这两个常量值,这里面定义了两个,分别是:WORLD_POOL_SIZE和WORLD_POOL_CONTAINER_SIZE。

然后使用World.withPool创建World对象。

接下来调用initialize()方法,初始化我们所有需要的东西,包括:需要调整大小和不需要调整大小的东西。然后它的返回值调用Flame的初始化的方法,一旦Flutter准备就绪,立即调用resize()方法检查显示尺寸。

接下来看看几个函数的说明:

● render:在画布上绘制元素。

● update: 目标是60fps的速度进行,这意味着在一秒内将调用该函数60次。由于并不一直是60fps的速度,time参数会告诉你自上次调用以来经过了多少时间。

开启引擎,绘制元素

如果你按照以上步骤都都设置好了,这时候运行程序到你的设备,你会发现是一片黑色或空白的,因为我们还没有绘制任何元素在我们的界面上面。

接下来可以试着画一点东西上去。

新增代码如下所示:

Paint?paint;
Size?screenSize;
Rect?_screenRect;
final?int?scale?=?5;

void?resize(Size?size)?{
??paint?=?Paint();
??paint.color?=?Color(0xffffffff);
??screenSize?=?size;
??_screenRect?=?Rect.fromLTWH(0,?0,?screenSize.width,?screenSize.height);
??super.resize(size);
?}

void?render(Canvas?canvas)?{
??if?(screenSize?==?null)?{
????return;
??}
??canvas.save();
??canvas.scale(screenSize.width?/?scale);
??canvas.translate(_screenRect.width/2,?_screenRect.height/2);
??canvas.drawCircle(Offset(0,?0),?.1,?paint);
??canvas.restore();
??}
}

这里发生的事情如下:

首先声明一个Paint对象,它是画笔,需要它来画一些东西。

screenSize和screenRect分别用于保存屏幕大小和相关的矩形以供以后使用。在resize()方法中,通过调用Flame的相关API,获得了size和Rect,然后再分别赋值给全局变量screenSize和screenRect。

定义一个比例因子(scale)这个变量来增加我们的应用程序中的元素。后面我们在物理交互中需要用到它。

render()函数内部主要是绘制的过程:

设置screenSize属性,确保我们准备好绘制了。然后保存画布。

调用scale()方法,设置缩放。使用屏幕的宽度除以比例因子,screenSize.width / scale,然后作为参数传入scale()方法。

使用translate()方法将画布的(0,0)点移动到屏幕中心位置。

使用drawCircle()方法,我们使用画图对象在(0,0)处绘制半径为0.1的圆

调用restore()方法将完成我们的渲染循环,仅显示一帧。

立即启动应用程序,应在屏幕中心附近绘制一个小圆圈,如下图所示:

最后我们把绘制部分的代码修改一下,加上重力传感器的代码,最终效果是这样的(具体的请进入Github查看源码),如下图所示:

源码及总结

本文的源码来自于GitHub:

https://github.com/Dev-Owl/Mazeball

来一点我的一些个人总结和说明:当然前面这些看似比较基础,但是只要你用心学习,多看看相关API介绍,也可以用它做其它的复杂的的游戏或其他功能,比如:连连看、俄罗斯方块、是男人就下100层、超级玛丽、愤怒的小鸟、接方块、摩拜单车APP的贴纸功能等。当然具体的业务逻辑需要你自己的思考,所有的具体业务功能点都是在核心API的基础之上不断完善的,这里只是给出一些可以研究的相关的方向,感兴趣的朋友们可以试着做一下,这里就不逐个列举了。


最后给大家送一点福利,感谢大家一直以来的支持和鼓励。具体内容大家可以看看这里 ↓

在这里我分享一份私货,自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以点赞+评论+转发关注我,然后私信我【进阶】我发给你

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码