cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!

原代码来自于网络,因为cocos2d-x 3.0的资料,的确不多,与曾经版本号的接口非常难对上,

所以网上非常多样例都无法调试,对于新学习cocos2d-x 的同学,难度添加了,所以出一个超具体的样例给大家。

源代码地址:http://download.csdn.net/detail/adady/7293629

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 1.创建场景
    auto scene = Scene::create();

    // 2.创建图层,把当本类创建出来,至layer
    auto layer = HelloWorld::create();

    // 3.把layer放到 场景其中
    scene->addChild(layer);

    // 4.返回此场景
    return scene;
}

void HelloWorld::onEnter()	//init() 之后就到这个函数
{
	LayerColor::onEnter();		//执行 LayerColor 的 onEnter();

	auto listener = EventListenerTouchOneByOne::create();	//创建监听事件
	listener->setSwallowTouches(true);			//时间是否向下传递,true 就不会向下传递

    listener->onTouchBegan = [=](cocos2d::Touch* touch,cocos2d::Event* event)		//****这还没懂,是什么意思,弄清楚了,告诉大家,或则大家能够与我分享
    {
        return true;
    };
	listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);			//弹起后,调用onTouchEnded函数

	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);		//导演加入 listener 事件
}

void HelloWorld::update(float t)
{
	Vector<Sprite*> targetsToDelete;				//列表targetsToDelete
	Vector<Sprite*> projectilesToDelete;			//列表projectilesToDelete

	for (int i = 0; i < _projectiles.size(); i++)		//从0至全部进入列表的子弹(所以还没有消失的子弹,包含屏幕外面的还没有结束的)
	{
		auto projectile = _projectiles.at(i);			//当前第i 个子弹 保存至 projectile

		//获取当前子弹的坐标及大小  得到一个矩形    这里减一个projectile->getContentSize().width / 2,是由于他的锚点在中心,所以要减掉
		auto projectileRect = Rect(
                                   projectile->getPositionX() - projectile->getContentSize().width / 2,
                                   projectile->getPositionY() - projectile->getContentSize().height / 2,
                                   projectile->getContentSize().width,
                                   projectile->getContentSize().height );

		for (int j = 0; j < _targets.size(); j++)
		{
			auto target = _targets.at(j);     //当前第j 个目标 保存至 target
			//获取当前目标的坐标及大小  得到一个矩形
			auto targetRect = Rect(
                                   target->getPositionX() - target->getContentSize().width / 2,
                                   target->getPositionY() - target->getContentSize().height / 2,
                                   target->getContentSize().width,
                                   target->getContentSize().height);

			if (projectileRect.intersectsRect(targetRect))       //一一比对,有没有子弹与目标碰撞了
			{
				targetsToDelete.pushBack(target);				//碰撞后,把要删除的目标,加入队列
			}
		}

		//C++11 的 range-based for循环
		for (Sprite* target : targetsToDelete)		//遍历  targetsToDelete 里全部元素  一一保存至 target
		{
			_targets.eraseObject(target);			//移除  _target表里的  target,并非  targetsToDelete
			this->removeChild(target);				//当前 layer 移掉 target

            _projectilesDestroyed++;				//每打中一个 加一分
            if (_projectilesDestroyed >3) {			//大于3分 转换至 成功场景
                auto gameOverScene = GameOverScene::create();
                gameOverScene->getLayer()->getLabel()->setString("You Win!");
                Director::getInstance()->replaceScene(gameOverScene);
            }
		}

		if (targetsToDelete.size() >0)				//当第i个子弹 有碰撞,就意味着 size 大于0
		{
			projectilesToDelete.pushBack(projectile);    //把当前子弹加入入 子弹删除列表
		}
		targetsToDelete.clear();					// 清空 目标删除 列表
	}

	for (const auto& p : projectilesToDelete)		//遍历  targetsToDelete 里全部元素  一一保存至 p
	{
		_projectiles.eraseObject(p);				//移除  _projectiles表里的  target,并非  projectilesToDelete
		this->removeChild(p);						//当前 layer 移掉 projectiles
		//p->removeFromParentAndCleanup(true);
	}
	projectilesToDelete.clear();					// 清空 目标删除 列表

}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    if ( !LayerColor::initWithColor(Color4B(255,255,255,255)) )	//5. 把本图层的背景设置成白色
    {
        return false;			//假设图层没有被创建就false
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();	//getInstance()应该是得到导演的句柄,取得屏幕的尺寸

    auto player = Sprite::create("Player.png", Rect(0, 0, 27, 40));     //创建一个玩家的精灵,他的大小改动为width:27 hight:40
	player->setPosition(Point(player->getContentSize().width/2, visibleSize.height / 2));    //设置精灵出现的位子,程序选择放在(27/2,屏幕中间)的位子,就是在左中,全然的能够显示图片
	this->addChild(player, 0);	//加入玩家精灵,进入图层

    //更新函数
    this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0f);   //schedule是按时调用一个函数的方法,定义这个以后就会隔一段时间调用一次该方法,每一秒调用一次gameLogic函数   //schedule_selector 应该是注冊HelloWorld::gameLogic 这个函数

	this->scheduleUpdate();			//这表示大概每0.01秒 调用一次 Update()函数

    CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music-aac.caf");     //载入声音文件

    return true;
}

void HelloWorld::gameLogic(float dt)			//每1秒调用一次
{
	addTarget();//每1秒调用一次
}

void HelloWorld::addTarget()
{
	Size visibleSize = Director::getInstance()->getVisibleSize();		//得到屏幕尺寸

	auto target = Sprite::create("Target.png", Rect(0, 0, 27, 40));		//创建一个 目标精灵

    // Determine where to spawn the target along the Y axis
	int minY = target->getContentSize().height / 2;						  // 得到Target 能够显示的最小位置   (相当于图片的height 的中点)
	int maxY = visibleSize.height - target->getContentSize().height / 2;  // 得到Target 能够显示的最大位置
	int rangeY = maxY - minY;											  // 得到可显示区域的大小
	int actualY = (CCRANDOM_0_1() * rangeY) + minY;					      //(随机产生一个数(0,1) * rangeY) + minY   得到(0-1)的小数
	target->setPosition(Point(visibleSize.width + target->getContentSize().width / 2, actualY));  //设置Target 出现的位子
	this->addChild(target,0);											//加入到本图层内

    target->setTag(1);													//设置这个Targer 的标签为1
    _targets.pushBack(target);											//把Target 存于 _targets的列表

	//以下4句,随即产生一个速度
	int minDuration = 2.0;
	int maxDuration = 4.0;
	int rangeDuration = maxDuration - minDuration;
	int actualDuration = (CCRANDOM_0_1() * rangeDuration) + minDuration;

	auto actionMove = MoveTo::create(actualDuration, Point(-target->getContentSize().width, actualY));  //创建一个速度移动, actualDuration速度, Point(-target->getContentSize().width, actualY)是起始点
	auto actionMoveDone = CallFuncN::create(CC_CALLBACK_1(HelloWorld::spriteMoveFinished, this));	//这里是创建一个回调函数,就是调用spriteMoveFinished函数 并把自己传出去this。

	target->runAction(Sequence::create(actionMove, actionMoveDone, NULL));		//执行一个动画  actionMove 移动方法   actionMoveDone回调的函数

	//从上面看来,这个函数,每1秒创建一个Target 精灵,从屏幕的最右边,随机高度,至左移动

}

void HelloWorld::onTouchEnded(Touch* touch, Event* event)				//按下事件
{
	Size visibleSize = Director::getInstance()->getVisibleSize();		//获得屏幕尺寸

	auto touchPoint = touch->getLocation();								//获得点击坐标

	auto projectile = Sprite::create("Projectile.png", Rect(0, 0, 20, 20));    //创建一个子弹
	projectile->setPosition(Point(20, visibleSize.height / 2));					//设置子弹位子

	// Determine offset of location to projectile
	int offX = touchPoint.x - projectile->getPosition().x;				//点击位置与子弹X位置的差值
	int offY = touchPoint.y - projectile->getPosition().y;				//点击位置与子弹Y位置的差值

	if (offX <= 0) return;												//假设 子弹 超出范围 return

	this->addChild(projectile);											//把 子弹 加入进图层

    projectile->setTag(2);					// 把子弹的标签设置为2
    _projectiles.pushBack(projectile);		// 把子弹加入进子弹列表

	// Determine where we wish to shoot the projectile to
	int realX = visibleSize.width + (projectile->getContentSize().width / 2);     //求出屏幕最大 + 子弹的一半, (求出子弹消失的最大x)
	float ratio = (float)offY / (float)offX;					//斜率
	int realY = (realX * ratio) + projectile->getPosition().y;					//求出真实的y值,同样的斜率
	auto realDest = Point(realX, realY);				//子弹要去位置

	// 理解上面的话,以下5句就非常好理解了
	int offRealX = realX - projectile->getPosition().x;		//真实X值
	int offRealY = realY - projectile->getPosition().y;		//真实Y值
	float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY));	//求出 直线距离
	float velocity = 960 / 1; // 960pixels/1sec				//960 像素/ 1秒
	float realMoveDuration = length / velocity;				//速度

	// 创建一个动作,移动动作,realMoveDuration速度,至realDest,并进入回调函数
	projectile->runAction(Sequence::create(MoveTo::create(realMoveDuration, realDest),CallFuncN::create(CC_CALLBACK_1(HelloWorld::spriteMoveFinished, this)), NULL));

    CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("pew-pew-lei.caf");   //载入声音文件
}

void HelloWorld::spriteMoveFinished(Ref* pSender)
{
	Sprite *sprite = (Sprite *)pSender;				//获得的Target  转成 sprite 类型

    if (sprite->getTag() == 1) {					//假设 标签 等于 1
		_targets.eraseObject(sprite);				//从_target列表里删掉Target      仅仅是从列表里删掉

        auto gameOverScene = GameOverScene::create();        //创建一个GameOver的场景
        gameOverScene->getLayer()->getLabel()->setString("You Lose :[");    //显示youLose
        Director::getInstance()->replaceScene(gameOverScene);				//替换成刚生成的GameOver场景
	} else if(sprite->getTag() == 2) {				//假设 标签 等于 2
		_projectiles.eraseObject(sprite);			//从_projectiles列表里删掉 Projectiles     仅仅是从列表里删掉
	}

    this->removeChild(sprite);						//删掉sprite 这个图层

}

void HelloWorld::menuCloseCallback(Ref* pSender)
{
    Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}
				
时间: 2025-01-07 13:08:53

cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!的相关文章

.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

原文:.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器 目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不多,因此在实现的过程中遇到了很多坑,在这边博客中,逐一介绍下.下面进入正文 正文: 1-启用httpClient注入: 参考文档:https://docs.microsoft.c

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

[3] 用D3.js做一个简单的图表吧!

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为可缩放矢量图形(Scalable Vector Graphics),SVG 使用 XML 格式定义图像,不清楚什么是SVG的朋友请先在 w3cschools 学习下

【Python】 做一个简单的 http 服务器

# coding=utf-8 ''' Created on 2014年6月15日 @author: Yang ''' import socket import datetime # 初始化socket s = socket.socket() # 获取主机名, 也可以使用localhost # host = socket.gethostname() host = "localhost" # 默认的http协议端口号 port = 80 # 绑定服务器socket的ip和端口号 s.bin

使用React并做一个简单的to-do-list

1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其visual-dom的这种技术创新,也算是早就有了初步了解.一来没有学的太深入,二来后来在工作中和业余项目中都没有用到,因此慢慢的就更加生疏了. 近期,因为我想把自己的开源项目wangEditor能放在React.angular和vuejs中使用.先从react开始,顺手自己也重试一下React的基础知识,顺便再做一个小d

【 D3.js 入门系列 — 3 】 做一个简单的图表!

图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 . SVG ,即可缩放矢量图形(Scalable Vector Graphics),使用 XML 格式定义图形,可在 W3School 学习 SVG 的相关语法,不需要记住所有标签,用的时候再查即可. 先看下面的代码: <script src="http://d3js.org/d3.v3.mi

【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看[demo],扫描后点击屏幕有惊喜哦… 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单的引擎里需要有三种元素:世界(World).发射器(Launcher).粒子(Grain).总得来说就是:发射器存在于世界之中,

初学者如何做一个简单的计算器,代码分享

先新建一个类 startCalculator 声明如下 #import <Foundation/Foundation.h> @interface StartCalculator : NSObject //声明两个要计算的变量 @property float opValue1; @property float opValue2; //声明一个运算符 @property char op; //普通方法 //- (float) gzyWorkAdd; // //- (float) gzyWorkSu

如何做一个简单的Chrome Extension用于网页截屏

Chrome extension是一个文件包,里面包含了一个配置文件manifest.json,以及一些用于Web开发的文件和资源 (HTML, JavaScript, CSS,等). Chrome Extension开发指南 Chrome Extension Overview Chrome Extension Debugging Chrome Extension Samples 如何实现网页截屏功能 看一下manifest文件: {       "name": "Scree