3.cocos2dx它Menu,由menu为了实现场景切换



1 头文件

TMenu.h

#ifndef __TMENU_H__

#define __TMENU_H__

 

#include "cocos2d.h"

USING_NS_CC;

 

class TMenu :public CCLayer

{

public:

    static CCScene * scene();

    CREATE_FUNC(TMenu);

    bool init();

 

    CCMenu * menu;

 

    void menuCallback(CCObject * sender);

    void closeCallback(CCObject * sender);

 

    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);

};

 

#endif

TMenu.cpp

#include "TMenu.h"

#include "AppMacros.h"

#include "T02LayerSprite.h"

#include "T03LayerZorder.h"

#include "T04ColorLayer.h"

#include "T05Coordinate.h"

#include "T06BatchNode.h"

#include "T07Schedule.h"

#include "T08Touch.h"

#include "T09Memory.h"

#include "T10Label.h"

 

//通过sizeof(menu_array)求出数组占用的总空间大小

//通过sizeof(*menu_array)求出数组中的每一个元素的大小

static char * menu_array[]

{

    "T02LayerSprite.h",

    "T03LayerZorder.h",

    "T04ColorLayer.h",

    "T05Coordinate.h",

    "T06BatchNode.h",

    "T07Schedule.h",

    "T08Touch.h",

    "T09Memory.h",

    "T10Label.h"

};

 

CCScene * TMenu::scene()

{

    CCScene * scene = CCScene::create();

    TMenu * layer = TMenu::create();

    scene->addChild(layer);

    return scene;

}

 

bool TMenu::init()

{

    CCLayer::init();

 

    menu = CCMenu::create();

    //通过以下的方式实现将菜单项加入到menu

    for (int i = 0; i < sizeof(menu_array) / sizeof(*menu_array); i++)

    {

        CCMenuItem * item = CCMenuItemFont::create(menu_array[i],

            this,

            menu_selector(TMenu::menuCallback));

        menu->addChild(item);

    }

    //设置菜单的显示方向为垂直方向

    menu->alignItemsVertically();

    addChild(menu);

 

    CCArray * array = menu->getChildren();

    CCObject * obj;

    int i = 0;

    CCARRAY_FOREACH(array, obj)

    {

        CCMenuItem * item = (CCMenuItem*)obj;

        item->setTag(i + 1 + 10000);

        i++;

    }

    CCMenuItem * closeItem = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png");

    closeItem->setTarget(this, menu_selector(TMenu::closeCallback));

    CCMenu * menu2 = CCMenu::create(closeItem, NULL);

    menu2->setPosition(CCPointZero);

    closeItem->setPosition(ccp(winSize.width - closeItem->getContentSize().width / 2,

        winSize.height - closeItem->getContentSize().height / 2));

    addChild(menu2);

 

    //设置触摸事件,为可touch

    setTouchEnabled(true);

    setTouchMode(kCCTouchesOneByOne);

 

    return true;

}

 

//当点击到菜单之后跳转到指定的CCScene中去

void TMenu::menuCallback(CCObject * sender)

{

    CCMenuItem * item = (CCMenuItem *)sender;

    CCScene * pScene = NULL;

    switch (item->getTag() - 10000)

    {

    case 1:

        pScene = T02LayerSprite::scene();

        break;

    case 2:

        pScene = T03LayerZorder::scene();

        break;

    case 3:

        pScene = T04ColorLayer::scene();

        break;

    case 4:

        pScene = T05Coordinate::scene();

        break;

    case 5:

        pScene = T06BatchNode::scene();

        break;

    case 6:

        pScene = T07Schedule::scene();

        break;

    case 7:

        pScene = T08Touch::scene();

        break;

    case 8:

        pScene = T09Memory::scene();

        break;

    case 9:

        pScene = T10Label::scene();

        break;

    }

    if (pScene != NULL)

    {

        //通过CCDirectorsharedDirector来实现场景的切换

        CCDirector::sharedDirector()->replaceScene(pScene);

    }

}

 

//当点击关闭的时候游戏退出

void TMenu::closeCallback(CCObject * sender)

{

    exit(0);

}

 

bool TMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

    return true;

}

 

void TMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){

    CCRect rcWin = CCRect(0,40,winSize.width,winSize.height - 80);

    CCMenuItem * firstItem = (CCMenuItem *)menu->getChildren()->objectAtIndex(0);

    CCMenuItem * lastItem = (CCMenuItem *)menu->getChildren()->lastObject();

 

    CCPoint firstInWorld = menu->convertToWorldSpace(firstItem->getPosition());

    CCPoint lastInWorld = menu->convertToWorldSpace(lastItem->getPosition());

 

    //当中Delta的坐标表示的是開始坐标的减去最后坐标的差值

    if (rcWin.containsPoint(firstInWorld) && pTouch->getDelta().y<0)

        return;

    if (rcWin.containsPoint(lastInWorld) && pTouch->getDelta().y>0)

        return;

    menu->setPositionY(menu->getPositionY() + pTouch->getDelta().y);

}

执行结果:

 

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4658589.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Difference: throw or throw ex?

Difference: throw or throw ex? 主要区别在于throw出的堆栈详细程度。 throw ex只是抛出在当前代码处的错误。 throw 能够更进一步&#xff0c;抛出内部调用的具体错误。 Just for demonstrating, if you have classes in C# as follows: using System;namespace WindowsAppl…

学习笔记01:1.1 基于概率的信任

基于概率的信任 大数定律&#xff1a;当样本数量越来越多时&#xff0c;预测事件也就越来越接近于真实的事件&#xff0c;事件出现的频率无穷地接近事件发生的概率建模检验&#xff1a;人工规则->学习模型&#xff0c;数据少则重视先验&#xff0c;数据多则重视后验给予概率…

人工智能数学基础知识

方差的概念与计算公式&#xff0c;例1 两人的5次测验成绩如下&#xff1a;X&#xff1a; 50&#xff0c;100&#xff0c;100&#xff0c;60&#xff0c;50 E(X)72&#xff1b;Y&#xff1a; 73&#xff0c; 70&#xff0c; 75&#xff0c;72&#xff0c;70 E(Y)72。平均成绩相同…

学习笔记02:直播串讲——3/22

去 就 就 就 接近 就 就 接近

认真分析mmap:是什么 为什么 怎么用

mmap基础概念 mmap是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff0c;进程就可以采用指针的方式读写操作这一段内存&#xff…

数据库子查询

子查询&#xff0c;又叫做嵌套查询。 将一个查询语句做为一个结果集供其他SQL语句使用&#xff0c;就像使用普通的表一样&#xff0c;被当作结果集的查询语句被称为子查询。 子查询有两种类型&#xff1a; 一种是只返回一个单值的子查询&#xff0c;这时它可以用在一个单值可以…

摄像头资料

https://blog.csdn.net/u013749068/article/details/79463736

配置vim在源代码中自动添加作者信息

每个程序员都有自己心爱的代码编辑和查看工具&#xff0c;相信不少Linux下的程序员都喜欢用Vim&#xff0c;尽管Vim没有SourceInsight这种依托于桌面环境的编辑器看起来那样强大&#xff0c;但是Vim的高效、简洁以及强大的可配置性都让它吸引了无数忠实的fans。 很多编辑器都支…

paddle模块的详细介绍

https://blog.csdn.net/hua111hua/article/details/89415396

[CareerCup] 2.4 Partition List 划分链表

2.4 Write code to partition a linked list around a value x, such that all nodes less than x come before all nodes greater than or equal to x. LeetCode上的原题&#xff0c;请参见我之前的博客Partition List 划分链表。转载于:https://www.cnblogs.com/grandyang/p/…

sdl的缩放问题

SDL是一种既是开源的&#xff0c;也是跨平台的多媒体开发包&#xff0c;在各种平台上应用很广&#xff0c;经常和FFMPEG等解码器同时使用。对于在windows mobile等缺乏通用播放器的平台来说&#xff0c;是一种很好的选择。网上很多代码&#xff0c;介绍SDL的用法&#xff0c;主…

Ubuntu系统盘制作

1、首先打开UltraISO软件&#xff0c;尽量下载最新版的&#xff0c;小编曾用某个旧版的UltraISO&#xff0c;制作的安装盘&#xff0c;不能不能识别磁盘&#xff0c;安装失败! 2、点击工具栏中的第二个打开镜像文件工具&#xff0c;如图红色方框标志按钮&#xff0c;然后在打开…

RH131 网络配置

ip addr show 查看当前网络地址 ip link show 查看网络链接状态 ip -s link show 查看网卡统计信息 ip addr add 192.168.0.154 添加ip地址 ip link dev eth0 down 禁用ip地址 网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ethx 自动专用地址&#xff1a;169.254.*.* …

学习笔记02:直播串讲02

1.基于模型的学习 根据以往的学习经验&#xff0c;建立起输入输出的模型&#xff0c;然后预测输入&#xff0c;并且将输入带入到模型中&#xff0c;进而预测出输出的结果&#xff0c;这种学习称为基于模型的学习 2.机器学习的过程 1&#xff09;数据收集&#xff1a;通过爬虫、…

如何将Pcm格式的音频文件转换成Wave格式的文件

最近在做一款变声App&#xff0c;其中就用到了将pcm格式转wave格式&#xff0c;下面贴出源代码&#xff0c;希望带有需求的童鞋有帮助&#xff01;&#xff01;&#xff01;这里是c语言写的&#xff0c;也可以用java实现。当然java调用native函数要用到jni技术。具体jni技术自己…

Dojo仪表板

Dojo它提供了一个良好的仪表板显示器&#xff0c;的影响&#xff0c;如以下&#xff1a; <!DOCTYPE html> <html> <head><title>Dojo仪表盘</title><meta charset"utf-8"><script src"http://192.168.240.186/arcgis_js…

在新的固态硬盘只装ubuntu16.04系统,重启后无启动项解决方案

方法一&#xff1a;不要使用UltraISO制作ubutnu系统启动盘&#xff0c;需要用UniversalUSBInstaller &#xff08;这个是Ubuntu官方推荐的制作u盘的软件&#xff09; 不用UltraISO这个是因为&#xff0c;装完ubuntu系统后&#xff0c;启动的时候只有黑屏幕的光标&#xff0c;是…

学习笔记(22):Python网络编程并发编程-什么是线程

立即学习:https://edu.csdn.net/course/play/24458/296436?utm_sourceblogtoedu 什么是线程&#xff1f;&#xff08;以地铁为例&#xff09; 1.北京地铁、上海地铁、广州地铁称之为三个不同的进程&#xff1b;而上海1号线上海3号线称之为线程&#xff1b; 2.进程是资源单位&a…

流程图制作在云上 https://www.processon.com/

流程图制作在云上 &#xff1a; https://www.processon.com/ 转载于:https://www.cnblogs.com/hopesun/p/4661429.html

机械硬盘变成了动态磁盘怎么压缩不了该磁盘

由于我的电脑原装是win8系统&#xff0c;自从win8系统以及以后的win10系统&#xff0c;磁盘管理方式变成了两种&#xff0c;1是基本磁盘管理&#xff1b;2是动态磁盘管理 由于本人想要在机械硬盘上压缩一个可用的绿色空间出来安装ubuntu系统&#xff1b;由于本人的三星机械100…