VS2013快捷键:注释,Ctrl+K+C;取消注释Ctrl+K+U。都是单行。要实现多行注释与取消注释,就选中多行。
run方法调用了AppDelegate的applicationDidFinishLaunching方法
要调整窗体的大小的话,在AppDelegate.cpp的

auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}

下面添加一行:

glview->setFrameSize(,);

效果如图:

director->setDisplayStats(true);//显示帧频
director->setAnimationInterval(1.0/);//设置动画间隔。设置帧频大小,设置每一帧时间的间隔。1.0/60表示现在的帧频是60帧。

在讲今天的内容之前,需要了解几个概念:Director, Scene, Layer, Sprite, 本地坐标VS世界坐标,锚点,Z轴顺序。

游戏中基本上所有的类都派生自节点类(Node),如图

  

  •   Director是整个cocos2dx引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。

       1、获取Director实例:auto director = Director::getInstance();

         2、Director控制场景的常用方法:用的栈的思想

      • runWithScene(Scene *scene)
      • replaceScene(Scene *scene)
  •   场景(Scene)是层的容器。一般创建Scene的子类,在子类的初始化中载入游戏资源,为场景添加层,启动音乐播放等等。
  •   层(Layer)通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等。
  •   精灵(Sprite)和其他游戏引擎中的精灵相似,它可以移动,旋转,缩放,执行动画,并接受其他转换。

笛卡尔坐标系、笛卡尔右手系、屏幕坐标系、cocos2d坐标系:

  •   笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系。
  •   Cocos2d坐标系和OpenGL坐标系一样,原点为屏幕左下角,x向右,y向上。
  •   iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下。
  •   世界坐标系也叫绝对坐标系,“世界”指的是游戏世界。本地坐标系也叫相对坐标系,和节点关联,随节点移动。

锚点(Anchor Point):

  •   两个参数在(0,1)之间。
  •   Layer的Anchor Point默认值为(0,0),其他Node的默认值为(0.5,0.5)。
  •   将一个节点添加到父节点里面时,需要设置其在父节点上的位置,本质上是设置节点的锚点在父节点坐标上的位置。
  •   Layer添加子节点默认在(0,0),除非子节点用setPosition方法修改。setPosition默认参数为(0, 0)(相对坐标系)。
  •   个人认为,锚点就是中心变化点。

VertexZ, PositionZ, Zorder:

  •   positionZ = VertexZ。
  •   positionZ:全局渲染顺序,即在根节点上的渲染顺序。
  •   zOrder: 局部渲染顺序,即在其父节点上的渲染顺序,与Node的层级有关。
  •   当同时设置了positionZ和zOrder, 则positionZ生效。
  •   个人理解:positionZ比zOrder优先级更大。

Sprite:

  (Sprite)精灵只是很简单的表现,可以理解为图片对象,仅用于图像表现。所以包含攻击力、血量、速度等一系列属性的飞机不是Sprite。飞机包含了精灵对象,是组合。
  Sprite的create方法有4个重载。
  我们要把图片img.jpg放在项目的Resources目录下。然后在VS2013中,展开我们的项目,右键resource——>添加——>添加现有项(快捷键Alt+Shift+A)。找到Resources目录下的img.jpg,添加进来。
  注释掉HelloWorldScene.cpp的init()方法中其他语句,只保留

bool HelloWorld::init()
if ( !Layer::init() )
{
return false;
}
//我们的代码从这里开始
return true;
}

  从我标注的地方添加代码:

auto s = Sprite::create("img.jpg");
this->addChild(s);

  Shift+F5,运行项目,结果如图。

  咦?和我们想象的不一样。图片只显示了右上角1/4。因为Sprite对象默认的锚点是(0.5, 0.5)。我们调整锚点为(0, 0)。

s->setAnchorPoint(Vec2(, ));//方法的参数是一个二维向量

  这样,图片整个都出来了。

Director、Layer、Scene:
  Director: 功能是切换Scene。只有在第一次呈现场景时用runWithScene,有场景存在的情况下,用replaceScene。
  为了演示Scene是怎么操作的,我们注释掉AppDelegate.cpp的applicationDidFinishLaunching方法中的这条语句:auto scene = HelloWorld::createScene();
  并在下面添加如下代码:

Scene *scene = Scene::create();
Layer *layer = Layer::create();
scene->addChild(layer);
Sprite *s = Sprite::create("img.jpg");
s->setAnchorPoint(Vec2(, ));
layer->addChild(s);

  运行效果和原来一样。

注:以下代码无特殊说明,都写在HelloWorldScene.cpp的init方法中。
Log:

  Log只能在调试(快捷键F5)时才能看到。
  

log("Hello cocos2d-x log");
log("Hello int %d",);

MessageBox(对话框):
创建方法:MessageBox("消息内容", "消息标题");
效果如图:

LabelTTF(文本标签):

//获得屏幕可见区域的大小
Size visibleSize = Director::getInstance()->getVisibleSize(); LabelTTF *label = LabelTTF::create();
label->setString("Hello cocos2d-x");
label->setFontSize();
//setPosition放置的是label的锚点,而label的锚点默认是(0.5, 0.5),在label的正中间
//下面这条语句将label放在屏幕的正中间
label->setPosition(visibleSize.width/, visibleSize.height/);
this->addChild(label);

  运行结果:

TextFieldTTF(输入文本):

Size visibleSize = Director::getInstance()->getVisibleSize();
TextFieldTTF *tf = TextFieldTTF::textFieldWithPlaceHolder("input here","宋体",);
tf->setPosition(visibleSize.width/, visibleSize.height/);
this->addChild(tf); auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [](Touch *t, Event *e){
log(">>>>>>>>");
return false;
}; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,tf);

  以上代码,单击input here输入文本,有log输出,但是,单击屏幕其他地方,也有log输出,这就不是我们希望的结果了。

  修改代码如下:

[](Touch *t, Event *e){
if (tf->getBoundingBox().containsPoint(t->getLocation())){
log(">>>>>>>>");
}
return false;
};


  
这段其实是函数闭包,我们在函数闭包里面是访问不到外面的变量的。要解决这个问题,在中括号里面写tf,即[tf]。
  最终代码如下:

Size visibleSize = Director::getInstance()->getVisibleSize();
TextFieldTTF *tf = TextFieldTTF::textFieldWithPlaceHolder("input here","宋体",);
tf->setPosition(visibleSize.width/, visibleSize.height/);
this->addChild(tf); auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [tf](Touch *t, Event *e){
if (tf->getBoundingBox().containsPoint(t->getLocation())){
//log(">>>>>>>>");
tf->attachWithIME();//连接到IME,就可以输入了
}
else{
tf->detachWithIME();//断开连接
  }
return false;
}; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,tf);

  效果如图:

创建自定义类:
  cocos2d-x发展自cocos2d,cocos2d最开始是用OC开发的,所以cocos2d-x也保留了OC的语言习惯。

  VS2013,如果你直接在:解决方案资源管理器——>HelloCocos——>src——>添加——>新建项,创建自定义类,那么你在include进其他.cpp或.h文件的时候,会报“无法打开源文件”的错。因为项目的层级显示是虚拟文件夹,你的新建项在proj.win32目录下,不在Classes目录下,当然找不到。所以为了统一管理,在Classes目录下新建.cpp和.h文件,然后解决方案资源管理器——>HelloCocos——>src——>添加——>现有项。资源文件也是如此。

  自定义一个类,中间显示一个小球。ball.png放在HelloCocos\Resources目录下;Ball.h和Ball.cpp放在HelloCocos\Classes目录下。

  Ball.h如下:

#ifndef _HELLOCOCOS_BALL_
#define _HELLOCOCOS_BALL_ #include<iostream>
#include "cocos2d.h" using namespace cocos2d;//因为Sprite在cocos2d的命名空间里 class Ball : public Sprite{
public:
virtual bool init();
/*static Ball* create(){
Ball* b = new Ball();
b->init();
b->autorelease(); return b;
}*/
CREATE_FUNC(Ball);
}; #endif

Ball.cpp如下:

#include "Ball.h"
bool Ball::init(){
initWithFile("ball.png");
return true;
}

在HelloWorldScene.cpp的init方法中添加如下代码:

Size visibleSize = Director::getInstance()->getVisibleSize();
auto ball = Ball::create();
ball->setPosition(visibleSize.width/,visibleSize.height/);
this->addChild(ball);

  具体添加位置如图:

  运行结果:

今天就这么多内容。明天加油!

五毛的cocos2d-x学习笔记03-控件的更多相关文章

  1. iOS学习笔记——基础控件(上)

    本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...

  2. Python:GUI之tkinter学习笔记1控件的介绍及使用

    相关内容: tkinter的使用 1.模块的导入 2.使用 3.控件介绍 Tk Button Label Frame Toplevel Menu Menubutton Canvas Entry Mes ...

  3. ios 学习笔记之控件属性

    1.文本框 设置密码属性:Secure Text Entry 勾选; 设置文本框带清除属性: Clear Button =Is always visible;  默认是不带清除属性:Never app ...

  4. jQuery学习笔记(控件位置定位、尺寸大小的获取等)

    想做一个幽灵按钮出来,效果大概如下图: 当点击按钮的时候,会有四根线条从四个方向飞入,经历从“无-有-无”的闪入过程. 那么我的设计想法是,先在HTML中定义一个按钮,然后在jQuery中设计按钮点击 ...

  5. 学习笔记-menusript控件中条目权限设置使用

    在做一个小程序的时候,偶然发现了使用menusript控件做权限设置的方法,仅此标记,以供参考. 首先创建一个实例:testuseright.sln, 在项目文件里创建两个窗体:Form1.cs和us ...

  6. IOS 学习笔记(7) 控件 分隔栏控件(UISegmentControl)的使用方法

    分隔栏控件的系统默认式样一共有3种,分别是“普通式样”,"边框式样","条状式样" 分隔栏控件中有一个momentary属性,默认时NO.当开发者配置成YES时 ...

  7. IOS 学习笔记(6) 控件 文本域(UITextField)的使用方法

    UITextField控件的诸多特性都和UITextView相似,比如成为输入文本焦点时键盘自动显示,支持长按弹出动作选项,能够接收输入事件(开始输入,修改内容,结束输入和点击回车等). 1.特有的特 ...

  8. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  9. IOS 学习笔记(4) 控件 标签(UILabel)的使用方法

    虽说Label的中文翻译是标签标记,但它其实是一个静态文本内容的展现控件. 一般来说,UILabel只是一个只读的文本视图,开发者可以利用UiLabel来展示内容长度有固定上限的文字内容.并且,UIL ...

  10. [Android学习笔记]组合控件的使用

    组合控件的使用 开发过程中,多个UI控件需要协同工作,相互交互之后,才可完成一个完整的业务需求,此时可把这些控件封装成为一个整体,相互之间的交互逻辑封装其中,外部调用可无需关心内部逻辑,只需获取处理后 ...

随机推荐

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">的含义

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/x ...

  2. IQC,QA,FQC,OQC,IPQC的定义与职责

    进货检验员(IQC):CLInetLabIQC(以下简称IQC)是CLInet在多年开发维护EQA(实验室间质量评价)系统后,成功开发的一套完善的实验室内部的质量评价.质量控制的软件.它不仅包含了每家 ...

  3. 59 pages的Delphi源码

    http://www.codesc.net/source/list_10_59.shtml

  4. 飘逸的python - 用urlparse从url中抽离出想要的信息

    最近有个需求,要检测配置中的那些url的域名是否都正常,即是否都能ping通. 不过配置中url格式是这样的 http://www.something.com:1234/ . 要ping的是www.s ...

  5. 自己的第一个android应用(天气)

    主界面代码 package com.example.weather; import android.os.Bundle; import android.app.Activity; import and ...

  6. JavaSE学习总结第26天_网络编程

      26.01  网络编程概述 网络编程:就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 26.02  网络模型概述和图解 计算机网络之间以何种规则进行通信,就是网络模型研究问题. ...

  7. BZOJ 1114 Number theory(莫比乌斯反演+预处理)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , ...

  8. quartz 定时调度持久化数据库配置文件

    1 下载quartz对应版本jar包 2 初始化对应数据库sql(版本需要对应,不然会出现少字段的情况) ,下载地址  https://github.com/quartz-scheduler/quar ...

  9. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  10. 使用 Sublime Text 3 开发 React

    下载, 安装, 破解就不用说了, 直接进主题: 1, 安装Package Control 默认的Sublime 3中没有Package Control,要进行安装之后才能用这个去安装其他的插件. 简单 ...