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

📄 fjmain.cpp

📁 经典飞机游戏的源代码 dx实现
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <time.h>
#include <ddraw.h>
#include <dinput.h>
#include <direct.h>
#include "ddutil.h"
#include "dsobj.h"
#include "midobj.h"
#include "resource.h"
#include "fj.h"
#include "enemy.h"

#define  MAXENEMY    10     //暂不能更改,很多参数使用.
#define  MAXSLUG     10     //自机的子弹总数
#define  SLUG_DELAY  500    //两个子弹之间的延迟时间
#define  SUPER_TIME  0    //无敌时间
#define  TREE_NUM    0     //树木的数量
#define  DOWN_MAX    200     //击落敌机数,超过出BOSS.
#define  BOSS_MAX_HP 100 
//使用DX6.0的SDK声明

LPDIRECTDRAW4            g_pDD;         //DirectDraw对象
LPDIRECTDRAWSURFACE4     g_pDDSPrimary; //以下均为DirectDrawSurface对象
LPDIRECTDRAWSURFACE4     g_pDDSBack; 
LPDIRECTDRAWSURFACE4     back;
LPDIRECTDRAWSURFACE4     m_back;
LPDIRECTDRAWSURFACE4     Map;
LPDIRECTDRAWPALETTE      g_pDDPal = NULL; 
LPDIRECTINPUT        g_lpDI; 
LPDIRECTINPUTDEVICE  g_lpKey; 

HWND	hWnd;				//主窗口句柄
BOOL	bActive = TRUE;		//应用程序是否活跃
int fps,speed=0;
char fspeed=3;

BYTE KEY_INPUT[256];        //Dinput 
char	apppath[50];		//应用程序路径
char	openmidi[50];		//打开midi命令字符串
char	closemidi[50];		//关闭midi命令字符串

int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow);
HWND InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, 
                        WPARAM wParam, LPARAM lParam );
BOOL InitDDraw(void);
void DrawMap(void );
void FreeDDraw( void );
void FreeDInput();
void UpdateFrame(void );
BOOL LoadBmp(void);
HRESULT  RestoreAll(void);
BOOL InitDInput(HINSTANCE hInstance);
int process_input();
void gameinit();
void game_loop();
void movebkg(int);
extern void GetRect(RECT* rect, long left, long top, long width, long height);
extern void draw_play(int,int,int);
extern void draw_play_start();
extern void draw_play_dead(int,int);
extern void draw_power();
extern void draw_missile();
extern void draw_missile_num(int);
extern int power_x,power_y,m_x,m_y;
void draw_slug();
bool d_time(int);
static char                 szBitmap[] = "FJ1.BMP";
int count=1;         //用来向下移屏的记数器

//player 的参数

POINT play,slug[MAXSLUG];// x,y
int move_flag,play_num=5,super_num=0,slug_delay,pm=50,pm2=30;//移动的标志
char slug_sum;//子弹的数量
int missile_num,m_num; //导弹的数量
char p_type=0,p_speed=2;//enemy plane type,speed
bool game_over=false,wav_error=false,play_start=TRUE;
bool play_dead=false,super=false,final=false,power=false,missile=false;
int  击毙敌机=0; //记录击中敌机的数量
int e_over=0,123;
bool enemy_over=false,boss_music=false;
//*******************************************************************
//应用程序入口
//*******************************************************************
//类定义

 enemy ep[MAXENEMY]; //敌机
 D_fire d_fire[MAXENEMY]; //子弹击中敌机后的火焰
 D_fire ml_fire[MAXSLUG]; //导弹击中敌机后的火焰-----left
 D_fire mr_fire[MAXSLUG]; //导弹击中敌机后的火焰-----right
 enemy_slug e_slug[MAXENEMY];//敌机子弹
 CDSObj wav_obj;       // DXSOUND  CLASS 
 CMidi midi;           // Midi Class
 BOSS boss;            // BOSS Class
 boss_slug  b_l_slug[3];
 boss_slug  b_m_slug[3];
 boss_slug  b_r_slug[3];
 BOSS_HIT_FLAME boss_hit_flame[MAXSLUG];//BOSS被击中后的火焰
 MISSILE_L  m_l[MAXSLUG];  //left missile
 MISSILE_R  m_r[MAXSLUG];  //right missile
 BOSS_DEAD_FLAME boss_dead_f[5];

 int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow)
{
	MSG		msg;

	//初始化主窗口
	hWnd=InitWindow( hInstance, nCmdShow ) ;
	if (hWnd == NULL ) 	return FALSE;

	if(!InitDInput(hInstance))
	{
		MessageBox(GetActiveWindow(), "初始化DirectInput过程中出错!请检查你是否正确的安装了DirectX。", "Error", MB_OK );
		FreeDInput();
		return FALSE;
	}
    if(g_lpKey) g_lpKey->Acquire(); //Dinput Acquire

	//初始化DirectDraw环境,并实现DirectDraw功能
	if (!InitDDraw())
	{
		MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!请检查你是否正确的安装了DirectX。", "Error", MB_OK );
		FreeDDraw();
		return FALSE;
	}
    
	//dxsound init
	wav_obj.Initialize(hWnd);
	    
	gameinit();
	 
	while(1)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(bActive)
		{
			//计算帧频率
			static int frame=0, nt, ot=0;
			nt=GetTickCount(); 
			if (nt > ot+1000)
			{
				ot=nt;
				fps=frame;
				frame=0;
			}
			//画面延时
			static int NewCount, OldCount=0;
			NewCount=GetTickCount(); 
			if (NewCount > OldCount+speed)
			{
				frame++;
				OldCount=NewCount;
				UpdateFrame();//更新画面
			}
		}
		//等待消息
		else WaitMessage();
	}
}

//******************************************************************
//创建主窗口。
//******************************************************************

HWND InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    HWND				hwnd;	
    WNDCLASS			wc;		

	//填充窗口类结构
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON1) );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
	wc.lpszClassName = "TK";

	//注册窗口类
    RegisterClass( &wc );
    
	//创建主窗口
    hwnd = CreateWindowEx(
		WS_EX_TOPMOST,
		"TK",
		"FJ",
		WS_POPUP,
		0,
		0,
	   GetSystemMetrics(SM_CXSCREEN),
       GetSystemMetrics(SM_CYSCREEN),
		NULL,
		NULL,
		hInstance,
		NULL );

    if( !hwnd )	return FALSE;

	//显示并更新窗口
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );

	return hwnd;
}

//*****************************
//处理主窗口消息
//*****************************

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, 
                            WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
	case WM_ACTIVATEAPP://
		bActive = wParam;
		break;

    case WM_KEYDOWN://击键消息
        switch( wParam )
        {
        case VK_ESCAPE://退出
            PostMessage(hWnd, WM_CLOSE, 0, 0);
            break;
		}
        break;
   	case MM_MCINOTIFY:  //midi replay
        midi.Replay();
        break;
    case WM_DESTROY://退出消息
        FreeDDraw();//释放所有DirectDraw对象
	    PostQuitMessage( 0 );
        break;
    case WM_SETCURSOR:
            // Turn off the cursor since this is a full-screen app
            SetCursor(NULL);
        return TRUE;

    }
	
	//调用缺省消息处理过程
    return DefWindowProc(hWnd, message, wParam, lParam);
}

//******************************************************************
//初始化DirectDraw环境

BOOL LoadBmp(void)
{
   	DDReLoadBitmap(Map,szBitmap);
	//直接创建一个用图块填充的底背景
	static int mapposX=80, mapposY=60;
     int tree_x,tree_y,tree_type;	
	RECT rc,rect;
	GetRect(&rc, 499,191, mapposX, mapposY);
    srand( (unsigned)time( NULL ) );
	for (int x=0; x<=640; x+=mapposX)
	for (int y=0; y<=480; y+=mapposY)
	{
    GetRect(&rect, x, y, mapposX, mapposY);
	m_back->Blt( &rect, Map, &rc, DDBLT_WAIT, NULL);
	}
	for(int i=0;i<TREE_NUM;i++)
	{
		tree_x=rand()%640;
		tree_y=rand()%480;
		if(tree_x<50)tree_x=rand()%640+50;
        if(tree_y<50)tree_y=rand()%480+50;
		tree_type=rand()%4;
	switch(tree_type)
	   {
	   case 0:
		   GetRect(&rc,570,81,27,24);
		   break;
	   case 1:
		   GetRect(&rc,600,81,28,22);
		   break;
	   case 2:
		   GetRect(&rc,570,108,37,31);
		   break;
	   case 3:
		   GetRect(&rc,611,108,14,20);
		   break;
   	   }
    m_back->BltFast(tree_x,tree_y,Map,&rc,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT);  
	}
	return TRUE;
}

//******************************
//     Directx Draw Init
//******************************

BOOL InitDDraw(void)
{
    DDSURFACEDESC2              ddsd;
    DDSCAPS2                    ddscaps;
    HRESULT                     hRet;
    LPDIRECTDRAW                pDD;
    BOOL                        load; 

    hRet = DirectDrawCreate(NULL, &pDD, NULL);
    if (hRet != DD_OK)
    return MessageBox(GetActiveWindow(), "DirectDrawCreate FAILED","FAILED",MB_OK);

    hRet = pDD->QueryInterface(IID_IDirectDraw4, (LPVOID *) & g_pDD);
    if (hRet != DD_OK)
    return MessageBox(GetActiveWindow(), " QueryInterface FAILED","FAILED",MB_OK);

    hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN|
     DDSCL_ALLOWMODEX);
    if (hRet != DD_OK)
    return MessageBox(GetActiveWindow(), "SetCooperativeLevel FAILED","FAILED",MB_OK);
		
    // Set the video mode to 640x480x8
    hRet = g_pDD->SetDisplayMode(640, 480, 8, 0, 0);
    if (hRet != DD_OK)
    return MessageBox(GetActiveWindow(), "SetDisplayMode FAILED","FAILED",MB_OK);

    // Create the primary surface with 1 back buffer
    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP |
                          DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount = 1;
    hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
    if (hRet != DD_OK)
        return MessageBox(GetActiveWindow(), "CreateSurface FAILED","FAILED",MB_OK);
		
	//----------声明SURFACE的尺寸,装入位图---------------//
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
    ddsd.dwHeight = 700;
    ddsd.dwWidth = 640;

	hRet = g_pDD->CreateSurface(&ddsd, &Map, NULL);
    if (hRet != DD_OK)
        return MessageBox(GetActiveWindow(), "MAP FAILED","FAILED",MB_OK);

	//----------声明back的尺寸,作为大屏幕的漫游---------------//   

	ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
    ddsd.dwHeight = 580;
    ddsd.dwWidth = 740;

	hRet = g_pDD->CreateSurface(&ddsd, &back, NULL);
    if (hRet != DD_OK)
        return MessageBox(GetActiveWindow(), "back FAILED","FAILED",MB_OK);

	//----------声明m_back的尺寸---------------//   

	ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
    ddsd.dwHeight = 480;
    ddsd.dwWidth = 640;

	hRet = g_pDD->CreateSurface(&ddsd, &m_back, NULL);
    if (hRet != DD_OK)
        return MessageBox(GetActiveWindow(), "m_back FAILED","FAILED",MB_OK);

	//LOAD 一个调色板
	 g_pDDPal = DDLoadPalette(g_pDD, szBitmap);
    if (g_pDDPal) g_pDDSPrimary->SetPalette(g_pDDPal);

    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
    if (hRet != DD_OK)
        return MessageBox(GetActiveWindow(), "GetAttachedSurface FAILED","FAILED",MB_OK);
    
	//产生透明COLOR KEY
	DDSetColorKey(Map, RGB(0, 0, 0));
    DDSetColorKey(back, RGB(0, 0, 0));
    load=LoadBmp();

⌨️ 快捷键说明

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