cocos2dx

  1. 简述cocos2d-x的屏幕适配解决方案
    glview->setDesignResolutionSize(960,640,ResolutionPolicy::FIXED_HEIGHT);第三个参数,定义解决方案:EXACT_FIT是会完全投射到屏幕全屏的,这样对程序和美术来说是最完美的,但是会有拉伸的现象。Show_All.它不会拉伸,但是左右或者上下会有黑边,没有全屏的感觉。NO_BORDER 顾名思义就是没有黑边,且保持宽高比。这样的结果就是,会有部分被裁剪掉。FIXED_HEIGHT和FIXED_WIDTH是类似的,就讲个FIXED_HEIGHT。FIXED_HEIGHT和FIXED_WIDTH是较高cocos2d版本才有的。这个解决方案是固定一个方向上的值,且固定比例。这样会导致部分覆盖不到或者部分被裁掉,要程序进行动态适配。
  2. 简述cocos2d-x内存管理
    Cocos2d-x中所有对象几乎都继承自Ref基类,Ref唯一的职责就是对对象进行引用计数管理:当一个对象被使用new运算符分配内存时,其引用计数为1,调用retain()方法会增加其引用计数,调用release()则会减少其引用计数,release()方法会在其引用计数为0时自动调用delete运算符删除对象并释放内存。Cocos2d-x使用autorelease来声明一个对象指针为”智能指针”,但是这些”智能指针”并不单独关联到某个自动变量,而是全部被加入到一个AutoreleasePool中。在每一帧结束的时候对加入到AutoreleasePool中的对象进行清理,也即是说在Cocos2d-x中,一个“智能指针”的生命周期是从创建开始到当前帧结束。
  3. 阐述cocos2d-x 中Scene Layer Sprite
    Scene是继承与Node类的。作为场景类,它却只有函数create。因为场景就像是一个容器,将不同的布景层(Layer)组合在一起,方便管理。Layer继承于Node。Layer不仅继承了CCNode的所有操作,还附加触控、重力加速度计、支持键盘输入的事件代理。一个布景层(Layer)可以包含多个元素,如标签(Label)、菜单(Menu)、精灵(Sprite)等等。精灵说简单一点,其实就是一个2D的图片。并赋予图片各种属性以及特性。如大小、颜色、放缩、旋转、动作等。精灵一般都是放在布景层(Layer)上面的,即一个布景层(Layer)应当有许多的精灵存在。精灵可以用来当做背景、人物、鸟、白云等内容。

  4. 简述SpriteframeCache SpriteBatchNode的作用
    SpriteframeCache:精灵框帧缓存,缓存了精灵框帧,主要是为了处理多张碎图合并出来的纹理图片。
    SpriteBatchNode就是cocos2d-x为了降低渲染批次而建立的一个专门管理精灵的类。都是用来加快渲染速度,加快游戏运行速度

  5. cocos2d-x游戏储存 UserDefault的优缺点
    CCUserDefault 是Cocos2d-x引擎提供的持久化方案,存储所有游戏通用的用户配置信息。例如音乐和音效配置。本质是一个XML文件。使用只需一行代码:
    UserDefault::getInstance()->setBoolForKey(“bool”,true);
    缺点:每次设置和读取都会遍历整棵XML树,效率不高,且值类型具有局限性,只支持int和float等基本类型。
  6. 简述:导演类Director
    就和现实中的导演一样,这里的导演也是起到指导的作用的。导演在这里负责的就是让不同的场景切换,控制整个游戏的流程,包括开始,继续,暂停等。以及设置、获取系统信息,比如调整OpenGL相关的设置,获取屏幕的大小等。
    作用:
    – 创建一个主窗口
    管理场景Scene
    – 初始化 OpenGL 内容
    – 设置 OpenGL 像素格式 (默认值时 RGB565)
    – 设置 OpenGL 缓存大小 (默认是 0-bit)
    – 设置 投影 (默认是一个 3D)
    – 设置 方向 (默认是竖屏Portrait)

  7. 闪亮标题实现

  8. auto clip = ClippingNode::create();//创建裁剪节点 auto gameTitle = Sprite::create(“game_title.png”); clip->setStencil(gameTitle);//设置裁剪模板 clip->setAlphaThreshold(0);//设置透明度阈值 clip->setContentSize(Size(gameTitle->getContentSize().width,gameTitle->getContentSize().height));//设置裁剪节点大小 auto clipSize = clip->getContentSize();//获取裁剪节点大小 clip->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));//设置裁剪节点位置 log(“clipSize.x = %lf,clipSize.y = %lf”,clipSize.width,clipSize.height);//log查看一下位置,没用的 auto gameTitle_show = Sprite::create(“game_title.png”);//创建要显示的对象 auto spark = Sprite::create(“spark.png”);//创建闪亮精灵 clip->addChild(gameTitle_show,1);//把要显示的内容放在裁剪节点中,其实可以直接clip->addChild(gameTitle,1);此处为了说明更改显示内容 spark->setPosition(Vec2(-visibleSize.width/2, 0));//设置闪亮精灵位置 clip->addChild(spark,2);//添加闪亮精灵到裁剪节点 addChild(clip,4);//添加裁剪节点 auto moveAction = MoveTo::create(2.6, Vec2(clipSize.width, 0));//创建精灵节点的动作 auto moveBack = MoveTo::create(2.6, Vec2(-clipSize.width, 0)); auto seq = Sequence::create(moveAction,moveBack, NULL); auto repreatAction = RepeatForever::create(seq); spark->runAction(repreatAction);//精灵节点重复执行动作

  9. 简述Action
    Action是动作的基类,所有的动作都派生自这个类,它创建的一个对象代表一个动作,动作作用于Node。主要使用FiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束;FiniteTimeAction 继承自Action。FiniteTimeAction又分为ActionInstanse(瞬时动作的基类)和ActionInterval(延时动作的基类)。

  10. 简单介绍一下CocoStudio
    CocoStudio是一套基于Cocos2D-X引擎的工具集,包括UI编辑器、动画编辑器、场景编辑器和数据编辑器。UI编辑器和动画编辑器主要面向美术,而场景编辑器和数据编辑器面则面向游戏策划,这四个工具合在一起构成了一套完整的游戏开发体系,帮助开发者进一步降低开发难度、提高开发效率、减少开发成本。
    UI编辑器:支持目前Cocos2D-X的所有控件,同时支持多分辨率适配、碎图合并以及自定义UI。
    动画编辑器:支持骨骼关键帧动画、序列帧动画,同时支持碎图合并、Flash动画直接导入等。
    数据编辑器:把策划用的Excel数值表分解,然后转化成Cocos2D-X可以识别的格式。
    场景编辑器:可以整合我们之前CocoStudio其他编辑器的资源,编辑当前的游戏场景,实时演示,所见即所得。同时也支持第三方的工具模式
  11. autorelease和release的区别
    release 会立马对对象进行引用计数减一操作,如果当前对象的引用计数小于0,则会进行释放.
    autorelease 则会将该对象放入到自动释放池中,当一帧结束的时候会执行release操作进行引用计数减一操作,如果当前对象的引用计数小于0,则会进行释放。
  12. cache机制原理是什么
    把新加进内存的资源做一个hashmap存储,每一个资源加一个key。每次加载资源的时候,先查找资源是否存在,存在直接返回,否则加载进内存。
  13. 减少内存开销的方法有哪些,图片压缩方法有哪些
    及时释放,减少泄露,重用资源,延迟加载,分部加载等
  14. 带目标的触摸事件的使用步骤
    (1) 实现TargetedTouchDelegate接口。
    (2) 使用addEventListenerWithSceneGraphPriority方法注册到触摸事件分发器。
    (3) 重载事件回调函数。注意,我们必须在触摸开始事件中针对需要接受的事件返回true以捕捉事件。
    (4) 当不再需要接受触摸事件时,使用removeAllListeners();方法来注销触摸事件的接收。与标准触摸事件相比,不同之处主要在于开始触摸事件需要返回一个代表是否捕捉事件的值。
  15. 标准触摸和目标触摸的区别
    (1) 增加触摸代理方法不同。
    (2) 标准触摸每个触摸点相互独立,目标触摸需要设置吞噬。
    (3) 目标触摸优先级比标准触摸优先级高。
  16. 如何解析json文件
    /* 读取配置文件字符串数据 */
    std::string sData = FileUtils::getInstance()->getStringFromFile(“monsterConf.plist”);
    /* 用于解析Json */
    Json::Reader reader;
    /* 解析Json后的根节点 */
    Json::Value root;
    /* 开始解析 */
    if (!reader.parse(sData, root, false))
    {
    return false;
    }
    /* 在这里,根节点是一个数组,遍历数组,找到我们要的ID */
    int size = root.size();
    for (int i = 0; i < size; ++i)
    {
    int id = root[i][“id”].asInt();
    if (id == ID)
    {
    m_sModelPath = root[i][“model”].asCString();
    break;
    }
    }
    return true;
    }
  17. 写一个cocos2d-x的单例模式

ifndef GLOBAL_H #define GLOBAL_H #include “cocos2d.h” #include “StartLayer.h” class Global{ public: StartLayer* startLayer; //存储全局可以访问的唯一性变量 static Global* toIns(); //通过这个方法返回Global对象 protected: ~Global(); }; #endif Cpp文件如下: #include “Global.h” using namespace cocos2d; static Global* share=NULL; //这行非常重要,将此变量声明和初始化放在头文件中,导致错误 Global::~Global(void){ startLayer = NULL; } Global* Global::toIns(){ if(!share){ share = new Global(); CCLOG(“first”); } CCLOG(“hello”); return share; }

  1. 简述瓦片地图中的TMXLayer类
    TMXLayer是地图层类,它的类图如图所示,TMXLayer也派生自Node类,也具有Node特点。同时TMXLayer也派生自SpriteBatchNode类,所有TMXLayer对象具有批量渲染的能力,瓦片地图层就是由大量重复的图片构成,它们需要渲染提高性能。
  2. TMXLayer类的常用方法有哪些
    TMXLayer常用的函数如下:
    ?std::string& getLayerName()。获得层名。
    ?Size& getLayerSize()。获得层尺寸,它的单位是瓦片。
    ?Size& getMapTileSize()。获得瓦片尺寸,它的单位是像素。
    ?Point getPositionAt(const Point& tileCoordinate) 。通过瓦片坐标获得像素坐标,瓦片坐标y轴方向与像素坐标y轴方向相反。
    ?int getTileGIDAt(const Point& tileCoordinate)。通过瓦片坐标获得GID值。
  3. cocos2d-x的box2d如何创建刚体
    创建刚体可以分为六个步骤:
    1、world,创建一个物理世界
    b2Vec2 gravity = b2Vec2(0, -10.f);
    b2World *world = new World(gravity);
    world->setAllowSleeping(true);//是否允许睡眠
    2、body definition,刚体定义
    通过b2BodyDef对象,定义一个刚体的属性
    b2BodyDef groundBodyDef;
    //刚体位置,其中PTM_RATIO是一个宏常量。设定像素/米的比例
    groundBodyDef.position.Set(100.f / PTM_RATIO, 100.f / PTM_RATIO);
    groundBodyDef.type = b2_staticBody;//静态刚体还是动态刚体
    groundBodyDef.userData = sprite;//将精灵与刚体绑定

3、body,通过世界创建一个刚体
b2Body groundBody = world->CreateBody(&groundBodyDef);

4、shape,创建刚体的形状
//实心四边形形状
b2PolygonShape rectShape;
//注意SetAsBox方法的参数分别为半宽、半高
rectShape.SetAsBox(sprite->getContentSize().width / 2 / PTM_RATIO,
sprite->getContentSize().height / 2 / PTM_RATIO));

5、fixture definition。fixture有人说是夹具,有人说是框架。各有所爱吧,本人更偏向于夹具这个形象的说法。
刚体的夹具定义,将形状附着在夹具上(fixture.shape = shape)

b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &rectShape;
groundFixtureDef.density = 1.f;//刚体密度
groundFixtureDef.friction = 0.f;/刚体摩擦力
groundFixtureDef.restitution = 0.f;//刚体的反弹系数

//传感器模式。如果为true,则与其他刚体碰撞时,该刚体不会自动产生碰撞反应
//即可穿过其他刚体
//如果为false,则会自动产生碰撞反应,默认为false
groundFixtureDef.isSensor = true;

6、fixture,通过body创建一个fixture
//注意此处的Fixture要通过Body对象来创建,而不是通过World对象来创建
b2Fixture *groundFixture = groundBody->CreateFixture(&groundFixtureDef);
21. Box2D物理引擎中如何检测碰撞
添加完成新类ContactListener,我们还需要修改它的代码,ContactListener.h文件代码如下

include “cocos2d.h”

include “Box2D/Box2D.h”

USING_NS_CC;

class ContactListener : public b2ContactListener
{
private:
//两个物体开始接触时会响应
virtual void BeginContact(b2Contact* contact);

//持续接触时响应 
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); 
//持续接触时响应,调用完preSolve后调用 
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); 

//分离时响应 
virtual void EndContact(b2Contact* contact); 

};
在头文件中需要引入cocos2d.h和Box2D/Box2D.h头文件,否则会有编译错误。ContactListener采用共有继承b2ContactListener。
ContactListener.cpp文件代码如下:

include “ContactListener.h”

void ContactListener::BeginContact(b2Contact* contact) ①
{
log(“BeginContact”);

b2Body* bodyA = contact->GetFixtureA()->GetBody(); ② 
b2Body* bodyB = contact->GetFixtureB()->GetBody(); ③ 
auto spriteA = (Sprite*)bodyA->GetUserData(); ④ 
auto spriteB = (Sprite*)bodyB->GetUserData(); ⑤ 

if (spriteA != nullptr && spriteB != nullptr)    ⑥ 
{ 
    spriteA->setColor(Color3B::YELLOW); 
    spriteB->setColor(Color3B::YELLOW); 
} 

}

void ContactListener::EndContact(b2Contact* contact) ⑦
{
log(“EndContact”);

b2Body* bodyA = contact->GetFixtureA()->GetBody(); 
b2Body* bodyB = contact->GetFixtureB()->GetBody(); 
auto spriteA = (Sprite*)bodyA->GetUserData(); 
auto spriteB = (Sprite*)bodyB->GetUserData(); 

if (spriteA != nullptr && spriteB != nullptr) 
{ 
    spriteA->setColor(Color3B::WHITE); 
    spriteB->setColor(Color3B::WHITE); 
} 

}

void ContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) ⑧
{
log(“PreSolve”);
}

void ContactListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) ⑨
{
log(“PostSolve”);
}
22. Lua的基本类型有哪些
nil,booiean,number,string,userdata,function,thread,tabel.
23. 函数type的作用是什么?如何使用?
作用:获得给定变量或值得类型
print(type(“string”)) –→string.
24. Lua中的逻辑运算符有哪些
and,or,not
25. Lua中的注释方式有哪些
–单行注释
–[[
]]—多行注释
26. 说说table的几种构造方式
local a = {}
local a = {[“x”] = 12, [“mutou”] = 99, [3] = “hello”}
local a = {x = 12, mutou = 99, [3] = “hello”}
local a = {12, 43, 45, 90}
local a = {
{x = 1, y = 2},
{x = 3, y = 10}
}
function test()
print(“Hello Table”);
end
local a = {[test] = 1}
27. 如何给lua中表添加元素
Table = {}
Tabel.x=0
Tabel[1]=1
28. Lua中多重赋值的规则
会先计算右边所有值再执行赋值操作,当变量个数大于值得个数时,按变量的个数补足nil,,当变量个数小于值得个数时,多余的值会被忽略。
29. 写一个lua的if语句
If i>2o then
Print(i)
else
print(0)
end
30. 写一个lua的for语句
for i=0 10 do
print(i)
end
31. 写一个lua的函数
function fun1()
end
32. Lua与c++的交互
lua和c++是通过一个虚拟栈来交互的。
c++调用lua实际上是:由c++先把数据放入栈中,由lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回c++。
lua调c++也一样:先编写自己的c模块,然后注册函数到lua解释器中,然后由lua去调用这个模块的函数。
33. 用lua创建一个精灵
local bg = CCSprite:create(“bg.png”)
bg:setPosition(100,100)
layer:addChild(bg)
34. 用lua创建一个菜单
local menu = CCMenu:create()
menu:setPosition(100,100)
layer:addChild(menu)
35. 用lua写一个响应触摸事件的处理函数
function onTouch(eventType)
if eventType == “began” then
print(“began”)
elseif eventType == “moved” then
print(“moved”)
else
print(“end”)
end
36. 列举quick-cocos2d-x的framework/ui中一些文件和用途
文件名称 控件
UIButton 按钮基类
UICheckBoxButton CheckBox按钮控件
UICheckBoxButtonGroup CheckBox按钮组控件
UIGroup 控件组基类
UIImage 图片控件
UIInput 输入控件
UILabel 文字控件
UILayout 布局基类
UIListView 列表控件
UIListViewItem 列表项控件
UILoadingBar 加载进度条控件
UIPageView PageView控件
UIPageViewItem PageView单个控件
UIPushButton 按钮控件
UIScrollView 滚动视图控件
UISlider 滑动控件
UIStretch 拉伸控件
37. 创建一个UIPushButton
Button=cc.ui.UIPushButton.new({normal=” Button.png”,pressed=” Button.png”},{scale9=true})
:onButtonClicked(function (event)
print(“Button”)
end)
38. 如何对quick-cocos2d-x的脚本文件加密
通过控制台进入到该工程目录下,例:
cd /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/quicktest

执行 compile_scripts.sh脚本(位于quick-cocos2d-x-2.2.5/bin文件夹下。windows下执行.bat),执行时需要输入若干个参数,这里简单介绍一下各个参数的功能(也可以直接查看对应的php脚本文件或输入-h查看帮助):
• -h 帮助
• -i 源文件目录
• -o 输出文件目录/输出文件名
• -p 包前缀名字
• -x 不包含的包,即当前目录下的哪些包不希望被添加进去
• -m 编译模式,包含两种,一种是默认的打包成zip,另外一种是不打包直接生成一个个的文件
• -e 加密模式,包含两种,xxtea_chunk是对文件本身进行加密,xxtea_zip是对打包后的zip进行加密
• -ek 加密秘钥
• -es 加密签名
• -ex 加密文件的后缀名,默认是lua
• -c 从一个文件加载参数列表
• -q 生成过程不输出信息

例:
1 /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek MYKEY -es XT
上面这段代码的作用,是将 scripts 文件夹中的脚本文件压缩,并存放到res目录下,压缩后的文件名为game.zip,加密方式采用的是对zip压缩包进行加密,如果采用文本方式加密则-e 后应该写 xxtea_chunks。秘钥和签名将会在代码中使用。操作完整截图如下:

下面打开quick-cocos2d-x/bin/quicktest/res ,可以看到里面有两个压缩包,其中framework_precompiled.zip是引擎自带的,而另外一个则是我们刚刚生成的,双击game.zip之后你会发现解压出来的是一个game.zip.cpgz的文件,然后双击这个.cpgz的文件之后又会生成game.zip文件,原因是这个zip已经被加密,所以无法识别了。如果这里采用的是脚本加密的方式或不加密的方式则可以正常解压。

之后在引擎中使用加密后的脚本文件时,只需将AppDelegate.cpp中原本执行脚本文件的那段代码替换为如下代码:
1
2
3 pStack->setXXTEAKeyAndSign(“MYKEY”, 5, “XT”, 2);
pStack->loadChunksFromZIP(“res/game.zip”);
pStack->executeString(“require ‘main’”);
其中第一行代码中的5和2代表的是字符串”MYKEY”和”XT”的字符个数为5和2
39. Quick-Cocos2d-x player使用步骤
1、打开player
2、选择新建项目
3、选择路径
4、选择配置
5、点击创建
40. 用quick实现画线
Line = display.newLine({10,10},{100,100})
Layer:addChild(Line)
41. UIPageView 简单使用
function TestUIPageViewScene:createPageView()

self.pv = cc.ui.UIPageView.new({
    viewRect = cc.rect(80,280,780,480) ,  --设置位置和大小
    column = 3 , row = 3,                       --列和行的数量
    padding = {left = 20 , right = 20 , top = 20 , bottom = 20} , --整体的四周距离
    columnSpace = 10 , rowSpace = 10                                        --行和列的间距
})
:onTouch(handler(self,self.touchListener))
:addTo(self)

for i = 1 , 18 do
           local item = self.pv:newItem()
           local content
    content = display.newColorLayer(
    cc.c4b(math.random(250),
    math.random(250),
    math.random(250),
    math.random(250)))

    content:setContentSize(240 , 140)
    content:setTouchEnabled(false)
    item:addChild(content)      -- 为每个单独的item添加一个颜色图块
    self.pv:addItem(item)          --为pageview添加item
end

self.pv:reload()            --需要重新刷新才能显示

end
42. Quick-Cocos2d-x数据存储之GameState主要 方法

1、GameState.init(eventListener_, stateFilename_, secretKey_)
这个方法是初始化GameState,在场景初始化之前调用一次即可,如在MyApp.lua的MyApp:ctor()中调用。
eventListener_是载入或保存时调用的函数,可以写个匿名函数,后面会重点介绍;
stateFilename_是保存的文件名,如果留空或非字符串(string)则是默认的state.txt,该文件会被保存到device.writablePath下;
secretKey_是 校验文件时所用到的密钥,GameState保存的数据格式为{h = hash, s = s},s是我们要保存的数据(一个table),h则是要校验的一个md5码。如果secretKey_留空或为非字符串(string)则不加校验码, 直接保存数据,跟CCUserDefault一样了。
2、GameState.load()
载入并返回数据,一般此方法只调用一些就行,在游戏加载前调用并保存到一个全局变量GameData。
3、GameState.save(newValues)
保存数据,newValues是一个table。GameState.init对应于保存一个文件,此文件的内容就是newValues,所以我们需要更新数据的时候应该改变上面的GameData,然后保存GameData。
4、GameState.getGameStatePath()
保存的文件的完整路径。
43. Quick-Cocos2d-x打包iOS和Android流程
1. 下载最新版本的 ADT Bundle
2. 在完成 SDK和 NDK 的下载安装后,我们需要做一些环境配置工作:
• Mac下修改 .profile 文件:
1
2
3
4
5
6
7
8
9 //启动终端应用程序, 运行命令:
if[f /.profile];thenopene /.profile;fi// if[ -f ~/.bash_profile ]; then open -e
~/.bash_profile; fi
//添加以下代码:
export ANDROID_NDK_ROOT=NDK绝对路径
export ANDROID_SDK_ROOT=SDK绝对路径
export ANDROID_HOME=${ANDROID_SDK_ROOT}
• Windows下在系统设置里添加以下环境变量:
1
2
3 ANDROID_NDK_ROOT=NDK绝对路径
ANDROID_SDK_ROOT=SDK绝对路径
ANDROID_HOME=%ANDROID_SDK_ROOT%
4. 打开终端窗口,进入 [项目文件夹]/frameworks/runtime-src/proj.android目录
5. 如果是 Mac系统,运行 ./build_native.sh,Windows 系统则运行 build_native.bat
6. 如果一切顺利,我们将看到输出信息的最后几行:
1
2
3 SharedLibrary : libgame.so
Install :
libgame.so => libs/armeabi/libgame.so
7. 将项目导入Eclipse ADT
7.1 先导入Cocos2d-x 的 Java 库
a. 选择菜单File -> Import, 再选择Android -> Existing Android Code Into Workspace
b. 点击Browse 按钮, 选择 quick 目录中的 cocos/platform/android/java
c. 点击“Finish” 完成操作。
7.2 导入项目的Android工程
a. 重复上述步骤,导入 [项目文件夹]/frameworks/runtime-src/proj.android
b. 在工程上点击右键选择菜单 “Properties” 打开工程设置对话框
c. 从左侧选择 Android,然后点击右侧 “Add” 按钮,添加 v3quick 库。如果添加之前 v3quick 库已经在 Library 列表中,则删除后重新添加
如果完成上述操作后,Eclipse ADT 窗口 Package Explorer 列出的 v3quick 和项目文件夹上有红色错误图标。请仔细检查 v3quick 和 项目的操作步骤,以及 Project
Build Target 是否是最新版本的 SDK。
8. 签名并打包apk

二、iOS打包
1. 用Xcode直接打开 [项目文件夹]/frameworks/runtime-src/proj.ios_mac/avoidplane.xcodeproj
2. 安装证书
3. 选择Product->Archive(必要的话,可以clean下工程),接下来就是漫长的编译过程
4. 右击生成的Archive文件,即“name”下面那些文件,选择Show in Finder
5. 右击xxx.xcarchive文件,显示包内容,找到真正的xxx.app
6. 将xxx.app拖到itunes中,此时就会在iTunes目录下生成ipa文件了
7. 在iTunes中右击我们拖进去的xxx.app,在Finder中显示,就找到了生成的plist和ipa文件了。
44. 创建一个帧动画
local frames = display.newFrames(frameName,1,frameNum)
local animation = display.newAnimation(frames,delayTime / frameNum)
45. Quick的几个常见事件
cc.NODE_EVENT - enter, exit 等事件
cc.NODE_ENTER_FRAME_EVENT - 帧事件
cc.NODE_TOUCH_EVENT - 触摸事件
cc.NODE_TOUCH_CAPTURE_EVENT - 捕获触摸事件
cc.MENU_ITEM_CLICKED_EVENT - CCMenu 菜单项点击事件
46. 如何设置单点触摸和多点触摸
cc.TOUCH_MODE_ONE_BY_ONE 是单点触摸
cc.TOUCH_MODE_ALL_AT_ONCE 是多点触摸
47. 触摸中event参数里变量的含义
event.name 是触摸事件的状态:began, moved, ended, cancelled, added(仅限多点触摸), removed(仅限多点触摸);
event.x, event.y 是触摸点当前位置;
event.prevX, event.prevY 是触摸点之前的位置;
48. 创建一个定时器
local scheduler = require(“framework.scheduler”)
self._schedule = scheduler.scheduleGlobal(handler(self, self.update),0.1)
49. transition类的一些常用函数
transition.newEasing(action, easingName, more)
为图像创造效果
transition.execute(target, action, args)
执行一个动作效果
transition.rotateTo(target, args)
将显示对象旋转到指定角度,并返回 CCAction 动作对象。
transition.moveTo(target, args)
将显示对象移动到指定位置,并返回 CCAction 动作对象。
transition.fadeTo(target, args)
将显示对象的透明度改变为指定值,并返回 CCAction 动作对象。
transition.scaleTo(target, args)
将显示对象缩放到指定比例,并返回 CCAction 动作对象。
transition.sequence(actions)
创建一个动作序列对象。
50. 如何设置Android返回键监听

scene:setKeypadEnabled(true)
scene:addNodeEventListener(cc.KEYPAD_EVENT , function(event)
if event.key == “back” then
print(“back”)
end

1.cocos2d与cocos2d-x的区别?
答:cocos2d是objective-c写的,是只能在ios平台使用的,cocos2d-x是使用c++写的,可以在android\ios\linux\windows等平台使用。

2.如何搭建mac下cocos2d-x的开发环境?
答:下载最新的开发包,解压,然后
cd 引擎包根目录
./setup.py
一路按回车即可
最后执行source /../ .bash_profile 前面的路径是你电脑中的路径,并且这个命令在最后是有提示的。

3.在哪些情况下使用Node?
答:需要管理一批子节点的时候,我们可以使用一个Node
还有我们如果需要实现一个自定义的精灵等,我们可以继承自Node。

4.简单介绍一下Dirctor?
答:导演是一个单例,我们可以通过getInstance方法来获取导演类的实例对象。导演控制整个的游戏流程,例如跑动第一个场景使用runWithScene,替换场景使用replaseWithScen,还有游戏暂停,重启等等,一些数据我们可以从导演中获得,例如屏幕的大小,屏幕的可见区域等等。

5.Layer和Scene有什么区别?
答:Scene类继承于Node,它的实现很简单,就是基本上没添加什么内容。它只是作为一个容器的抽象概念存在。对比Node差别有,构造函数中设置了不使用锚点定位,而是使用了坐标原点,即使设置了锚点也不起作用。在init中设置场景的大小。节点的初始化大小为SizeZero,也就是没有大小。Scene初始化时设置了场景的大小,即窗口大小。
Layer和Scene的初始化差不多,也是构造函数中设置不使用锚点定位,init函数中设置了层的大小,即窗口大小。

6.Layer的OnEnter、OnExit、OnEnterTransitionDidFinish、OnExitDidStart几个方法在什么时候被调用。
答:在屏幕将要显示的时候会调用OnEnter、OnEnterTransitionDidFinish。在推出的时候会调用OnExitDidStart、OnExit。

7.如何创建一个音乐播放和暂停按钮,代码实现。
答: void callback(Ref* psender)
MenuItemImage *item1 = MenuItemImage::create(“”, “”);
MenuItemImage *item2 = MenuItemImage::create(“”, “”);
MenuItemToggle *toggle = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::callback, this), item1,item2, NULL);
Menu *menu = Menu::create(toggle, NULL);
this->addChild(menu);

8.简单介绍Vector。
答: Vector

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值