红石笔试题回顾(那些我理解不深的)

1.float类型的变量 x 与0如何比较,写出代码实现。

float 在内存这种的存储是不准确的,只是一个近似值,所以不能直接用如下语句:

if(0 == x)

来实现比较。这样的语句在绝大多数情况下会返回false。对于float 类型值比较,我们应该设置一个能接受的误差范围,比如:

const float m_fDeviation = 10^-6;//( 即设置允许误差为0.000001);

因为定义了允许误差,所以 当 x 与0的差值 小于m_fDeviation的时候,即可认为 x 与0 相等。写法如下:

if(x >= -m_fDeviation && x <= m_fDeviation);  


2.string的构造函数,拷贝构造函数,赋值运算符重载函数?


String类有一个私有成员变量: private:char * m_pData;

在写到拷贝构造函数的时候,函数声明为:

String(const Sting & str);


答题的时候,突然想到,对象的私有成员变量是无法访问的,当时做的时候完全卡壳了,找不到解决思路。

回来之后,在电脑上实现了一下,编码如下:


String(const Sting & str) 

{

m_pData = str.m_pData; 

}


结果是编译通过,调用、运行也完全没有问题。


最终查阅到得资料解释为:

Standard C++ 98 has mentioned:  

A member of a class can be

private; its name can be used only by menbers and friends of the class in which it is declared."


即类的私有成员变量只能在声明它的类的成员函数或者友元中可以被使用。因此,在类的成员函数中,如果传入了其他的本类的对象,是可以直接使用它的私有成员变量的。这个知识点,相信很多朋友不知道或者误解了。


3.const,static有哪些用法?


关于const

a.用const定义常量。

b.用const修饰函数的参数(若需要用参数作为输出,则不可添加const,不然将失去输出功能)。

c.用const修饰函数返回值(const返回值不能被修改,只能被付给const 变量,除非强制转换)。

d.用于声明类中的const成员函数(const成员函数只能使用const成员变量)。


关于static

a.局部静态变量 (局部静态变量在第一次进入该代码块时初始化,并且整个程序运行时只初始化一次。下次访问,变量会保持上次访问后的值)。

b.外部静态变量或函数(在全局变量前加上static声明,会限制变量的作用域为文件范围,在其他文件中不可访问)。

前两种在C中的用法,后一种在C++中的用法。

c.类中的静态成员变量或成员函数(类的静态属性属于类本身,而不属于类的任何一个对象。类的静态方法不可使用非静态成员变量)。


4.cocos2d-x 中的坐标体系.


cocos2d-x 中一共有四种坐标系:

a.屏幕坐标系(以左上角为原点,X轴向右增长,Y轴向下增长)。

b.OpenGL坐标系(一个基于OpenGL的坐标系,以左下角为原点,X轴向右增长,Y轴向上增长)。

c.世界坐标系(相对于屏幕的坐标系,坐标与屏幕坐标系一致)。

d.本地坐标系(相对于父节点的坐标系)。

另外,节点还有一个属性,m_obAncharPoint(锚点);CCLayer是没有锚点的,不管设置还是没有设置。

CCNode中常用的坐标转换函数:

convertToWorldSpace();将本地坐标转换成世界坐标。

convertToNodeSpace();方法可以把世界坐标转换到当前node的本地坐标系中。


5.cocos2d-x中有几种纹理缓存方式?


cocos2d-x 中有两种方式可以实现纹理缓存,分别是: CCTextureCache 和 CCSpriteFrameCache;

CCTextureCache 用于缓存所有的纹理。调用方法是:

CCTextureCache::sharedTextureCache()->addImage(pszFilename);

CCSpriteFrameCache 用于缓存所有的精灵帧。调用方法是:

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();

cache->addSpriteFramesWithFile();


6.cocos2d-x中的粒子系统。


粒子系统是一个使用大量的很小的精灵或者一些其他的绘制对来模拟一些模糊效果,已达到传统绘制无法实现的效果。比如烟花、流星等。

Cocos2d-x 为我们提供的粒子系统由CCParticleSystem类来实现。

常用的对粒子的操作有: 产生粒子、更新粒子、回收无用粒子。

产生一个粒子效果的代码如下:

CCParticleSystem *particle = CCParticleSnow::node();  

particle->setTexture(CCTextureCache::sharedTextureCache()->addImage("snow.png"));

this->addChild(particle);


具体使用详见如下地址:Cocos2dx中粒子系统详解


7.cocos2d-x中是如何检测碰撞的?


碰撞检测是游戏的重要组成部分之一,Cocos2d-x中实现碰撞检测,,原理跟其他游戏一样。两个图片有交点,即可判断为已碰撞。

碰撞检测一般放在update()方法中,每帧刷新。

首先将两个需要检测的节点坐标用convertToWorldSpace()转换为世界坐标,然后:

target->boundingBox();//可以获取节点的实际绘制地点,判断两个节点举行是否有交点即实现了碰撞检测。


8.CCAction 中 实现两个动作并行的类是CCSpawn;(谨记,笔试的时候忘了)


9.Cocos2dx 音效引擎。

具体见链接:Cocos2dx音效引擎

 这个更为详细:Cocos2dx音效引擎-红黑联盟


10.用C语言判断大端机还是小端机。

union node
{
 int a;
 char b[4];
};
 union node t;
 t.a=1;
然后判断t.b[0] 是否为0,若为0.则是大端模式,否则为小端模式。
 
11.更多面试题目及答案
 
12.C++ 与Java代码相互调用。
  a. C++调用Java代码
  b.Java 通过native关键字调用C++代码
	
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值