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

📄 tetris_game.h

📁 自己写的俄罗斯方块
💻 H
字号:
// CTetris_Game.h: interface for the CTetris_Game class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CTETRIS_GAME_H__6C3F65AD_C149_4A3B_B735_18DC02853748__INCLUDED_)
#define AFX_CTETRIS_GAME_H__6C3F65AD_C149_4A3B_B735_18DC02853748__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <mmsystem.h>
#include "Tetris_AI.h"
#include "Tetrisdraw.h"
#include "Tetrismusic.h"
#include "TetrisInput.h"

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
struct CUSTOMVERTEX
{
    D3DXVECTOR3 position; // The position
    FLOAT       tu, tv;   // The texture coordinates
};
struct RECT3D
{
	CUSTOMVERTEX point[4];
	int width, height;
};

#define LEVELUP_SCORE 2000
#define BASELEVEL_INTERVAL 500
#define LEVEL_DIFFERENCE	1.25

struct KeyStatus
{
	DWORD Keydef;
	BOOL bKeydown;
	DWORD DownTime;
	BOOL bKeyPress;
};

enum	//SubTitle
{
	Subtitle_Win = 0,
	Subtitle_Lose,
	Subtitle_Draw,
	Subtitle_Level2,
	Subtitle_Level3,
	Subtitle_Level4,
	Subtitle_Level5,
	Subtitle_Level6,
	Subtitle_Level7,
	Subtitle_Level8,
	Subtitle_Level9,
	Subtitle_Level10,
};

class CTetris_Game : public CD3DApplication	//tetris full engine with image/sound/control...
{
public:
	void PauseGame();
	CTetris_Game();
	~CTetris_Game();
	int GetPlayerNumber()		{	return playernumber;}
	int SetPlayerNumber(int n)	{	return playernumber=n;}
	BOOL IsPaused()				{	return m_bIsPaused;}
	void TogglePause()			{	m_bIsPaused=!m_bIsPaused;	if(m_bIsPaused)	PauseGame();}
	BOOL IsPlaying()			{	return m_bIsPlaying;}
	void NewGame();	//new game
	void StopGame(BOOL ChangeSound = TRUE);	//stop game if playing
	void Destroy();	//game resource release
	HRESULT Create(CWnd *pwnd);	//引擎启动
	void SetParam(BOOL smoothdown, BOOL smoothrotate, BOOL leftwindow, int ailevel,
		int level, int difficulty, BOOL shownext, BOOL othereffect, int volumn);
	void Animate(KeyStatus keystatus[MAX_PLAYER][MAX_KEYDEF], DWORD curTime);//游戏中的动画或者闪烁等(比如平滑下降以及块的闪烁)
	void UpdateRect();//让directdraw重新绑定到指定的窗口位置

	BOOL IsMusicOn()			{	return m_bPlayMusic;}
	void SetMusicOn(BOOL bOn);
	BOOL IsSoundOn()			{	return m_bPlaySound;}
	void SetSoundOn(BOOL bOn)	{	m_bPlaySound = bOn;	}

private:
	HRESULT ForceFullscreenMode();
	HRESULT ForceWindowMode();
	HRESULT DeleteDeviceObjects();	//release directx resource
	HRESULT InitDeviceObjects();	//load directx resource
	HRESULT RestoreDeviceObjects();
	void ChangeDevice();
	HRESULT Render();	//render
	BOOL TestGameOver(int player);	//检测引擎,游戏是否结束
	void StopTetrisMusic();	//stop all music if playing
	void StopAllSubtitle();	//close all subtitle if visible
	void SetallOffset(SIZE* size, int cx, int cy);	//set texture information
	void Blt3D( DWORD x, DWORD y, LPDIRECT3DTEXTURE8 pTexture, int width, int height );
	void Blt3D( DWORD x, DWORD y, LPDIRECT3DTEXTURE8 pTexture, RECT3D* prc );
	void SetTextureRect(RECT3D& rect3d, float left, float top, float right, float bottom, int cx, int cy, BOOL CCW = TRUE);
	HRESULT Display();	//blt all image on backbuffer
	void AddSubtitle(int player, int sub, int subtime = SUBTITLE_TIME2);//add a new subtitle
	void PlayTetrisSound(int player, int nsound);//播放一个音效
	void PlayTetrisMusic(int nmusic);	//播放音乐
	int PlayerInputNotify(int player, int nkeydef, int defaultrow = -1);//游戏操作
	inline void SetColor(int color);	//设置directx颜色和material
	inline void UnSetColor();	//取消设置directx颜色


private:
	CTetris_AI TetrisEngine[MAX_PLAYER];

	int m_GameOver_Counter[MAX_PLAYER];

	BOOL m_bIsPlaying;	//若为假表示游戏不在进行中,不响应键盘,但可能显示动画等
	BOOL m_bIsPaused;	//若为真表示程序处于暂停状态,游戏暂停并且不响应键盘
	BOOL m_bWindowRendering[MAX_PLAYER];	//左、右两个窗口是否需要绘制(游戏可能正在进行,也可能在其他状态)
	int  m_Explode[MAX_PLAYER];//>0表示正进行消行动画
	int  m_AddFloor[MAX_PLAYER];//>0表示正进行加行动画
	int  m_nAddFloorBuffer[MAX_PLAYER];	//给对方增加的行数量
	int  m_nAddingFloor[MAX_PLAYER];	//正在增加的行的数量
	int playernumber;					//player数量 (1或者2)
	int m_curLevel;		//当前级别(下落速度)
	int m_Level;		//处世级别
	int m_AILevel;		//AI级别(速度)
	int m_difficulty;	//行数难度级别
	int m_DisplayScore[MAX_PLAYER];	//当前显示的分数
	int m_volumn;		//音量
	BOOL m_othereffect;
	BOOL m_smoothdown;	
	BOOL m_smoothrotate;
	BOOL m_shownext;
	BOOL m_leftwindow;

	BOOL m_bPlaySound;	//是否播放音效
	BOOL m_bPlayMusic;	//是否播放音乐

	struct
	{
		int subcount;	//0则该sub不存在
		byte subtitle;	//出现的subtitle类型
		int player;		//对应那个player(窗口)
		int subtime;	//停留时间
	}	Subtitle[MAX_SUBTITLE];

	DWORD LastTime_Down[MAX_PLAYER];
	DWORD TimerInterval[MAX_LEVEL+1];//ms为单位
	
	int AnimeFrame;//普通闪烁动画桢的控制

	//directx resource
	LPDIRECT3DTEXTURE8 m_Texture_Block;
	LPDIRECT3DTEXTURE8 m_Texture_Background;
	LPDIRECT3DTEXTURE8 m_Texture_Score;
	LPDIRECT3DTEXTURE8 m_Texture_Level;
	LPDIRECT3DTEXTURE8 m_Texture_NFloor;
	LPDIRECT3DTEXTURE8 m_Texture_GrayBlock;
	LPDIRECT3DTEXTURE8 m_Texture_GamePaused;
	LPDIRECT3DTEXTURE8 m_Texture_Subtitle;
	LPDIRECT3DTEXTURE8 m_Texture_Changewhite;
	LPDIRECT3DTEXTURE8 m_Texture_Explode;
	LPDIRECT3DTEXTURE8 m_Texture_Crash;

	D3DMATERIAL8 mtrl;
	//texture tile position
	RECT3D ChangewhiteRect[BLOCK_TYPE][CHANGEWHITE_FRAME];
	RECT3D CrashRect[CRASH_FRAME];
	RECT3D ExplodeRect[EXPLODE_DIRECTION*EXPLODE_TYPE][EXPLODE_FRAME];
	RECT3D BlockRect[BLOCK_TYPE][BLOCK_FRAME];
	RECT3D ScoreNumberRect[SCORE_NUMBER];
	RECT3D LevelNumberRect[LEVEL_NUMBER];
	RECT3D NFloorTypeRect[NFLOOR_TYPE][NFLOOR_FRAME];
	RECT3D SubtitleTypeRect[SUBTITLE_NUMBER];

	D3DCOLORVALUE BlockColor[BLOCK_TYPE];

	SIZE ExplodeCenterOffset[EXPLODE_DIRECTION*BLOCK_TYPE];	//explode center position
};

inline void CTetris_Game::SetColor(int color)
{
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
	mtrl.Emissive.r = BlockColor[color].r / 255;
	mtrl.Emissive.g = BlockColor[color].g / 255;
	mtrl.Emissive.b = BlockColor[color].b / 255;
	mtrl.Emissive.a = 1.0f;
	m_pd3dDevice->SetMaterial( &mtrl );	
}

inline void CTetris_Game::UnSetColor()
{
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
}

#endif // !defined(AFX_CTETRIS_GAME_H__6C3F65AD_C149_4A3B_B735_18DC02853748__INCLUDED_)

⌨️ 快捷键说明

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