注册
web

原来微信小游戏用的技术就是web, 有想法的直接可以做

12月玩了2个微信小游戏, 发现都是在玩数值, 其实就是同一个游戏场景, 于是想自己写一个试试.

然后看了微信小游戏文档, 推荐 cocos creator, 学了下发现 web 开发者那是根本不用学.

自己写了2个demo, 于是分享给大家.

cocos creator

cocos creator 是个游戏引擎, 他推荐使用 vscode 和 chrome, 并且 ts 是唯一支持的脚本语言.

他的预览就是打开chrome的一个网页, 主体是个canvas, 这个场景下cc可能就是一系列资源的执行器.

重要的是他可以打包到微信小游戏, 也是微信小游戏推荐的框架.

也就是我可以用 ts 写小程序了.

其实也就是个 html5 的小游戏, 而 cc 包装了h5小游戏要手动写的requestAnimationFrame执行器, 提供了更方便的编辑器, 包装了一些游戏开发要用到的概念.

网页开发和游戏开发的区别

显然网页开发和游戏开发是不同的, 来稍作分析.

游戏元素

网页元素一般由div布局, 终端的节点一般是文字, 或者输入框.

游戏元素看起来容易一些, 因为没有输入. 手机小游戏只有通过点击来传达一些指令.

游戏元素也有布局, 但没网页 bfc, flex 这些复杂的东西, 全部绝对定位, 也有z轴.

再细看游戏元素, 其实每个元素就是个图片.

简单总结, 游戏的所有元素就是图片, 通过设置x, y, z的数值来定位. 比网页开发容易得多.

游戏交互

网页的功能主要是2个部分: 输入和展示.

所以网页的交互也就是改变参数后刷新列表.

我们来分析游戏的交互, 也分为2个部分: 改变位置与结算.

随着游戏的开始和玩家的点击, 其实就是元素的位置发生改变而已.

我们只要通过脚本控制元素的位置. 这些位置和具体游戏场景相关, cc 也会提供常用工具库.

另外一个是结算, 判断分数高低, 或者数组比较, 最多通过位置计算碰撞, 来判断游戏结果.

可以看到这些计算都是在脚本中进行的, 也都是比较简单的数据结构或者数学公式.

在游戏场景外, 一些菜单, 设置的界面就和网页差不多了.

cc 系统介绍

我看了一个视频, 自己写了2个demo, 简单总结下 cc 的系统.

总的来说, cc 像是个低代码平台.

编辑器界面

编辑器就是典型的低代码.

  • 场景界面. 就是把元素拖拖拽拽的地方.
  • 资源列表. 放代码和图片的地方, 就是网页开发的src目录. 资源的类型值得下文展开.
  • 节点层级. 在编辑场景的时候, 场景通常是有多个节点的, 节点之间有层级关系便于维护, 所以有个界面展示.
  • 节点属性. 在场景界面里选中节点, 肯定是可以编辑这个节点的属性的, 大小/位置什么的.

这些元素一看就是低代码了, 应该是低代码借鉴了这些游戏引擎的.

这些面板都是可以拖动位置, 或者合并成tab的, 很方便.

资源类型介绍

上面说到资源, 资源类型还挺多的. 这里介绍一点我用到的.

  • ts文件, 图片文件.

脚本文件和图片文件都是用来拖到节点里, 和节点绑定的.

  • 场景.

应该是 cc 的核心了. 从文件看来, 就是个 json. 所以拖拖拽拽的结果就是修改 json. 然后通过 json schema 执行渲染或打包.

场景是由节点组成的. 在场景里新建节点并嵌套, 来构建游戏场景.

节点的种类是很多的, 可以插入图片变为元素, 也可以绑定脚本, 作为一个"虚拟节点", 只是为了维护方便.

场景有必须的节点是 canvas 和 camera.

  • prefab.

可以理解为"组件". 在场景中编辑了一些节点, 如果觉得可以复用, 直接把整个节点拖到资源列表里, 就会产生一个 prefab. 使用的时候拖动这个 prefab 到场景, 就会产生一个实例了.

更多的应该是用脚本批量创建.

  • 动画.

其实和ts文件与图片文件一样, 是关联到节点上的. 但他是 cc 特有的, 可以在 cc 里编辑动画内容, 可以对各个属性做帧动画, 也可以导入动画软件做的动画.

开发流程

我写了2个算能跑的项目, 来说说开发的过程.

  1. 资源目录下新建一些文件夹: scripts, imgs, animation, scene.
  2. 主要开发就是编辑场景. 在场景里添加节点, 然后给节点贴图, 从"资源列表"把资源拖到"节点属性面板"就好了, 容易.

我的节点很简单, 就是玩家角色, 和背景.

  1. 建立个空节点, 写游戏逻辑. 具体操作是新建个 ts 文件, 然后拖到这个节点属性上.
  2. 游戏逻辑需要操作的内容, 包括动画, 都以"拖动"的方式关联到"节点属性面板"上.

这样就写好一个游戏了.

游戏逻辑开发是和 html5 游戏一样的, 最后一小节我再赘述下吧.

游戏逻辑编写

游戏逻辑在 ts 的脚本文件中编写.

所有新建的 ts 文件都会有一个初始模板. 内容是export class XXX extends cc.Component {}.

这个类有2个生命周期方法. start()update().

update()方法的参数deltatime是离上一帧的时间, 不了解的去看下 h5 游戏的执行就好了.

游戏逻辑一定涉及到元素, 只要在脚本文件里声明一个属性, 就能在节点属性面板上看到一个属性.

把这个属性需要控制的元素拖过去就行.

然后元素节点也可以绑定脚本. 这个脚本可以通过this.node提供的 api 来操作元素的位置.

元素节点一般会绑定动画, 也需要把动画声明在属性里, 然后从资源列表把动画拖动到自己的节点属性面板上, 就可以在脚本里调用动画了.

我现在理解的层级是这样的:

  • 总脚本gameControl写在单独节点里. 写游戏逻辑与结算判断.
  • 会动的元素, 自己绑定节点, 写一些方法供总脚本调用.
  • 编辑一些动画, 供上一步"会动的元素"调用. 一般是和元素位置的移动同时调用的.

贴一些代码

这里分享个具体的demo代码. demo内容很简单, 按方向键角色就会在地图上走路.

走路的时候会播放一个帧动画, 是从微信表情里导出的20个png.

脚本文件只有2个. 一个是gameControl游戏控制, 只做了监听键盘事件, 并调用player脚本的对应方法.

另一个player脚本写了对应的方法, 改变一些参数, 在update()方法根据参数来设置角色的位置.

gameControl.ts

import { _decorator, Component, Node, input, Input, EventKeyboard } from 'cc'
const { ccclass, property } = _decorator

import { player } from './player'

@ccclass('gameControl')
export class gameControl extends Component {
@property(player)
public player: player = null

start() {
input.on(Input.EventType.KEY_DOWN, (event) => {
switch (event.keyCode) {
case 37:
this.player.left()
break
case 38:
this.player.up()
break
case 39:
this.player.right()
break
case 40:
this.player.down()
break

}
})
}

update(deltaTime: number) {

}
}

player.ts

import { _decorator, Component, Node, Animation, tween, Vec3, math } from 'cc'
const { ccclass, property } = _decorator

@ccclass('player')
export class player extends Component {

@property(Animation)
anim: Animation = null

@property(Node)
lulu: Node = null

private direction = new Vec3(1, 0, 0)
private isMoving = false
private movePeriod = 0

start() {

}

update(deltaTime: number) {
if (this.isMoving) {
if (this.movePeriod < 1) {
let target = this.node.position
Vec3.add(target, this.node.position, this.direction)
this.node.setPosition(target)
this.movePeriod += deltaTime
} else {
this.isMoving = false
}
}
}

left() {
if (!this.isMoving) {
this.lulu.setRotationFromEuler(0, 0, 180)
this.direction = new Vec3(-1, 0, 0)
this.startMove()
}
}

right() {
if (!this.isMoving) {
this.lulu.setRotationFromEuler(0, 0, 0)
this.direction = new Vec3(1, 0, 0)
this.startMove()
}
}

up() {
if (!this.isMoving) {
this.lulu.setRotationFromEuler(0, 0, 90)
this.direction = new Vec3(0, 1, 0)
this.startMove()
}
}

down() {
if (!this.isMoving) {
this.lulu.setRotationFromEuler(0, 0, 270)
this.direction = new Vec3(0, -1, 0)
this.startMove()
}
}

startMove() {
this.anim.play()
this.isMoving = true
this.movePeriod = 0
}
}

另外做的demo是跟着cocos creator 文档的2d游戏做的. 有兴趣的也可以跟我一样, 先照着这个做一遍, 再自己新建个空项目自己操作.

最后

我认为 cocos creator 对 web 开发者来说真的是非常好上手了.

我认为小游戏的设计分为2个吧. 核心游戏场景, 与, 游戏运营.

其实核心游戏场景都不复杂的, 那怎么能让玩家一直玩呢.

其实就是策划运营, 操作一些数据, 让每次玩同一个场景, 看到不同的数字, 和不同的皮肤.

用户就会为了这些数字(pay for ability), 和皮肤(pay for love)来付费了.

我认为游戏脚本不难. 难在2点:

  1. 游戏的完整度, 需要美术和动画, 程序只能控制角色的位置, 加上动画才让人有操作角色的感觉. 精美的游戏场景也能让玩家觉得真实.
  2. 策划: 数值系统, 货币系统, 奖励系统, 活动这些. 让玩家重复玩同一个场景几百遍还觉得自己在成长, 真是牛逼.


作者:nujnewnehc
来源:juejin.cn/post/7456805812045725734

0 个评论

要回复文章请先登录注册