📄 npc.cpp
字号:
#include ".\npc.h"
extern CPlane* player;
extern CBullet* bullet;
extern CGame* game;
extern CRITICAL_SECTION g_csBullet;
CRITICAL_SECTION g_cs2;
CRITICAL_SECTION g_csVecNpcBullet;
struct NPCBULLET
{
COORD newcoord , oldcoord;
int iAngleX;
};
vector<NPCBULLET> vecNpcBullet;
CNPC::CNPC(HANDLE _hStdOut, CONSOLE_SCREEN_BUFFER_INFO _csbi)
{
hStdOut=_hStdOut;
csbi=_csbi;
}
CNPC::~CNPC(void)
{
}
void CNPC::start()
{
InitializeCriticalSection(&g_cs2);
InitializeCriticalSection(&g_csVecNpcBullet);
Sleep(1000);
_beginthread(CNPC::upData , 0 , (void*)&hStdOut);
_beginthread(CNPC::BulletUpDate , 0 , (void*)&hStdOut);
}
void CNPC::upData(void *dummy)
{
while (true)
{
srand(time(0));
Sleep(GetRandom(1000 , 2000));
_beginthread(CNPC::ProcAI , 0 , dummy);
}
}
void CNPC::BulletUpDate(void *dummy)
{
HANDLE hStdOut=*(HANDLE *)dummy;
DWORD result;
char cVoid , cBullet;
cBullet=0x2E;
cVoid=0x20;
while (true)
{
//更新和绘制
EnterCriticalSection(&g_csVecNpcBullet);
for (int i=0 ; i<vecNpcBullet.size() ; i++)
{
vecNpcBullet[i].newcoord.X+=vecNpcBullet[i].iAngleX;
vecNpcBullet[i].newcoord.Y+=1;
WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
WriteConsoleOutputCharacter(hStdOut , &cBullet , 1 , vecNpcBullet[i].newcoord , &result);
vecNpcBullet[i].oldcoord.X=vecNpcBullet[i].newcoord.X;
vecNpcBullet[i].oldcoord.Y=vecNpcBullet[i].newcoord.Y;
}
//边检和碰撞
for (int i=0 ; i<vecNpcBullet.size() ; i++)
{
if (vecNpcBullet[i].newcoord.Y>50)
{
WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
vecNpcBullet.erase(&vecNpcBullet[i]);
i--;
}
else
{
if (vecNpcBullet[i].newcoord.X>player->newcoord.X-1 &&
vecNpcBullet[i].newcoord.X<player->newcoord.X+1 &&
vecNpcBullet[i].newcoord.Y>player->newcoord.Y-2 &&
vecNpcBullet[i].newcoord.Y<player->newcoord.Y+2 )
{
WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
vecNpcBullet.erase(&vecNpcBullet[i]);
i--;
//玩家死亡
}
}
}
LeaveCriticalSection(&g_csVecNpcBullet);
Sleep(100);
}
}
void CNPC::ProcAI(void *dummy)
{
HANDLE hStdOut=*(HANDLE*)dummy;
DWORD result;
char cNpc[3] , cVoid[3];
COORD newcoord , oldcoord;
cNpc[0]=0x11;
cNpc[1]=0x0F;
cNpc[2]=0x10;
cVoid[0]=cVoid[1]=cVoid[2]=0x20;
srand(time(0));
EnterCriticalSection(&g_cs2);
newcoord.X=GetRandom(10 , 60);
newcoord.Y=GetRandom(-15 , 0);
oldcoord=newcoord;
srand(time(0));
int iAngleX=rand()%4-2;
srand(time(0));
int iAngleY=1;
int iChangeTime=GetRandom(5 , 30);
int iTime=0;
LeaveCriticalSection(&g_cs2);
while (true)
{
iTime++;
EnterCriticalSection(&g_cs2);
//数据更新部分
newcoord.X+=iAngleX;
newcoord.Y+=iAngleY;
//AI部分
if (newcoord.X<2)
{
srand(time(0));
if (GetRandom(1 , 3)==2)
{
newcoord.X=3;
iAngleX=~iAngleX;
}
else
{
newcoord.Y=55;
}
}
if (newcoord.X>70)
{
srand(time(0));
if (GetRandom(1 , 3)==2)
{
newcoord.X=69;
iAngleX=~iAngleX;
}
else
{
newcoord.Y=55;
}
}
if (iTime==iChangeTime)
{
srand(time(0));
iAngleX=rand()%4-2;
}
LeaveCriticalSection(&g_cs2);
EnterCriticalSection(&g_csVecNpcBullet);
if ((iTime%5)==0)
{
NPCBULLET n1,n2,n3;
n1.iAngleX=1;
n2.iAngleX=0;
n3.iAngleX=-1;
n1.newcoord.X=n2.newcoord.X=n3.newcoord.X=newcoord.X+1;
n1.newcoord.Y=n2.newcoord.Y=n3.newcoord.Y=newcoord.Y+1;
n1.oldcoord=n2.oldcoord=n3.oldcoord=n1.newcoord;
vecNpcBullet.push_back(n1);
vecNpcBullet.push_back(n2);
vecNpcBullet.push_back(n3);
}
LeaveCriticalSection(&g_csVecNpcBullet);
//销毁条件
EnterCriticalSection(&g_csBullet);
for (int i=0 ; i<bullet->vecBullet.size() ; i++)
{
if (bullet->vecBullet[i].newcoord.X>newcoord.X-1 &&
bullet->vecBullet[i].newcoord.X<newcoord.X+4 &&
bullet->vecBullet[i].newcoord.Y>newcoord.Y-2 &&
bullet->vecBullet[i].newcoord.Y<newcoord.Y+2 )
{
char cVoidTemp=0x20;
WriteConsoleOutputCharacter(hStdOut , &cVoidTemp , 1 , bullet->vecBullet[i].oldcoord , &result);
bullet->vecBullet.erase(&bullet->vecBullet[i]);
WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
i--;
LeaveCriticalSection(&g_csBullet);
game->createBomb(newcoord);
_endthread();
}
}
LeaveCriticalSection(&g_csBullet);
if (newcoord.Y>50)
{
WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
_endthread();
}
EnterCriticalSection(&g_cs2);
//绘制部分
WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
WriteConsoleOutputCharacter(hStdOut , cNpc , 3 , newcoord , &result);
oldcoord.X=newcoord.X;
oldcoord.Y=newcoord.Y;
LeaveCriticalSection(&g_cs2);
Sleep(150);
}
_endthread();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -