一,前言
五一嘛,当然以玩为主题,延续我之前的python游戏开发中的数学和物理--Apple的学习笔记blog内容,正好之前看了游戏运动中的细节处理。但是没有框架,所以自己拿着python做了个简单的框架,然后就可以体验下细节功能设计的魅力。那么说到正经的游戏开发,UE4,unity3D等3d及vr渲染都比较好,但是我现在想玩的是简单的2D游戏开发。因为它的游戏引擎源码和我之前看的单片机中littlegvl的源码思路有些像。那么我就乘机玩玩吧!虽然我知道现在cocos已经不流行的,但是我要学习的是引擎相关的方法论,以及游戏的设计模式,所以不影响。
二,Cocos2D vc环境搭建
我先没有使用cocos create。直接想看c++源码编程。搭建步骤
- https://github.com/cocos2d/cocos2d-x去下载最新版本,我放在了D:\cocos2d-x-4.0\cocos2d-x-4.0
- Python要下载2.7.10,然后修改环境变量。(当前已删除此环境变量,要生成代码再加)
a. 在github下载的目录下能看到bat文件。输入命令
python download-deps.py
若过程中无法下载则自己按cmd窗口的提示路径手工下载到py同级目录,并且zip包名字要改和cmd提示中的一致即可。
b. 初始化一个cocos2d vc++工程配置环境。输入命令
python setup.py
c. 创建vc++工程
$ cocos new MyGame -p com.your_company.mygame -l cpp -d D:/cocospro
$ cd D:/cocospro/MyGame
$ mkdir build
$ cd build
$ cocos run --proj-dir .. -p win32
此时已经编译完成了。也可以通过win32-build文件夹打开vc++工程,自行编译。然后选择最后一个helloword工程作为启示工程进行运行。接着就是要学习api的使用了,这里面没有游戏设计模式接招,只能通过使用api来分析源码。那么我还是先简单点,学习怎么使用吧!于是开始用cocos create创建工程。
三,Cocos create环境搭建
这个比较简单,就是一个IDE。现在4.0已经结合了2d和3d,并且cc模块已经被淘汰了。关于这个IDE的使用,可以参考官网视频教程。已经cocos官网的脚本章节说明。
当然typescrpit我也没用过,只用过JavaScript,但是不涉及高级语法,我学起来很快的,顺便把lua语言基础也学习。因为看到了游戏热更新用lua比较多。也了解了下热更新的原理。
四,自制简单游戏
界面中可以看出结构,而且我只添加了一个ts脚本文件,就是通过wsad按钮来控制小球进行直线运动,目的是和我之前的python框做对比。没有用自动位置移动的update函数,这个其实也一样的思路,每次要设计不同的运动可以在update中自动设置下一帧位置。
等于我把田地选好了,上面可以种植多种多样的农作物。框架有了,就可以填充各种内容了。
typescript有了类的定义,真的不错,这样多态的实现和c++思路类似。这个语言怪不得排名一直在上升。而且它的库也很多,做APP的貌似就是要快,哈哈~
import { _decorator, Component, Node, systemEvent, SystemEventType, EventKeyboard, macro, CCInteger } from 'cc';
const { ccclass, property, type } = _decorator;
@ccclass('Test2')
export class Test2 extends Component {
//@property({ type: Node })
//private player = null;
@type(Node) // 声明属性 _targetNode 的 cc 类型为 Node
private player: Node | null = null;
// 声明 speed 属性
@property(CCInteger) // 声明属性 _id 的 cc 类型为 Cocos 整数
private speed = 0;
// [1]
// dummy = '';
// [2]
// @property
// serializableDummy = 0;
start() {
let objs = this.node.getChildByName("Player");
this.player = objs;
if (this.player === null) {
console.log("error");
}
}
// update (deltaTime: number) {
// // [4]
// }
onLoad() {
console.log("start");
systemEvent.on(SystemEventType.KEY_DOWN, this.onKeyDown, this);
systemEvent.on(SystemEventType.KEY_UP, this.onKeyUp, this);
}
onDestroy() {
systemEvent.off(SystemEventType.KEY_DOWN, this.onKeyDown, this);
systemEvent.off(SystemEventType.KEY_UP, this.onKeyUp, this);
}
onKeyDown(event: EventKeyboard) {
/*
switch(event.keyCode) {
case macro.KEY.a:
console.log('Press a key');
break;
}
*/
}
onKeyUp(event: EventKeyboard) {
switch (event.keyCode) {
case macro.KEY.d:
this.player?.setPosition(this.player.position.x + this.speed,
this.player.position.y,
this.player.position.z);
console.log('Release a key s');
break;
case macro.KEY.a:
this.player?.setPosition(this.player.position.x - this.speed,
this.player.position.y,
this.player.position.z);
console.log('Release a key a');
break;
case macro.KEY.s:
this.player?.setPosition(this.player.position.x,
this.player.position.y - this.speed,
this.player.position.z);
console.log('Release a key s');
break;
case macro.KEY.w:
this.player?.setPosition(this.player.position.x,
this.player.position.y + this.speed,
this.player.position.z);
console.log('Release a key w');
break;
default:
break;
}
}
}
五,总结
通过多种工具的对比及使用,终于对游戏开发中的设计有点思路的,因为看框架看来看去都是一样的。每一帧渲染可以通过定时器,然后就是运动算法,然后就是渲染显示。这就是基于事件模型的框架。
关于游戏中类的设计暂时还没有深刻的体会,之前看过一个esc游戏架构设计,通过组合模式来定义新的类,这样的类可以扩展很多。到时候也可以看些源码了解基于面向对象的游戏设计。
就是关于游戏引擎,了解也不深刻,但是有2个内容是我看到的GUI源码框架中都有的,就是node和子node的归递扫描然后draw。另外一个就是surface显示区的概念,用来透明合并多重frame。
我都是围绕图像相关的学习,没跑题吧!喜欢这样360度的学习,因为当我在看似不同的项目中看到了相同之处,那么这就是精华。看来我已经掌握了GUI的基于事件响应的大框架设计。