⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cal.h

📁 一个C++的游戏,还没有完善. 这是一个在windows下开发的! 有兴趣的朋友看一下啊!
💻 H
字号:
#pragma once
#include <windows.h>
#include <math.h>
#include <iostream>
#include "RPos.h"
#include <algorithm>

class Cal
{
public:
	enum
	{
		E_M_DOWN = 0,
		E_M_LEFT,
		E_M_UP,
		E_M_RIGHT
	};
	Cal(void);
	Cal(float nspd)
		:sx(0), sy(0), tx(0), ty(0), spd(nspd), dir(0)
	{
		InitializeCriticalSection(&cs);
		queue.push_back(RPos(sx, sy, dir));
	};

	Cal(const Cal& cal)
		: sx(cal.sx), sy(cal.sy), tx(cal.tx), ty(cal.ty), spd(cal.spd),
		dir(cal.dir)
	{
		memcpy(&cs, &cal.cs, sizeof(CRITICAL_SECTION));
	};
	virtual ~Cal(void);

	Cal& setTarget(float x, float y)
	{
		tx = x;
		ty = y;
		return *this;
	}

	void move(void)
	{
		if((tx == sx) && (ty == sy))
		{
			/*EnterCriticalSection(&cs);
			queue.push_back(RPos(sx, sy, 0));
			LeaveCriticalSection(&cs);*/
			return;
		}

		float dtx = (tx - sx) / abs(tx - sx) * spd;
		float dty = (ty - sy) / abs(ty - sy) * spd;

		if(dtx < 0)
		{
			if(sx + dtx >= tx)
			{
				sx += dtx;
			}
			else
			{
				sx = tx;
			}
		}
		else
		{
			if(dtx > 0)
			{
				if(sx + dtx <= tx)
				{
					sx += dtx;
				}
				else
				{
					sx = tx;
				}
			}
		}

		if(dty < 0)
		{
			if(sy + dty >= ty)
			{
				sy += dty;
			}
			else
			{
				sy = ty;
			}
		}
		else
		{
			if(dty > 0)
			{
				if(sy + dty <= ty)
				{
					sy += dty;
				}
				else
				{
					sy = ty;
				}
			}
		}
		int dx = sx - tx;
		int dy = sy - ty;

		if(abs(dx) < abs(dy))
		{
			dir = dy >= 0? Cal::E_M_UP : Cal::E_M_DOWN;
		}
		else
		{
			if(abs(dx) != abs(dy))
			{
				dir = dx >= 0? Cal::E_M_LEFT : Cal::E_M_RIGHT;
			}
		}


		/*std::cout << "sx = " << sx <<  "sy = " << sy << "dir =" << dir<< std::endl;
		std::cout << "tx = " << tx <<  "ty = " << ty << std::endl;*/
		EnterCriticalSection(&cs);
		queue.push_back(RPos(sx, sy, dir));
		LeaveCriticalSection(&cs);
	}


	bool getPos(RPosQueue& posq)
	{
		if(queue.empty())
		{
			return false;
		}
		EnterCriticalSection(&cs);
		posq.insert(posq.end(), queue.begin(), queue.end());
		queue.clear();
		LeaveCriticalSection(&cs);
		return true;
	}

	static DWORD __stdcall run(void* lp)
	{
		if(!lp)
		{
			return 1;
		}
		
		Cal* pcal = (Cal*)lp;
		for(;Cal::brun;)
		{
			//std::cout << "Cal" <<std::endl;
			pcal->move();
			Sleep(33);
		}

		return 0;
	}

	float sx;
	float sy;

	float tx;
	float ty;

	float spd;

	int dir;

	RPosQueue queue;
	CRITICAL_SECTION cs;

	static bool brun;
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -