【二】CocosCreator-CCGame.js源码分析

PS:只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。

【1】config:当前游戏的一些配置
1.debugMode:用于控制输出日志的级别
2.showFPS:是否显示FPS
3.exposeClassName
4.frameRate:设置游戏帧率
5.id
6.renderMode:使用canvas渲染还是使用WebGL渲染(简单理解:WebGL能实现高效的3D渲染、支持多平台,通过各种着色器实现各种效果交互比较灵活等多种优势,但WebGL学习成本比较高)

这个对象不能直接修改,如果要修改其参数,可以使用CCGame类内部开出来的接口,如setFrameRate等方式来设置。

【2】_paused:是否暂停主循环
相比较于cc.director.pause暂停游戏逻辑,此处暂停主循环会暂停的更加彻底,他会暂停游戏逻辑、渲染、事件处理、背景音乐等。

【3】restart:重启游戏
在一帧渲染结束后,取消常驻节点,销毁当前运行的scene,清理audio,停止主循环,初始化内置资源后调用game.onStart(),重启游戏。

【4】end:退出游戏
调用close()退出游戏,暂时还不知道这个close调的是哪里……怀疑是各平台里面的方法……

【5】on():注册game的特定事件回调,如:EVENT_RESTART、EVENT_GAME_INITED等等,具体可以看看CCGame内部定义了哪些事件。

【6】once():基本同on一样,区别只在于此函数只会通知一次。

【7】run():启动游戏引擎
设置config配置参数,设置onStart函数(在重启时还会用到),然后调用prepare()准备引擎。
准备引擎的过程大致如下:
1._loadPreviewScript:加载项目预览代码。
2._initRenderer:初始化render。
3._initEvents:初始化消息分发系统,设置了进入后台时暂停主循环,回到前台时恢复主循环。
4._setAnimFrame:根据config的帧率参数设置游戏相关帧率。
5.builtins.init:初始化游戏内置资源。
6._runMainLoop:开始执行游戏的主循环了,具体原理是通过每次屏幕刷新时,就调用一次主循环对整个游戏进行一次刷新。此处是通过调用window.requestAnimFrame(callback)来实现,此函数会在浏览器每次重绘之前调用,我们就利用此函数实现游戏主循环了。然后在内部的callback里面再调用CCDirector的mainLoop实现游戏的主循环。附带说明一下,不同平台可能实现主循环依赖的函数有所不同,如:
浏览器:window.requestAnimFrame
android:GLSurfaceView下的onDrawFrame
ios:CADisplayLink
三者原理上都是通过在屏幕刷新时会有回调通知,只要把主循环放在回调里面,就可以实现每次屏幕刷新都调用主循环函数,从而实现游戏的主循环。

        以上就是游戏引擎准备的全过程了,在整个过程中间的某些步骤会有消息通知,监听这些消息就可以在这些步骤中间插入你需要的代码了。

【8】_persistRootNodes:常驻节点
addPersistRootNode():加入常驻节点,会调用_addPersistNodeRef对加入常驻节点的node内部所有子节点和组件进行addRef()引用计数加1.
removePersistRootNode():移出常驻节点,会调用_removePersistNodeRef进行引用计数减1.
isPersistRootNode():查询是否常驻节点。

常驻节点具体实现原理:用_persistRootNodes数组保存所有常驻节点,然后把常驻节点的父节点指向当前运行的runingScene,当切换场景时(由于加入常驻节点时引用计数已经加1了,所以场景切换也不会释放资源),再把常驻节点的父节点指向新场景中,达到场景切换,常驻节点的内容依然存在的目的。

题外话:此处常驻节点的处理和cocos2dx的处理方式可是不太相同了,cocos2dx源码内部的处理方式,常驻节点时独立于场景之外的,在进行渲染时,会先render runningScene,接着再对_notificationNode(全局节点)进行渲染的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis单机部署

一、下载redis压缩包tar.gz 官网下载,现在一般用6.x以上版本 二、上传指定目录,解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录,进行编译 cd redis-6.2.14 make &&a…

SSH以及Dropbear介绍

SSH 1、什么是SSH (1)SSH仅仅是一种协议标准,目的是实现安全远程登录及安全网络服务。 2、实现SSH的工具有哪些 (1)开源OpenSSH,使用最广泛。 (2)Dropbear,轻量级SSH。 3、SSH可以实现的功能场景 (1)安全远程登录 (2)安全的端口转发 ①本地端…

【elfboard linux开发板】5.vmware tools安装及uart属性的获取和设置

1. 安装VMware tools 系统:ubuntu22.04 虚拟机版本:VMware workstation 16 pro(16.1.2) VMware tools文件(iso)一般在虚拟机目录下,如果没有,这是下载网址,找到对应的虚拟机版本下载…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉 宽,和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候,把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结: 1.Chatgpt引爆了通用人工智能,最大的受益者或是机器人,2023年最热门的创业赛道便是人形机器人,优必选更是成为人形机器人上市第一股, 可以说2023年是机器人开启智能化的元年,而2024则将成为机器…

【动态规划】LeetCode-10. 正则表达式匹配

10. 正则表达式匹配。 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 …

winform简易用户权限管理系统

一、功能简介 1. 数据库可使用sqlite、mssql、mysql等 2. 管理员账号不管控,其余账号进行权限管控(左侧菜单,表单按钮),且只能看到自己创建的角色、用户 二、操作界面 1. 管理员账号登陆后,左侧菜单栏自动…

SVN迁移至GitLab,并附带历史提交记录

Git在代码管理方面比SVN有更多的优势,如代码审查,分支和合并。 一、准备工作 安装Git环境,配置本地git账户信息: git config --global user.name "XXX" git config --global user.email "XXXmail.com"可通…

对象存储的策略问题

对象存储中的数据可以让其他用户访问吗? 对象存储(简称ZOS)中的数据有两种常见的方式可以授予其他用户访问权限: 桶级别的访问控制列表(ACL):您可以在桶上设置ACL,定义哪些用户具有…

基于矩阵乘的CUDA编程优化过程

背景:网上很多关于矩阵乘的编程优化思路,本着看理论分析万遍,不如实际代码写一遍的想法,大概过一下优化思路。 矩阵乘的定义如下,约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

C/C++汇编学习(一)——C++代码到汇编代码的转换

目录 一、 学习C编译过程 预处理器的作用 编译器如何将C代码转换为汇编 汇编代码示例(假设) 链接器的作用 二、 使用编译器探索C代码的汇编表示 使用GCC查看汇编输出 使用Visual Studio查看汇编输出 比较不同优化级别的汇编代码 三、 理解C控制…

判断两张图片是否完全一致

判断两张图片是否为完全相同的图片 批量判断尺寸 大小 图像展示内容体是否完全一致的图片 import os import hashlib from PIL import Imagedef check_img_repeat(directory):"""批量对图片进行重复性校验是检查一组图像中是否有相同或几乎相同的图像副本。一…

Linux C/C++ 获取CPUID

实现方式: INTEL CC 格式 AT^T CC 格式 GCC/C库 __cpuid 宏 大致讲义: AT^T 格式汇编很反人类,GCC可以改编译器选项为INTEL内嵌汇编,但一般在GCC还是按照默认的AT^T汇编来拽写把,不想用也可以让AI工具把INTEL内嵌…

神经网络模型常见的类型介绍

神经网络模型有很多种类型,下面是一些常见的神经网络模型: 前馈神经网络(Feedforward Neural Network):这是最简单、最基础的神经网络形式。在这种网络中,信息只朝一个方向流动,从输入节点经过…

Redis命令---String篇 (超全)

目录 1.Redis Setnx 命令 - 只有在 key 不存在时设置 key 的值。简介语法可用版本: > 1.0.0返回值: 设置成功,返回 1 。 设置失败,返回 0 。 示例 2.Redis Getrange 命令 - 返回 key 中字符串值的子字符简介语法可用版本: > 2.4.0返回值: 截取得到…

2024年个人工作计划怎么写?新年待办计划这样写更方便

元旦的钟声还在耳边回响,2024年的新篇章已经开启。面对新的一年,我深知一个清晰、实用的个人工作计划是多么重要。它不仅是指引我前进的灯塔,更是我实现目标、提升效率的秘密武器。 但如何制定这样一个计划呢?在过去,…

嵌入式开发——ADC开发

学习目标 了解ADC开发流程掌握采样方式能够使用ADC进行芯片内部通道进行采样能够使用ADC对外部电路进行采样学习内容 GD32F4的ADC 特点: 16个外部模拟输入通道;1个内部温度传感通道(VSENSE);1个内部参考电压输入通道(VREFINT);1个外部监测电池VBAT供电引脚输入通道。ADC开…

《工具录》nslookup

工具录 1:nslookup2:选项介绍3:示例 - 命令行模式3.1:查询类型设置3.2:指定 DNS 服务器 4:示例 - 交互模式5:其他 本文以 kali-linux-2023.3-vmware-amd64 为例。 1:nslookup nsloo…

Python计算三角形的面积

Python 计算三角形的面积 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: # 三角形第一边长 a 3 # 三角形第二边长 b 4 c float( input("输入三角形第三边长: ") ) # 计算半周长 s (a b c) / 2 # 计算…

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff0…