cocos create游戏开发入门--Apple的学习笔记

一,前言

五一嘛,当然以玩为主题,延续我之前的python游戏开发中的数学和物理--Apple的学习笔记blog内容,正好之前看了游戏运动中的细节处理。但是没有框架,所以自己拿着python做了个简单的框架,然后就可以体验下细节功能设计的魅力。那么说到正经的游戏开发,UE4,unity3D等3d及vr渲染都比较好,但是我现在想玩的是简单的2D游戏开发。因为它的游戏引擎源码和我之前看的单片机中littlegvl的源码思路有些像。那么我就乘机玩玩吧!虽然我知道现在cocos已经不流行的,但是我要学习的是引擎相关的方法论,以及游戏的设计模式,所以不影响。

二,Cocos2D vc环境搭建

我先没有使用cocos create。直接想看c++源码编程。搭建步骤

  1. https://github.com/cocos2d/cocos2d-x去下载最新版本,我放在了D:\cocos2d-x-4.0\cocos2d-x-4.0
  2. 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比较多。也了解了下热更新的原理。

四,自制简单游戏

image.png

界面中可以看出结构,而且我只添加了一个ts脚本文件,就是通过wsad按钮来控制小球进行直线运动,目的是和我之前的python框做对比。没有用自动位置移动的update函数,这个其实也一样的思路,每次要设计不同的运动可以在update中自动设置下一帧位置。


image.png

等于我把田地选好了,上面可以种植多种多样的农作物。框架有了,就可以填充各种内容了。
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的基于事件响应的大框架设计。

你可能感兴趣的:(cocos create游戏开发入门--Apple的学习笔记)