GDI地图加载

1.地图加载:就是根据地图数组编号,把各种“瓷砖”贴到相应坐标下的过程。

在这里插入图片描述
                          在这里插入图片描述

在这里插入图片描述
                          在这里插入图片描述                                                             在这里插入图片描述
步骤:
1.定义常量和变量

//1.定义常量
const int rows=8,cols=8;//8行8列
//2.定义变量
HDC g_hdc=NULL; //全局设备环境句柄
HDC g_mdc=NULL;
HBITMAP fullmap;

2.在Game_Paint(HWND hwnd)函数中绘制

//绘制函数
VOID Game_Paint(HWND hwnd)
{    
    //1.先定义地图数组
    int mapIndex[rows*cols] = { 2,2,2,0,0,1,0,1,  //第1列
								0,2,2,0,0,0,1,1,  //第2列
								0,0,2,0,0,0,0,1,  //第3列
								2,0,0,0,0,0,2,2,  //第4列
								2,2,0,0,0,2,2,2,  //第5列
								2,0,0,0,2,2,0,0,  //第6列
								0,0,0,2,2,0,0,1,  //第7列
								0,0,2,0,0,0,1,1 }; //第8列
	//2.给规定的变量赋值
	g_hdc = GetDC(hwnd);
	g_mdc = CreateCompatibleDC(g_hdc);
	
	fullmap = CreateCompatibleBitmap(g_mdc,cols*50,rows*50);//建立一个兼容的bitmap

	SelectObject(g_mdc,fullmap);
	
	//3.建立三个地图图片的指针和加载地图
	HBITMAP map[3];
	wchar_t filename[20] = L"";//wsprintf对应的字符串是宽字符型wchar_t,即一个字符占用2个字节的内存空间.
//sprintf对应的字符串是字符类型为char,几一个字符占用1个字节的内存空间.
//sprintf是用于对ASCII码的127个字符进行操作,wsprintf是对UNICODE的多语言字符进行操作.
	int rowNum,colNum;
	int i,x,y;

	//加载表示小地图的位图
	for(i=0;i<3;i++)
	{
		wsprintf(filename,L"map%d.bmp",i);
		//sprintf(filename,"map%d.bmp",i);
/*在C语言中格式化字符串可以使用PRINTF,但是在WINDOWS编程设计中却行不通了,但是却有变通的方法,那就是用 WSPRINTF这个函数 它的格式如下:
wsprintf(缓冲区,格式,要格式化的值);
第一个参数是字符缓冲区,后面是格式字符串,wsprintf不是将格式化结果写到标准输出,而是将其写入缓冲区中,该函数返回该字符串的长度。*/

		map[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,50,50,LR_LOADFROMFILE);
	}

	//4.计算数组中对应的小地图位置
	for (i=0;i<rows*cols;i++)
	{
		SelectObject(g_mdc,map[mapIndex[i]]);

		rowNum = i / cols;   //求列编号
		colNum = i % cols;   //求行编号
		x = colNum * 50;     //求小地图的X坐标
		y = rowNum * 50;     //求小地图的Y坐标

		BitBlt(g_hdc,x,y,50,50,g_mdc,0,0,SRCCOPY);
	}
}							

代码:

#include <windows.h>
#pragma comment(lib, "Msimg32.lib")

#define WINDOW_WIDTH    400                            //为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT    400                            //为窗口高度定义的宏,以方便在此处修改窗口高度
#define WINDOW_TITLE    L"程序核心框架"        //为窗口标题定义的宏

//1.定义常量
const int rows=8,cols=8;//8行8列

HDC g_hdc=NULL; //全局设备环境句柄
//2.定义变量
HDC g_mdc=NULL;



LRESULT CALLBACK    WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );  //窗口过程函数
BOOL Game_Init(HWND hwnd); //在此函数中进行资源的初始化
VOID Game_Paint(HWND hwnd); //进行绘图代码的书写
BOOL Game_CleanUp(HWND hwnd); //资源的清理

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
    //【1】窗口创建四步曲之一:开始设计一个完整的窗口类
    WNDCLASSEX wndClass = { 0 };                            //用WINDCLASSEX定义了一个窗口类,{0}用来初始化结构体
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;            //设置结构体的字节数大小
    wndClass.style = CS_HREDRAW | CS_VREDRAW;    //设置窗口的样式
    wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
    wndClass.cbClsExtra  = 0;                                //窗口类的附加内存,取0就可以了
    wndClass.cbWndExtra  = 0;                            //窗口的附加内存,依然取0就行了
    wndClass.hInstance = hInstance;                        //指定包含窗口过程的程序的实例句柄。
    wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);  //本地加载自定义ico图标
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。
    wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄    
    wndClass.lpszMenuName = NULL;                        //用一个以空终止的字符串,指定菜单资源的名字。
    wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";        //用一个以空终止的字符串,指定窗口类的名字。

    //【2】窗口创建四步曲之二:注册窗口类
    if( !RegisterClassEx( &wndClass ) )                //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
        return -1;        

    //【3】窗口创建四步曲之三:正式创建窗口
    HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE,        //喜闻乐见的创建窗口函数CreateWindow
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
        WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );

    //【4】窗口创建四步曲之四:窗口的移动、显示与更新
    MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);        //调整窗口显示时的位置,使窗口左上角位于(250,80)处
    ShowWindow( hwnd, nShowCmd );    //调用ShowWindow函数来显示窗口,第二个参数用于指定窗口的显示状态
    UpdateWindow(hwnd);                        //对窗口进行更新,就像我们买了新房子要装修一样

    //游戏资源的初始化,若初始化失败,弹出一个消息框,并返回FALSE
    if(!(Game_Init(hwnd)))
    {
        MessageBox(hwnd,L"资源初始化失败",L"消息窗口",0);
        return FALSE;
    }

    //【5】消息循环过程
    MSG msg = { 0 };        //定义并初始化msg
    while( msg.message != WM_QUIT )            //使用while循环,如果消息不是WM_QUIT消息,就继续循环
    {
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
        {
            TranslateMessage( &msg );        //将虚拟键消息转换为字符消息
            DispatchMessage( &msg );            //分发一个消息给窗口程序。
        }
    }

    //【6】窗口类的注销
    UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);  //程序准备结束,注销窗口类
    return 0;  
}
//    描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
{
    PAINTSTRUCT paintStruct;    //定义一个PAINTSTRUCT结构体来记录一些绘制信息

    switch( message )                        //switch语句开始
    {
    case WM_PAINT:                        // 若是客户区重绘消息
        g_hdc=BeginPaint(hwnd,&paintStruct);    //指定窗口进行绘图工作的准备,并将和绘图有关的信息填充到paintstruct结构体中
        Game_Paint(hwnd);
        EndPaint(hwnd,&paintStruct);    //EndPaint函数标记指定窗口的绘画过程结束
        ValidateRect(hwnd, NULL);        // 更新客户区的显示
        break;                                    //跳出该switch语句

    case WM_KEYDOWN:                // 若是键盘按下消息
        if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
            DestroyWindow(hwnd);        // 销毁窗口, 并发送一条WM_DESTROY消息
        break;                                    //跳出该switch语句

    case WM_DESTROY:                //若是窗口销毁消息
        PostQuitMessage( 0 );        //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
        break;                                //跳出该switch语句

    default:                                    //若上述case条件都不符合,则执行该default语句
        return DefWindowProc( hwnd, message, wParam, lParam );        //调用缺省的窗口过程
    }

    return 0;            //正常退出
}

//初始化函数,进行一些简单的初始化
BOOL Game_Init(HWND hwnd)
{
    g_hdc=GetDC(hwnd);
    Game_Paint(hwnd);
    ReleaseDC(hwnd,g_hdc); //一个窗口句柄,一个设备上下文环境句柄,注意区别
    return TRUE;
}

//绘制函数
VOID Game_Paint(HWND hwnd)
{
//3.绘制地图
    int mapIndex[rows*cols] = { 2,2,2,0,0,1,0,1,  //第1列
								0,2,2,0,0,0,1,1,  //第2列
								0,0,2,0,0,0,0,1,  //第3列
								2,0,0,0,0,0,2,2,  //第4列
								2,2,0,0,0,2,2,2,  //第5列
								2,0,0,0,2,2,0,0,  //第6列
								0,0,0,2,2,0,0,1,  //第7列
								0,0,2,0,0,0,1,1 }; //第8列
	g_hdc = GetDC(hwnd);
	g_mdc = CreateCompatibleDC(g_hdc);
	
	fullmap = CreateCompatibleBitmap(g_mdc,cols*50,rows*50);//建立一个兼容的bitmap

	SelectObject(g_mdc,fullmap);

	HBITMAP map[3];
	wchar_t filename[20] = L"";//wsprintf对应的字符串是宽字符型wchar_t,即一个字符占用2个字节的内存空间.
//sprintf对应的字符串是字符类型为char,几一个字符占用1个字节的内存空间.
//sprintf是用于对ASCII码的127个字符进行操作,wsprintf是对UNICODE的多语言字符进行操作.
	int rowNum,colNum;
	int i,x,y;

	//加载表示小地图的位图
	for(i=0;i<3;i++)
	{
		wsprintf(filename,L"map%d.bmp",i);
		//sprintf(filename,"map%d.bmp",i);
/*在C语言中格式化字符串可以使用PRINTF,但是在WINDOWS编程设计中却行不通了,但是却有变通的方法,那就是用 WSPRINTF这个函数 它的格式如下:
wsprintf(缓冲区,格式,要格式化的值);
第一个参数是字符缓冲区,后面是格式字符串,wsprintf不是将格式化结果写到标准输出,而是将其写入缓冲区中,该函数返回该字符串的长度。*/

		map[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,50,50,LR_LOADFROMFILE);
	}

	//计算数组中对应的小地图位置
	for (i=0;i<rows*cols;i++)
	{
		SelectObject(g_mdc,map[mapIndex[i]]);

		rowNum = i / cols;   //求列编号
		colNum = i % cols;   //求行编号
		x = colNum * 50;     //求小地图的X坐标
		y = rowNum * 50;     //求小地图的Y坐标

		BitBlt(g_hdc,x,y,50,50,g_mdc,0,0,SRCCOPY);
	}
}

//清理资源
BOOL Game_CleanUp(HWND hwnd)
{
    return TRUE;
}



2.斜角拼接地图

思路:
在这里插入图片描述

                          ;     ;    在这里插入图片描述

在这里插入图片描述

                                      在这里插入图片描述                                                             

效果:
在这里插入图片描述
注意点:
在这里插入图片描述
在这里插入图片描述

代码:

#include <windows.h>
#pragma comment(lib, "Msimg32.lib")
//1.添加头文件
#include <math.h>
#include <stdio.h>

#define WINDOW_WIDTH    800                            //为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT    600                            //为窗口高度定义的宏,以方便在此处修改窗口高度
#define WINDOW_TITLE    L"程序核心框架"        //为窗口标题定义的宏

//2.定义常量
const int rows=10,cols=10;//10行10列

HDC g_hdc=NULL; //全局设备环境句柄
//3.定义变量
HDC g_mdc=NULL;
HDC bufdc=NULL;
HBITMAP fullmap;


LRESULT CALLBACK    WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );  //窗口过程函数
BOOL Game_Init(HWND hwnd); //在此函数中进行资源的初始化
VOID Game_Paint(HWND hwnd); //进行绘图代码的书写
BOOL Game_CleanUp(HWND hwnd); //资源的清理

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
    //【1】窗口创建四步曲之一:开始设计一个完整的窗口类
    WNDCLASSEX wndClass = { 0 };                            //用WINDCLASSEX定义了一个窗口类,{0}用来初始化结构体
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;            //设置结构体的字节数大小
    wndClass.style = CS_HREDRAW | CS_VREDRAW;    //设置窗口的样式
    wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
    wndClass.cbClsExtra  = 0;                                //窗口类的附加内存,取0就可以了
    wndClass.cbWndExtra  = 0;                            //窗口的附加内存,依然取0就行了
    wndClass.hInstance = hInstance;                        //指定包含窗口过程的程序的实例句柄。
    wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);  //本地加载自定义ico图标
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。
    wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄    
    wndClass.lpszMenuName = NULL;                        //用一个以空终止的字符串,指定菜单资源的名字。
    wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";        //用一个以空终止的字符串,指定窗口类的名字。

    //【2】窗口创建四步曲之二:注册窗口类
    if( !RegisterClassEx( &wndClass ) )                //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
        return -1;        

    //【3】窗口创建四步曲之三:正式创建窗口
    HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE,        //喜闻乐见的创建窗口函数CreateWindow
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
        WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );

    //【4】窗口创建四步曲之四:窗口的移动、显示与更新
    MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);        //调整窗口显示时的位置,使窗口左上角位于(250,80)处
    ShowWindow( hwnd, nShowCmd );    //调用ShowWindow函数来显示窗口,第二个参数用于指定窗口的显示状态
    UpdateWindow(hwnd);                        //对窗口进行更新,就像我们买了新房子要装修一样

    //游戏资源的初始化,若初始化失败,弹出一个消息框,并返回FALSE
    if(!(Game_Init(hwnd)))
    {
        MessageBox(hwnd,L"资源初始化失败",L"消息窗口",0);
        return FALSE;
    }

    //【5】消息循环过程
    MSG msg = { 0 };        //定义并初始化msg
    while( msg.message != WM_QUIT )            //使用while循环,如果消息不是WM_QUIT消息,就继续循环
    {
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
        {
            TranslateMessage( &msg );        //将虚拟键消息转换为字符消息
            DispatchMessage( &msg );            //分发一个消息给窗口程序。
        }
    }

    //【6】窗口类的注销
    UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);  //程序准备结束,注销窗口类
    return 0;  
}
//    描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
{
    PAINTSTRUCT paintStruct;    //定义一个PAINTSTRUCT结构体来记录一些绘制信息

    switch( message )                        //switch语句开始
    {
    case WM_PAINT:                        // 若是客户区重绘消息
        g_hdc=BeginPaint(hwnd,&paintStruct);    //指定窗口进行绘图工作的准备,并将和绘图有关的信息填充到paintstruct结构体中
        Game_Paint(hwnd);
        EndPaint(hwnd,&paintStruct);    //EndPaint函数标记指定窗口的绘画过程结束
        ValidateRect(hwnd, NULL);        // 更新客户区的显示
        break;                                    //跳出该switch语句

    case WM_KEYDOWN:                // 若是键盘按下消息
        if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
            DestroyWindow(hwnd);        // 销毁窗口, 并发送一条WM_DESTROY消息
        break;                                    //跳出该switch语句

    case WM_DESTROY:                //若是窗口销毁消息
        PostQuitMessage( 0 );        //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
        break;                                //跳出该switch语句

    default:                                    //若上述case条件都不符合,则执行该default语句
        return DefWindowProc( hwnd, message, wParam, lParam );        //调用缺省的窗口过程
    }

    return 0;            //正常退出
}

//初始化函数,进行一些简单的初始化
BOOL Game_Init(HWND hwnd)
{
//4.绘制地图
    int mapIndex[rows*cols] = { 2,2,2,2,2,0,1,1,1,0,  //列1
								2,2,2,2,0,0,0,1,1,0,  //列2
								2,0,0,0,0,0,0,0,1,2,  //列3
								2,2,0,0,0,0,0,2,2,2,  //列4
								2,2,0,0,0,0,2,2,2,2,  //列5
								2,2,0,0,0,2,2,0,0,2,  //列6
								2,0,0,2,2,2,0,0,1,0,  //列7
								0,0,2,0,0,3,1,1,1,1,  //列8
								0,2,0,3,3,3,3,3,3,1,  //列9
								2,0,3,3,0,0,0,3,3,3 };//列10
	g_hdc = GetDC(hwnd);
	g_mdc = CreateCompatibleDC(g_hdc);
	bufdc = CreateCompatibleDC(g_hdc);
	
	HBITMAP map[4];
	wchar_t filename[20] = L"";
	int rowNum,colNum;
	int i,x,y;
	int xstart,ystart;
	
	xstart = 32 * (rows-1);
	ystart = 0;
	//加载背景图的位图
	fullmap = (HBITMAP)LoadImage(NULL,L"bg24.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); 
	SelectObject(g_mdc,fullmap);
	BitBlt(g_hdc,0,0,640,480,g_mdc,0,0,SRCCOPY);
	
	//加载表示小地图的位图
	for(i=0;i<4;i++)
	{
		wsprintf(filename,L"map%d.bmp",i);
		map[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,128,32,LR_LOADFROMFILE);
	}

	
	for (i=0;i<rows*cols;i++)
	{
		SelectObject(g_mdc,map[mapIndex[i]]);

		rowNum = i / cols;
		colNum = i % cols;
		x = xstart + colNum * 32 + rowNum * (-32);
		y = ystart + rowNum * 16 + colNum * 16;
		
		BitBlt(g_hdc,x,y,64,32,g_mdc,64,0,SRCAND);
		BitBlt(g_hdc,x,y,64,32,g_mdc,0,0,SRCPAINT);
	}


  
    
	//ReleaseDC(hwnd,g_hdc); //一个窗口句柄,一个设备上下文环境句柄,注意区别
	Game_CleanUp(hwnd);
    return TRUE;
}

//绘制函数
VOID Game_Paint(HWND hwnd)
{

}

//清理资源
BOOL Game_CleanUp(HWND hwnd)
{
//5.清理资源
    ReleaseDC(hwnd,g_hdc);
	DeleteDC(bufdc);
	return TRUE;
}


3.景物贴图

思路:
在原有地图基础上添加景物贴图数组

在这里插入图片描述
                          ;     ;    在这里插入图片描述

                          ; 在这里插入图片描述

                          ;     ;    在这里插入图片描述

在这里插入图片描述

                                      在这里插入图片描述

在这里插入图片描述
注意点:
景物贴图只对数组中值是1和2的,加载景物图。0不做任何操作。

//4.景物进行贴图
		switch(sceneIndex[i])
		{
			case 1:
				SelectObject(g_mdc,scene[0]);
				BitBlt(g_hdc,x+7,y-44,50,60,g_mdc,50,0,SRCAND);
				BitBlt(g_hdc,x+7,y-44,50,60,g_mdc,0,0,SRCPAINT);
				break;
			case 2:
				SelectObject(g_mdc,scene[1]);
				BitBlt(g_hdc,x+7,y-30,50,60,g_mdc,50,0,SRCAND);
				BitBlt(g_hdc,x+7,y-30,50,60,g_mdc,0,0,SRCPAINT);
				break;
		}
	}

源代码:

#include <windows.h>
#pragma comment(lib, "Msimg32.lib")
//1.添加头文件
#include <math.h>
#include <stdio.h>

#define WINDOW_WIDTH    800                            //为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT    600                            //为窗口高度定义的宏,以方便在此处修改窗口高度
#define WINDOW_TITLE    L"程序核心框架"        //为窗口标题定义的宏

//2.定义常量
const int rows=10,cols=10;//10行10列

HDC g_hdc=NULL; //全局设备环境句柄
//2.定义变量
HDC g_mdc=NULL;
HDC bufdc=NULL;
HBITMAP fullmap;


LRESULT CALLBACK    WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );  //窗口过程函数
BOOL Game_Init(HWND hwnd); //在此函数中进行资源的初始化
VOID Game_Paint(HWND hwnd); //进行绘图代码的书写
BOOL Game_CleanUp(HWND hwnd); //资源的清理

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
    //【1】窗口创建四步曲之一:开始设计一个完整的窗口类
    WNDCLASSEX wndClass = { 0 };                            //用WINDCLASSEX定义了一个窗口类,{0}用来初始化结构体
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;            //设置结构体的字节数大小
    wndClass.style = CS_HREDRAW | CS_VREDRAW;    //设置窗口的样式
    wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
    wndClass.cbClsExtra  = 0;                                //窗口类的附加内存,取0就可以了
    wndClass.cbWndExtra  = 0;                            //窗口的附加内存,依然取0就行了
    wndClass.hInstance = hInstance;                        //指定包含窗口过程的程序的实例句柄。
    wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);  //本地加载自定义ico图标
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。
    wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄    
    wndClass.lpszMenuName = NULL;                        //用一个以空终止的字符串,指定菜单资源的名字。
    wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";        //用一个以空终止的字符串,指定窗口类的名字。

    //【2】窗口创建四步曲之二:注册窗口类
    if( !RegisterClassEx( &wndClass ) )                //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
        return -1;        

    //【3】窗口创建四步曲之三:正式创建窗口
    HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE,        //喜闻乐见的创建窗口函数CreateWindow
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
        WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );

    //【4】窗口创建四步曲之四:窗口的移动、显示与更新
    MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);        //调整窗口显示时的位置,使窗口左上角位于(250,80)处
    ShowWindow( hwnd, nShowCmd );    //调用ShowWindow函数来显示窗口,第二个参数用于指定窗口的显示状态
    UpdateWindow(hwnd);                        //对窗口进行更新,就像我们买了新房子要装修一样

    //游戏资源的初始化,若初始化失败,弹出一个消息框,并返回FALSE
    if(!(Game_Init(hwnd)))
    {
        MessageBox(hwnd,L"资源初始化失败",L"消息窗口",0);
        return FALSE;
    }

    //【5】消息循环过程
    MSG msg = { 0 };        //定义并初始化msg
    while( msg.message != WM_QUIT )            //使用while循环,如果消息不是WM_QUIT消息,就继续循环
    {
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
        {
            TranslateMessage( &msg );        //将虚拟键消息转换为字符消息
            DispatchMessage( &msg );            //分发一个消息给窗口程序。
        }
    }

    //【6】窗口类的注销
    UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);  //程序准备结束,注销窗口类
    return 0;  
}
//    描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
{
    PAINTSTRUCT paintStruct;    //定义一个PAINTSTRUCT结构体来记录一些绘制信息

    switch( message )                        //switch语句开始
    {
    case WM_PAINT:                        // 若是客户区重绘消息
        g_hdc=BeginPaint(hwnd,&paintStruct);    //指定窗口进行绘图工作的准备,并将和绘图有关的信息填充到paintstruct结构体中
        Game_Paint(hwnd);
        EndPaint(hwnd,&paintStruct);    //EndPaint函数标记指定窗口的绘画过程结束
        ValidateRect(hwnd, NULL);        // 更新客户区的显示
        break;                                    //跳出该switch语句

    case WM_KEYDOWN:                // 若是键盘按下消息
        if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
            DestroyWindow(hwnd);        // 销毁窗口, 并发送一条WM_DESTROY消息
        break;                                    //跳出该switch语句

    case WM_DESTROY:                //若是窗口销毁消息
        PostQuitMessage( 0 );        //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
        break;                                //跳出该switch语句

    default:                                    //若上述case条件都不符合,则执行该default语句
        return DefWindowProc( hwnd, message, wParam, lParam );        //调用缺省的窗口过程
    }

    return 0;            //正常退出
}

//初始化函数,进行一些简单的初始化
BOOL Game_Init(HWND hwnd)
{
    


	//3.绘制地图
    int mapIndex[rows*cols] = { 2,2,2,2,2,0,1,1,1,0,  //列1
								2,2,2,2,0,0,0,1,1,0,  //列2
								2,0,0,0,0,0,0,0,1,2,  //列3
								2,2,0,0,0,0,0,2,2,2,  //列4
								2,2,0,0,0,0,2,2,2,2,  //列5
								2,2,0,0,0,2,2,0,0,2,  //列6
								2,0,0,2,2,2,0,0,1,0,  //列7
								0,0,2,0,0,3,1,1,1,1,  //列8
								0,2,0,3,3,3,3,3,3,1,  //列9
								2,0,3,3,0,0,0,3,3,3 };//列10
//1.景物贴图数组
		int sceneIndex[rows*cols] = { 0,2,2,0,2,0,1,0,1,1,  //材1
								  0,0,0,0,0,0,0,1,1,0,  //材2
								  0,0,0,0,0,0,1,0,1,0,  //材3
								  0,0,1,0,1,0,0,0,2,0,  //材4
								  2,2,0,0,1,0,0,0,0,2,  //材5
								  0,0,0,0,0,0,0,0,0,0,  //材6
								  0,0,1,0,0,0,0,0,1,0,  //材7
								  0,0,0,0,0,0,1,1,1,1,  //材8
								  1,0,0,0,0,0,0,0,0,1,  //材9
								  2,0,0,0,0,0,0,0,0,0 };//材10
	g_hdc = GetDC(hwnd);
	g_mdc = CreateCompatibleDC(g_hdc);
	//bufdc = CreateCompatibleDC(g_hdc);

//2.增加定义一个图像数组
    HBITMAP map[4],scene[2];
	wchar_t filename[20] = L"";
	int rowNum,colNum;
	int i,x,y;
	int xstart,ystart;
	
	xstart = 32 * (rows-1);
	ystart = 0;
	//加载背景图的位图
	fullmap = (HBITMAP)LoadImage(NULL,L"bg24.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); 
	SelectObject(g_mdc,fullmap);
	BitBlt(g_hdc,0,0,640,480,g_mdc,0,0,SRCCOPY);
	
	//加载表示小地图的位图
	for(i=0;i<4;i++)
	{
		wsprintf(filename,L"map%d.bmp",i);
		map[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,128,32,LR_LOADFROMFILE);
	}

//3.加载景物贴图的位图
	for(i=0;i<2;i++)
	{
		wsprintf(filename,L"scene%d.bmp",i+1);
		scene[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,100,60,LR_LOADFROMFILE);
	}

	
	for (i=0;i<rows*cols;i++)
	{
		SelectObject(g_mdc,map[mapIndex[i]]);

		rowNum = i / cols;
		colNum = i % cols;
		x = xstart + colNum * 32 + rowNum * (-32);
		y = ystart + rowNum * 16 + colNum * 16;
		
		BitBlt(g_hdc,x,y,64,32,g_mdc,64,0,SRCAND);
		BitBlt(g_hdc,x,y,64,32,g_mdc,0,0,SRCPAINT);

//4.景物进行贴图
		switch(sceneIndex[i])
		{
			case 1:
				SelectObject(g_mdc,scene[0]);
				BitBlt(g_hdc,x+7,y-44,50,60,g_mdc,50,0,SRCAND);
				BitBlt(g_hdc,x+7,y-44,50,60,g_mdc,0,0,SRCPAINT);
				break;
			case 2:
				SelectObject(g_mdc,scene[1]);
				BitBlt(g_hdc,x+7,y-30,50,60,g_mdc,50,0,SRCAND);
				BitBlt(g_hdc,x+7,y-30,50,60,g_mdc,0,0,SRCPAINT);
				break;
		}
	}


  
    
	//ReleaseDC(hwnd,g_hdc); //一个窗口句柄,一个设备上下文环境句柄,注意区别
	Game_CleanUp(hwnd);
    return TRUE;
}

//绘制函数
VOID Game_Paint(HWND hwnd)
{

}

//清理资源
BOOL Game_CleanUp(HWND hwnd)
{
    ReleaseDC(hwnd,g_hdc);
	DeleteDC(bufdc);
	return TRUE;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
360全景漫游软件(krpano-GDI),基于KRpano引擎!由720全景网开发,软件具备上手快,引擎最新,目前测试兼容所有智能手机设备、而且速度最快、功能最为强大、是制作360全景必备的工具! 同行业软件对比:市场大部分软件为了节省开发成本都是基于1.169的KRpano引擎,而最新版本是1.19!1.16有很多移动端设备不支持,比如一些IOS 设备!这款360全景漫游软件紧跟KRpano更新的速度,已经更新到1.19的引擎!!! 360全景漫游软件(krpano-GDI)功能介绍 1.支持打包手机APP 2. 场景插件添加 3. 背景音乐、项目自转 4. 打包输出一个swf,打包项目 5. 热点鼠标事件添加,场景事件添加,插件鼠标事件添加 6. Ios.js支持所有智能手机设备观看 7. 场景漫游,无限场景 8. 皮肤插件,可编辑皮肤 9. 公共插件,可视化添加外观皮肤文件 10. 场景分类,可用于给每个场景添加不同的地图雷达 11. 地图雷达添加 12. 平面图标注添加 13. 场景初始值设置 14. 基本设置,修补场景,设置名称 15. 智能主持人,可以添加场景解说 16. 360物体展示,包括控制相机拍摄,批量添加水印等 17. 基本设置,设置过渡条,鼠标样式 18. 热区添加,修改热区颜色,边框颜色,鼠标经过,点击时颜色修改 19. 视频添加,支持各种视频的添加 20. 支持合成、分割、全景图像 21. 控制项目转动速度,移动帧频 22. 添加光晕,鼠标拖动添加,修改曝光度不足 23. 缩略图修改,缩略图设置 24. 场景事件,包括鼠标点击,鼠标经过,鼠标停留,鼠标离开,加载完,鼠标事件等 25. 鱼眼视角修改,最大视角修改,向北角度值修改! 360全景漫游软件(krpano-GDI)软件截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szmtjs10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值