-
Notifications
You must be signed in to change notification settings - Fork 0
/
_nebula_application.html
204 lines (202 loc) · 11.8 KB
/
_nebula_application.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.12.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Nebula: Application</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="custom.css" rel="stylesheet" type="text/css"/>
<link href="custom_dark_theme.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Nebula
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.12.0 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function(){initNavTree('_nebula_application.html',''); initResizable(true); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div><div class="header">
<div class="headertitle"><div class="title">Application</div></div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>The nebula application layer provides high level application utilities, such as gameplay systems.</p>
<h1><a class="anchor" id="NebulaApplicationGameSystem"></a>
Game system</h1>
<p><a class="el" href="namespace_nebula.html">Nebula</a> uses a database oriented approach to storing game entities and their respective properties.</p>
<p>The entity system currently consists of a couple of databases, the most important one being the world database. <br />
The world database contains all entity data for active entities. <br />
Properties are what define the entities' data. When an entity is created with a unique combination of properties, a new table will be created in the world database. These tables are referred to as entity "Categories". <br />
Entity behaviour and logic is expressed via "managers" and "processors" that query the database for entities that fulfill certain property requirements, and then process each entity based on their properties states.</p>
<h2><a class="anchor" id="NebulaApplicationGameSystemEntities"></a>
Entities, Blueprints and Templates</h2>
<p>Entities are simply integer identifiers that are mapped to a category, and row within the category table. Entities are commonly created by instantiating data-driven blueprints and/or templates. <br />
Blueprints are essentially category descriptions that just describe a named collection of properties. <br />
Templates are derived from blueprints and describe specific property values for an instantiation of a entity. <br />
Lets take an example: <br />
We declare an "Orc" blueprint that consists of four properties: Position, Health, Stats and Target.</p><ul>
<li>example_blueprints.json: <div class="fragment"><div class="line">{</div>
<div class="line"> "blueprints": {</div>
<div class="line"> "Orc": {</div>
<div class="line"> "desc": "A mean and green orc.",</div>
<div class="line"> "properties": [</div>
<div class="line"> "Position",</div>
<div class="line"> "Health",</div>
<div class="line"> "Stats",</div>
<div class="line"> "Target"</div>
<div class="line"> ]</div>
<div class="line"> }</div>
<div class="line"> }</div>
<div class="line">}</div>
</div><!-- fragment --></li>
</ul>
<p>Each and every instantiation of this Orc would have the same values (default set by the property definition) but we might want to have multiple different types of orcs. This is where we can use templates.</p><ul>
<li>templates/Orc/orc_soldier.json: <div class="fragment"><div class="line">{</div>
<div class="line"> "blueprint": "Orc",</div>
<div class="line"> "properties": {</div>
<div class="line"> "Health": 100</div>
<div class="line"> "Stats": {</div>
<div class="line"> "Strength": 75.0,</div>
<div class="line"> "IQ": 85</div>
<div class="line"> }</div>
<div class="line"> }</div>
<div class="line">}</div>
</div><!-- fragment --></li>
<li>templates/Orc/orc_brute.json: <div class="fragment"><div class="line">{</div>
<div class="line"> "blueprint": "Orc",</div>
<div class="line"> "properties": {</div>
<div class="line"> "Health": 250</div>
<div class="line"> "Stats": {</div>
<div class="line"> "Strength": 120.0,</div>
<div class="line"> "IQ": 44,</div>
<div class="line"> "isLarge": true</div>
<div class="line"> }</div>
<div class="line"> }</div>
<div class="line">}</div>
</div><!-- fragment --></li>
</ul>
<p>Instantiating these templates will automatically set the defined properties to a specific value. <br />
Note that we don't need to overwrite all default property values in our templates. <br />
</p>
<h2><a class="anchor" id="NebulaApplicationGameSystemProperties"></a>
Properties</h2>
<p>Properties are the main way to describe an entity's state. <br />
Properties are usually declared and defined via .nidl files (<a class="el" href="namespace_nebula.html">Nebula</a> intermediate definition language) and compiled into C++ code via an IDL compiler. <br />
All properties must be <a href="http://www.cplusplus.com/reference/type_traits/is_trivially_destructible/">trivially destructible</a> and <a href="http://www.cplusplus.com/reference/type_traits/is_trivially_copyable/">trivially copyable</a>. Note that it can still define a constructor or have initilizers in the declaration. The NIDL specification can be found here: <a class="el" href="_nebula_i_d_l.html">Nebula IDL</a> <br />
Properties can also be created explicitly via the <a class="el" href="api_8h.html">Game API's</a> CreateProperty function or the MemDb::TypeRegistry::Register (typesafe) function. When explicitly creating a property, you can choose to flag the property with various flags. These flags can for example alter the lifetime of the property, allowing certain managers to clean up external resources before an entity is fully destroyed.</p>
<dl class="section see"><dt>See also</dt><dd>Game::PropertyCreateInfo </dd>
<dd>
Game::PropertyFlags </dd>
<dd>
MemDb::TypeRegistry::Register</dd></dl>
<h2><a class="anchor" id="NebulaApplicationGameManagers"></a>
Game Managers</h2>
<p>Managers are defined via a simple function API. They are meant to care about "specific global stuff" and should be defined by applications to implement globals aspects of the application (mainly global game play related). Managers should be created and triggered by <a class="el" href="class_game_1_1_feature_unit.html">game features</a>. Their frame event functions are invoked when the gameserver triggers the game feature.</p>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="struct_game_1_1_manager_a_p_i.html" title="A Manager is just a bundle of function pointers to static or global functions that is called by the G...">Game::ManagerAPI</a></dd></dl>
<h2><a class="anchor" id="NebulaApplicationBaseGameFeature"></a>
Base Game Feature</h2>
<p>The <a class="el" href="namespace_base_game_feature.html">BaseGameFeature</a> is integral to the <a class="el" href="namespace_nebula.html">Nebula</a> entity system and sets up the entity, <a class="el" href="class_game_1_1_blueprint_manager.html">blueprint</a> and <a class="el" href="namespace_game_1_1_time_manager.html">time</a> managers. These managers supply the runtime with the core management needed for the entity system, and this feature should most likely always be attached to the <a class="el" href="class_game_1_1_game_server.html">game server</a> upon application startup.</p>
<h2><a class="anchor" id="NebulaApplicationGraphicsFeature"></a>
Graphics Feature</h2>
<p>The <a class="el" href="namespace_graphics_feature.html">GraphicsFeature</a> automatically sets up the core rendering subsystem and initializes tons of boilerplate so that you won't have to. The feature also creates a number of useful properties and managers that allow you to easily render models, animations, particles etc.</p>
<h2><a class="anchor" id="NebulaApplicationSeeAlso"></a>
See also</h2>
<p><a class="el" href="api_8h.html">api.h</a> <br />
<a class="el" href="namespace_game.html">Game</a> <br />
<a class="el" href="namespace_base_game_feature.html">BaseGameFeature</a> <br />
<a class="el" href="namespace_graphics_feature.html">GraphicsFeature</a> <br />
<a class="el" href="namespace_physics_feature.html">PhysicsFeature</a> <br />
<a class="el" href="namespace_mem_db.html">MemDb</a> <br />
</p>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">
Generated on Sat Oct 5 2024 16:49:15 for Nebula. Dark theme by <a href="http://majerle.eu" target="_new">Tilen Majerle</a>. All rights reserved.
</li>
</ul>
</div>
<script src="custom.js"></script>
</body>
</html>