刚刚接触游戏编程,有段代码请各位大神解惑
#include <windows.h>
#include <iostream>
#include <time.h>
using namespace std;
const string APPTITLE = "Game Loop";
HWND window;
HDC device;
bool gameover = false;
//从文件中下载并绘制一份位图,然后释放内存
void DrawBitmap(char* filename, int x, int y)
{
//下载位图
HBITMAP image = (HBITMAP)LoadImage(0, "c.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//获得位图属性
BITMAP bm;
GetObject(image, sizeof(BITMAP), &bm);
//为位图创建一个设备环境
HDC hdcImage = CreateCompatibleDC(device);
SelectObject(hdcImage, image);
//在窗口里面绘制位图(单元块转换)
BitBlt(
device,//目标设备环境
x, y,//目标位置的x和y坐标
bm.bmWidth, bm.bmHeight,//源位图的宽度和高度
hdcImage,//源位图设备环境
0, 0,//源位图的初始x和y
SRCCOPY);//位块传送方式
//删除设备环境和位图
DeleteDC(hdcImage);
DeleteObject((HBITMAP)image);
}
//开启代码
bool Game_Init()
{
//开启随机数字发生器
srand(time(NULL));
return 1;
}
//内部调用的更新函数
void Game_Run()
{
if(gameover == true) return;
//获得绘图背景
RECT rect;
GetClientRect(window, &rect);
//在随机位置绘制位图
int x = rand()%(rect.right - rect.left);
int y = rand()%(rect.bottom - rect.top);
DrawBitmap("c.bmp", x, y);
}
//关闭代码
void Game_End()
{
//释放设备
ReleaseDC(window, device);
}
//窗口回调函数
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
gameover = true;
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
//MyRegisterClass函数设置程序窗口属性
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//创建窗口类
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPTITLE.c_str();
wc.hIconSm = NULL;
//根据类信息设置窗口
return RegisterClassEx(&wc);
}
//用于创建和刷新窗口的辅助函数
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
//创建一个新的窗口
window = CreateWindow(
APPTITLE.c_str(),//窗口类
APPTITLE.c_str(),//标题栏
WS_OVERLAPPEDWINDOW,//窗口风格
CW_USEDEFAULT,//窗口的x坐标
CW_USEDEFAULT,//窗口的y坐标
640,//窗口的宽度
480,//窗口的高度
NULL,//父窗口
NULL,//菜单
hInstance, //应用实例
NULL);//窗口参数
//创建窗口是否出现错误?
if(window == 0) return 0;
//展示窗口
ShowWindow(window, nCmdShow);
UpdateWindow(window);
//为绘图获得设备环境
device = GetDC(window);
return 1;
}
//入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
//创建窗口
MyRegisterClass(hInstance);
if(!InitInstance(hInstance, nCmdShow)) return 0;
//初始化游戏
if(!Game_Init()) return 0;
// 主消息循环
while(!gameover)
{
//处理windows事件
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//处理游戏循环
Game_Run();
}
//释放游戏资源
Game_End();
return msg.wParam;
}
代码如上,这段代码的效果就是在窗口中不断的绘制“C”位图,相信有眼尖的人已经看出,这是《游戏编程入门》里面的一段代码,不错。但是如果想要达到另外一种效果:只能看到一个“C”位图在窗口中不断的随机移动,如何才能达到这样的效果呢?本人刚接触这方面,研究了半天没弄出这种效果来,跪求各位大牛指导。
[解决办法]
所有的东西都在Game_Run这段代码里面
//内部调用的更新函数void Game_Run(){if(gameover == true) return;//获得绘图背景RECT rect;GetClientRect(window, &rect);//在随机位置绘制位图int x = rand()%(rect.right - rect.left);int y = rand()%(rect.bottom - rect.top);DrawBitmap("c.bmp", x, y);}