`
mmoseeker
  • 浏览: 440 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

游戏的基石: 窗口 的建立

阅读更多
游戏的基石: 窗口 的建立



  Welcome back!很高兴再次与你相遇教程。废话不多说,继续。



  上次的代码片段,说实在,拿在手里没有用。为啥?因为不能运行的啊:)我们这次就按照上次的安排,讲如何将显示图片的代码片段整合到程序中,让它能够具体的体现出来。



  我将在这儿讨论 Windows 编程,而不是 MFC 。关于 MFC 和 Windows 的不同和各自的优点,我们不多涉及了。 MFC 就是微软的一个封装开发库,极大程度的降低了 Windows 开发的复杂。但是,我们还是继续 Windows 编程,呵呵。



  我们来看,一个基本的 Windows 程序是一个窗口对吧:)我们所玩的游戏,其实也是有窗口的,只不过是看不见的,而且被 DirectDraw 掩盖了而已。那么,如何创建一个窗口呢?我们来看:



BOOL Init(HINSTANCE hInst, int nCmdShow)

{

    HWND hWnd;                           // 窗口的句柄,就是一个储存窗口的对象

    WNDCLASS WndClass;                   // 用于注册窗口的对象



    WndClass.style = CS_HREDRAW | CS_VREDRAW; // 定义窗口的类型

    WndClass.lpfnWndProc = WinProc;      // 指定了窗口消息的处理函数 ** 关键!

    WndClass.cbClsExtra = 0;             // 没有特定意义

    WndClass.cbWndExtra = 0;             // 没有特定意义

    WndClass.hInstance = hInst;          // 窗口的实例

    WndClass.hIcon = LoadIcon(hInst, IDI_APPLICATION); // 指定窗口的图标

    WndClass.hCursor = LoadCursor(hInst, IDC_ARROW);   // 指定程序的指针

    WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 指定背景色为黑色

    WndClass.lpszMenuName = NULL;        // 指定菜单为无,游戏不需要

    WndClass.lpszClassName = "GDIM_GAME_ENGINE"; //这个程序注册的名字

    RegisterClass(&WndClass);            // 注册程序



    hWnd = CreateWindowEx(WS_EX_TOPMOST, "GDIM_GAME_ENGINE", "GDIM_GAME", WS_POPUP, 112, 84, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInst, NULL);

    // 这段代码就是实现了一个窗口的创建

    // 我们可以通过来检测是否创建成功。如果失败将返回一个 FALSE 的值。

    if(!hWnd) return FALSE;

    ShowWindow(hWnd, nCmdShow);  // 显示窗口

    UpdateWindow(hWnd);          // 更新窗口

}



  好了,到这儿呢,我们就成功的创建了一个窗口。我们回头看我注了“**”的地方,关于这个函数,我们得写个同名函数来处理 Windows 的消息。呵呵,不好意思,再看一个函数:



BOOL bActive = FALSE;        // 用于判断程序是否运行的变量



long PASCAL WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch(message)

    {

    case WM_ACTIVATE:

        bActive = TRUE;      // 当程序被激活时,赋值 TRUE

        break;

    case WM_SETCURSOR:

        SetCursor(NULL);     // 设定鼠标为不显示

        return TRUE;

    case WM_KEYDOWN:

        switch(wParam)

        {

        case VK_ESCAPE:      // 处理按下 ESC 键的反应

            PostMessage(hWnd, WM_CLOSE, 0, 0);   // 发送一个关闭窗口的命令

            break;

        }

        break;

    case WM_DESTROY:         // 在窗口即将销毁时的反应

        PostQuitMessage(0);  // 发送一个结束的消息,必须的!

        break;

    }

    return DefWindowProc(hWnd, message, wParam, lParam);  // 一些没有像上面一样具体定义的消息的处理

}



  这个函数就是用来处理 Windows 的消息的,是一个标准程序必要的。



  再来最后一个重要的函数。不好意思哦,实在是不想这么写,但是想想,在这个函数结束后,你就可以实现一个具体的窗口了哦:)



int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)

{

    MSG msg; // 定义一个消息的对象



    if(!Init(hInst, nCmdShow)) return FALSE;           // 还记得上面的那个函数吗?



    while(1) // 程序的循环

    {

        if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) // 不要特别注意的

        {

            if(!GetMessage(&msg, NULL, 0, 0 ))

            return msg.wParam;

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

        else if(bActive)     // 就是上面的“程序是否激活”的变量判断

        {

            ShowThePic();    // 显示人物图片的函数,上节的内容,就是整合在这儿的!

        }

        else WaitMessage();  // 没有消息时,就等消息:)

    }

}



  其实到这儿,一个简单的程序已经可以出炉了:)编译,运行,你将看到一个黑色的窗口。这个窗口不同于一般的窗口,它没有平常的标题栏,这个才是适合我们游戏的。我在这儿给出完整的代码,但是,无法将上节的内容以程序的形式表现出来,因为涉及到了 DirectDraw 。我不想过多在教程中涉及未讲的知识,因为那样会影响对现有知识的理解。



  下章教程,我将开始介绍 DirectDraw 了,以便能尽快将显示的内容整合,同时我会保持教程和代码的详尽。
分享到:
评论

相关推荐

    游戏入门基础 《游戏编程》 基础篇

    目录:  零、基础篇的目的  一、游戏的动画原理  二、基于动画原理的提高  三、游戏的基石: 窗口 的建立  四、游戏制作利器: 引擎 的选择

    Python游戏编程入门前四章 源代码

    这些游戏涉及到的游戏逻辑、碰撞检测和游戏循环等概念,将帮助初学者逐步建立起游戏开发的思维模式。 遗憾的是,资料仅提供了前四章的源代码,无法获取后续章节的原代码,这意味着我们无法深入到更复杂的主题,如...

    Java实现的小游戏

    比如,可以创建一个游戏窗口,用组件展示游戏状态,处理用户输入事件。 4. **事件处理**:在游戏编程中,事件处理是非常关键的部分,它负责监听用户的键盘、鼠标输入,并根据这些输入执行相应的游戏逻辑。 5. **...

    网络游戏-网络头插拔检测机.zip

    《网络游戏中的网络头插拔检测技术详解》 网络游戏在当今社会已经...总结,网络头插拔检测技术是网络游戏稳定运行的基石,通过不断的技术创新和完善,它将持续提升玩家的游戏体验,推动整个网络游戏行业的健康发展。

    Visual C++游戏编程基础(10

    《Visual C++游戏编程基础》是一本面向初学者的教程,旨在帮助读者掌握使用Visual C++进行游戏开发的基础知识。...不过,通过这些知识点的学习,读者可以逐步建立起自己的游戏开发能力,从零开始构建简单的游戏项目。

    传智播客_俄罗斯方块游戏10_障碍物生成与显示

    4. 渲染类:利用GUI库创建游戏窗口,绘制方块和障碍物。 5. 输入处理类:监听用户输入,控制方块的移动和旋转。 6. 测试类:用于测试各个组件的正确性。 在学习过程中,通过实际编写和调试代码,你可以加深对面向...

    PYTHON游戏编程

    首先,Python的基础语法是游戏编程的基石。理解变量、数据类型、控制结构(如if-else、for循环和while循环)、函数以及类等基本概念至关重要。Python的简洁性和易读性使得代码更易于理解和维护,这对于初学者来说...

    网络游戏-远程命令器和网络连接系统.zip

    其次,网络连接系统(Network Connection System)是网络游戏的基石,它负责建立、管理和维护客户端与服务器之间的网络连接。这个系统需要处理诸多挑战,如延迟、丢包、网络拥塞等问题,以确保数据传输的可靠性和...

    linux终端c编程练习 大富翁游戏

    再者,**游戏框架** 的建立是一个复杂的过程,涉及到状态管理、事件处理和数据结构的设计。游戏地图的显示可能使用了二维数组或者链表来存储格子信息,而每个格子可能包含了特定的事件(如“你买下了这块地”)。...

    java小游戏

    Java的Swing和JavaFX库提供了丰富的组件和工具,用于创建窗口、按钮、文本框等,使游戏更加直观易用。 总的来说,Java小游戏是学习和实践Java编程的理想起点,它们涵盖了从基本语法到高级特性的各种编程概念。通过...

    C语言精彩编程 游戏编程从入门到精通

    C语言是计算机科学中的基石,它以其高效、灵活和强大的功能被广泛应用于系统编程、嵌入式开发以及游戏编程等领域。 首先,书中会介绍C语言的基础语法,包括数据类型(如整型、浮点型、字符型等)、变量的声明与初始...

    pygame-2.5.0.dev2.tar.gz

    《Pygame 2.5.0.dev2:Python游戏开发的基石》 Pygame是Python编程语言中的一个库,用于创建多媒体应用,尤其是游戏。它建立在SDL(Simple DirectMedia Layer)库之上,为开发者提供了丰富的功能,使游戏开发变得...

    TCP.rar_tcp

    4. **流量控制**:TCP通过滑动窗口机制控制发送方的速率,避免接收方因数据过多而无法处理。 5. **拥塞控制**:当网络拥塞时,TCP会减慢数据的发送速率,以减少网络拥塞的影响。 **TCP的工作流程** 1. **三次握手...

    JAVA课程设计——网络版五子棋

    2. **Swing组件**:Swing组件是Java GUI设计的核心,如JFrame(窗口)、JPanel(面板)、JButton(按钮)、JLabel(标签)、JTextField(文本框)等,它们在五子棋游戏界面中起到显示棋盘、落子提示、用户交互等作用...

    ohmud:Golang的行动泥浆游戏

    "ohmud"就是这样一个利用Golang构建的动作泥浆游戏(MUD,Multi-User Dungeon),它为我们提供了一个深入了解Golang在游戏开发中应用的窗口。 首先,我们来理解一下什么是MUD游戏。MUD游戏是一种基于文本的多人在线...

    MFC五子棋 可联机单机(包含vc++源码及程序)

    本项目以MFC为基石,构建了一个功能丰富的五子棋游戏,不仅支持人机对战,还实现了人人对战模式,具有悔棋、认输、和棋等核心功能,并加入了实时聊天的社交元素,为玩家提供了更丰富的游戏体验。 一、MFC与五子棋的...

    Java基础常见英语词汇

    ### Java基础常见英语词汇解析 在Java编程领域,掌握一系列专业术语是十分必要的,这不仅有助于理解技术...以上术语涵盖了Java编程的基础知识和常用概念,对于初学者来说,熟练掌握这些词汇是进一步学习和实践的基石。

    TCP_UDP_advanced_programe.rar_TCP UDp_tcp

    1. 连接建立:TCP通信前需要建立三次握手,确保双方都有能力进行数据交换。 2. 数据传输:TCP以字节流的形式传输数据,没有消息边界,需要应用程序自己处理。 3. 断开连接:四次挥手释放连接,确保数据完全传输后...

    Beginning Directx 9

    通过学习《初识DirectX 9》,你将建立起对DirectX编程的坚实基础,为进一步深入游戏开发或图形编程领域打下牢固的基石。无论你是想制作自己的游戏还是探索计算机图形学的奥秘,这本书都将是你宝贵的参考资料。

    VC 网路五子棋

    其次,网络通信是游戏的基石,使得玩家可以在线对弈。这里涉及到了套接字(Socket)编程,它是网络编程的基础。在VC中,可以使用Winsock库实现TCP/IP协议的套接字通信。服务器端需要监听特定端口,等待客户端的连接...

Global site tag (gtag.js) - Google Analytics