cocos2d实现2D地图A*广度路径算法

2023-05-16

.h


#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

USING_NS_CC;

enum PatchFront
{
	Uper = 1,
	Down = 2,
	Left = 3,
	Right = 4,
};

struct SinglePatch;
static SinglePatch* patchvector[32][32];

struct SinglePatch
{
public:
	static SinglePatch* CreatePatch(int row, int field)
	{
		SinglePatch* TempPatch = new SinglePatch(row, field);
		return TempPatch;
	}

	Sprite* GetVision() const { return pSprite; }

	SinglePatch* GetPatchNear(PatchFront f)
	{
		SinglePatch* returnpatch = nullptr;
		switch (f)
		{
		case Uper:
			if (Row + 1 >= 32)
				return nullptr;
			returnpatch = patchvector[Row + 1][Field];
			break;
		case Down:
			if (Row - 1 < 0)
				return nullptr;
			returnpatch = patchvector[Row - 1][Field];
			break;
		case Left:
			if (Field - 1 < 0)
				return nullptr;
			returnpatch = patchvector[Row][Field - 1];
			break;
		case Right:
			if (Field + 1 >= 32)
				return nullptr;
			returnpatch = patchvector[Row][Field + 1];
			break;
		}
		if (returnpatch->IsMarked)
			return nullptr;

		return returnpatch;
	}

	void Marked()
	{
		pSprite->setTexture("Finded.png");
	}

	void SetStep(int step)
	{
		Step = step;
		char msg[20];
		snprintf(msg, 20, "%d", step);
		pText->setString(msg);
		pSprite->setTexture("Marked.png");
	}

	void _draw()
	{
		pSprite->setTexture("WayPoint.png");
	}

	void SetBefore(SinglePatch* before)	{ BeforeStep = before; }

	void DrawWayPoint()
	{
		_draw();
		SinglePatch* Before = BeforeStep;
		while (Before)
		{
			Before->_draw();
			Before = Before->BeforeStep;
		}
	}

	int Step;
	bool IsMarked;
private:

	SinglePatch(int row, int field) : Row(row), Field(field), Step(0), IsMarked(false), BeforeStep(nullptr)
	{
		pSprite = Sprite::create("SinglePatch.png");
		pSprite->setAnchorPoint(Vec2(0, 0));
		pSprite->setPosition(row * 30, field * 30);

		char msg[255];
		snprintf(msg, 255, "%d|%d", row, field);
		pText = LabelTTF::create();
		pText->setString(msg);
		pText->setHorizontalAlignment(TextHAlignment::CENTER);
		pText->setVerticalAlignment(TextVAlignment::CENTER);
		pText->setPosition(pSprite->getContentSize() / 2);
		pText->setColor(ccc3(0, 0, 0));
		pText->setFontSize(18);
		pSprite->addChild(pText);
	}
	~SinglePatch();

	int Row;
	int Field;
	Sprite* pSprite;
	LabelTTF* pText;
	SinglePatch* BeforeStep;

};

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
    
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);

	void FindPatch(SinglePatch* _patch, int Step);
	void Begin();
private:

	SinglePatch* StartPoint;
	SinglePatch* EndPoint;

	bool Finded;
	std::list<SinglePatch*> ArrayBefore;
	std::list<SinglePatch*> ArrayAfter;
};

#endif

.cpp


#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();
	layer->setTag(159);
    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
	for (int i = 0; i < 32; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			SinglePatch* patch = SinglePatch::CreatePatch(i, j);
			addChild(patch->GetVision());
			patchvector[i][j] = patch;
		}
	}

	EndPoint = patchvector[rand() % 31][rand() % 31];
	Finded = false;
	StartPoint = patchvector[15][15];
	StartPoint->SetStep(0);
	StartPoint->IsMarked = true;

	ArrayBefore.push_back(StartPoint);

	std::thread th(&HelloWorld::Begin, this);
	th.detach();
	
    return true;
}

void HelloWorld::Begin()
{
//_begin:
	while (ArrayBefore.size())
	{
		if (Finded)
			break;
		SinglePatch* TempSreach = *ArrayBefore.begin();
		ArrayBefore.pop_front();
		FindPatch(TempSreach, TempSreach->Step);
	}

	//goto _begin;
}

void HelloWorld::FindPatch(SinglePatch* _StartPatch, int Step)
{
	for (int i = Uper; i != Right + 1; i++)
	{
		SinglePatch* tempPatch = _StartPatch->GetPatchNear((PatchFront)i);
		if (tempPatch == EndPoint)
		{
			tempPatch->Marked();
			_StartPatch->DrawWayPoint();
			Finded = true;
			return;
		}
		if (tempPatch)
		{
			tempPatch->SetBefore(_StartPatch);
			tempPatch->SetStep(Step + 1);
			tempPatch->IsMarked = true;
			ArrayBefore.push_back(tempPatch);
			Sleep(100);
		}
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocos2d实现2D地图A*广度路径算法 的相关文章

随机推荐

  • 详解MIPI协议

    目录 前言MIPI简介MIPI联盟的MIPI DSI规范MIPI名词解释MIPI DSI分层结构command和video模式 D PHYLane模组Lane 全局架构Lane电压和状态DATA LANE操作模式时钟LANE低功耗状态高速数
  • 音频处理——详解PCM数据格式

    目录 知识储备什么是PCM采样采样率重采样 量化编码PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation xff0c 翻译一下是
  • 音频处理——常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

    目录 PCMG726ADPCMLPCMG711AAC格式对比音频帧长音频播放过程 PCM 音频处理 详解PCM数据格式 音频处理 解析PCM格式实例 xff08 音量调控 xff09 G726 G 726是ITU T定义的音频编码算法 19
  • 音频处理——G711标准详解

    目录 G711简介G711A算法原理压缩方法举例代码 G711U算法原理压缩方法举例代码 G711A与G711U对比 参考链接 G711简介 G711是国际电信联盟ITU T定制出来的一套语音压缩标准 xff0c 它代表了对数PCM xff
  • PS流详解(载荷H264)

    目录 PS简介标准结构标准H264流结构定长音频帧和其他流式私有数据的结构 PS流封装标准PSH结构PES包结构PSM包结构体 元素流 PS 封装规则H264元素流封装规则音频元素流封装规则私有信息封装规则 PS简介 PS 封装方式需要支持
  • Postman中的authorization

    1 概述 Authorization是验证是否拥有从服务器访问所需数据的权限 当发送请求时 xff0c 通常必须包含参数 xff0c 以确保请求具有访问和返回所需数据的权限 Postman提供了授权类型 xff0c 可以轻松地在Postma
  • 操作pdf,提示startxref not found

    startxref not found多半是文件被损坏了 xff0c 检查一下 xff0c 是不是之前自己写的代码把pdf文件跑崩了 可以尝试重新生成一遍该pdf文件 xff0c 然后再进行操作 或者尝试一下 xff1a https www
  • FTP 530未登录

    提供一种思路 xff1a 如果说FTP服务器已开 xff0c 服务器也能ping通 就得考虑是不是我们在FTP服务器上设置的默认路径有问题 xff08 不符合我们的需求 xff09 Windows10下 xff0c FTP设置默认位置 xf
  • 开源个小demo

    https github com UnderADome epms 内部项目管理
  • LDAP的基本知识

    https zhuanlan zhihu com p 147768058 https www cnblogs com gaoyanbing p 13967860 html
  • 「权威发布」2019年电赛最全各类题目细节问题解答汇总

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 xff01 各位朋友大家上午好 xff0c 今天是比赛的第二天 xff0c 许多朋友都给我发消息 xff0c 我不是不回 xff0c 我实在是回不
  • Unable to find explicit activity class

    做项目从一个activity逐渐转向到使用多个activity xff0c 这个时候新手就容易出现一个问题 xff0c 忘了给activity在AndroidManifest xml中注册 打开日志 xff0c 在遇到这个报错信息的时候 x
  • Errors running builder 'Maven Project Builder'

    由于第一次玩maven的时候 xff0c 很多东西都还是懵懵懂懂 xff0c 不是很清楚 xff0c 不知道怎么把Myeclipse中的maven配置弄坏了 xff0c 从外部导入maven项目的时候 xff0c 总会报一些错误 xff1a
  • Type handler was null on parameter mapping for property '__frch_id_0'

    1 Type handler was null on parameter mapping for property frch id 0 2 Type handler was null on parameter mapping or prop
  • 如何解决error: failed to push some refs to 'xxx(远程库)'

    在使用git 对源代码进行push到gitHub时可能会出错 xff0c 信息如下 此时很多人会尝试下面的命令把当前分支代码上传到master分支上 git push u origin master 但依然没能解决问题 出现错误的主要原因是
  • expected an indented block

    Python中没有分号 xff0c 用严格的缩进来表示上下级从属关系 导致excepted an indented block这个错误的原因一般有两个 xff1a 1 冒号后面是要写上一定的内容的 xff08 新手容易遗忘这一点 xff09
  • C 实现TCP服务端(select、poll、epoll)

    使用C简单的实现一个tcp server xff0c 包括常规server 多线程实现server select实现server poll实现server epoll实现server IO模型原理可以看上一篇文章 常规模式 define M
  • UART串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描
  • 项目:文件搜索助手(FileSeeker)

    目录 1 项目简介 2 项目源代码 3 相关技术 4 实现原理 5 项目架构图 6 项目功能 7 测试报告 7 1 测试用例 7 2 测试环境 7 3 测试结论 7 3 1 功能测试 7 3 2 性能测试 7 3 3 兼容性 7 3 4 容
  • cocos2d实现2D地图A*广度路径算法

    h ifndef HELLOWORLD SCENE H define HELLOWORLD SCENE H include 34 cocos2d h 34 USING NS CC enum PatchFront Uper 61 1 Down