Cocos2d-X开发一个简单的小游戏

学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动

在做游戏前,先学一个新概念

调度器(scheduler):

Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:

  1. 每当Node不再可见或已从场景中移除时,调度器会停止。
  2. Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
  3. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。

使用调度器时用到的一些函数:

// 让帧循环调用this->update(float dt)函数

// scheduleUpdate();

// 让帧循环去调用制定的函数,时间还是1/60秒

// schedule(schedule_selector(T19Update::MyScheduleFunc));

// 定时器,每隔2秒调用T19Update::MyScheduleFunc函数

// schedule(schedule_selector(T19Update::MyScheduleFunc), 2.0f);

// 有限次数的定时器,当次数定义得很大时,也认为是无限的,实际次数是制定参数的+1

schedule(schedule_selector(T19Update::MyScheduleFunc), 1.0f, 3, 2.0f);

// 只调度一次的定时器

// scheduleOnce(schedule_selector(T19Update::MyScheduleFunc), 5.0f);

// 停止一个以参数为回调函数的定时器

unschedule(schedule_selector(T19Update::MyScheduleFunc));

// 停止update调度

unscheduleUpdate();

// 停止所有的调度

unscheduleAllSelectors();

熟悉了调度器的概念后就开始我们今天的重头戏,一个简单的游戏

首先在工程目录下的Resource文件中添加一张小球的图片

然后定义一个Update类

在Update.h类中添加下面的代码

#ifndef _Update_H_
#define _Update_H_

#include "cocos2d.h"
USING_NS_CC;

class Update : public CCLayer
{
public:
    static CCScene* scene();

    CREATE_FUNC(Update);

    bool init();

    void update(float dt);

    CCSprite* _sprite;

    void Handle(CCObject* sender);

    //表示方向
    int _direction;

    //窗口的大小
    CCSize winSize;
};

#endif

在Update.cpp中添加下面的代码

#include "Update.h"

CCScene* Update::scene()
{
    CCScene* s = CCScene::create();

    Update* layer = Update::create();

    s->addChild(layer);

    return s;
}

bool Update::init()
{
    //初始化父类
    CCLayer::init();

    //得到窗口的大小
    winSize = CCDirector::sharedDirector()->getWinSize();

    //设置坐标
    CCPoint center = ccp(winSize.width / 2, winSize.height / 2);

    //让帧循环调用this->update(float dt)函数
	scheduleUpdate();

    //创建精灵
    _sprite = CCSprite::create("green_edit.png");
    addChild(_sprite);

    //设置精灵的位置
    _sprite->setPosition(center);

    //创建菜单项
    CCMenuItemFont* up = CCMenuItemFont::create("up", this, menu_selector(Update::Handle));
    CCMenuItemFont* down = CCMenuItemFont::create("down", this, menu_selector(Update::Handle));
    CCMenuItemFont* left = CCMenuItemFont::create("left", this, menu_selector(Update::Handle));
    CCMenuItemFont* right = CCMenuItemFont::create("right", this, menu_selector(Update::Handle));
    CCMenuItemFont* Stop = CCMenuItemFont::create("Stop", this,  menu_selector(Update::Handle));

    //创建菜单
    CCMenu* menu = CCMenu::create(up, down, left, right, Stop, NULL);
    addChild(menu);

    //对齐菜单项
    menu->alignItemsVertically();

    //设置菜单项的ID
    up->setTag(1);
    down->setTag(2);
    left->setTag(3);
    right->setTag(4);
    Stop->setTag(0);

    //标记方向
    _direction = -1;

    return true;
}

void Update::Handle(CCObject* sender)
{
    CCNode* node = (CCNode*)sender;

    //得到菜单项的ID,ID对应的是精灵移动的方向
    _direction  = node->getTag();
}

void Update::update(float dt)
{
   // _direction == 1表示精灵向上移动
    if(1 == _direction)
    {
        //精灵向上移动
        //50表示一秒钟移动50个像素
        _sprite->setPositionY(_sprite->getPositionY() + dt * 100);
    }

     // _direction == 2表示精灵向下移动
    if(2 == _direction)
    {
        //精灵向下移动
        //50表示一秒钟移动50个像素
        _sprite->setPositionY(_sprite->getPositionY() - dt * 100);
    }

     // _direction == 3表示精灵向左移动
    if(3 == _direction)
    {
        //精灵向左移动
        //50表示一秒钟移动50个像素
        _sprite->setPositionX(_sprite->getPositionX() - dt * 100);
    }

     // _direction == 4表示精灵向右移动
    if(4 == _direction)
    {
        //精灵向右移动
        //50表示一秒钟移动50个像素
        _sprite->setPositionX(_sprite->getPositionX() + dt * 100);
    }

     // _direction == 4表示精灵停止移动
    if(0 == _direction)
    {
    }
}

执行结果:

参考资料:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/scheduler/zh.md



时间: 2024-10-24 00:49:17

Cocos2d-X开发一个简单的小游戏的相关文章

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了.例如,提供了一些专用于开发2D游戏的Unity工具.现在Unity已经发布了版本4.5,对2D游戏的支持更是完善了不少.为了说明Unity对2D游戏所提供的支持,本章会使用这些在Unity中原生的工具,开发一个简单的2D游戏.本文选自<Unity

HTML5小游戏-简单抽奖小游戏

换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.        知识点 canvas绘制背景 canvas绘制图片 canvas绘制边框 canvas事件处理 canvas简单动画制作      步骤 1.准备好图片,首先是机器的外观.以及滚动的奖项图片,我一共准备了6种,奖项图片按照一定的规律命名,这样方便处理   2.准备好canvas画布,设置好基本的C

【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

? 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文

【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发VR实战]三.开发一个寻宝类VR游戏TreasureHunt VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Androi

java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码

原文:java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码 源代码下载地址:http://www.zuidaima.com/share/1550463495146496.htm java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码, 很久以前找到的一个Swing实现的俄罗斯方块,短线精悍,算法值得一看 经验证代码可用,确实短小精悍,值得下载. package com.zuidaima.swing.game; import java.awt.*; i

cocos2d-x开发的《派对小游戏》-github源码分享

这是博主很久以前写的一个cocos2d-x跨平台小游戏,我称它为<派对小游戏>,现在分享给大家,希望对大家有所帮助的话. 项目源码地址:https://github.com/xiebaochun/partygame-cocos2d-x 游戏截图如下: 主页: 打地鼠 视觉空间 拖拖拉拉

作业1开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 hint: re.search(r'\([^()]+\)',s).group() '(-

需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次,超过5次提示:游戏试玩结束,请付费。

package cn.idcast4; import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.io.Writer;import java.util.Properties; /* * 需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次, *

【Nginx】开发一个简单的HTTP模块

首先来分析一下HTTP模块是如何介入Nginx的. 当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... } 事件模块检测是否有TCP连接请求,当收到一个SYN包后,由事件模块建立一条TCP连接.连接建立成功后,交由HTTP框架处理,HTTP框架负责接收HTTP头部,并根据头部信息将