第一课-游戏得分

戴维营教育原创文章,转载请注明出处。我们的梦想是做最好的iOS开发培训!

这里是长沙戴维营教育(www.diveinedu.cn)游戏开发课程的C++初级教程第一课。我们坚持以兴趣为主导,在实战中学习知识的教学方式,期望能够给大家带来收获。

课程中用到的资源:(链接: http://pan.baidu.com/s/1pJA1ujD 密码: in2b)

一、环境搭建

  1. Xcode和Cocos2d-x游戏引擎。其中Xcode是苹果公司(Apple Inc.)免费提供的集成开发环境,支持Objective-C/C/C++等语言,我们可以在Mac Store中下载到最新的稳定版本。Cocos2d-x是触控科技旗下的一款跨平台游戏引擎,采用C++开发,支持iOS/Android/Windows Phone等移动平台和Windows/Mac/Linux等桌面系统。Cocos2d-x还提供了Lua/JavaScript等脚本语言绑定、CocosStudio、Cocos2d Code等开发工具。
  2. Cocos2d-x在写本文的时候最新版为v3.3版。不过为了专注于游戏开发的学习,我们已经用它创建了一个框架工程(Playground),直接拿过来就可以用了。

二、语法基础

首先我们来看几个代码的例子:

//在这显示分数
void PlaygroundScene::showGameInfo() {
    //显示文字
    mScoreLabel->setString("128");
    //设置文字显示位置
    mScoreLabel->setPosition(100, 100);
}

上面的代码会让屏幕上显示数字“128”,通过修改它可以显示任意的文本信息,而不仅仅是数字。在设置位置那行,修改(100, 100)(200, 200),会看到文字位置变了。只要稍微留意一下就会发现,我们显示的文字外面有双引号",而下面设置位置的时候没有使用。从Xcode中看起来它们之间的差异非常明显,双引号和它里面的文字一般是红色的(可以设置)。但是如果我们将代码修改成上面不使用双引号,而下面设置位置时使用双引。

//在这显示分数
void PlaygroundScene::showGameInfo() {
    //显示文字
    mScoreLabel->setString(128);
    //设置文字显示位置
    mScoreLabel->setPosition("200", "200");
}

Xcode直接显示代码出错。

CocosPlayground/Classes/PlaygroundScene.cpp:65:28: Reference to type 'const std::string' (aka 'const basic_string<char, char_traits<char>, allocator<char> >') could not bind to an rvalue of type 'int'

CocosPlayground/Classes/PlaygroundScene.cpp:67:18: No matching member function for call to 'setPosition'

现象解惑: C++是一门强类型的语言,它的所有值都是有类型的,并且不能随意转换。C++中的值可以分为以下几类。

  • 基本数据类型
数据类型 类型名 含义
布尔型 bool 布尔值,true/false,1个字节
字符型 char 整数,1个字节
短整型 short 整数,2个字节
整型 int 整数,4个字节
长整型 long 整数,8个字节
单精度浮点数 float 小数*,4个字节
双精度浮点数 double 小数*,8个字节

*上面的大小都是在64位机器上的值

*一些类型还可以用signedunsignedlong等进行修饰。

*以后可能会看到类似uint16_tint8_t的写法,实际上它们都是为了方便兼容不同平台而给上面这些类型的别名。

  • 复杂数据类型(推导数据类型)
数据类型 类型名 含义
引用 类型名 & 别名
指针 类型名 * 地址值
数组 类型名 [] 多个有序排列的同类型数据
枚举类型 enum 有限的整数集合
函数 可重复使用的代码片段
  • 对象类型
数据类型 类型名 含义
结构体 struct 定义类,类似class
class 定义类,创建对象的模版,同一类事物的抽象

不同类型的数据所能表示的取值范围、所占用的内存大小是不一样的。我们要根据实际应用进行选取。比如给班上50个学生进行编号,肯定是选择整数,考虑到内存大小,我们可以使用char类型来表示。

Tips:可以使用sizeof运算符来查看不同数据类型所需内存大小。将下面的代码复制到刚才显示文字的地方,重新编译运行。

std::cout << sizeof(int) << std::endl; 或者 CCLOG("%zu", sizeof(int));

我们通过进一步查看之前显示分数的代码发现这两个函数的参数都是有特定类型的,其中分数为string(字符串)类型,而位置为两个float(单精度)浮点数类型。

void Label::setString(const std::string& text);
void Node::setPosition(float x, float y);

C++中的字面常量也具备默认的数据类型。

示例 类型
true/false bool
'a' char
123/0123/0x123 int,分别为十进制、八进制、十六进制整数
123L long
123U unsinged int
123UL unsinged long
12.3 double
12.3F float
"123" 字符串

Tips: 可以通过typeid运算符打印运行时类型。不同编译器打印的结果可能不同。 std::cout << typeid(123).name() << std::endl;

三、游戏得分

在游戏的过程中,我们的分数可能一直在变化。比如斗地主赢了,玩家的金币会增加,输了金币就会会减少。这时我们就需要有一个地方来记录这个金币,并且能够在以后进行修改和显示。C++中我们可以通过变量来存放金币值。

int score = 1000;       //默认金币数
score = score - 100;    //输了100金币

//整数转化为字符串
//    std::stringstream ss;
//    ss << score;
//    
//    std::string s;
//    ss >> s;

__String *str = __String::createWithFormat("%d", score);
//显示分数
mScoreLabel->setString(str->getCString());

变量相当于一个容器,可以存放特定格式的数据,在程序运行过程中可以进行修改(存放不同的值)。它的定义的基本格式如下,C++中每个语句必须以;号结束:

<数据类型名> <变量名>;

Tips: 其中变量名也是有一定规则的,必须是一个合法的标识符。

  • 只能是由字母(a-zA-Z)、数字(0-9)和下划线组成。
  • 不能以数字(0-9)开头。
  • 不能与关键字(保留字)、库函数同名。

不同类型的数据除了取值范围的区别外,在使用的时候也会出现表现出一些不同。我们将上面代码中的分数换成float类型,可以看到结果变成了900.000000,并且创建字符串的时候必须使用%f,否则Xcode会提示警告。

float score = 1000;
score = score - 100;

__String *str = __String::createWithFormat("%f", score);
//显示分数
mScoreLabel->setString(str->getCString());

不过细心的同学应该已经观察到了,上面的代码中出现了1000100两个字面常量。我们之前已经提到过,它们默认应该是int类型的,但是现在却用来给一个浮点类型的变量直接赋值。在基本的数值类型之间,默认情况下取值范围小的类型的值会自动转换为取值范围大的类型值。我们一般称之为“自动类型提升”。

char > short > int > long > float > double

运算符: 刚才我们不但看到了不同的数据类型以及变量的定义,而且使用定义好的变量进行了一定的运算(减法)。计算机的发明主要就是为了替我们执行更加复杂的数学运算,因此它肯定能够执行常见的四则运算。

int a = 100;
int b = 20;
int result;

result = a + b; //120
result = a - b; //80
result = a * b; //2000
result = a / b; //5

当然我们也能够使用复杂的表达式进行计算。

result = a + b - 50 * 4;    //100 + 20 - 200 = -80

注意,C++中的运算符同样具备优先级。我们在幼儿园的时候就已经学过了,在同一个式子里,先乘除后加减,并且可以使用括号来提升优先级。这些在C++中照样成立。

result = (a + b - 50) * 4;  //280

除此以外,C++还具备有许多其它的操作符,并且它们具备不同的优先级以及结合性,这些需要我们在以后的学习中慢慢去熟悉。

更多信息: http://en.cppreference.com/w/cpp/language/operator_precedence

四、继续练习

  1. 上网查找几个幼儿园小朋友的数学题,使用代码计算结果并显示。
  2. 修改文字位置,让它显示在屏幕右上角,思考坐标原点的位置(提示:文字默认以中心点计算位置)。

五、参考资料

  1. Cocos2d-x官网:http://cn.cocos2d-x.org/
  2. http://www.cprogramming.com
  3. http://www.cplusplus.com
  4. http://en.cppreference.com/w/

六、词汇表

名字 含义 单词
变量 具有名字的可变存储空间 Variable
常量 不可变的值或存储空间 Constant

©长沙戴维营教育,转载请注明出处

戴维营学院(高级开发视频): http://v.diveinedu.com

潜心俱乐部(iOS面试必备): http://divein.club