4k words
在本篇中,我们将设计Nest框架UI库中的停靠窗口和DockWidget窗口管理类。 设计思路 在Qt中,QDockWidget提供了停靠窗口部件的概念,也称为工具选项板或实用程序窗口。停靠窗口是放置在QMainWindow中中央部件周围的停靠小部件区域中的辅助窗口。QDockWidget由标题栏和内容区域组成。 标题栏显示停靠小部件窗口标题、浮动按钮和关闭按钮。 根据 QDockWidget 的状态,浮动和关闭按钮可能被禁用或根本不显示。标题栏和按钮的视觉外观取决于所使用的样式。QDockWidget充当其子窗口小部件的包装器,通过setWidget()设置。自定义尺寸提示、最小和最大尺寸以及尺寸策略应在子窗口小部件中实现。QDockWidget将尊重它们,调整其自身的约束以包括框架和标题。 不应在QDockWidget本身上设置大小约束,因为它们会根据它是否停靠而变化; 停靠的 QDockWidget 没有框架和较小的标题栏。 DockWidget 功能设计作为框架UI库中的DockWidget,我们希望其具有以下功能和特性: 由于整个Nest框架是基于Qt开发的,所以主...
1.6k words
完成Applicaiton类的初步设计和Log模块的设计后,我们将在本篇中对框架中的UI库中的 主窗口(MainWindow) 进行设计。 设计思路在Qt中,有三种用户界面类:QWidget、QMainWindow、QDialog,其中QWidget是QMainWindow和QDialog的基类。 QWidgetQWidget是所有用户界面对象的基类,它从窗口系统中接收鼠标、键盘和其他事件,并在屏幕上绘制自己。 QMainWindow QMainWindow是Qt框架自带的一个预定义好的主窗口类。所谓主窗口,即一个应用程序最顶层的窗口,比如VSCode就是一个主窗口。经典的主窗口通常是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏组成。 Qt中QMainWindow的布局包括:QMenuBar(菜单栏)、QToolBar(工具栏)、QStatusBar(状态栏)、QDockWidget(停靠窗体)和Central Widget(中心小部件),其中Central Widget必须存在。 QDialogQDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及...
4.1k words
根据EchoEngine开发笔记-软件设计中的设计思路,在完成Applicaiton类的初步设计后,我们将进行Log日志模块的设计与开发。 设计思路 问题引入说起Log,我们在软件开发过程中,经常会遇到需要跟踪和记录应用程序的状态和行为的情况。当应用程序变得复杂,出现了更多的错误、警告和信息时,手动输出到控制台或文件就不够高效和方便了。因此,有一个可靠的日志系统是非常重要的。 功能设计对于Log来说,我们希望其具有以下功能和特性: 支持多种日志级别,如调试、信息、警告、错误等 原文链接:C++ 实现简易 log 日志库日志级别一般分为以下几种(从高到低排序):FATAL(致命): FATAL级别的日志用于记录严重的错误,通常表示应用程序遇到了无法继续运行的情况,可能会导致应用程序崩溃。这些日志级别用于标识需要立即处理的严重问题。ERROR(错误):ERROR级别的日志用于记录错误情况,例如操作失败、异常抛出等。这些日志表明应用程序遇到了一些问题,但通常不会导致应用程序崩溃。ERROR级别的日志在生产环境中非常重要,以及时发现和修复错误。WARN(警告):WARNING级别的...
2.8k words
在平时使用应用程序时,我们经常会注意到应用在运行期间能够有效地管理资源,并在结束后进行适当的资源释放。这引发了我对于代码中是否存在一个类来管理应用程序资源的思考。在学习Qt开发时,我注意到每当涉及窗口程序时都会涉及到 QApplication类。通过研究文档,我了解到 QApplication类用于管理Qt应用程序,并提供相应的功能和职责。因此,在设计Nest框架时,我希望有一个类来管理程序运行时的所有应用相关资源。为此,我选择设计一个名为 Application的类来实现这一需求。 设计思路 由于整个框架是基于Qt框架的开发,在设计Application时应继承Qt中的相关Application类。 在Qt中,一共有三种Application类:QCoreApplication、QGuiApplication和QApplication 三者之间的关系如图所示 三者的区别 QCoreApplication定义在core模块中,为应用程序提供了一个非gui的事件循环。 123456789#include <QCoreApplication>#include <...
2.1k words
众所周知,在任何软件项目开发之前,都需要进行软件设计,思考软件定位、软件架构设计以及软件开发范围等问题。特别是在谈论到渲染引擎或游戏引擎架构时,我们常常会想到那张经典的游戏引擎架构图,如下图所示。 由图可知: 游戏引擎通常由工具套件和运行时组件构成 游戏引擎是由软件层(software layer)构建,并且通常为上层依赖下层,而下层不依赖上层。 引擎可分为一下几个模块 Hardware & Drivers OS 3rd Party SDKs 第三方SDK是解决某一个问题或者某一类问题的通用解决方案。 DirectX和OpenGL等图形API,可以让我们在CPU上通过特定的编程模式去操纵GPU。 Havok、PhysX等物理引擎可以让我们高效准确地模拟物理过程,是虚拟世界运行的基础。 Boost则是功能强大的数据结构和算法库,涵盖了大部分场景所需的数据结构和算法,方便我们快速构建更上层的逻辑,而不需要重新编写这些通用组件。 STL是C++标准模板库,也包含了大量常用数据结构和算法。 Platform Independence Layer平台独立层包...
694 words
EchoEngine以Cherno老师的Game Engine系列视频为指导,结合Qt6、GLFW和GLAD等第三方库开发的渲染引擎项目。EchoEngine将是一个长期维护项目,最终目标是将EchoEngine开发成为一个可用于自己学习Shader的工具。 项目目标:理解渲染引擎架构、熟悉OpenGL API、掌握OpenGL封装方法、熟悉图形学基本知识。 项目仓库:EchoEngine 开发环境 IDE: Visual Studio 2019、Visual Studio 2022 Qt Version: Qt6.5.3 DependenciesEcho Engine uses the following open-source libraries: Qt6 spdlog - C++ logging library. GLFW - A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input. GLAD - Multi-Language Vulkan/GL/GLES...
454 words
当开发EchoEngine项目时,我的设计理念是采用分层架构,将渲染引擎层和应用软件框架分开,因此我创建了Nest Framework。Nest Framework是一个基于Qt 6.5.3版本的通用软件开发框架。该项目是一个学习项目,旨在深入了解Qt相关特性和软件开发过程。 开发环境 IDE: Visual Studio 2019、Visual Studio 2022 Qt Version: Qt6.5.3 开发日志(持续更新)Nest Framework v0.1.0本框架计划使用分层架构设计,实现框架核心与UI分离。 Nest:此项目为框架核心,是一个 .lib项目。内部包含Application(应用程序类)、基于spdlog库封装的Log日志模块。 NestUI:此项目为框架UI库,是一个 .dll项目。内部包含MainWindow(纯虚类)、DockWidget(纯虚类)、DockWidgetManager(DockWidget窗口管理类)。 依赖本项目用到以下开源库: Qt6 spdlog - C++ logging library.
1.4k words
本项目是一个基于Java Swing开发的网络聊天/即时通讯程序,整个项目会参考Cherno大佬的Network Chat Programming的系列视频进行开发。本项目的目标:熟悉Java语言、学会Java相关的GUI开发 项目环境配置在本项目中,我使用vscode作为编辑器,因此需要在vscode上配置对应的Java开发环境来支持项目开发。 JDK 下载JDK链接:JDK下载基于我个人习惯,我习惯选择LTS版本的软件和SDK,因此我选择了17.0.9版本的JDK,并且开发的系统平台为Windows。 添加JDK因为我使用的是Windows平台,因此在安装JDK时选择将java环境添加到系统环境变量中即可。 在vscode中配置Java环境在vscode中下载以下插件: Language Support for Java™ by Red Hat Debugger for Java Java Test Runner Maven for Java Project Manager for Java 创建项目 使用 CTRL+SHIFT+P输入 Java: creat...
6.6k words
结合Michael老师在B站上的课程《Unity休闲手机游戏开发》,开发了一款简单的竖屏小游戏,并命名为CrossRoad。以此项目为契机,实现熟悉unity相关操作,了解游戏开发流程等目标。在这篇博客中,将一些在开发中遇到的一些困难点、运用到的技术点记录下来,以便日后回顾。 项目仓库:CrossRoad 玩法: 在这个游戏中,我们通过点按/长按屏幕控制青蛙向前跳跃、根据点按位置控制青蛙左右移动。在游戏场景中,有公路、草地和小河三种场景。在公路场景中,会有移动的车辆;在草地场景中,会有障碍物(栅栏、石墙);在小河场景中,会有移动的木板。当青蛙碰撞到汽车、栅栏、石墙,亦或是穿越小河时,掉入水中,都会判定失败。 设置相机由于这是一款2D竖版游戏,所以我希望整个游戏的渲染能以Y轴的坐标为标准,即当两个模型发现重叠时,Y轴越小显示在前面,Y轴越大的显示在后面。因此,在菜单栏中选择Edit->Project Settings中,选择Graphics,将Carema Settings中的Transparency Sort Mode(透明排序模式)设置为Custom Ax...