最近也不知道怎么了,总想用Cocos2d-X做一个比较好的东西,想想也是,学习Cocos2d-X快一个月了,也该做个东西练练手了,最近总用手机拍照,看照片,忽然想做一款与图片相关的小游戏,游戏非常简单打开后会显示一个界面,界面上有三个按钮(实际上是使用精灵创建的菜单项)


点击按钮后可以进入相关的场景中(例如点击校园后进入校园创建)


通过鼠标的拖拽可以查看校园场景的图片



如果再看其它创建的图片可以通过点击右下角返回程序主界面



工程文件结构


文件解析:

MenuScene.h/MenuScene.cpp:创建程序的主创建、创建菜单项

LayerBack.h/LayerBack.cpp:创建返回按钮,实现各个场景到主场景的切换

ParkScene.h/Park.cpp:创建公园场景

SchoolScene.h/SchoolScene.cpp:创建校园场景

ViewScene.h/ViewScene.cpp:创建风景区场景


程序中所用到的技术:

程序主界面显示的一张背景图和三个按钮

背景图片使用的是精灵

    //设置程序背景
    CCSprite* background = CCSprite::create("background.png");
    addChild(background);
    background->setPosition(center);


三个按钮使用了Ccmenu 、CcmenuItemSprite、通过精灵创建菜单项,并且实现点击菜单项切换场景

    //创建一个菜单
    Ccmenu* menu = Ccmenu::create();
    addChild(menu);

    //设置菜单的坐标原点在窗口的左下角
     menu->setPosition(CCPointZero);


     //创建个按钮(用精灵创建菜单项,点击后进入公园)
    CcmenuItemSprite* Item1 = CcmenuItemSprite::create (
        CCSprite::create("Button_3.png"),CCSprite::create("Button_3.png"));
    menu->addChild(Item1);
    Item1->setPosition(ccp(center.x,center.y + 70));


    //创建个按钮(用精灵创建菜单项,点击后进入校园)
    CcmenuItemSprite* Item2 = CcmenuItemSprite::create (
        CCSprite::create("Button_1.png"),CCSprite::create("Button_1.png"));
    menu->addChild(Item2);
    Item2->setPosition(center);


     //创建个按钮(用精灵创建菜单项,点击后进入风景区)
    CcmenuItemSprite* Item3 = CcmenuItemSprite::create (
        CCSprite::create("Button_2.png"),CCSprite::create("Button_2.png"));
    menu->addChild(Item3);
    Item3->setPosition(ccp(center.x,center.y - 70));


   //设置响应函数:当触摸到item时调用Menu::menuHandler  
    //第一个参数:响应函数所在的对象  
    //第二个参数:成员函数指针  
    Item1->setTarget(this,menu_selector(MenuScene::menu));  
    Item2->setTarget(this,menu_selector(MenuScene::menu));  
    Item3->setTarget(this,menu_selector(MenuScene::menu));  
  
   //设置菜单项的ID
   Item1->setTag(1);
   Item2->setTag(2);
   Item3->setTag(3);
   

定义一个菜单响应函数,实现点击菜单项切换场景

void MenuScene::menu(CCObject* pSender)
{
    //将obj强制转换成菜单项类型  
    CcmenuItemSprite* item = (CcmenuItemSprite*)pSender;  
  
    //得到菜单项的ID  
    int tag = item->getTag();  

    //用于调用场景
    CCScene* scene = NULL;
  
    //判断用户点击了那个菜单  
    if(1 == tag)  
    {   
        scene = ParkScene::scene();  
    }  
    else if(2 == tag)  
    {  
          scene = SchoolScene::scene();  
    }
    else
    {
         scene = ViewScene::scene();  
    }
    
    if(scene)
    {
        CCDirector::sharedDirector()->pushScene(scene);
    }
}


返回的特殊处理,实现从各个场景返回程序主界面时,由于各个层中都需要一个返回按钮,如果在每个层中都通过代码创建返回按钮,会写许多重复的代码,为了解决这个问题,可以单独创建一个层,层中只有一个返回按钮,其它层可以初始化的时候使用只有一个按钮的层,就可以减少代码量

创建一个LayerBack类用于处理返回按钮

LayerBack.h中的代码

#ifndef __LayerBack_H__
#define __LayerBack_H__

#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;

class LayerBack : public cclayer
{
public:
	bool init();

	void back(CCObject*);
};

#endif


LayerBack.cpp中的代码

#include "LayerBack.h"

bool LayerBack::init()
{
    cclayer::init();

    //得到窗口的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    Ccmenu* menu = Ccmenu::create();
    addChild(menu);

    CcmenuItem* backItem = CcmenuItemImage::create("Closenormal.png","CloseSelected.png",this,menu_selector(LayerBack::back));

    menu->addChild(backItem);

    //设置菜单项的位置(将菜单项设置到右下角)
    backItem->setPosition(ccp(winSize.width / 2 - backItem->getContentSize().width / 2,backItem->getContentSize().height / 2 - winSize.height / 2));

    return true;
}

void LayerBack::back(CCObject*)
{
    //场景切换
    CCDirector::sharedDirector()->popScene();
}


然后将各个层初始化父类的代码改成下面的代码就可以实现场景的返回

 LayerBack::init();


图片滑动效果的实现

图片滑动效果是使用 CCScrollView实现的,为了说明 CCScrollView的用法,笔者决定举程序中风景区场景的代码

创建风景区创建,首先创建一个ViewScene类

ViewScene.h中的代码

#ifndef __ViewScene_H__
#define __ViewScene_H__

#include "LayerBack.h"

class ViewScene : public LayerBack
{
public:
    bool init();  

    static CCScene* scene();
    
    CREATE_FUNC(ViewScene);

    bool ccTouchBegan(CCTouch* touch,CCEvent* ev);
    void ccTouchEnded(CCTouch* touch,CCEvent* ev);
    
    CCNode*_contaner;
};

#endif


ViewScene.cpp中的代码

#include "ViewScene.h"

CCScene* ViewScene::scene()
{
    CCScene *scene = CCScene::create();
    
    ViewScene *layer = ViewScene::create();

    scene->addChild(layer);

    return scene;
}

//保存风景图片名
static const char* View[] = {
    "View_1.png","View_2.png","View_3.png","View_4.png","View_5.png",};

bool ViewScene::init()
{
    LayerBack::init();

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    CCPoint center = ccp(winSize.width / 2,winSize.height / 2);
    
    //创建一个结点
    CCNode* c = CCNode::create();

    _contaner = c;

    //创建5个紧挨着的精灵
    for(int i = 0; i < 5; i++)
    {
        CCSprite* sprite = CCSprite::create(View[i]);
		c->addChild(sprite);
		
        //设置图片的位置,每两张图片相差一个屏幕的宽度
        sprite->setPosition(ccpAdd(center,ccp(i*winSize.width,0)));
    }

    //滚动视图
    //第一个参数:在窗口显示的视图大小
    //第二个参数:视图的实际大小
    CCScrollView* view = CCScrollView::create(winSize,c);
    addChild(view);

    //设置视图运动的方向为水平运动
    view->setDirection(kCCScrollViewDirectionHorizontal);

    //设置视图的宽度和高度
    view->setContentSize(CCSize(winSize.width * 5,winSize.height * 5));

    //取消ScrollView的弹性 
    view->setBounceable(false);

    //注册触摸事件
    setTouchEnabled(true);
    setTouchMode(kCCtouchesOneByOne);

    return true;
}

bool ViewScene::ccTouchBegan(CCTouch* touch,CCEvent* ev)
{
	return true;
}

void ViewScene::ccTouchEnded(CCTouch* touch,CCEvent* ev)
{
    //得到鼠标按下去的时候的坐标
	CCPoint ptClickDown = touch->getStartLocation();
	
    //得到鼠标松开时的坐标
    CCPoint ptUp = touch->getLocation();
	
    //当两个坐标的距离的平方小于25时(认为是点击,否则是滑动)
    if (ptUp.getdistanceSq(ptClickDown) > 25)
	{
		// 滑动
		int x = _contaner->getPositionX();
		
        if (x >= -1920 && x <= 0)
		{
			// adjust
			// 0,-480,-960,-1440,-1920
			int idx = (-x +240)/ 480;
			x = -idx * 480;

			CCMoveto* moveto = CCMoveto::create(0.5f,ccp(x,this->_contaner->getPositionY()));
			
            this->_contaner->runAction(moveto);
		}
	}
}


程序的主要的功能就分析到这里了

程序的下载地址:http://download.csdn.net/detail/u010105970/8061415



使用Cocos2d-X实现一个小游戏PhotoExhibition的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. amazeui模态框弹出后立马消失并刷新页面

    这篇文章主要介绍了amazeui模态框弹出后立马消失并刷新页面,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. AmazeUI 模态窗口的实现代码

    这篇文章主要介绍了AmazeUI 模态窗口的实现代码,代码简单易懂,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  6. ios – 关闭UIBarButtonItem上的突出显示

    我正在尝试使用UIBarButtonItem在我的UIToolbar上添加标题.我使用简单的风格,看起来很好,但我似乎无法让它停止突出显示触摸.“突出显示时触摸”选项不适用于条形按钮项目.有没有快速简便的方法来做到这一点?

  7. 以编程方式调整iOS中的按钮大小

    我正在使用XCode4.6.1并开发iOS6.我在故事板上添加了一个按钮.我在我的实现文件ViewController.m中创建了一个插座:我尝试按如下所示更改按钮b1的属性(在同一个文件中:ViewController.m):当我在模拟器中运行应用程序时,按钮的alpha成功设置为0.5.但是,按钮的位置和大小不会改变.我尝试了各种方法来实现它.然而似乎没有任何作用.我想知道我做错了什么.我对O

  8. 如何在iOS / Swift的顶部导航栏中添加“继续”按钮

    我想在导航栏的右侧添加一个“继续”按钮.如何实现这一目标?我一直在尝试使用UIBarButtonItem上的一些方法,但无法使其正常工作.我迄今为止的最大努力是:但我在第一行遇到错误.它不喜欢“style”参数.我也试过了但没有运气.仍然停留在样式参数上.有任何想法吗?

  9. ios – 将图像添加到界面构建器中的按钮

    我想在我的按钮而不是文本中添加图像.我可以在界面构建器中这样做吗?我可以看一下这个例子吗?

  10. ios – 自定义BackBarButtonItem

    主要原因是您丢失了标准后退按钮滑动动画以更改视图.此外,这意味着我不需要使用自定义按钮或编写自定义方法返回.它只是起作用.希望这也能解决别人的问题,我知道我已经坚持了3个小时!

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部