不做换皮游戏-从0开始努力了1个月,终于上线了
ps:我也是新手,描述不正确请大神轻点拍
`

1.学习历程:开始接触cocos creator
先说下技术方向:大学学过java,毕业后没有从事编程的工作。
一个偶然的机会,看到微信小游戏支持游戏引擎开发,感觉有点意思,琢磨了自己搞一个试试水。
先后考察了 egret、laya、ccc 三个引擎,分别试着写过 入门的教程
说说为啥选择了ccc 吧:
之前用untiy,简单做过一个demo,个人认为unity的模式比较适合我这种技术比较菜的入门小白。 egret 就这样被略过了,看了看api,不合适。 laya air 官方文档好像跟IDE 不配套,看起来太费劲了,虽然据说是支持3d非常厉害。。 最后又回到了 ccc,之前了解过ccc是用js写游戏脚本,但是个人对js不感冒, 后来发现 ccc支持typescript了,据我了解 ts 支持强类型校验,并且结合vscode代码提示也不错。先看了2天的ts,入门,基本跟java差不多。然后开始先弄了个demo,试了试,发现ccc 使用typescript 结合 vscode 工具流非常完善。关联号vscode之后,把那个菜单下的所有项都点一下,vscode就都关联好了。
于是就开始着手准备了。
2、游戏设计
想做个卡通类IO游戏,类似于贪吃蛇大作战,但是需要在玩法上进行创新,不能抄袭,不做换皮游戏。
于是就开始了设计:
首先需要三要素: 1、简单容易上手 2、由于是对抗类,需要攻守兼备 3 、入门简单,玩精难。
游戏素材设计软件:
游戏素材用到的并不多,ui和全部游戏素材都是通过 inkscape 画的,如果是程序向,可以学习下,画一些简单的素材和ui非常方便。
2.1 界面相关
首屏加载:由于需要 加载游戏素材,选择了首屏加载策略,避免开始游戏的时候卡住
首先需要做两个场景,第一个场景尽量少,类似于下图这种,给个logo,给个进度条就好了,避免用户打开游戏的时候卡。图片资源尽量小一点,第二个场景是真正的游戏场景。
比如,我这个黑色背景并不是图片,而是摄像机设置成了黑色
在第一个场景的 onload函数中,加载第二个场景,并且 更新进度条,相关代码如下所示:
public static readonly MAIN_SCENE = 'Main'
onLoad() {
console.debug(' onLoad ');
let that = this;
cc.director.preloadScene(MainMenu.MAIN_SCENE,
(completedCount: number, totalCount: number, item: any) => {
//console.debug(completedCount, completedCount / totalCount)
that.progressbar.progress = completedCount / totalCount;
that.infoLabel.string = 'Loading...(' + ((this.progressbar.progress) * 100.0).toFixed(0) + '%)'
},
(error: Error, asset: cc.SceneAsset) => {
if (that.infoLabel == null){
return ;
}
that.infoLabel.string = 'Loading complete!';
}
)
}
点击开始游戏的时候,在加载第二个游戏场景(真正游戏互动的场景)
on_startbutton_click() {
cc.director.loadScene(MainMenu.MAIN_SCENE);
}
加载完成后,游戏界面如下所示:
先说下玩法介绍吧:
1:一开始是一个中心球,通过中心球,可以粘上 小球,越粘小球数量会越多
2:达到一定数量之后,中心球体会变大,同时小球和中心球之间的距离会边长
3:控制中心球,小心不要 其他玩家 周围的小球,注意躲避。同时 控制中心小球移动,通过周围的小球可以将其他玩家 击败
4:可以发射子弹,子弹碰到其他玩家的中心球,则其他玩家被击败,碰到其他玩家周围的小球,则被防护了。 发射子弹会减少一个小球。
5:由于是微信小游戏,采取了AI控制方式。
###2.2 玩法相关
由于用户和AI都需要显示,所有,抽取了一个基类 BasePlayer,负责显示,渲染,等相同的内容,然后用户和ai 分别编写控制脚本,比如,用户使用 触摸控制,ai自动控制。
这个是我的目录结构:

小提示:
关于emit事件: 玩家死亡,发射子弹等可以通过emit进行事件发射,在gamemanager类中,可以对相关的事件进行响应,但是emit 的参数不能自动提示,可以通过在player中编写一个 函数,定义callback的参数,这样,当在其他类中再去响应 die 事件的时候,就有代码提示了:
onEmitPlayerDie(callback: (itemCount: number, killcount: number) => void, that) {
this.node.on('die', callback, that);
}
效果如下所示(再也不用返回到 player 类中去看看 对应的事件 到底传递什么参数出来了 ):
物理引擎的一些小知识
如何动态更改distance joint的 长度:
中心球和周围的小球通过distance joint 连接在一起,如果想改变distancejoint的长度,需要先禁用,在启用该组件。
element.enabled = false;
element.distance = this._jointDistanceCurrent
element.enabled = true;
2:不要尝试直接更改 刚体的线性速度的x,y值
错误示范:(这样是没有效果的)
this.rigbody.linearVelocity.x = 100
正确示范:
this.rigbody.linearVelocity = cc.v2(100,0)
再附上几张游戏截图吧:
绝杀:
发射子弹:
看我无敌大:
快要 被击中了 。。。
小游戏二维码:








。