经过较为繁琐的环境搭建后,我们终于运行出了一个helloworld窗口,可以正式上手cocos了

现在我们就从改代码开始玩起

AppDelegate

AppDelegate类 是程序的入口,现在我们先来看AppDelegate的几个成员函数

你可能会好奇入口为什么不是main函数,因为AppDelegate类其实是一个应用委托类,main.c里把游戏的运行委托给了这个类

  • applicationDidFinishLaunching 正如其名,我们的游戏启动时会调用这个函数,也就是入口函数

    比如等下会提到的:实例化单例类 director,设置窗口大小,游戏分辨率等等
  • applicationDidEnterBackground 是在游戏要切换到后台时调用的函数

    比如:停止音乐,停止动画等等
  • applicationWillEnterForeground 也就是游戏从后台切换回来时调用的函数

    比如:继续播放音乐,继续播放动画

接下来我们的重点是看 applicationDidFinishLaunching 函数内的代码

导演

首先可以看到第一行

实例化了一个 Director 类,director是干什么的呢?

如果把做游戏比作拍电影,director导演就是总指挥,切换场景,播放/停止音乐等动作都是director决定的

也就是说你你在cocos里需要通过director来实现这一系列操作,他是必不可少的

窗口

接下来你看到的会是

auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("Test", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
#else
glview = GLViewImpl::create("Test");
#endif
director->setOpenGLView(glview);
}

你可能会有点懵,没关系,先看

// 为方便阅读我做了换行处理
glview = GLViewImpl::createWithRect(
"Test",
cocos2d::Rect(
0,
0,
designResolutionSize.width,
designResolutionSize.height
)
);

再看看你运行出来的画面

GLViewImpl::createWithRect() 的第一个参数 “Test” 其实就是运行出来的窗口的名称(默认是你的项目名)

至于第二个参数

cocos2d::Rect(
0,
0,
designResolutionSize.width,
designResolutionSize.height
)

从名字应该不难看出一个是高,一个是宽,在Visual Studio里按住Ctrl,鼠标左键点选designResolutionSize就能找到定义

cocos有一个叫做Size的类,这个尺寸的width和height两个成员是我们经常需要使用的,在设置精灵的尺寸,坐标的时候会经常使用到

这是示例预先设置好的几个窗口大小,所以你应该能理解上面那一段代码是干什么的了吧——设置窗口名和大小

至于 #if#else#endif 是干嘛的,从字面上看其实就很好理解,是检测你的运行环境的(WIN32,MAC,LINUX或其他)这个我们暂时不用深究

现在由于designResolutionSize提供的宽高太小了不方便我们调试,我们把参数换成mediumResolutionSize将下面这个designResolutionSize直接改成mediumResolutionSize即可:

改后

运行:

之后的两行都很好理解

director->setDisplayStats(true);			// 显示FPS
director->setAnimationInterval(1.0f / 60); // 设置每帧的间隔

把第一个参数改成false就能关闭帧数显示,可以发现FPS显示和帧间隔也是director控制的

画面分辨率

看字面应该就能理解了,setDesignResolutionSize就是设置画面分辨率的,同样是属于Director导演类的成员函数

现在虽然我们窗口的尺寸设置成了mediumResolutionSize1024*768,但是实际上游戏窗口里的分辨率还是designResolutionSize480*320个像素

打开项目目录的Resources文件夹我们可以看到HelloWorld.png这个图片的分辨率是195*270

可以尝试下更改窗口分辨率运行,窗口内的这个Logo还是一样大的,但是改了画面分辨率的话就不一定了

场景

最后有两行比较关键的代码

这里用我们写好的HelloWorld类创建了一个场景helloWorldscene

然后让directorhelloWorldscene这个场景开始,启动整个程序

精灵

精灵(Sprite)是Cocos里的一个概念,我们helloworld界面的Cocos的logo就是一个精灵,现在我们尝试把他换成别的图片,选一张图片放到项目目录的Resources文件夹内

控制这个精灵的代码在HelloWorldScene.cpp内,打开找到这段代码:

只要把HelloWorld.png修改成你放入Resources内的图片名即可

运行:

坐标系统

首先介绍一下Vec2类,有接触过图形库或者游戏引擎的同学应该不陌生,这个类代表的是二维向量,有x和y这两个成员,我们在设置游戏物体的坐标的时候会使用到

同样在HelloWorldScene.cpp中,在创建sprite精灵的地方有这么几行代码,就是我们刚才换图片的那里

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

这行代码就是使用 setPosition 设置初始化好的精灵(你的图片)的坐标,

注意,坐标中出现了两个对象,一个是visibleSizeorigin

  • visibleSize这个对象储存了游戏世界的尺寸,也就是我们能够看到的窗口的尺寸,设置游戏的分辨率可以影响这个值
  • origin指的是窗口左下角的点在游戏世界中的位置

在设置坐标的代码下加入这样一行代码输出一些信息(log函数可以当作c/c++的printf使用)

log("visibleSize.width=%f, visibleSize.height=%f, origin.x=%f, origin.y=%f",
visibleSize.width,
visibleSize.height,
origin.x,
origin.y);

运行,查看输出窗口

可以看到visibleSize和origin的值

再回看设置坐标的代码

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

理性理解一下,实际上意思很简单,就是set到了窗口正中间的位置

稍作改动

Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y)

就向左移动了1/4窗口宽度的距离

最后一句

this->addChile(sprite, 0);

意思是将这个精灵加入到当前图层中,参数0代表最底层,如果不加这行代码,sprite不会成为游戏世界中的一员,编译出来之后就不会显示(这个涉及到场景的 z-order 值,下一节会讲到)

总结

通过这篇文章你应该基本了解了实例工程HelloWorld里的几个文件是干什么的了

关于场景和精灵,要学习的还有很多,我们之后会逐一介绍

cocos2d-x C++ 工程初探的更多相关文章

  1. Android下Cocos2d创建HelloWorld工程

    最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

  2. #Cocos2d+lua#android+Eclipse工程编译设置

    用Elicpse编译cocos2d+lua的工程几点注意点记录: 1.设置工程属性Windows->Preferences->NDK目录 2.右键Android Tools->Add ...

  3. Mac下搭建cocos2d 和cocos2d -x 环境

    来源:http://blog.csdn.net/duxinfeng2010/article/details/7985024 cocos2d是一个开源框架,用于构建2D游戏.演示程序和其他图形界面交互应 ...

  4. 25个增强iOS应用程序性能的提示和技巧(初级篇)

    25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  5. 25 个增强iOS应用程序性能的提示和技巧 应用程序性能的提示和技巧

    初级 在开发过程中,下面这些初级技巧需要时刻注意: 1.使用ARC进行内存管理2.在适当的情况下使用reuseIdentifier3.尽可能将View设置为不透明(Opaque)4.避免臃肿的XIBs ...

  6. 《Cocos2d-x实战 Lua卷》上线了

    感谢大家一直以来的支持!各大商店均开始销售:京东:http://item.jd.com/11659697.html当当:http://product.dangdang.com/23659810.htm ...

  7. 增强iOS应用程序性能的提示和技巧(25个)

    转自 http://www.cocoachina.com/newbie/basic/2013/0522/6259.html 在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的 ...

  8. (转)25个增强iOS应用程序性能的提示和技巧--初级篇

    在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...

  9. cocos2dx基础篇(1) Cocos2D-X项目创建

    已经入行工作半年多时间了,以前都是把这些东西记录在有道云上面的,现在抽出些时间把以前的笔记腾过来. 具体的环境配置就不用说了,因为现在已经是2018年,只需要下载对应版本解压后就能使用,不用再像多年前 ...

随机推荐

  1. Java日志框架总结

    1. 前言 从写代码开始,就陆陆续续接触到了许多日志框架,较常用的属于LOG4J,LogBack等.每次自己写项目时,就copy前人的代码或网上的demo.配置log4j.properties或者lo ...

  2. 【Offer】[6] 【从尾到头打印链表】

    题目描述 思路分析 Java代码 代码链接 题目描述 从尾到头打印链表,将其添加到ArrayList当中输出 思路分析 递归的思路 利用栈 Java代码 public class Offer006 { ...

  3. jQuery的大小拖动

    原来一直没有拖动放大的效果,居然只是没有jquery-ui.css的样式文件,虽然这是一个很小的部分,但是防微杜渐.程序本来就是个不容有小错误的存在. 如果没有样式文件,那么可以收缩的三角形就不会出现 ...

  4. C#中FileStream的对比以及使用方法

    场景 File与FileStream的区别 举例: 将读取文件比作是从A桶往B桶运水. 使用File就是整个用桶倒进去,使用FileStream就是使用水管慢慢输送. FileStream与Strea ...

  5. 【学习笔记】第二章 python安全编程基础---正则表达式

    一.python正则表达式 定义:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式相匹配: 1.1RE模块:是python语言拥有全部的正则表达式功能的一个正则模块: 常见 ...

  6. Jenkins把GitHub项目做成Docker镜像

    本文是<Jenkins流水线(pipeline)实战>系列的第三篇,前面已对Jenkins流水线有了基本认识,也试过从GitHub下载pipeline脚本并执行,今天的实战是编写一段pip ...

  7. 工厂/Builder,桥接/策略

    1.工厂 vs 抽象工厂 工厂方法模式: 用来加工.生产对象的类.比如说我想要一个汽车类,但是我总不能现场给你造个车出来对吧?于是我找到工厂类,然后工厂帮我把发动机型号选好,轮胎装好,油漆喷好,然后把 ...

  8. [Leetcode] 第357题 计算各个位数不同的数字个数

    一.题目描述 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55, ...

  9. Spring Boot 配置元数据指南

    1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot C ...

  10. Java 基础篇之异常

    异常 异常层次 Error:Java 运行时系统的内部错误和资源耗尽错误.应用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了. Ex ...