首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

刚接触游戏编程,有段代码请各位大神解惑

2013-01-11 
刚刚接触游戏编程,有段代码请各位大神解惑#include windows.h#include iostream#include time.husin

刚刚接触游戏编程,有段代码请各位大神解惑
#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);
}


你想要移动就需要修改 x和y不要让他做随机 而是记录下他上帧位置,
然后根据上一帧位置计算出当前帧的位置

如何计算,比如上一帧在 (30,0) 要想沿着Y轴移动 那么这次的位置就是 x=30 , y=40 就可以了

热点排行