游戏引擎/GUI的设计与实现-主题

GUI的主题与中心思想没有什么关系,纯粹是一种控制GUI外观的配置方案。几乎所有的视觉效果都由主题是控制的,一个设计良好的主题模块,可以通过配置文件模拟不同的系统。主题的设计可繁可简,能满足自己的需要就可以了。这里以我写得几个GUI,FTKCANTKWTK为例,介绍一下主题得设计。

主题的内容

一般来说每种控件都有一种或多种状态,常见的状态有正常状态、鼠标按下状态、鼠标OVER状态、只读状态,选中状态和禁用状态等。比如文本只用正常状态,按钮有正常状态、鼠标按下状态、鼠标OVER状态和禁用状态,而编辑器有正常状态、选中状态和只读状态。

UI设计的基本原则就是要给用户反馈,让用户清楚当前的状况。所以每种状态会需要有不同的视觉效果,视觉效果无非就是用颜色或图片来呈现。一般来说控件由背景和文字两部分组成,背景可以用图片,或者背景颜色和边框颜色来决定,文字由字体,大小,风格和颜色决定。

综上所述,一个简单主题配置文件由多组配置信息,每组配置信息描述一种控件在不同状态下的外观。

比如下面这段配置就是WTK里关于按钮的配置,WTK是我为TANGIDE专门开发的一个GUI。这里 有完整的配置文件。

        "button": {
            "state-normal": {
                "textColor": "Black",
                "font": "10pt bold sans-serif",
                "bgImage": "bgimage_button_normal.png"
            },
            "state-active": {
                "textColor": "Black",
                "font": "10pt bold sans-serif",
                "bgImage": "bgimage_button_active.png"
            },
            "state-over": {
                "textColor": "Black",
                "font": "10pt bold sans-serif",
                "bgImage": "bgimage_button_over.png"
            },
            "state-disable": {
                "textColor": "Gray",
                "font": "10pt bold sans-serif",
                "bgImage": "bgimage_button_disable.png"
            }
        }

一种控件有时需要多组配置信息,比如按钮,正常的按钮用一种风格,对话框中的缺省按钮(按下回车建时自动触发的那个按钮)用另外一种风格。代码中可以提供一个函数,允许开发者指定当前控件用哪个配置。

一种控件可以没有配置信息,可能是它压根就没可见的界面,比如一些用于布局的控件。也可能它用缺省的配置信息就行了。

允许应用程序开发者改变单个控件的风格。主题只是定义每种控件的缺省风格,应用程序开发者可以定制任何单个控件,比如文本控件的字体,在不同界面变化是比较大的。

主题的形式

主题的其实不应该拘泥于形式,我最早见到的主题配置信息写在代码里的,它加载和切换都很快,在一个52M主频+512K内存的系统里是正确的选择。

直接硬编码在代码里通常不是好的选择。我在设计FTK时,选择了用XML文件保存主题配置信息。当时受GTK+影响很深,本来应该选择gtkrc类似的格式的。但是我不喜欢gtkrc的语法,XML解析起来容易很多,而且自己写过XML解析器。自然选择了用XML文件格式。

在学习JS后,我接触到JSON格式,JSON格式的伟大之处在于,它有机的把数据的存储状态和运行状态统一起来了。在JS里使用JSON就像呼吸一样自然,JSON.parse解析出来的数据结构,和直接在代码里定义的数据结构一样可以直接访问。所以在WTK里,选择了JSON数据格式。

要不要主题,是个问题

一个GUI系统可以不用主题吗? 当然!

但是情况要分别对待,一种情况是GUI设计得非常差,它只提供一种外观,没法通过配置信息改变它。另外一种情况是GUI设计的非常灵活,它完全不管视觉效果,所有视觉效果都由使用者自己决定。

在设计CANTK时,我研究了上百个APP,发现它们之间风格差别很大,根本没有什么主题能把它们得风格统一起来。所以在CANTK里我完全没有用主题,每个控件也没有提供缺省得外观,除非调用者指定得控件需要得配置数据,否则什么也看不到。

在使用时,如果每个控件都要指定相关得配置信息,使用起来一定非常麻烦,比如要手工去写下面得数据,一定非常让人抓狂。

{
    "type": "ui-button",
    "name": "ui-button",
    "w": 200,
    "h": 69,
    "x": 167,
    "y": 218,
    "text": "ok",
    "vTextAlign": "middle",
    "hTextAlign": "center",
    "enable": true,
    "visible": true,
    "xAttr": 0,
    "yAttr": 0,
    "widthAttr": 0,
    "heightAttr": 0,
    "uid": 11205,
    "runtimeVisible": true,
    "wMin": 50,
    "hMin": 41,
    "enableAutoScaleFontSize": true,
    "xParam": 1,
    "yParam": 1,
    "widthParam": 1,
    "heightParam": 1,
    "isUIButton": true,
    "isUIElement": true,
    "hasChildren": true,
    "style": {
        "lineWidth": 2,
        "lineColor": "Red",
        "fillColor": "White",
        "textColor": "#FEFFFF",
        "fontSize": 19,
        "fontFamily": "serif",
        "textB": true,
        "enableGradient": true
    },
    "events": {
        "onClick": null,
        "onUpdateTransform": null
    },
    "images": {
        "display": 4,
        "focused_bg": "drawapp8/images/common/buttons/red_button.png",
        "active_bg": "drawapp8/images/common/buttons/red_button_active.png",
        "normal_bg": "drawapp8/images/common/buttons/red_button.png",
        "disable_bg": "drawapp8/images/common/buttons/red_button.png"
    },
    "deviceConfig": "{\"name\":\"Device-General\",\"bg\":\"drawapp8/images/device.png\",\"platform\":\"android\",\"version\":\"5\",\"lcdDensity\":\"hdpi\",\"width\":560,\"height\":798,\"screenX\":36,\"screenY\":80,\"screenW\":480,\"screenH\":720}"
}

上面的数据确实是CANTK需要的,创建任何一个控件都需上面类似的数据。但是这些数据是由开发工具TANGIDE来生成,开发者要做的只是拖动几下鼠标而已。

时间: 2024-10-12 15:12:04

游戏引擎/GUI的设计与实现-主题的相关文章

游戏引擎/GUI的设计与实现-序

几年前写<嵌入式GUI FTK设计与实现>,没写几篇就停止更新了.当时自己研究过MicroWindows, X Window, DirectFB, GTK+和Android的GUI,又写过嵌入式GUI FTK,以为自己对GUI还算熟悉,但是真正写起来还是有些力不从心.另外硬件的飞速发展,我感觉FTK的实用价值不大了,自己的精力转向了CANTK的开发,所以没有再写下去. 这几年我又实现了两个GUI,一个是CANTK,它是基于HTML5的CANVAS元素实现的,针对移动设备的GUI,它已经开源了.

游戏引擎/GUI的设计与实现-常见GUI架构

以X Window为代表的客户/服务器架构. X Window通常是指X服务器及封装了通信协议的客户端库.服务器端主要负责输入事件的分发,窗口层次的管理,以及显示输出的处理,其它功能基本上都是在客户端实现了.我们看到的各种界面元素都是在客户端绘制的,这一部分通常称为ToolKit,应用程序开发者只需要关注ToolKit就行了.以前的ToolKit非常多,经过多年的进化和淘汰,常用的ToolKit主要是GTK+和QT两个了.X Window是非常复杂和晦涩的,以前我花了不少时间去研究用于嵌入式系统

游戏引擎介绍,架构,设计及实现

本文的灵感来自于<Android应用开发揭秘>的游戏引擎的那一章. 关于Game Engine,我能想到的几个问题: 1.游戏引擎是什么? 2.Game Engine是为了解决什么问题? 3.Game Engine的架构是什么? 4.如何设计一款游戏引擎? 5.游戏引擎包含哪些模块? 下面就来探讨几个问题:  1. Game Engine是什么? 游戏产业在全球来看是一个很大的产业,一款游戏大作包含了非常多的元素.游戏涉及到剧情.人物.任务.关卡.地图.画质.美术.音乐.网络等多种元素.开发一

VC++实战《星际传奇》网游课程第一部分网络游戏开发基础篇(游戏引擎设计)

本系列课程基于最新的DirectX11接口进行深入细致的讲解,内容涉及D3D11原理与应用.DirectInput.DirectSound等: 教程中专门针对新兴的D3D11接口展开深入的讲解,详细讲解了D3D11渲染管线.DirectComputer(参看<VC++游戏开发系列之Directcomputer并行计算原理与实践--DX11游戏实战开发>).Tessellation.多线程渲染.Shader动态链接等新内容.新知识.并且基于这些内容的基础,更进一步讲解了光照模型原理及实现.高级的

刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式:游戏方式可以发生很大变化,比如棒球模式中,所有刺猬都有保护膜无法损伤,只能击入水中退场 可以制作语音,游戏已经包括如海盗,唱诗风格等五种风格,使用开放的ogg格式 纸娃娃系统,不只可以为每个队员命名,还可以用头饰分辨每个人,已有超过90种头部装饰分辨每个刺猬 支持定制团队背景和离场的动画效果 武器[

Geomystery(几何迷城)的游戏引擎设计与实现

在这里介绍Geomystery(几何迷城)的游戏引擎设计与实现. 业务逻辑:引擎采用模块化的MVC(Model模型,View视图,Controller控制)设计方式,这样有助于运用多种设计模式,便于日后的修改与维护. M模型坐标系中的模型是被操作的对象,模型坐标系是被"显示坐标系"显示的单位. V视图(显示坐标系)是模型在用户屏幕的一个投影,这也和显卡.显示器的工作原理有关. C控制器操作某个逻辑坐标系模型A,或者每次操作后由控制器直接通知视图(显示坐标系)刷新模型A的投影a,或者由&

游戏引擎架构笔记之逐层设计

软件设计最底层是什么?当然是硬件平台了.书里其实有点迷惑,说硬件呢,为啥要说Microsoft Windows, Linux and MacOS-based PCs这种系统呢?其实目前的PC,应该可以安装各种系统吧.我想这一层是硬件设备.包括桌面计算机(PC,当然也包括笔记本吧),手持设备包括各种的phone,pad,主机游戏设备XBOX,PS,WII等.这一层能考虑什么呢,首先手持设备的特性,尤其像wii之类特殊的,还有屏幕分辨率等都是要考虑的,另外设备升级,比如增加了方向盘,或者头盔显示器,

一款小游戏引擎设计

前言 本文为后续引擎提炼定下了一个大致的方向,没有给出完整的引擎架构.这就够了!让我们在具体开发过程中再来从底向上设计吧! 本文目的 1.进行引擎提炼的前期规划,明确引擎提炼的整体流程和引擎的非功能性需求.2.从炸弹人领域模型中提炼出精简的领域模型,作为炸弹人的参考模型.3.从炸弹人参考模型中提炼出抽象的领域模型,作为引擎的初步领域模型. 本文主要内容 前期规划 回顾炸弹人设计 初步设计引擎 前期规划 开发流程 引擎提炼的整个流程如下图所示: 说明 • 回顾炸弹人游戏介绍炸弹人游戏的基本情况,回

游戏引擎网络开发者的 64 做与不做 | Part 1 | 客户端方面

摘要:纵观过去 10 年的游戏领域,单机向网络发展已成为一个非常大的趋势.然而,为游戏添加网络支持的过程中往往存在着大量挑战,这里将为大家揭示游戏引擎网络开发者的 64 个做与不做. [编者按]时下,游戏网络化已势不可逆,因此,对于游戏开发者来说,掌握网络引擎的打造技巧同样不可避免.近日,Research Industrial Systems Engineering GmbH 安全研究员 Sergey Ignatchenko「拥有 20 年以上的工程经验」在 IT Hare 上撰文,深入分享了游