📄 cal.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 + -