消灭星星游戏程序设计【连载一】——游戏窗口的创建
游戏整体效果展示:
今天开始我们要用VC编写一个消灭星星的小游戏。这里我们要说一下这个小游戏,消灭星星,大家此前肯定都玩过手机版的,这个游戏当年非常的火,大街小巷都在玩。消灭星星版是一款经典好玩的消除游戏,游戏画面丰富有趣,游戏玩法精彩多样,玩家在游戏中可以选择各种各样的游戏道具来加快通关速度,达到通关成就,百变丰富的游戏关卡,好听的背景音效,炫酷的消除画面带给玩家极致的消除游戏体验。
1、本次要编写游戏的画面效果
前一段时间呢,我用VC做了一个消灭星星的小游戏。最近正好有时间,就准备发一个关于消灭星星的游戏设计思路,帮着大家梳理一下怎样用C++去开发一个小的游戏,能够根据自己的想法去把有些游戏的内容实现出来,特别是帮助一些游戏编程感兴趣的朋友,更快的上手C++编写游戏。
这是游戏的效果:
这里呢,我将从简单简单的窗体设计开始,到后期的游戏实现一步步的带着大家去了解游戏开发中的乐趣,期间我会尽量用一些直白的语言去详细说明游戏开发的要点和注意的事项,以及需要实现的功能,也会示例部分核心的代码,上传一些必要的图文。因为在我的学习过程中,我有这个体会,就是经常看到帖子上有图片,有代码这样的帖子就会给自己学习带来很大方便,便于理解,而且不再那么枯燥乏味。
2、编程工具的选用
由于这是个小游戏,并不需要耗费太多资源,我们选用VC6.0进行编译。这款编程工具是最早的VC编辑器,Microsoft Visual C++是Microsoft公司推出的以C++语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统。当然大家可以根据自己的情况采用Visual Studio的最新版本比如Visual Studio 2022都可以,实现的内容都一样,我们这里选用VC6.0仅仅是为了让编程的门槛变低一些。
3、编程工具的说明
这里我们并没有使用VC自带的Mfc程序,主要原因在于:Mfc程序虽然给我们带来了极大的便捷,实现了很多简单上手的功能,但是它给我们把所有的功能实现像添加了一个黑匣子一样,我们只能看到它实现的最终功能,但是并不容易直观的了解到它是怎样去实现这些功能的,也就无法更好的去按照我们的思想,我们的想法去修改游戏设计的内容。这就好比去购买了一个生产零件的机器,我们把材料准备好,放入机器后就直接生产出我们需要的产品,单是如果我们想改变一些最终产品的制造参数,我们就得去花费更多的时间找生产机器的厂家,这样并不利于我们按照我们的思想去修改、设计游戏的内容。
4、游戏窗口的建立
那我们想制作这个游戏,首先必须得创建一个WINDOWS的窗口,首先,为了便于大家学习,我们用VC创建一个最简单的窗口。就好比在学各种编程语言的时候都会创建一个基本的hello world示例程序一样,这样可以给我们的编程从感觉上带来简单容易上手的良好效果。
5、创建窗口的代码
我们先建立一个PopStar.cpp的源文件,将一下程序保存到文件,在用VC编译运行后就能产生一个简单的程序窗口。
//加载系统头文件
#include "Windows.h"
#include "Stdio.h"
#include "Imm.h"
#include "Math.h"
#include "Time.h"
#include "Winuser.h"
#include "FStream.h"
#include "IOStream.h"
#include "MMSystem.h"
//加载静态链接库
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"imm32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"msimg32.lib")
//全局句柄
HWND hWnd=NULL;
HINSTANCE hInstance=NULL;
//消息处理模块
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
switch (message)
{
case WM_CREATE:
return 0;
case WM_PAINT:
PAINTSTRUCT PS;
hDC=BeginPaint(hWnd,&PS);
ReleaseDC(hWnd,hDC);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
//主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
MSG message;
HWND hWnd;
CHAR szAppName[]="PopStar";
//设置程序的样式
WNDCLASS WC;
WC.style = CS_HREDRAW|CS_VREDRAW;
WC.lpfnWndProc = WndProc;
WC.cbClsExtra = 0;
WC.cbWndExtra = 0;
WC.hInstance = hInstance;
WC.hIcon = LoadIcon(hInstance,IDI_APPLICATION);
WC.hCursor = LoadCursor(hInstance,IDC_ARROW);
WC.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
WC.lpszMenuName = NULL;
WC.lpszClassName = szAppName;
if(!RegisterClass(&WC)){return 0;}
//创建窗口
hWnd=CreateWindow(szAppName,szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
330+GetSystemMetrics(SM_CXFRAME)*2,
500+GetSystemMetrics(SM_CYFRAME)*2+GetSystemMetrics(SM_CYCAPTION),
NULL,NULL,hInstance,NULL);
//赋值全局变量
::hWnd=hWnd;
::hInstance=hInstance;
//显示更新窗口
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
//消息循环
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
这样我们今天就通过一个简单的实例,创造出了我们游戏的框架窗口,有了这个窗口,我们就开启了游戏编程的第一步。虽然目前还是一个黑屏幕的窗口,但我们后续可以逐步添加图像、声音、游戏操作等功能,可以逐步按照我们的想法去设计、修改游戏内容,我会带着大家一步一步从简单流程开始,逐步完成小游戏设计。本次代码文件见附件。
6、需要注意的事项
但我们要注意,首次运行可能会出错,是我们经常遇到的问题,错误提示如下:
解决方法也比较简单,按照下面的提示进行修改:
修改完毕后,就能正常运行了。