📄 main.cpp
字号:
//-----------------------------------------------------------------------------
// 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 + -