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

📄 main.cpp

📁 这是一个屠宰场游戏,此游戏很休闲的请大家下载来看看.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//-----------------------------------------------------------------------------
// File: Main.cpp
//
//-----------------------------------------------------------------------------
#define STRICT
#include <windows.h>
#include <ddraw.h>
#include <dshow.h>
#include <mmsystem.h>
#include <math.h>
#include <fstream>
#include <list>
#include "resource.h"
#include "DSUtil.h"
#include "ddutil.h"
#include "Maze.h"
#include "Sprite.h"
#include "SpriteManager.h"
#include "GameErrors.h"
#include "InputLayer.h"
#include "Keyboard.h"
#include "ijl.h"  // Intel JPEG header file
//#define DISPLAY_STATUS
#undef DISPLAY_STATUS
//-----------------------------------------------------------------------------
// Defines, constants, and global variables
//-----------------------------------------------------------------------------
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

#define TITLE "Adventure in Abit"
#define SPLASHFILENAME "AdvInAbat.jpg"
#define CHOICEFILENAME "choose.jpg"
#define GAMEOVERBADFILENAME "GameOver.jpg"
#define GAMEOVERGOODFILENAME "Finish.jpg"

//屏幕分辨率,精灵大小,迷宫格子大小
#define SCREEN_WIDTH    1024  
#define SCREEN_HEIGHT   768
#define SCREEN_BPP      16
#define SPRITE_WIDTH    64
#define SPRITE_HEIGHT   64
#define MAZETEXTURE_WIDTH    32  //迷宫格子大小
#define MAZETEXTURE_HEIGHT   32

//人物和精灵代号
#define TYPE_PLAYER   1
#define TYPE_ENEMY1   2
#define TYPE_ENEMY2   3
#define TYPE_ENEMY3   4
#define TYPE_ENEMY4   5
#define TYPE_POO     10    // 粪便
#define TYPE_SPECIAL 11
#define TYPE_BULLET  12   //子弹

//精灵状态
#define ST_STAND_STILL 1     //站着不动
#define ST_WALK_UP     2     //向上走 
#define ST_WALK_DOWN   3
#define ST_WALK_LEFT   4
#define ST_WALK_RIGHT  5
#define ST_DEFAULT     6
#define ST_KEY         7    //钥匙
#define ST_DOOR        8    //门
#define ST_FOOD1       9
#define ST_FOOD2       (ST_FOOD1+1)
#define ST_FOOD3       (ST_FOOD1+2)
#define ST_FOOD4       (ST_FOOD1+3)
#define ST_FOOD5       (ST_FOOD1+4)
#define ST_FOOD6       (ST_FOOD1+5)

//游戏状态
#define GAMESTATE_SPLASHSCREEN 0
#define GAMESTATE_CHOICE       1
#define GAMESTATE_RUNNING      2
#define GAMESTATE_GAMEOVERBAD  3
#define GAMESTATE_GAMEOVERGOOD 4

#define POO_DELAY   500
#define INVULNERABLE_DELAY  200    //不死延时
#define NO_OF_LIFE     4           //生命
#define NO_OF_SPECIALS 5           //物品

#define GAMESTATUS_TEXT "Dead Pigs:%d Dead Enemies:%d"
char g_szGameStatus[200];

#define LIFE_LEFT_TEXT "Lives:%d"
char g_szLifeLeft[100];

#define GAMESCORE_TEXT "Score:%06d"
char g_szScore[100];

CDisplay*            g_pDisplay        = NULL;
//表面类
#ifdef DISPLAY_STATUS
CSurface*            g_pTextSurface    = NULL;  
#endif
CSurface*            g_pLifeTextSurface = NULL;  
CSurface*            g_pScoreTextSurface = NULL;  
CSurface*            g_pLevelTextSurface = NULL;  
CSurface*            g_pMazeSurface    = NULL;  
CSurface*            g_pSpriteSurface  = NULL;
CSurface*            g_pSplashSurface  = NULL;
RECT                 g_rcWindow;            
RECT                 g_rcViewport;          
RECT                 g_rcScreen;            
BOOL                 g_bWindowed   = false;  
BOOL                 g_bActive     = FALSE;
DWORD                g_dwLastTick;
//迷宫类
CMaze                g_Maze(MAKEINTRESOURCE(IDB_TEXTURE)); //初始化迷宫,包括纹理等
//精灵类
CSprite              g_PigSprite;        //猪
CSprite              g_RabbitSprite;     //兔
CSprite              g_SheepSprite;      //羊
CSprite*             g_pPlayerSprite = NULL;
CSprite              g_Enemy1Sprite;     //敌人
CSprite              g_Enemy2Sprite;
CSprite              g_Enemy3Sprite;
CSprite              g_Enemy4Sprite;
CSprite              g_Enemy5Sprite;
CSprite              g_PigPooSprite;    //猪粪
CSprite              g_RabbitPooSprite;
CSprite              g_SheepPooSprite;
CSprite*             g_pPooSprite= NULL;
CSprite              g_SpecialSprite;   //特殊:食物 钥匙 门 
CSprite              g_BulletSprite;    //子弹
CSpriteManager       g_EnemySpriteManager;   //精灵管理器

//声效类
CSound*              g_pSplashSound = NULL;
CSound*              g_pPickupSound = NULL;
CSoundManager*       g_pSoundManager = NULL;

int                  g_nGameState = GAMESTATE_SPLASHSCREEN;
int                  g_nPigDead = 0;
int                  g_nEnemyDead = 0;
long                 g_nPooDelay = 0;
long                 g_nNoOfEnemies = 10;
long                 g_nLivesLeft = NO_OF_LIFE;
long                 g_nNoOfSpecials = NO_OF_SPECIALS;
long                 g_nScore = 0;

struct SLEVEL {  //关卡结构体
	char  szLevelFile[100]; //关卡数据文件名
	int   nNoOfEnemys;      //本关卡中敌人的数目 
}* g_pLevel;

long                 g_nNoOfLevels;
long                 g_nCurrLevel=0;


HINSTANCE g_hInstance;  //应用程序实例句柄  
HWND      g_hMainWnd;   //主窗口的句柄

//-----------------------------------------------------------------------------
// Function-prototypes
//-----------------------------------------------------------------------------
//函数声明

LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
HRESULT WinInit( HINSTANCE hInst, int nCmdShow, HWND* phWnd, HACCEL* phAccel );
HRESULT InitDirectDraw( HWND hWnd );
VOID    FreeDirectDraw();
HRESULT InitDirectDrawMode( HWND hWnd, BOOL bWindowed );
HRESULT ProcessNextFrame( HWND hWnd );
HRESULT DisplayFrame();
HRESULT RestoreSurfaces();
bool LoadJPEG(bool bFromFile, LPCTSTR szName,  CSurface** ppSurface);
void DisplaySplashScreen(bool bDisplay);
void InitSprites();
void InitLevel();
//void MoveCharacterRelative(long dX, long dY);

//using namespace std;

//定义结构体
struct SHandleInput: public iKeyboardReceiver  //struct 和类相似
{
	SHandleInput() {
		cInputLayer::Create( g_hInstance, g_hMainWnd, 
			true, true, false );
		/**调用cInputLayer的构造函数,
		   cInputLayer类定义了cKeyboard、cMouse类的指针 
		   导致,创建了DirectInput8 的接口指针,
		   并创建了键盘类cKeyboard和鼠标类cMouse实例
		   调用了cKeyboard、cMouse 的构造函数初始化了键盘和鼠标
		*/

		Input()->GetKeyboard()->SetReceiver( this );
		/**
		全局函数Input() 返回的是cInputLayer 指针
        利用该指针调用GetKeyboard()函数获取 cKeyboard类的指针
		再通过cKeyboard类的指针调用SetReceiver函数,
		在键盘类cKeyboard中设置了接收器,该接收器就是本结构体,
		利用接收器的处理函数KeyUp、KeyDown处理键盘。
		*/
	}
	~SHandleInput() {
		cInputLayer::Destroy();
	}
	void KeyUp( int key )   //处理弹起键的函数
	{
		switch(g_nGameState) 
		{
		case GAMESTATE_SPLASHSCREEN: 
			{
				switch( key )
				{
					
				case DIK_SPACE:
					{
						g_nGameState=GAMESTATE_CHOICE;
						g_pSplashSound->Stop();
						LoadJPEG(true, CHOICEFILENAME,  &g_pSplashSurface);
						
						break;
					}
				}
				
			}
			break;
			
		case GAMESTATE_CHOICE:
			{
				bool bKeyHit = false;
				
				switch( key )
				{
				case DIK_1: g_pPlayerSprite = &g_PigSprite; 
					g_pPooSprite = &g_PigPooSprite;
					bKeyHit = true; break;
				case DIK_2: g_pPlayerSprite = &g_RabbitSprite;
					g_pPooSprite = &g_RabbitPooSprite;
					bKeyHit = true;break;
				case DIK_3: g_pPlayerSprite = &g_SheepSprite; 
					g_pPooSprite = &g_SheepPooSprite;
					bKeyHit = true;	break;
				}
				if (bKeyHit) {
					g_nGameState=GAMESTATE_RUNNING;
					InitLevel();
				}
			}
			break;
			
		case GAMESTATE_RUNNING: 
			{
				switch( key )
				{
					// move up
				case DIK_UP:
				case DIK_NUMPAD8:
					// move down
				case DIK_DOWN:
				case DIK_NUMPAD2:
					// turn right
				case DIK_RIGHT:
				case DIK_NUMPAD6:
					// turn left
				case DIK_LEFT:
				case DIK_NUMPAD4:
					g_pPlayerSprite->SetState(ST_STAND_STILL);
					g_pPlayerSprite->m_Movement.m_dx = g_pPlayerSprite->m_Movement.m_dy =0;
					break;
				}
			}
			break;
		case GAMESTATE_GAMEOVERGOOD: 
		case GAMESTATE_GAMEOVERBAD: 
			{
				switch( key )
				{
					
				case DIK_SPACE:
					{
						g_nGameState=GAMESTATE_SPLASHSCREEN;
						g_nLivesLeft = NO_OF_LIFE;
						g_nScore=0;
						g_nCurrLevel=0;
						
						break;
					}
				}
				
			}
			break;
			
		}
	}
	
	
	void KeyDown( int key )   //处理按下键的函数
	{
		switch(g_nGameState) {
			
			
		case GAMESTATE_RUNNING: 
			{
				switch( key )
				{
					
					// move up
				case DIK_UP:
				case DIK_NUMPAD8:
					{
						g_pPlayerSprite->SetState(ST_WALK_UP);
						g_pPlayerSprite->m_Movement.m_dy = -2;
						g_pPlayerSprite->m_Movement.m_dx = 0;
						break;
					}
					
					// move down
				case DIK_DOWN:
				case DIK_NUMPAD2:
					{
						g_pPlayerSprite->SetState(ST_WALK_DOWN);
						g_pPlayerSprite->m_Movement.m_dy = 2;
						g_pPlayerSprite->m_Movement.m_dx = 0;
						break;
					}
					
					// Shoot
				case DIK_SPACE:
					{
						if (g_nPooDelay == 0 && g_pPlayerSprite->GetState()!= ST_KILL) {
							RECT rc = g_pPlayerSprite->GetRect();
							g_pPooSprite->MoveTo(rc.left,rc.top);
							g_nPooDelay = POO_DELAY;
							g_pPooSprite->SetState(ST_DEFAULT);
						}
						break;
					}
					
					// turn right
				case DIK_RIGHT:
				case DIK_NUMPAD6:
					{
						g_pPlayerSprite->SetState(ST_WALK_RIGHT); 
						g_pPlayerSprite->m_Movement.m_dx = 2;
						g_pPlayerSprite->m_Movement.m_dy = 0;
						break;
					}
					
					// turn left
				case DIK_LEFT:
				case DIK_NUMPAD4:
					{
						g_pPlayerSprite->SetState(ST_WALK_LEFT);
						g_pPlayerSprite->m_Movement.m_dx = -2;
						g_pPlayerSprite->m_Movement.m_dy = 0;
						break;
					}
				}
			}
		}
	}
} *  g_pHandleInput = NULL;





//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything and calls
//       UpdateFrame() when idle from the message pump.
//-----------------------------------------------------------------------------
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow )
{
    MSG	   msg;
    HWND   hWnd;
    HACCEL hAccel;  //Handle to an accelerator table 快捷键表的句柄
	
    srand( GetTickCount() );  //初始化随机数
	
	
	wsprintf((char*)g_szGameStatus, (char*)GAMESTATUS_TEXT,0,0);
	//-----------------------------------------------------------------------
	// 格式化字符串,第一个为输出的buffer,第二个为格式,后面的是对应格式需要的参数
	// 例:    wsprintf((char*)g_szGameStatus, "Dead Pigs:%d Dead Enemies:%d",0,0);
	// 结果:  g_szGameStatus="Dead Pigs:0 Dead Enemies:0 "
	//----------------------------------------------------------------------------
	wsprintf((char*)g_szLifeLeft, (char*)LIFE_LEFT_TEXT,g_nLivesLeft -1);
	wsprintf((char*)g_szScore, (char*)GAMESCORE_TEXT,g_nScore);
	
	g_hInstance = hInst;    //用全局变量记录应用程序的句柄
	
	char szName[200];
	
	//将文件链接到流LevelData,用于读
	std::fstream LevelData("config.txt",std::ios::in );//std 命名空间,fstream流

⌨️ 快捷键说明

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