cocos2dx 消灭星星

#include "GamePopStar.h"
#include "StarSprite.h"

USING_NS_CC;

Scene* GamePopStar::createScene()
{
	auto scene = Scene::create();
	auto layer = GamePopStar::create();
	scene->addChild(layer);
	return scene;
}

bool GamePopStar::init()
{
	if (!Layer::init())
		return false;

	addStars();
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan = CC_CALLBACK_2(GamePopStar::touchBegan, this);
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
	scheduleUpdate();

	return true;
}

void GamePopStar::addStars()
{
	srand(time(NULL));
	for (int w = 0; w < WIDTH; ++w)
	{
		for (int h = 0; h < HEIGH; ++h)
		{
			stars[w][h] = StarSprite::createStar(rand() % 5 + 1, w, h);
			addChild(stars[w][h]);
		}
	}
}

bool GamePopStar::touchBegan(cocos2d::Touch* touch, cocos2d::Event*)
{
	auto pos = touch->getLocation();
	if (pos.x < 40 * WIDTH && pos.y < 40 * HEIGH)
	{
		int x = pos.x / 40;
		int y = pos.y / 40;
		if (stars[x][y]->getType() != 0)
		{
			//stars[x][y]->deleStar();
			delStarsFrom(stars[x][y]->getType(), x, y);
			starsDrop();
			if (isOver())
				exit(-1);
		}
	}
	return false;
}

void GamePopStar::delStarsFrom(int type, int w, int h)
{
	if (type == 0)
		return;
	
	bool canDel = false;
	
	if (w - 1 >= 0 && stars[w - 1][h]->getType() == type)
	{
		delStarsFromRight(type, w - 1, h);
		canDel = true;
	}
	if (w + 1 < WIDTH && stars[w + 1][h]->getType() == type)
	{
		delStarsFromLeft(type, w + 1, h);
		canDel = true;
	}
	if (h - 1 >= 0 && stars[w][h - 1]->getType() == type)
	{
		delStarsFromUp(type, w, h - 1);
		canDel = true;
	}
	if (h + 1 < HEIGH && stars[w][h + 1]->getType() == type)
	{
		delStarsFromDown(type, w, h + 1);
		canDel = true;
	}

	if (canDel)
		stars[w][h]->deleStar();
}

void GamePopStar::delStarsFromUp(int type, int w, int h)
{
	stars[w][h]->deleStar();
	if (w - 1 >= 0 && stars[w - 1][h]->getType() == type)
		delStarsFromRight(type, w - 1, h);
	if (w + 1 < WIDTH && stars[w + 1][h]->getType() == type)
		delStarsFromLeft(type, w + 1, h);
	if (h - 1 >= 0 && stars[w][h - 1]->getType() == type)
		delStarsFromUp(type, w, h - 1);
}
void GamePopStar::delStarsFromDown(int type, int w, int h)
{
	stars[w][h]->deleStar();
	if (w - 1 >= 0 && stars[w - 1][h]->getType() == type)
		delStarsFromRight(type, w - 1, h);
	if (w + 1 < WIDTH && stars[w + 1][h]->getType() == type)
		delStarsFromLeft(type, w + 1, h);
	if (h + 1 < HEIGH && stars[w][h + 1]->getType() == type)
		delStarsFromDown(type, w, h + 1);
}
void GamePopStar::delStarsFromLeft(int type, int w, int h)
{
	stars[w][h]->deleStar();
	if (w + 1 < WIDTH && stars[w + 1][h]->getType() == type)
		delStarsFromLeft(type, w + 1, h);
	if (h - 1 >= 0 && stars[w][h - 1]->getType() == type)
		delStarsFromUp(type, w, h - 1);
	if (h + 1 < HEIGH && stars[w][h + 1]->getType() == type)
		delStarsFromDown(type, w, h + 1);
}
void GamePopStar::delStarsFromRight(int type, int w, int h)
{
	stars[w][h]->deleStar();
	if (w - 1 >= 0 && stars[w - 1][h]->getType() == type)
		delStarsFromRight(type, w - 1, h);
	if (h - 1 >= 0 && stars[w][h - 1]->getType() == type)
		delStarsFromUp(type, w, h - 1);
	if (h + 1 < HEIGH && stars[w][h + 1]->getType() == type)
		delStarsFromDown(type, w, h + 1);
}

void GamePopStar::starsDrop()
{
	//下落
	for (int w = 0; w < WIDTH; ++w)
	{
		for (int h = 1; h < HEIGH; ++h)
		{
			int num = 0;
			for (int i=0; i < h; ++i)
			{
				/*if (stars[w][i]->getType() == 0)
				{
					auto temp = stars[w][i];
					stars[w][i] = stars[w][h];
					stars[w][h] = temp;
					break;
				}*/
				if (stars[w][i]->getType() == 0)
					++num;
			}
			auto temp = stars[w][h];
			stars[w][h] = stars[w][h - num];
			stars[w][h - num] = temp;
			//stars[w][h]->move(1, w, h);
		}
	}
	//左移
	for (int w = 1; w < WIDTH; ++w)
	{
		for (int i = 0; i < w; ++i)
		{
			if (stars[i][0]->getType() == 0)
			{
				for (int h = 0; h < HEIGH; ++h)
				{
					auto temp = stars[i][h];
					stars[i][h] = stars[w][h];
					stars[w][h] = temp;
				}
				break;
			}
		}
	}

	for (int w = 0; w < WIDTH; ++w)
	{
		for (int h = 0; h < HEIGH; ++h)
		{
			stars[w][h]->move(0.5,w,h);
		}
	}
}

bool GamePopStar::isOver()
{
	for (int w = 0; w < WIDTH; ++w)
	{
		for (int h = 0; h < HEIGH; ++h)
		{
			auto type = stars[w][h]->getType();
			if (type == 0)
				continue;
			if (w - 1 >= 0 && stars[w - 1][h]->getType() == type)
			{
				return false;
			}
			if (w + 1 < WIDTH && stars[w + 1][h]->getType() == type)
			{
				return false;
			}
			if (h - 1 >= 0 && stars[w][h - 1]->getType() == type)
			{
				return false;
			}
			if (h + 1 < HEIGH && stars[w][h + 1]->getType() == type)
			{
				return false;
			}
		}
	}
	return true;
}

void GamePopStar::update(float dt)
{
	static int w = 0;
	static int h = 0;

	if (w < WIDTH && h < HEIGH)
	{
		stars[w][h]->move(0.1*(w+1)/(h+1), w, h);
		++w;
	}
	else if (h < HEIGH)
	{
		w = 0;
		++h;
	}
	else
	{
		unscheduleUpdate();
	}
}
#include "StarSprite.h"

USING_NS_CC;

StarSprite* StarSprite::createStar(int type, float x, float y)
{
	auto star = new StarSprite();
	if (star && star->init())
	{
		star->autorelease();
		star->initStar(type, x, y);
	}
	else
	{
		delete star;
		star = NULL;
	}
	return star;
}

bool StarSprite::init()
{
	if (!Layer::init())
		return false;
	return true;
}

void StarSprite::initStar(int type, float x, float y)
{
	this->type = type;
	star = Sprite::create(String::createWithFormat("card%d.png", type)->getCString());
	//star->setPosition(20 + 40 * x, 20 + 40 * y);
	star->setPosition(20 + 40 * x, 20 + 40 * 16);
	addChild(star);
}

void StarSprite::deleStar()
{
	this->type = 0;
	star->setSpriteFrame(SpriteFrame::create("card0.png", Rect(0, 0, 40, 40)));
}

void StarSprite::move(float dt, int w, int h)
{
	auto move = MoveTo::create(dt, Vec2(w * 40 + 20, h * 40 + 20));
	star->runAction(move);
}

代码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

第12章 元编程与注解、反射第12章 元编程与注解、反射

反射(Reflection)是在运行时获取类的函数(方法)、属性、父类、接口、注解元数据、泛型信息等类的内部信息的机制。这些信息我们称之为 RTTI(Run-T...

652
来自专栏hbbliyong

C#基础知识回顾--线程传参

  在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值。如果希望传递参...

2676
来自专栏用户画像

获得InputStream,读取配置文件的方式

InputStream in = new BufferedInputStream(new FileInputStream("E:\\svn_new\\3icom...

602
来自专栏Android开发指南

Android回调接口的写法

4345
来自专栏向治洪

ormlite介绍一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http...

1716
来自专栏LeoXu的博客

oCanvas 教程学习摘要(一) 转

oCanvas 是一个全局对象,包含了所有的模块,以及核心的构造器和一些其它的方法。

543
来自专栏Ryan Miao

lombok使用基础教程

前言 lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。在很多工具类的项目中都有这个功能。比如dagger。 通俗的说,lombok可以通过...

52414
来自专栏Java Edge

InitializingBean使用

2686
来自专栏cmazxiaoma的架构师之路

使用Hibernate、JPA、Lombok遇到的有趣问题

1164
来自专栏海说

单元测试基本方法

依照类型划分,单元测试方法可以划分为两大类。一类是针对public方法进行测试,另一类是针对private方法进行测试。 public方法测试 public方法...

1820

扫描关注云+社区