Angelscript/docs/manual/doc_register_prop.html

145 lines
9.8 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AngelScript: Registering global properties</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="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.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>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function() { init_search(); });
/* @license-end */
</script>
<link href="doxygen.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="projectlogo"><img alt="Logo" src="aslogo_small.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AngelScript
</div>
</td>
<td> <div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
</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:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('doc_register_prop.html',''); initResizable(); });
/* @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">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Registering global properties </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>By registering global properties with the script engine you can allow the scripts to inspect and/or modify variables within the application directly, without the need to write special functions to do this.</p>
<p>To register the property, you just need to call the <a class="el" href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">RegisterGlobalProperty</a> method, passing the declaration and a pointer to the property. Remember that the registered property must stay alive as long as its registration is valid in the engine.</p>
<p>Make sure you give the correct pointer to AngelScript. The pointer should be to value that the declaration refers to, i.e. if the declaration is an integer then the pointer should be to the integer value, if the declaration is an object handle then the pointer should be to the pointer to the object, etc. Unfortunately there is no way for AngelScript to validate that the pointer is correct, so if the wrong pointer is given, you will only detect it at runtime when seeing unexpected behaviours from the application.</p>
<div class="fragment"><div class="line"><span class="comment">// Variables that should be accessible through the script.</span></div>
<div class="line"><span class="keywordtype">int</span> g_number = 0;</div>
<div class="line">CObject *g_object = 0;</div>
<div class="line">Vector3 g_vector = {0,0,0};</div>
<div class="line"><span class="keywordtype">bool</span> g_readOnlyFlag = <span class="keyword">false</span>;</div>
<div class="line"> </div>
<div class="line"><span class="comment">// A function to register the global properties. </span></div>
<div class="line"><span class="keywordtype">void</span> RegisterProperties(<a class="code" href="classas_i_script_engine.html">asIScriptEngine</a> *engine)</div>
<div class="line">{</div>
<div class="line"> <span class="keywordtype">int</span> r;</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// Register a primitive property that can be read and written to from the script.</span></div>
<div class="line"> r = engine-&gt;<a class="code" href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">RegisterGlobalProperty</a>(<span class="stringliteral">&quot;int g_number&quot;</span>, &amp;g_number); assert( r &gt;= 0 );</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// Register variable where the script can store a handle to a CObject type. </span></div>
<div class="line"> <span class="comment">// Assumes that the CObject type has been registered with the engine already as a reference type.</span></div>
<div class="line"> r = engine-&gt;<a class="code" href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">RegisterGlobalProperty</a>(<span class="stringliteral">&quot;CObject @g_object&quot;</span>, &amp;g_object); assert( r &gt;= 0 );</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// Register a 3D vector variable.</span></div>
<div class="line"> <span class="comment">// Assumes that the Vector3 type has been registered already as a value type.</span></div>
<div class="line"> r = engine-&gt;<a class="code" href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">RegisterGlobalProperty</a>(<span class="stringliteral">&quot;Vector3 g_vector&quot;</span>, &amp;g_vector); assert( r &gt;= 0 );</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// Register a boolean flag that can be read, but not modified by the script.</span></div>
<div class="line"> r = engine-&gt;<a class="code" href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">RegisterGlobalProperty</a>(<span class="stringliteral">&quot;const bool g_readOnlyFlag&quot;</span>, &amp;g_readOnlyFlag); assert( r &gt;= 0 );</div>
<div class="line">}</div>
</div><!-- fragment --><p>It is also possible to expose properties through <a class="el" href="doc_script_class_prop.html">property accessors</a>, which are a pair of functions with the prefixes 'get_' and 'set_' and the function decorator 'property' for getting and setting the property value. These functions should be registered with <a class="el" href="doc_register_func.html">RegisterGlobalFunction</a>. This is especially useful when the offset of the property cannot be determined, or if the type of the property is not registered in the script and some translation must occur, i.e. from <code>char*</code> to <code>string</code>.</p>
<dl class="section note"><dt>Note</dt><dd>The behaviour of virtual properties can be customized with the engine property <a class="el" href="doc_adv_custom_options.html#doc_adv_custom_options_lang_mod">asEP_PROPERTY_ACCESSOR_MODE</a>.</dd></dl>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="doc_register_type.html">Registering an object type</a> </dd></dl>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<div class="ttc" id="aclassas_i_script_engine_html"><div class="ttname"><a href="classas_i_script_engine.html">asIScriptEngine</a></div><div class="ttdoc">The engine interface.</div><div class="ttdef"><b>Definition:</b> angelscript.h:1092</div></div>
<div class="ttc" id="aclassas_i_script_engine_html_aacd32f32b2922b8ffaed204812013169"><div class="ttname"><a href="classas_i_script_engine.html#aacd32f32b2922b8ffaed204812013169">asIScriptEngine::RegisterGlobalProperty</a></div><div class="ttdeci">virtual int RegisterGlobalProperty(const char *declaration, void *pointer)=0</div><div class="ttdoc">Registers a global property.</div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on Sat Dec 5 2020 23:20:24 for AngelScript by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.18 </li>
</ul>
</div>
</body>
</html>