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

📄 gmain.cpp

📁 vc写的源程序,是关于游戏类的程序。调用了系统的很多API
💻 CPP
字号:
#define STRUCT
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <Windowsx.h>
#include <ddraw.h>
#include <stdio.h>
#include "graphics.h"
#include "AstarFind.h"

HINSTANCE             app_hInst;
MSG                   Msg;                 // 消息类
HWND                  hWnd;                // 窗口句柄
WNDCLASS              Wndclass;            // 窗口类
LPDIRECTDRAW          lpDD = NULL;                // DirectDraw对象
LPDIRECTDRAWSURFACE   lpDDPrimary;         // 主显示页面
DDSURFACEDESC         PrimarySurfaceDesc;  // 主显示页面的属性
LPDIRECTDRAWCLIPPER   lpClipper;           // 剪裁对象

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	switch(Message)
	{
    case WM_ACTIVATEAPP:
		IsActive = wParam;
		active_directinput(IsActive);
		if (!IsActive)
			restore_surface();
		return TRUE;
    case WM_SETCURSOR:
		SetCursor(NULL);
		return TRUE;
	default:
		return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return DefWindowProc(hWnd, Message, wParam, lParam);	
}

// 初始化窗口及DirectDraw界面
BOOL initialize(HINSTANCE hInst, int nCmdShow)
{
	app_hInst = hInst;
	Wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	Wndclass.lpfnWndProc   = WndProc;
	Wndclass.cbClsExtra    = 0;
	Wndclass.cbWndExtra    = 0;
	Wndclass.hInstance     = hInst;
	Wndclass.hIcon         = LoadIcon(hInst, IDI_APPLICATION);
	Wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
	Wndclass.hbrBackground = NULL;
	Wndclass.lpszMenuName  = NULL;
	Wndclass.lpszClassName = "Game";
	// 注册窗口类
	RegisterClass(&Wndclass);

	hWnd = CreateWindowEx(
		0,
		"Game",
		"Game",
		WS_SYSMENU,
		0,
		0,
		GetSystemMetrics(SM_CXSCREEN),
		GetSystemMetrics(SM_CXSCREEN),
		NULL,
		NULL,
		hInst,
		NULL);
	// 显示和登记窗口
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	// 建立DirectDraw对象
	if (DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK)
		return FALSE;
	// 设置协作层
#ifndef WINDOW_MODE
	if (lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK)
		return FALSE;
	// 设置显示模式
	if (lpDD->SetDisplayMode(640, 480, 16) != DD_OK)
		return FALSE;
#else
	if (lpDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL) != DD_OK)
		return FALSE;
#endif
	// 建立主显示页面
	DDSURFACEDESC ddsd;
	ZeroMemory(&ddsd, sizeof(DDSURFACEDESC));
	ddsd.dwSize = sizeof(ddsd); 
    ddsd.dwFlags = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
	if (lpDD->CreateSurface(&ddsd, &lpDDPrimary, NULL) != DD_OK)
		return FALSE;
#ifdef WINDOW_MODE
	if (lpDD->CreateClipper(0, &lpClipper, NULL) != DD_OK)
		return FALSE;
	if (lpClipper->SetHWnd(0, hWnd) != DD_OK)
		return FALSE;
	if (lpDDPrimary->SetClipper(lpClipper) != DD_OK)
		return FALSE;
#endif
	// 测试像素格式是555还是565
	DDPIXELFORMAT DDPixelFormat;
	ZeroMemory(&DDPixelFormat, sizeof(DDPIXELFORMAT));
	DDPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
	if (lpDDPrimary->GetPixelFormat(&DDPixelFormat) != DD_OK)
		return FALSE;
#ifndef _SET_555
	if (DDPixelFormat.dwGBitMask == 2016) // 0000 0111 1110 0000
		Is555 = FALSE;
#endif
	ZeroMemory(&PrimarySurfaceDesc, sizeof(DDSURFACEDESC));
	PrimarySurfaceDesc.dwSize = sizeof(ddsd);
	PrimarySurfaceDesc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
	if (lpDDPrimary->GetSurfaceDesc(&PrimarySurfaceDesc) != DD_OK)
		return FALSE;

	init_set();

	// 把屏幕清为黑色
	lock_screen();
	clrscr_bitmap(directscreen, 0x0);
	unlock_screen();

	// 初始化DirectSound
	if (!init_directsound())
		return FALSE;
	return TRUE;
}

void free_resource()
{
	// 解锁屏幕
	if (ScreenIsLock)
		unlock_screen();
	free_ime(); // 释放输入法模块
	free_bitmap(&screen); // 释放屏幕位图
	free_bitmap(&temp_screen); // 释放临时位图
	free(directscreen); // 释放指向主缓冲区的指针位图
	// 释放汉字库
	if (hzk_16 != NULL)
		free(hzk_16);
	if (hzk_16 != NULL)
		free(hzk_24);
	if (asc_16 != NULL)
		free(asc_16);
	free_directsound(); // 释放声音对象
	free_directinput(); // 释放输入对象
	// 释放DirectDraw对象
	if (lpDDPrimary != NULL)
	{
		lpDDPrimary->Release();
		lpDDPrimary = NULL;
	}
	if (lpDD != NULL)
	{
		lpDD->Release();
		lpDD = NULL;
	}
	// 释放调试信息缓冲区
	free_debug_msg();
}

// 应用程序主函数
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdParam, int nCmdShow)
{
	initialize(hInst, nCmdShow);

	put_message(!game_init(), "错误,用户初始化失败。");
	// 初始化DirectInput
	if (!init_directinput())
		return FALSE;

	while(TRUE)
	{
		if (PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if (!GetMessage(&Msg, NULL, 0, 0 )) return Msg.wParam;
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}
		else
		{
			if (IsActive)
			{
				if (!game_loop())
				{
					game_exit();
					free_resource();
					PostQuitMessage(0);
				}
			}
		}
	}

	return Msg.wParam;
}

BOOL lock_screen()
{
	if (ScreenIsLock)
		return FALSE;
	if (lpDDPrimary->Lock(NULL, &PrimarySurfaceDesc, DDLOCK_WAIT, NULL) != DD_OK)
		put_message(TRUE, "错误,不能设置为直接写屏方式。");
	void *bitmap = PrimarySurfaceDesc.lpSurface;
	if (directscreen != NULL)
		free(directscreen);
	directscreen = create_ptr_bitmap(SCREEN_WIDTH, SCREEN_HEIGHT, (WORD *)bitmap);
	ScreenIsLock = TRUE;
	return TRUE;
}

void unlock_screen()
{
	if (!ScreenIsLock)
		return;
	lpDDPrimary->Unlock(&PrimarySurfaceDesc);
	free(directscreen);
	directscreen = NULL;
	ScreenIsLock = FALSE;
}

void restore_surface()
{
	lpDDPrimary->Restore();
}

void calc_fps()
{
	static int frame = 0, nt, ot = 0;
	frame++;
	nt = GetTickCount();
	if (nt > ot + 1000)
	{
		ot = nt;
		fps = frame;
		frame = 0;
	}
}

void *load_file(char *filename)
{
	FILE *fp;
	fp = fopen(filename, "rb");
	put_message(fp == NULL, "错误,打开文件%s失败", filename);
	fseek(fp, 0, SEEK_END);
	DWORD size = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	char *buffer = new char [size];
	fread(buffer, size, 1, fp);
	return buffer;
}

⌨️ 快捷键说明

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