📄 engine.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////////////////
// ENGINE.CPP
/////////////////////////////////////////////////////////////////////////////////////////////
#include "engine.h"
#include "graphics.h"
#include "input.h"
#include "sound.h"
#include "level.h"
#include "editor.h"
extern BYTE Keys[256];
extern long MouseX, MouseY;
OBJECT Blocks;
OBJp Player;
OBJp Ball;
int nBlocks;
int ProgramState;
/////////////////////////////////////////////////////////////////////////////////////////////
// DelObject
/////////////////////////////////////////////////////////////////////////////////////////////
void DelBlock(OBJp node)
{
nBlocks--;
node->Next->Prev = node->Prev;
node->Prev->Next = node->Next;
delete node;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// AddBlock
/////////////////////////////////////////////////////////////////////////////////////////////
void AddBlock(int type, int x, int y)
{
OBJp node;
node = new OBJECT;
if(node == NULL) return;
node->Width = 31;
node->Height = 20;
node->Type = type;
node->PosX = x;
node->PosY = y;
node->Next = Blocks.Next;
node->Prev = &Blocks;
Blocks.Next->Prev = node;
Blocks.Next = node;
nBlocks++;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// InitEngine
/////////////////////////////////////////////////////////////////////////////////////////////
void InitEngine()
{
nBlocks = 0;
ProgramState = PS_ACTIVE;
Blocks.Next = Blocks.Prev = &Blocks;
Blocks.PosX = Blocks.PosY = 0;
for(int i = 0; i < 20; i++)
{
AddBlock(Level1[i][0], Level1[i][1], Level1[i][2]);
}
Player = new OBJECT;
Player->Width = 60;
Player->Height = 15;
Player->PosX = 300;
Player->PosY = 450;
Ball = new OBJECT;
Ball->Width = 10;
Ball->Height = 10;
Ball->PosX = 310;
Ball->PosY = 60;
Ball->VelX = 4;
Ball->VelY = 4;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// PlayerHit
/////////////////////////////////////////////////////////////////////////////////////////////
void HitPlayer(OBJp Obj1, OBJp Obj2)
{
RECT Dest;
RECT Src1 = { Obj1->PosX, Obj1->PosY, Obj1->PosX + Obj1->Width, Obj1->PosY + Obj1->Height };
RECT Src2 = { Obj2->PosX, Obj2->PosY, Obj2->PosX + Obj2->Width, Obj2->PosY + Obj2->Height };
if(!IntersectRect(&Dest, &Src1, &Src2)) return;
PlaySound(SND_BALLHIT);
if(Dest.right - Dest.left > Dest.bottom - Dest.top)
{
Ball->VelY = -Ball->VelY;
if(Src2.left < Src1.left)
{
Ball->VelX -= 4;
}
if(Src2.left < Src1.left + 10)
{
Ball->VelX -= 2;
}
else if(Src2.right > Src1.right)
{
Ball->VelX += 4;
}
else if(Src2.right > Src1.right - 10)
{
Ball->VelX += 2;
}
}
else Ball->VelX = -Ball->VelX;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// BlockHit
/////////////////////////////////////////////////////////////////////////////////////////////
HITS HitBlock(OBJp Obj1, OBJp Obj2)
{
RECT Dest;
RECT Src1 = { Obj1->PosX, Obj1->PosY, Obj1->PosX + Obj1->Width, Obj1->PosY + Obj1->Height };
RECT Src2 = { Obj2->PosX, Obj2->PosY, Obj2->PosX + Obj2->Width, Obj2->PosY + Obj2->Height };
if(!IntersectRect(&Dest, &Src1, &Src2)) return NO_HIT;
if(Dest.right - Dest.left > Dest.bottom - Dest.top) return HIT_Y;
else return HIT_X;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// UpdateFrame
/////////////////////////////////////////////////////////////////////////////////////////////
void UpdateFrame()
{
HITS rval;
OBJp node;
OBJp save;
BOOL BlockHit;
switch(ProgramState)
{
case PS_EDITOR:
InitEditor();
break;
case PS_SPLASH:
break;
case PS_WON:
break;
case PS_DEAD:
break;
case PS_ACTIVE:
UpdateInput();
if(Keys[DIK_TAB] & 0x80) ProgramState = PS_EDITOR;
if(Keys[DIK_LEFT] & 0x80) Player->PosX -= 8;
if(Keys[DIK_RIGHT] & 0x80) Player->PosX += 8;
if(MouseX) Player->PosX += MouseX;
if(Player->PosX < 10) Player->PosX = 10;
if(Player->PosX > 570) Player->PosX = 570;
// Player collision detection
HitPlayer(Player, Ball);
// Block collision detection
node = Blocks.Next;
do
{
BlockHit = FALSE;
rval = HitBlock(node, Ball);
if(rval == HIT_Y)
{
Ball->VelY = -Ball->VelY;
save = node;
BlockHit = TRUE;
}
else if(rval == HIT_X)
{
Ball->VelX = -Ball->VelX;
save = node;
BlockHit = TRUE;
}
node = node->Next;
if(BlockHit)
{
PlaySound(SND_BLOCKHIT);
DelBlock(save);
}
}
while(node != &Blocks);
// Update ball position
Ball->PosX += Ball->VelX;
Ball->PosY += Ball->VelY;
if(Ball->PosX < 10) { Ball->VelX = -Ball->VelX; PlaySound(SND_WALLHIT); }
if(Ball->PosX > 620) { Ball->VelX = -Ball->VelX; PlaySound(SND_WALLHIT); }
if(Ball->PosY < 10) { Ball->VelY = -Ball->VelY; PlaySound(SND_DEAD); }
if(Ball->PosY > 470) { Ball->VelY = -Ball->VelY; PlaySound(SND_WALLHIT); }
// if(nBlocks <= 0) PlaySound(SND_WON);
UpdateGraphics();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -