设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: guoxiaomi

[胡扯] How to写一个全新的rpg maker

[复制链接]

Lv4.逐梦者

梦石
0
星屑
7848
在线时间
1835 小时
注册时间
2017-10-23
帖子
352
发表于 2021-9-1 18:02:53 | 显示全部楼层
大佬不如用Unity做一個開源 RPGmaker的功能啊   
11區的幾個黃油大社團現在都用同一個Unity模板  

点评

Unity是免費,3D/2D也可  发表于 2021-9-23 23:02
我在Q群里看见有人在用Unity做出了RM,但我其实不懂Unity,写这个主要是为了学习C++  发表于 2021-9-1 19:00
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

 楼主| 发表于 2021-9-23 00:40:07 | 显示全部楼层
本帖最后由 guoxiaomi 于 2021-9-23 00:43 编辑

把Sprite、Plane、Window和Tilemap都写好了:
Screenshot 2021-09-23 003731.png
其实Tilemap没有想象中难写……反而是window最麻烦。
1920x1080的Tilemap轻松120帧
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
8
星屑
2832
在线时间
474 小时
注册时间
2010-9-11
帖子
519
发表于 2021-9-23 09:53:39 | 显示全部楼层
渲染怎麽解決的... 感覺這方面是最難的坎 但是看樓主好像跳過了。

点评

因为不会写shader,所以全部用的sdl的标准api,引擎用的d3d  发表于 2021-9-23 10:47
用的sdl,开源地址:https://gitee.com/rmxp/sdlrgss  发表于 2021-9-23 10:46
Paku
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-23 10:39:16 | 显示全部楼层
牛逼啊,改天发我的看看有啥问题

点评

来呀一起交流  发表于 2021-9-23 10:48
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-23 10:42:04 | 显示全部楼层
搞事 发表于 2021-9-23 10:39
牛逼啊,改天发我的看看有啥问题

我的只是一个引擎,没有用来写rm,只是自己写游戏用的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-23 21:56:26 | 显示全部楼层
/*
* 游戏引擎
*/
#ifndef _GAMENGINE_H_
#define _GAMENGINE_H_

// 包含库
#include "Configure_Engine.h"                // 引擎配置参数
#include "Engine_Graphics.h"                // 渲染部分
#include "Engine_DataBase.h"                // 数据部分
#include "Manager_UI.h"                                // UI部分
#include "Manager_View.h"                        // 场景部分

// 声明类
class GameEngine;

// 外部定义
extern GameEngine* g_eng;                        // 全局 - 游戏引擎


// 游戏引擎 实现类
class GameEngine {
private:
        // 基础属性
        bool eng_iskeep;                                // 可持续
        unsigned int eng_errorvalue;        // 错误值
        unsigned int eng_state;                        // 引擎状态

        // 错误类型

private:
        // win32程序属性 -- 句柄
        HWND m_hwnd;                                        // 句柄
        HINSTANCE m_hinstance;                        // 线程进程
        HMENU m_hemnu;                                        // 菜单
        HCURSOR m_hcursor;                                // 光标
        HICON m_hicon;                                        // 图标
        HBRUSH m_hbrush;                                // 画刷

        // win32程序属性 -- 基础属性
        int m_x, m_y, m_width, m_height;
        bool m_fullscreen;

private:       
        vector<Data_San9Event*> eng_eventlist;        // 事件列表


public:
        // 构造
        GameEngine();

        // 析构
        ~GameEngine();

        // 释放引擎
        void ReleaseEngine();

        // 初始化句柄
        void InithInst(HINSTANCE hinstance);

        // 初始化引擎
        void InitEngine();

        // 初始化引擎
        // x,y,width,height == 程序窗口大小
        // Fullscreen == 全屏(默认全屏)
        void InitEngine(int x,int y,int width,int height,bool full = true);

        // 运行引擎
        void RunEngine();

public:        // 相关 win32程序
        // 接收win32消息
        void CheckWin32Msg(UINT msg, WPARAM wp, LPARAM lp);

public:
        // 判定引擎是否结束更新
        bool IsActivity();


private:
        // 发送结束引擎消息
        void SelfKill();

private:
        // 初始化win32程序
        void InitWin32Process();

        // 初始化渲染部分
        void InitGraphicsProcess();

        // 初始化数据库部分
        void InitDataBaseProcess();

        // 初始化场景控制部分
        void InitViewControlProcess();

        // 处理事件
        void Engine_CheckEvent();

        // 处理更新
        void Engine_Update();

        // 处理渲染
        void Engine_Draw();

};


#endif // !_GAMENGINE_H_




回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-23 21:57:20 | 显示全部楼层
#include "GameEngine.h"

// 游戏引擎生成  
GameEngine* g_eng = new GameEngine();

// 游戏引擎 - win32回调函数
// 唯一性
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {

        switch (msg) {
        case WM_KEYDOWN:
        case WM_KEYUP:
        case WM_MOUSEMOVE:
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        case WM_MBUTTONDOWN:
        case WM_MBUTTONUP:
        case WM_CHAR:
        case WM_ACTIVATE:
        {
                if (g_eng != nullptr) {
                        g_eng->CheckWin32Msg(msg, wp, lp);
                }
        }
                break;
        case WM_DESTROY:
        {
                bool result = false;
                if (g_eng != nullptr) {
                        result = g_eng->IsActivity();
                }

                if (result) {
                        PostQuitMessage(0);
                }
        }
                break;
        default:
                break;
        }
        return DefWindowProc(hwnd, msg, wp, lp);
}

// 构造
GameEngine::GameEngine() {
        // 基础属性
        eng_iskeep = true;                                // 可持续
        eng_errorvalue = 0x00;                        // 错误值 - 0
        eng_state = SYS_STATE_BEGIN;        // 引擎状态 - 刚开始

        // win32程序属性 -- 句柄


        // win32程序属性 -- 基础属性
        m_x = 0, m_y = 0, m_width = 1024, m_height = 769;        // 固定像素大小
        m_fullscreen = true;                                                                // 默认全屏


}

// 析构
GameEngine::~GameEngine() {

}

// 释放引擎
void GameEngine::ReleaseEngine() {

}

// 初始化句柄
void GameEngine::InithInst(HINSTANCE hinstance) {
        m_hinstance = hinstance;
}

// 初始化引擎
void GameEngine::InitEngine() {
        // 初始化 win32程序  
        InitWin32Process();

        // 初始化 渲染部分
        InitGraphicsProcess();

        // 初始化 数据库部分
        InitDataBaseProcess();

        // 初始化场景控制部分
        InitViewControlProcess();
}

// 初始化引擎
// x,y,width,height == 程序窗口大小
// Fullscreen == 全屏(默认全屏)
void GameEngine::InitEngine(int x, int y, int width, int height, bool full) {
        // 设置属性
        m_fullscreen = full;
        if (!m_fullscreen) {
                m_x = x;
                m_y = y;
                m_width = width;
                m_height = height;
        }
        else {
                m_x = 0;
                m_y = 0;
                m_width = GetSystemMetrics(SM_CXSCREEN) - 1;
                m_height = GetSystemMetrics(SM_CYSCREEN) - 1;
        }

        // 初始化引擎
        InitEngine();
}

// 初始化win32程序
void GameEngine::InitWin32Process() {
        // 属性配置
        // 背景画刷
        if (m_hbrush == nullptr) {
                m_hbrush = CreateSolidBrush(RGB(0, 0, 0));
        }
        // 默认光标
        if (m_hcursor == nullptr) {
                m_hcursor = LoadCursor(NULL, IDC_ARROW);
        }
        // 默认图标  
        if (m_hicon == nullptr) {
                m_hicon = LoadIcon(NULL, IDI_APPLICATION);
        }

        // 窗口创建
        // 信息结构体
        WNDCLASSEX wc = { 0 };
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = 0;
        wc.cbWndExtra = 0;
        wc.hbrBackground = m_hbrush;
        wc.hCursor = m_hcursor;
        wc.hIcon = m_hicon;
        wc.lpfnWndProc = WindowProc;
        wc.hInstance = m_hinstance;
        wc.lpszClassName = "youguess";
        wc.lpszMenuName = "sometitle";

        // 注册
        if (!RegisterClassEx(&wc)) {
                return;
        }
        else {
                // 创建窗口
                DWORD tmp_style = m_fullscreen ? (WS_MAXIMIZE | WS_POPUP) : WS_POPUP;
                m_hwnd = CreateWindow(
                        wc.lpszClassName, "san9pk",
                        tmp_style,
                        m_x, m_y, m_width, m_height,
                        NULL, NULL, m_hinstance, NULL
                );

                // 创建失败
                if (m_hwnd == NULL) {
                       
                }
        }
}

// 初始化渲染部分
void GameEngine::InitGraphicsProcess() {
        bool result = true;

        // 非全屏
        if (!m_fullscreen) {
                result = Engine_Graphics::InitGraphics(m_hwnd, RECT{ (LONG)m_x, (LONG)m_y, (LONG)m_width, (LONG)m_height });
        }

}

// 初始化数据库部分
void GameEngine::InitDataBaseProcess() {
        if (g_data != nullptr) {
                return;
        }

        g_data = new DataBase();
        g_data->InitDataBase();

}

// 初始化场景控制部分
void GameEngine::InitViewControlProcess() {
        if (g_view != nullptr) {
                return;
        }

        g_view = new Manager_View();
        g_view->Init();
}

// 处理事件
void GameEngine::Engine_CheckEvent() {
        // 处理事件
        unsigned int index = 0;
        while (1) {
                // 索引
                if (index >= eng_eventlist.size()) {
                        break;
                }

                index++;
        }

        // 清空事件列表
        eng_eventlist.clear();
}

// 处理更新
void GameEngine::Engine_Update() {
        //
        if (eng_state == SYS_STATE_EXIT) {
               
                return;
        }
        else {
                if (eng_state == SYS_STATE_BEGIN) {
                        eng_state = SYS_STATE_KEEP;
                }
                else {
                        // 场景更新
                        if (g_view != nullptr) {
                                g_view->Update();
                        }
                }
        }

        // 渲染系统更新
        Manager_UI::Update();
}

// 处理渲染
void GameEngine::Engine_Draw() {
        // 开始 + 清屏
        Engine_Graphics::Begin();

        //
        if (eng_state == SYS_STATE_EXIT) {
                return;
        }
        else {
                // 场景渲染
                if (g_view != nullptr) {
                        g_view->Draw();
                }
        }

        // UI系统绘制
        Manager_UI::Draw();

        // 结束
        Engine_Graphics::End();
}

// 运行引擎
void GameEngine::RunEngine() {

        // 窗体已创建
        if (m_hwnd != NULL) {
                // 显示和更新窗口
                if (m_fullscreen) {
                        ShowWindow(m_hwnd, SW_MAXIMIZE);
                }
                else {
                        ShowWindow(m_hwnd, SW_SHOW);
                }
                UpdateWindow(m_hwnd);


                // 消息循环
                MSG msg = { 0 };
                while (1) {

                        // 窗口消息
                        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
                                // 系统处理机制
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);

                                if (msg.message == WM_QUIT) {
                                        break;
                                }
                        }
                        else {
                                // 计时器
                                Engine_CheckEvent();
                                Engine_Update();
                                Engine_Draw();
                        }
                }
        }
}

// 接收win32消息
void GameEngine::CheckWin32Msg(UINT msg, WPARAM wp, LPARAM lp) {
        // 渲染部分
        Manager_UI::CheckUpdate(msg, wp, lp);

        // 场景部分
        if (g_view != nullptr) {
                g_view->CheckUpdate(msg, wp, lp);
        }
}

// 判定引擎是否结束更新
bool GameEngine::IsActivity() {
        return (eng_state == SYS_STATE_EXIT);
}

// 发送结束引擎消息
void GameEngine::SelfKill() {
        if (m_hwnd != nullptr) {
                // 状态值更新
                eng_state = SYS_STATE_EXIT;

                // 立即发送摧毁窗口消息
                PostMessage(m_hwnd, WM_DESTROY, 0, 0);
        }
}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-23 21:58:28 | 显示全部楼层
感觉直接发代码好像不太好

点评

可以用[pre]包一下  发表于 2021-9-24 01:34
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

 楼主| 发表于 2021-9-24 01:37:03 | 显示全部楼层
搞事 发表于 2021-9-23 21:57
#include "GameEngine.h"

// 游戏引擎生成  

没有用SDL嘛,那画面上的内容是用什么画的?
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
136
在线时间
7 小时
注册时间
2020-1-18
帖子
12
发表于 2021-9-24 10:10:12 | 显示全部楼层
guoxiaomi 发表于 2021-9-24 01:37
没有用SDL嘛,那画面上的内容是用什么画的?

用的direct2d渲染的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-18 23:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表