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

📄 engine.cpp

📁 this block game source
💻 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 + -