男人得了hpv有什么症状| 来月经前有褐色分泌物是什么原因| 跑步有什么好处| 花荣的绰号是什么| 花金龟吃什么| 手机流量是什么| 罗飞鱼是什么鱼| 菠萝蜜吃多了有什么坏处| 口是心非是什么动物| 足石念什么| 肾阴阳两虚吃什么中成药| 宫颈是什么| 绩效工资是什么意思| 舌头发麻看什么科| 1997年是什么生肖| 耳前瘘管有什么危害| 便秘吃什么快速通便| belkin是什么牌子| 红景天是什么| fsh是什么激素| 苯磺酸氨氯地平片是什么药| 埋怨是什么意思| b型o型生出来的孩子什么血型| 7.14什么情人节| 小孩子发烧抽搐是什么原因| 冻顶乌龙茶是什么茶| 血小板分布宽度偏低是什么原因| 梦见别人搬家预示什么| 用什么刷牙能使牙齿变白| 百毒不侵是什么意思| 桉字五行属什么| 38线是什么意思| 姜维属什么生肖| 劫财是什么意思| 常字五行属什么| 血糖高会出现什么症状| 坐月子可以吃什么水果| 水痘通过什么途径传染| 后脑勺疼吃什么药| 牛油果树长什么样| 惊艳是什么意思| 窦性心律室性早搏是什么意思| 917是什么星座| 手机cpu是什么| 春梦了无痕是什么意思| 孩子打喷嚏流鼻涕吃什么药| 突然尿多是什么原因| wonderland什么意思| 淋巴结炎吃什么药| 怀孕做nt检查什么| 禀报是什么意思| 莲子和什么搭配最好| 茶寿为什么是108岁| 植入是什么意思| 孔雀蓝是什么颜色| 皮肤过敏用什么药膏| 独角仙长什么样| 月经不调有什么危害| 电磁炉什么牌子好| 耳后有痣代表什么| 小腿酸胀吃什么药| 和合双全是什么生肖| 李世民是什么民族| 胃强脾弱吃什么中成药| 为什么会感冒| sc是什么意思| 脖子右侧疼是什么原因| 猪鬃为什么是战略物资| 附耳是什么意思| 硼砂是什么| 什么宠物好养又干净| 甲亢的早期症状是什么| gl小说是什么意思| 肝火旺盛是什么原因引起的| 口腔溃疡吃什么好得快| 天蝎和什么星座最配对| icu什么意思| 政协委员是干什么的| 腺瘤是什么意思| 始祖是什么意思| 阴道炎吃什么药| 双氯芬酸钠缓释片是什么药| 愤是什么生肖| 466是什么意思| 帝陀表什么档次| 拉姆什么意思| 什么头十足| 开瑞坦是什么药| 女人为什么会喷水| 血沉高忌口什么| 无性婚姻会有什么好处| 智商125是什么水平| 荣字五行属什么| 眼痒用什么眼药水| 为什么一热就头疼| 西酞普兰为什么早晨吃| 腰扭伤用什么药最好| 辣椒代表什么生肖| 炖肉放山楂起什么作用| 出柜是什么意思| 带状疱疹长什么样| 开封有什么大学| 巨蟹座什么性格| 欧巴桑是什么意思| 泡温泉穿什么衣服| o型血容易得什么病| 基础医学是什么| 胸前长痘痘是什么原因| 615是什么星座| 喝什么茶去火排毒祛痘| 炸鸡翅裹什么粉| 逝者如斯夫是什么意思| 唐僧是什么生肖| 奇异是什么意思| 什么人不能吃猪肝| 痔疮是什么样的| 腰的左侧疼是什么原因| 难耐是什么意思| 为什么眼睛会有红血丝| 吃什么容易滑胎流产| 直肠炎吃什么药最好| 小缺血灶是什么意思| 芒种可以种什么菜| 国粹是什么| 土命适合什么颜色| 潮汕立冬吃什么| 科举制什么时候废除| 爽文是什么意思| 白起为什么被赐死| 为什么眼皮一直跳| 卧推60公斤什么水平| 什么是逆向思维| 办理慢性病需要什么手续| 狗上皮过敏是什么意思| 大三阳吃什么药好| 胃不好的人吃什么好| 止语是什么意思| 为什么一喝牛奶就拉肚子| 牙龈出血挂什么科| 泌尿外科主要看什么病| 淋巴结是什么意思| 什么粥最养胃健脾| 五合是什么意思| 临床是什么意思| screenx影厅是什么| 咽炎咳嗽吃什么| pr医学上什么意思| ny什么牌子| 血压低吃什么药见效快| kap是什么意思| 批发零售属于什么行业| 八字桃花是什么意思| 扁平疣是什么原因引起的| 创字五行属什么| 避孕套有什么危害| 双侧筛窦粘膜增厚是什么意思| 浪子回头金不换是什么意思| 突然膝盖疼是什么原因| 2017年属鸡火命缺什么| 羊水透声欠佳什么意思| 什么叫有机| 玫瑰花泡水喝有什么功效| 吃什么能快速补血| 电脑什么时候发明的| lucas是什么意思| 天体是什么| 重庆的市花是什么| 92年什么命| 什么是双减| 什么东西补气血效果最好| 吴佳尼为什么嫁马景涛| 什么是可支配收入| 口臭胃火大吃什么药好| 月经不调是什么原因造成的| 莱卡是什么面料| 鲜黄花菜含有什么毒素| 女生肾疼是什么原因| 沧海桑田什么意思| 12月2日什么星座| 高血压三级是什么意思| 风骚什么意思| 蝙蝠吃什么食物| 新生儿足底采血检查什么项目| 肢体拘挛是什么意思| 龟头责是什么意思| 疣吃什么药能治好| 慧根是什么意思| 孕妇喝什么牛奶对胎儿好| hyc是什么牌子| 高密度脂蛋白低是什么原因| h型高血压什么意思| air是什么牌子| 顶胯是什么意思| 时间观念是什么意思| 腹腔气体多是什么原因| bp是什么职位| 辛是什么味道| 什么样的人不能吃海参| 喻字五行属什么| 小case是什么意思| doosan挖掘机是什么牌子| 秋高气爽是什么意思| 成语一什么不什么| 眼角红肿用什么药| 脚水肿是什么原因| 李时珍的皮是什么意思| 晚上尿多是什么原因| 宫腔积液排出什么颜色| 耳鼻喉科主要看什么病| mlb是什么档次| 眼珠子疼是什么原因| 痛经看什么科| 制动是什么意思| 2月3号是什么星座| 血小板减少吃什么能补回来| 什么颜色加什么颜色等于灰色| 带沉香手串有什么好处| 子宫肌瘤手术后吃什么好| 白细胞高是什么问题| 西装裤配什么上衣| 1962属什么| 降压药什么时候吃最好| 未必是什么意思| 柠檬泡水喝有什么作用| 白蜜是什么| 牙齿脱矿是什么原因| 尿酸高吃什么药降尿酸效果好| 两肺间质性改变是什么意思| 什么油适合高温油炸| 政协是什么| 什么炖鸡好吃| 早上起来手发麻是什么原因| 老虎油是什么意思| 发扬什么词语搭配| 白居易是诗什么| 2001年属什么| igg是什么意思| 北京大学前身叫什么| 冥币是什么意思| 眼睛为什么会长麦粒肿| 生物钟是什么意思| spao是什么牌子| 马云父母是做什么的| 搬家当天有什么讲究| 女人吃葛根粉有什么好处| 刮宫是什么| 韩愈字什么| 秃噜皮是什么意思| 上火引起的喉咙痛吃什么药| 空五行属什么| 8月11号是什么星座| 七月八日是什么星座| lesportsac什么牌子| 什么是内分泌| 瞳孔是什么| 68岁属什么生肖| 龙龟适合什么属相人| 七月十六是什么星座| 头疼是因为什么| 绅士什么意思| 女人做春梦预示着什么| 伊索寓言有什么故事| 头晕头痛吃什么药| 仙人掌有什么作用| 百度

win10系统怎么破解电信光猫 破解电信光猫图文教程

# 注册小游戏账号

  1. 百度 中共中央政治局常委、国务院副总理韩正出席开幕式并致辞。

    前往注册页面注册小程序账号,点击查看流程指引

  2. 选择类目时选择游戏类目,选择游戏类目后,该账号即为小游戏账号(无法更改一级类目,谨慎选择),点击查看流程指引

# 下载开发者工具

前往 开发者工具页面,选择符合当前系统的版本下载

如果想使用最新的特性和能力,请选择【开发版】,如果想使用更稳定的版本,请选择【稳定版】

# 创建小游戏项目

  1. 打开已安装的开发者工具客户端,使用刚刚注册小游戏账号登记的微信账号“扫一扫”扫码即可进入开发环境。

  2. 选择左侧列表中的“小游戏”,然后点击右侧“+”号,开始创建小游戏项目。

  1. 参数填写:创建时有默认的项目名称和目录,可以自行修改合适的项目名称以及本机空目录,下拉选择找到刚注册的小游戏账号的 AppID,勾选【不使用云服务】,可以后面需要使用时再打开

(如果你尚未完成AppID的注册,可以先点击“测试号”,进行体验,“测试号”除了无法验证商业化能力以及无法上传发布,其他功能都可以正常体验)

  1. 均填写完整后点击右下角“创建”按钮,即可完成创建小游戏。

在开发者工具中就能进入小游戏的可视化开发界面了。

如果你想了解开发者工具界面上的各项功能,可以查看开发者工具主界面介绍

# 导入小游戏项目

如果你使用的是UnityCocos 或者 Laya等游戏引擎进行开发,在游戏引擎侧就能导出小游戏代码包,通过面板中的【导入】,选择对应的文件夹目录打开即可

注意:小游戏项目文件夹是必定有project.config.json文件的,例如 Unity 导出的项目结构包含了 minigame 和 webgl 这 2 个文件夹,需要选择 minigame 文件夹进行导入

# 小游戏项目结构

├── game.js
├── game.json
├── project.config.json
└── project.private.config.json

小游戏核心的目录结构主要以以上 4 个文件为主

project.config.jsonproject.private.config.json是项目配置文件,是项目编辑时的配置,具体字段详情点击查看配置介绍

game.json是游戏的配置文件,是游戏运行时的配置,具体字段详情点击查看配置介绍

game.js是游戏执行逻辑的主入口,示例项目中的其他代码和资源均为game.js的引用

注意:如果在project.config.json中配置了miniprogramRoot,则game.jsgame.json可以和project.config.json不在同一级目录中

例如创建项目时选择了【微信云开发】模板,则目录结构为

├── cloudfunction
├── miniprogram
│   ├── game.js
│   ├── game.json
├── project.config.json
└── project.private.config.json

# 学习飞机游戏示例

注意:小游戏创建项目默认创建的飞机游戏示例,本质上是一个 Canvas2D 游戏,本文只提供一个游戏开发的思路讲解,并不推荐在线上环境中使用该示例,我们更推荐使用UnityCocos 或者 Laya等游戏引擎进行小游戏开发

我们创建的小游戏项目的初始目录结构如下:

├── audio                                      // 音频资源
├── images                                     // 图片资源
├── js
│   ├── base
│   │   ├── animatoin.js                       // 帧动画的简易实现
│   │   ├── pool.js                            // 对象池的简易实现
│   │   └── sprite.js                          // 游戏基本元素精灵类
│   ├── libs
│   │   └── tinyemitter.js                     // 事件监听和触发
│   ├── npc
│   │   └── enemy.js                           // 敌机类
│   ├── player
│   │   ├── bullet.js                          // 子弹类
│   │   └── index.js                           // 玩家类
│   ├── runtime
│   │   ├── background.js                      // 背景类
│   │   ├── gameinfo.js                        // 用于展示分数和结算界面
│   │   └── music.js                           // 全局音效管理器
│   ├── databus.js                             // 管控游戏状态
│   ├── main.js                                // 游戏入口主函数
│   └── render.js                              // 基础渲染信息
├── .eslintrc.js                               // 代码规范
├── game.js                                    // 游戏逻辑主入口
├── game.json                                  // 游戏运行时配置
├── project.config.json                        // 项目配置
└── project.private.config.json                // 项目个人配置

在开发者工具中运行游戏,可以看到一个飞机发射子弹,子弹击打敌机后得分的游戏。接下来,我们简单讲解一下该游戏示例的实现思路:

# 实现思路

该小游戏示例是一个 Canvas2D 飞机游戏,通过微信 API来实现游戏的交互逻辑。

  • 注意:如果你想以 Web 开发的风格写小游戏代码,可以通过引入weapp-adapter来实现。

我们从项目的主入口game.js只引用了js/main.js,主要的游戏逻辑都来自Main这个类中。

Main这个类实现了一个简单的游戏框架,包含了游戏的初始化、重启、敌机生成、碰撞检测、渲染、更新逻辑和主循环等功能。通过这些功能,游戏能够在 Canvas 上动态运行并响应用户的输入。

我们解读一下本示例游戏中几个关键的游戏逻辑构成

# 1. 初始化Canvas

canvas = wx.createCanvas(); // 创建Canvas画布
ctx = canvas.getContext("2d"); // 获取canvas的2D绘图上下文

我们需要绘制画面到屏幕上,首选需要创建一个 Canvas,并获取 Canvas 的 2D 渲染上下文,用于绘制图形。

如果你有引入 weapp-adapter,在 weapp-adapter 中默认会创建一个 Canvas 做为主屏 Canvas

wx.createCanvas()有一个规则:首次调用创建的是显示在屏幕上的画布,之后调用创建的都是离屏画布。

# 2. 游戏初始化

import Player from './player/index'; // 导入玩家类
import Enemy from './npc/enemy'; // 导入敌机类
// ...

export default class Main {
  bg = new BackGround(); // 创建背景
  player = new Player(); // 创建玩家
  gameInfo = new GameInfo(); // 创建游戏UI信息显示

  constructor() {
    // 当开始游戏被点击时,重新开始游戏
    this.gameInfo.on("restart", this.start.bind(this));
    // 开始游戏
    this.start();
  }

  start() {
    GameGlobal.databus.reset(); // 重置数据
    this.player.init(); // 重置玩家状态
    window.cancelAnimationFrame(this.aniId); // 清除上一局的动画
    this.aniId = window.requestAnimationFrame(this.loop.bind(this)); // 开始新的动画循环
  }
}

我们通过模块导入语句引入了游戏中使用的不同模块,包括玩家、敌机、背景、游戏信息、音乐和数据。

在初始化Main类时,我们在类属性中创建了一些必要的实例,例如背景、玩家和游戏用户界面(UI)。

Main的构造函数中,我们设置了对游戏 UI 中restart按钮点击事件的监听,以便于重新开始新一局游戏。同时,还主动调用start方法以启动游戏。

# 3. 游戏帧循环

  loop() {
    this.update(); // 更新游戏逻辑
    this.render(); // 渲染游戏画面
    // 请求下一帧动画
    this.aniId = requestAnimationFrame(this.loop.bind(this));
  }

  update() {
    // ...
    this.bg.update(); // 更新背景
    this.player.update(); // 更新玩家
    GameGlobal.databus.bullets.forEach((item) => item.update()); // 更新所有子弹
    GameGlobal.databus.enemys.forEach((item) => item.update()); // 更新所有敌机
    this.enemyGenerate(); // 生成敌机
    this.collisionDetection(); // 检测碰撞
  }

  render() {
    ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布

    this.bg.render(ctx); // 绘制背景
    this.player.render(ctx); // 绘制玩家飞机
    GameGlobal.databus.bullets.forEach((item) => item.render(ctx)); // 绘制所有子弹
    GameGlobal.databus.enemys.forEach((item) => item.render(ctx)); // 绘制所有敌机
    this.gameInfo.render(ctx); // 绘制游戏UI
  }

游戏帧循环是游戏运行过程中的核心概念。

loop() 方法是游戏的主循环,负责更新游戏状态并渲染画面。通过requestAnimationFrame,我们实现了流畅的动画效果。每个游戏帧循环都会调用loop函数,以计算游戏逻辑并绘制游戏画面。

update() 方法主要用于计算和更新游戏状态,包括背景、玩家、子弹和敌机的位置,生成敌机,以及检测碰撞等。

render() 方法负责绘制所有游戏元素,包括背景、玩家、敌机、子弹、动画和分数,并处理游戏结束时的逻辑。

# 4. 数据和状态管理

维护游戏的当前状态和记录游戏数据至关重要,因为这些数据决定了游戏的进度和需要展示的 UI 信息。

在本示例中,我们通过DataBus类来管理游戏的状态和数据,记录用户的分数,判断游戏是否结束。在游戏帧循环的updaterender阶段,都会根据当前的数据进行逻辑判断和调整。

# 5. 游戏对象管理

在游戏开发中,Sprite是一个非常重要的概念,通常指的是在2D图形中使用的图像或动画的单个对象,是游戏对象的基本单元。

我们在Main类中管理游戏中的各种对象,如玩家、敌机、子弹等,负责它们的创建、更新、绘制、销毁等。

如果你已阅读了示例源码的话,可以发现玩家、敌机、子弹等都继承自Sprite这个游戏精灵类,并且每个游戏对象都有独立的updaterender方法,方便进行统一的管理和维护。

# 6. 增加交互

通过绑定触摸事件或者监听陀螺仪等微信API提供的交互方式,可以允许玩家与游戏进行互动。

在本示例中,我们希望用户和飞机进行交互,我们在js/player/index.js中,通过wx.onTouchStart()wx.onTouchMove()wx.onTouchEnd()wx.onTouchCancel()这几个监听触摸事件,来判断用户是否与屏幕交互,当用户的手指在 Player 这个飞机上进行按住并拖动时,可以实现飞机跟随的手指移动的效果。

跟随拖动的原理是:当手指按住时,我们通过checkIsFingerOnAir判断是否按在了飞机的区域,当手指拖动时,判断是否已经按住,然后根据wx.onTouchMove中获取的屏幕上按住的xy坐标的位置,重新计算飞机的xy的位置,当下一次render时,会根据最新的xy进行渲染,屏幕上的飞机也就跟着移动了。

# 7. 增强反馈

合理的增加游戏中的动画,音乐,音效,震动等,可以增强游戏的沉浸感。

在本示例中,当敌机和子弹发生碰撞时,会播放一个爆炸动画,并同时播放音效震动,具体代码可以查看js/npc/enemy.js中的destroy部分

# 8. 总结

游戏开发有几个重要的考虑因素,例如设计好架构以确保代码的模块化和可扩展性,管理好游戏状态和数据,管理好游戏对象等等。

如果你熟悉了这些基本的概念,我们更推荐你直接阅读游戏引擎的开发文档。游戏引擎已经对上述讲的一些基础都做好了封装,可以即开即用。例如在Unity中,你可以直接在层级面板右键创建3D对象或者Image对象,无需自己封装对象和处理帧循环。

使用游戏引擎的好处在于,它们提供了丰富的工具和功能,帮助开发者快速实现创意。引擎通常包含物理引擎、动画系统、音效管理等模块,使得开发者可以专注于游戏的创意和设计,而不是底层的技术细节。

游戏引擎还支持可视化编辑,允许开发者通过拖拽和配置来构建场景和角色,这种直观的方式也降低了开发门槛。

总之,不管你是选择自行封装组件还是使用游戏引擎进行开发,充分利用好各种工具,发挥想象力,将你的创意转化为现实,创造更多有趣的小游戏。

了解更多内容可以查看学习进阶指南

点击咨询小助手
vb是什么意思 喝酒头疼是什么原因 外伤挂什么科 心脏彩超可以检查什么 ivy是什么意思
血小板低会引发什么病 万箭穿心是什么意思 25度穿什么衣服合适 梦见下雪是什么意思 梦见过年是什么意思
csco是什么意思 什么竹笋不能吃 夏天煲什么汤好 胃反流是什么原因 脸上起疙瘩是什么原因
荔枝对身体有什么好处 给孩子测骨龄应该挂什么科 神经元特异性烯醇化酶偏高是什么意思 身份证最后一位x是什么意思 左室舒张功能减低是什么意思
花开半夏什么意思hcv7jop5ns6r.cn 怀孕什么时候打胎最合适hcv7jop9ns9r.cn 鸟加一笔变成什么字gysmod.com 司南是什么hcv9jop3ns7r.cn 黑木耳不能和什么一起吃hcv8jop1ns7r.cn
牙龈发炎用什么药hcv8jop5ns6r.cn 副高是什么意思hcv8jop0ns1r.cn 贡菊泡水喝有什么功效hcv8jop1ns0r.cn 石榴石一般什么价位hcv8jop9ns5r.cn 做完雾化为什么要漱口hcv9jop0ns8r.cn
拉肚子吃什么药weuuu.com 乳腺炎吃什么消炎药hcv9jop5ns9r.cn 舌头短是什么原因clwhiglsz.com 矿泉水敷脸有什么作用hcv7jop7ns2r.cn 狂狷是什么意思hcv8jop6ns4r.cn
五月十二号是什么日子hcv9jop2ns9r.cn 看睾丸去医院挂什么科hcv8jop2ns2r.cn bm是什么意思qingzhougame.com 为什么老是流鼻血hcv8jop4ns0r.cn n是什么牌子hcv8jop2ns7r.cn
百度