游戏开发之路

2023-09-20 14:34:59
  • 最近即将大四,面临实习和就业的问题,学校只想尽快把我们推出去,却不管前方是刀山还是火海。
  • 如果没有梦想,去哪里都是流浪。
  • 如果怀有梦想,你是否迷茫?
  • 我不是985也不是211,我不想使用Unity或Unreal,明明什么都没有我却想做出惊艳的3A作品。
  • 但现在实现不了梦想没关系,十年后也许可以实现梦想,二十年后也许可以实现梦想。坚持的意义就是,总有一天,我会实现自己的梦想。
  • 如果你想学习游戏开发,可你还是小白,推荐一本书《筑梦之旅:Windows游戏编程从零开始》。最近我也在看这本书,还买了龙书,明天才到,真让人期待呀!
  • 今天学会了使用Windows API创建窗口。如果能回到过去,我会告诉自己:Windows平台是游戏市场中最大的平台,请你学习Windows API以创建游戏程序,请你学习DirectX以进行实时渲染,请你抱着独立开发游戏的志向坚定向前,以需求为目标,遇山移山、遇河搭桥,做出优质画面、剧情丰富、内涵深远的作品,这是你成为一个优秀游戏开发者唯一的也是最好的证明。
  • 附上今天学习的代码,创建一个Windows 窗口:
#include<Windows.h>

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_TITLE L"GameEngine"

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd
)
{
    SetProcessDPIAware();
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYMAXTRACK);

    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_DBLCLKS | CS_NOCLOSE | CS_VREDRAW | CS_HREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = (HICON)::LoadImage(NULL, L"Image.ico", IMAGE_ICON, 0, 0,
        LR_DEFAULTSIZE | LR_LOADFROMFILE);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";

    if (!RegisterClassEx(&wndClass))
        return -1;

    HWND hWnd = CreateWindow(L"ForTheDreamOfGameDevelop",
        WINDOW_TITLE,
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
        WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

    MoveWindow(hWnd, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, true);

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    MSG msg = { 0 };
    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);
    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
        ValidateRect(hwnd, NULL);
        break;
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
            DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}
更多推荐

go工具类的封装——(一)配置文件工具类封装

使用方式在后端开发中,我们经常会使用配置文件,所以我想封装出一个工具类出来,能够提供简洁的接口,让我们很方便地读取配置文件并从配置文件中提取信息。我封装了一个工具类ConfigManager,主要有以下功能:根据配置文件的路径和文件名读取配置信息通过一系列Get函数,可以根据key查询配置项的值自动将配置项写入缓存,提

Python Subprocess介绍:基础和示例

PythonSubprocess介绍:基础和示例探索PythonSubprocess模块的逐步指南,包括示例。目录什么是PythonSubprocess何时使用PythonSubprocessPythonSubprocess示例PythonSubprocess管道结论PythonSubprocess常见问题什么是Pyt

数据结构--哈希表,哈希函数(或者散列表、散列函数)

目录哈希表的定义处理冲突的方法--拉链法散列查找常见的散列函数(构造哈希函数)除留余数法直接定址法数字分析法平方取中法处理冲突的方法--开放定址法(1)线性探测法:(2)平方探测法(3)伪随机序列发处理冲突的方法--再散列法总结哈希表的定义处理冲突的方法--拉链法散列查找圈出来部分,分别是除了第一层查找1次,其他每个元

【算法】二分答案

文章目录相关链接什么时候使用二分答案?题目列表最大化最小化相关题目列表📕2439.最小化数组中的最大值解法1——二分答案解法2——分类讨论O(n)2513.最小化两个数组中的最大值(二分答案+lcm+容斥原理)🐂好题!相似题目(容斥原理+二分查找)878.第N个神奇数字1201.丑数III2517.礼盒的最大甜蜜度

Golang并发的循环

本节中,我们会探索一些用来在并行时循环迭代的常见并发模型。我们会探究从全尺寸图片生成一些缩略图的问题。gopl.io/ch8/thumbnail包提供了ImageFile函数来帮我们拉伸图片。我们不会说明这个函数的实现,只需要从gopl.io下载它。gopl.io/ch8/thumbnailpackagethumbna

爬虫使用代理IP不会被限的原因解析

在网络爬虫的世界中,使用代理IP可以为您带来许多好处,其中之一就是能够避免被目标网站限制或封锁。本文将解析爬虫使用代理IP不会被限的原因,帮助您突破封锁,高效抓取所需数据!IP匿名性:代理IP可以隐藏爬虫程序的真实IP地址,使目标网站无法准确获取您的真实身份和位置信息。目标网站通常会根据IP地址进行访问限制或封锁,尤其

【MySQL】基础SQL语句——库的操作

文章目录一.创建数据库1.1基础语句1.2字符集和校验规则1.3校验规则对读取数据的影响二.查看数据库三.修改数据库四.删除数据库及备份4.1删除4.2备份和还原结束语一.创建数据库1.1基础语句最简洁的创建数据库的SQL语句是:createdatabasedb_name;db_name是数据库的名称创建一个数据库,本

mysql中server_id的作用

在MySQL中,server_id是一个重要的配置参数,用于唯一标识MySQL服务器实例。server_id的配置和使用在MySQL复制和高可用性(HA)方案中至关重要,因为它允许不同的MySQL服务器之间进行数据同步和复制,并确保数据的一致性。以下是关于server_id的配置和使用的一些重要信息:1.配置serve

【pyinstaller 一步步学会打包教程 】

文章目录基础语法参数必选的参数可选的参数:打包详细步骤打包多文件打包的资源路径问题基础语法此处参考官网说明:pyinstaller[options]script[script…]|specfile所以最简单的用法如下,即可打包pyinstallermyscript.py这个操作即可完成打包,会执行如下操作:Writes

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录一、JSR3031、什么是JSR303?2、为什么要使用JSR303?3、JSR303常用注解3.1、常用的JSR303注解3.2、@Validated与@Valid区别3.2.1、@Validated3.2.2、@Valid3.2.3、区别4、使用案例4.1、导入依赖4.2、配置校验规则4.3、编写校验方法4.4

什么是物联网(IoT),解释物联网的架构和应用场景

1、什么是物联网(IoT),解释物联网的架构和应用场景。物联网(IoT,InternetofThings)是一种通过互联网进行连接和监控的网络,它将各种物理设备和系统集成在一起,使得数据可以远程传输和分析。物联网的应用场景非常广泛,它可以帮助人们更好地理解和管理周围的环境和事物。物联网的架构通常由三个部分组成:感知层:

热文推荐