<?xml version="1.0"?>
<rss version="2.0"><channel><title/><link>https://www.leadwerks.com/community/blogs/blog/275-the-blog-of-yue/</link><description><![CDATA[<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="<fileStore.core_Attachment>/monthly_2019_07/CodeAmortiguadores.jpg.3c7d9bf110e97aa9ade8c34592117056.jpg" data-fileid="13900" data-fileext="jpg" rel=""><img alt="CodeAmortiguadores.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="13900" data-ratio="20" width="1000" src="<fileStore.core_Attachment>/monthly_2019_07/CodeAmortiguadores.thumb.jpg.d413598d95bbcd3f39d9617500aa9144.jpg" /></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="<fileStore.core_Attachment>/monthly_2019_07/Amortiguadores.jpg.e21be1b6978eac36295421b831f95033.jpg" data-fileid="13902" data-fileext="jpg" rel=""><img alt="Amortiguadores.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="13902" data-ratio="56.4" width="1000" src="<fileStore.core_Attachment>/monthly_2019_07/Amortiguadores.thumb.jpg.939c53ba9a2fdc6079efee06d6a1856f.jpg" /></a>
</p>
]]></description><language>en</language><item><title>Advanced Tutorial on DPI and UI Scaling in Leadwerks 5</title><link>https://www.leadwerks.com/community/blogs/entry/2889-advanced-tutorial-on-dpi-and-ui-scaling-in-leadwerks-5/</link><description><![CDATA[<h1>
	Advanced Tutorial on DPI and UI Scaling in Leadwerks 5
</h1>

<p>
	 
</p>

<p>
	This tutorial will provide a detailed, technical explanation of managing <b>System DPI (Dots Per Inch) Scaling</b> for window creation and <b>In-Game UI Scaling</b> for accessibility within the Leadwerks 5 game engine using Lua. This approach ensures your application renders correctly across various monitor resolutions, particularly High DPI displays like <span>$4\text{K}$</span>.
</p>

<hr />
<p>
	 
</p>

<h2>
	1. System DPI Integration: Window Sizing
</h2>

<p>
	 
</p>

<p>
	The Operating System (OS) uses DPI scaling as a global multiplier for rendering the user interface elements, making them legible on high-resolution screens. In Leadwerks 5, we must retrieve this factor to calculate the appropriate pixel dimensions for our game window.
</p>

<p>
	 
</p>

<h3>
	Technical Concept: Logical vs. Physical Window Size
</h3>

<p>
	 
</p>

<ul>
	<li>
		<p>
			<b>Logical Size (Base):</b> The target resolution for your content (e.g., <span>$1280 \times 720$</span>). This is the resolution you design for.
		</p>
	</li>
	<li>
		<p>
			<b>DPI Factor (<code>_displayScale</code>):</b> The float value (e.g., <span>$1.25$</span> for <span>$125\%$</span> scaling) retrieved from the OS.
		</p>
	</li>
	<li>
		<p>
			<b>Physical Size (Pixels):</b> The final dimensions of the window on the screen, calculated as <span>$\text{Logical Size} \times \text{DPI Factor}$</span>.
		</p>
	</li>
</ul>

<p>
	 
</p>

<h3>
	Implementation in the <code>CApp</code> Object (Initialization)
</h3>

<p>
	 
</p>

<p>
	The <code>CApp:Init()</code> function performs the crucial step of window dimensioning:<br />
	<br />
	<br />
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="com">-- CApp:New()</span><span class="pln">
</span><span class="kwd">local</span><span class="pun"> </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">Init</span><span class="pun">()</span><span class="pln">
    
    </span><span class="com">-- 1. Query the available displays (monitors).</span><span class="pln">
    _displays</span><span class="pun"> = </span><span class="pln">GetDisplays</span><span class="pun">()</span><span class="pln">
    
    </span><span class="com">-- 2. Retrieve the DPI scale factor from the primary display (index 1).</span><span class="pln">
    </span><span class="com">-- This function returns the scale set by the OS (e.g., 1.5).</span><span class="pln">
    _displayScale</span><span class="pun"> = </span><span class="pln">_displays</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]:</span><span class="pln">GetScale</span><span class="pun">() </span><span class="pln">
    
    </span><span class="com">-- 3. Calculate the Physical Window Dimensions. </span><span class="pln">
    </span><span class="com">-- This scales the logical base resolution to match the OS display settings.</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">windowWidth</span><span class="pun"> = </span><span class="lit">1280</span><span class="pun"> * </span><span class="pln">_displayScale
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">windowHeight</span><span class="pun"> = </span><span class="lit">720</span><span class="pun"> * </span><span class="pln">_displayScale
    
    _window</span><span class="pun"> = </span><span class="pln">CreateWindow</span><span class="pun">(</span><span class="str">"Leadwerks"</span><span class="pun">, </span><span class="lit">0</span><span class="pun">, </span><span class="lit">0</span><span class="pun">, </span><span class="pln">windowWidth</span><span class="pun">, </span><span class="pln">windowHeight</span><span class="pun">, </span><span class="pln">_displays</span><span class="pun">[</span><span class="lit">1</span><span class="pun">], </span><span class="pln">WINDOW_CENTER</span><span class="pun"> | </span><span class="pln">WINDOW_TITLEBAR</span><span class="pun">)</span><span class="pln">
    
    </span><span class="com">-- 4. Framebuffer Creation: The framebuffer's dimensions are automatically</span><span class="pln">
    </span><span class="com">-- set to the physical pixel size of the newly created window,</span><span class="pln">
    </span><span class="com">-- which is already DPI-scaled.</span><span class="pln">
    _framebuffer</span><span class="pun"> = </span><span class="pln">CreateFramebuffer</span><span class="pun">(</span><span class="pln">_window</span><span class="pun">)</span><span class="pln">

    </span><span class="com">-- The _framebuffer.size is now the correct DPI-adjusted resolution used</span><span class="pln">
    </span><span class="com">-- for camera setup and UI background sizing.</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h1>
	Advanced Tutorial on DPI and UI Scaling in Leadwerks 5
</h1>

<p>
	 
</p>

<p>
	This tutorial will provide a detailed, technical explanation of managing <b>System DPI (Dots Per Inch) Scaling</b> for window creation and <b>In-Game UI Scaling</b> for accessibility within the Leadwerks 5 game engine using Lua. This approach ensures your application renders correctly across various monitor resolutions, particularly High DPI displays like <span>$4\text{K}$</span>.
</p>

<hr />
<p>
	 
</p>

<h2>
	1. System DPI Integration: Window Sizing
</h2>

<p>
	 
</p>

<p>
	The Operating System (OS) uses DPI scaling as a global multiplier for rendering the user interface elements, making them legible on high-resolution screens. In Leadwerks 5, we must retrieve this factor to calculate the appropriate pixel dimensions for our game window.
</p>

<p>
	 
</p>

<h3>
	Technical Concept: Logical vs. Physical Window Size
</h3>

<p>
	 
</p>

<ul>
	<li>
		<p>
			<b>Logical Size (Base):</b> The target resolution for your content (e.g., <span>$1280 \times 720$</span>). This is the resolution you design for.
		</p>
	</li>
	<li>
		<p>
			<b>DPI Factor (<code>_displayScale</code>):</b> The float value (e.g., <span>$1.25$</span> for <span>$125\%$</span> scaling) retrieved from the OS.
		</p>
	</li>
	<li>
		<p>
			<b>Physical Size (Pixels):</b> The final dimensions of the window on the screen, calculated as <span>$\text{Logical Size} \times \text{DPI Factor}$</span>.
		</p>
	</li>
</ul>

<p>
	 
</p>

<h3>
	Implementation in the <code>CApp</code> Object (Initialization)
</h3>

<p>
	 
</p>

<p>
	The <code>CApp:Init()</code> function performs the crucial step of window dimensioning:
</p>

<div>
	<div>
		<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="com">-- CApp:New()</span><span class="pln">
</span><span class="kwd">local</span><span class="pun"> </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">Init</span><span class="pun">()</span><span class="pln">
    
    </span><span class="com">-- 1. Query the available displays (monitors).</span><span class="pln">
    _displays</span><span class="pun"> = </span><span class="pln">GetDisplays</span><span class="pun">()</span><span class="pln">
    
    </span><span class="com">-- 2. Retrieve the DPI scale factor from the primary display (index 1).</span><span class="pln">
    </span><span class="com">-- This function returns the scale set by the OS (e.g., 1.5).</span><span class="pln">
    _displayScale</span><span class="pun"> = </span><span class="pln">_displays</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]:</span><span class="pln">GetScale</span><span class="pun">() </span><span class="pln">
    
    </span><span class="com">-- 3. Calculate the Physical Window Dimensions. </span><span class="pln">
    </span><span class="com">-- This scales the logical base resolution to match the OS display settings.</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">windowWidth</span><span class="pun"> = </span><span class="lit">1280</span><span class="pun"> * </span><span class="pln">_displayScale
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">windowHeight</span><span class="pun"> = </span><span class="lit">720</span><span class="pun"> * </span><span class="pln">_displayScale
    
    _window</span><span class="pun"> = </span><span class="pln">CreateWindow</span><span class="pun">(</span><span class="str">"Leadwerks"</span><span class="pun">, </span><span class="lit">0</span><span class="pun">, </span><span class="lit">0</span><span class="pun">, </span><span class="pln">windowWidth</span><span class="pun">, </span><span class="pln">windowHeight</span><span class="pun">, </span><span class="pln">_displays</span><span class="pun">[</span><span class="lit">1</span><span class="pun">], </span><span class="pln">WINDOW_CENTER</span><span class="pun"> | </span><span class="pln">WINDOW_TITLEBAR</span><span class="pun">)</span><span class="pln">
    
    </span><span class="com">-- 4. Framebuffer Creation: The framebuffer's dimensions are automatically</span><span class="pln">
    </span><span class="com">-- set to the physical pixel size of the newly created window,</span><span class="pln">
    </span><span class="com">-- which is already DPI-scaled.</span><span class="pln">
    _framebuffer</span><span class="pun"> = </span><span class="pln">CreateFramebuffer</span><span class="pun">(</span><span class="pln">_window</span><span class="pun">)</span><span class="pln">

    </span><span class="com">-- The _framebuffer.size is now the correct DPI-adjusted resolution used</span><span class="pln">
    </span><span class="com">-- for camera setup and UI background sizing.</span><span class="pln">
</span><span class="kwd">end</span></pre>
	</div>
</div>

<p>
	<b>Outcome:</b> The game window is created with the exact physical size required to maintain the visual fidelity and scale intended by the user's OS settings.
</p>

<hr />
<p>
	 
</p>

<h2>
	2. In-Game UI Scaling: Accessibility and Redrawing
</h2>

<p>
	 
</p>

<p>
	While the window is correctly sized, the UI elements are initially drawn based on the raw framebuffer size. We use the <code>$UI:SetScale()$</code> method to apply a uniform zoom factor to all UI elements, offering accessibility options.
</p>

<p>
	 
</p>

<h3>
	Technical Concept: UI Hierarchy and Coordinate Recalculation
</h3>

<p>
	 
</p>

<ul>
	<li>
		<p>
			<b>UI Root (<code>_ui</code>):</b> The primary UI object created with the DPI-adjusted <code>_framebuffer.size</code>.
		</p>
	</li>
	<li>
		<p>
			<b>Automatic Scaling:</b> When <code>$UI:SetScale(factor)$</code> is called, all child elements (like buttons and labels) <b>automatically</b> inherit this scale factor.
		</p>
	</li>
	<li>
		<p>
			<b>Manual Recalculation:</b> Top-level panels and containers, whose position is often calculated relative to the screen size (e.g., centered), must be <b>manually redrawn</b> using the new scale factor to maintain correct positioning.
		</p>
	</li>
</ul>

<p>
	 
</p>

<h3>
	Implementation in the <code>CMenu</code> Object (Control and Redraw)
</h3>

<p>
	 
</p>

<p>
	The <code>$self:Update()$</code> function demonstrates the dynamic scaling mechanism triggered by a user input (the <b>SPACE</b> key).<br />
	<br />
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="kwd">function</span><span class="pun"> </span><span class="pln">self</span><span class="pun">:</span><span class="pln">Update</span><span class="pun">()</span><span class="pln">
    </span><span class="com">-- ... Event loop</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">ev</span><span class="pun">.</span><span class="pln">id</span><span class="pun"> == </span><span class="pln">EVENT_KEYDOWN</span><span class="pun"> </span><span class="kwd">and</span><span class="pun"> </span><span class="pln">ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun"> == </span><span class="pln">KEY_SPACE</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
        
        </span><span class="com">-- 1. Apply a new uniform scale factor to the entire UI hierarchy.</span><span class="pln">
        </span><span class="com">-- This acts as an accessibility zoom.</span><span class="pln">
        _ui</span><span class="pun">:</span><span class="pln">SetScale</span><span class="pun">(</span><span class="lit">1.25</span><span class="pun">)</span><span class="pln">
        
        </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">currentScale</span><span class="pun"> = </span><span class="pln">_ui</span><span class="pun">:</span><span class="pln">GetScale</span><span class="pun">() </span><span class="pln">
        
        </span><span class="com">-- 2. Recalculate and set the shape for the TOP-LEVEL panel (_pnlMenu).</span><span class="pln">
        </span><span class="com">-- Original Coordinates (e.g., 300, 150, 600, 100) are the LOGICAL design values.</span><span class="pln">
        </span><span class="com">-- These must be multiplied by the currentScale to correctly adjust the panel's</span><span class="pln">
        </span><span class="com">-- physical position and size on the screen.</span><span class="pln">
        
        </span><span class="com">-- Original Position X: _szUi.x / 2 - 300</span><span class="pln">
        </span><span class="com">-- New Position X: (_szUi.x / 2 - 300) * currentScale is INCORRECT.</span><span class="pln">
        </span><span class="com">-- We want to scale the OFFSET (300) from the center.</span><span class="pln">
        _pnlMenu</span><span class="pun">:</span><span class="pln">SetShape</span><span class="pun">(</span><span class="pln">
            _szUi</span><span class="pun">.</span><span class="pln">x</span><span class="pun"> / </span><span class="lit">2</span><span class="pun"> - </span><span class="lit">300</span><span class="pun"> * </span><span class="pln">currentScale</span><span class="pun">,  </span><span class="com">-- Scaled X Offset from center</span><span class="pln">
            _szUi</span><span class="pun">.</span><span class="pln">y</span><span class="pun"> - </span><span class="lit">150</span><span class="pun"> * </span><span class="pln">currentScale</span><span class="pun">,      </span><span class="com">-- Scaled Y Position</span><span class="pln">
            </span><span class="lit">600</span><span class="pun"> * </span><span class="pln">currentScale</span><span class="pun">,                </span><span class="com">-- Scaled Width</span><span class="pln">
            </span><span class="lit">100</span><span class="pun"> * </span><span class="pln">currentScale</span><span class="pun">                 </span><span class="com">-- Scaled Height</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
        
        </span><span class="com">-- NOTE: The button positions within _pnlMenu remain the same (relative), </span><span class="pln">
        </span><span class="com">-- but their physical size on screen is scaled by the factor applied to the root UI.</span><span class="pln">

    </span><span class="kwd">end</span><span class="pln">
    </span><span class="com">-- ...</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	By correctly applying the DPI factor during window creation and managing the UI scale multiplier for top-level containers, we achieve a robust, high-resolution-ready UI system in Leadwerks 5.
</p>
]]></description><guid isPermaLink="false">2889</guid><pubDate>Thu, 16 Oct 2025 15:12:28 +0000</pubDate></item><item><title>&#x1F9E0; &#x201C;My Window Won't Center (and Other Fullscreen Mode Traumas)&#x201D;</title><link>https://www.leadwerks.com/community/blogs/entry/2870-%F0%9F%A7%A0-%E2%80%9Cmy-window-wont-center-and-other-fullscreen-mode-traumas%E2%80%9D/</link><description><![CDATA[<p>
	<span>A real-life story about how graphics engines can mess up your desktop without asking permission.</span><br />
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2025_04/image.png.193578496e190ca56c65a105d0548280.png" data-fileid="21832" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="21832" data-ratio="100.00" width="750" alt="image.thumb.png.fa76ab9e22e4c37589d74eeb41bef33c.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2025_04/image.thumb.png.fa76ab9e22e4c37589d74eeb41bef33c.png" src="https://www.leadwerks.com/community/applications/core/interface/js/spacer.png" /></a>
</p>

<h3>
	<span class="ipsEmoji">🧩</span> Technical Context
</h3>

<p>
	<span>You're developing your game in <strong>Leadwerks 5</strong>, you create a windowed mode with beautiful dimensions like <code>1280 x 720</code>, and you decide to center it stylishly using:</span><br />
	<br />
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="kwd">local</span><span class="pun"> </span><span class="pln">displaySize</span><span class="pun"> = </span><span class="pln">display</span><span class="pun">:</span><span class="pln">GetSize</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">local</span><span class="pun"> </span><span class="pln">posX</span><span class="pun"> = </span><span class="pln">displaySize</span><span class="pun">.</span><span class="pln">x</span><span class="pun"> / </span><span class="lit">2</span><span class="pun"> - </span><span class="pln">width</span><span class="pun"> / </span><span class="lit">2</span><span class="pln">
</span><span class="kwd">local</span><span class="pun"> </span><span class="pln">posY</span><span class="pun"> = </span><span class="pln">displaySize</span><span class="pun">.</span><span class="pln">y</span><span class="pun"> / </span><span class="lit">2</span><span class="pun"> - </span><span class="pln">height</span><span class="pun"> / </span><span class="lit">2</span></pre>

<p>
	<span>So far, so good...</span><br />
	BUT...
</p>

<p>
	<span class="ipsEmoji">🧨</span> <strong>When you decide to switch to fullscreen mode</strong>, everything goes haywire.<br />
	 
</p>

<h3>
	<span class="ipsEmoji">💥</span> What Happened Here?
</h3>

<p>
	<span>When you activate <strong>fullscreen</strong>, you're not just removing the window border and maximizing the visible area.</span><br />
	<strong>No, sir.</strong>
</p>

<p>
	<span>In many engines (and Leadwerks is no exception), <strong>the operating system completely changes the monitor's resolution</strong> to match that of the game window.</span>
</p>

<p>
	Yes, you read that right:
</p>

<blockquote>
	<p>
		<span>“The entire system lowers its resolution to accommodate your game.”</span>
	</p>
</blockquote>

<p>
	For example:<br />
	<span>If your desktop was <code>1920x1080</code> and your window is <code>1280x720</code>, then upon going fullscreen, <strong>your entire operating system is now at 1280x720</strong>.</span>
</p>

<h3>
	<span class="ipsEmoji">🕳️</span> What Does This Imply?
</h3>

<p>
	<span>Upon returning to windowed mode, if you call <code>display:GetSize()</code> again, what you get is no longer the real desktop resolution, but the last forced monitor size.</span>
</p>

<p>
	Result:<br />
	<span class="ipsEmoji">🔄</span> <span>Your window is created mispositioned, miscentered, everything's wrong.</span><br />
	 
</p>

<h3>
	<span class="ipsEmoji">🧪</span> Is This a Bug?
</h3>

<p>
	<span>No, it's “<strong>expected behavior with dark side effects</strong>.”</span><br />
	<span>Engines like <strong>SDL</strong>, <strong>Unity</strong>, or <strong>Unreal Engine</strong> also have to deal with this.</span>
</p>

<ul>
	<li>
		<p>
			<span>SDL recommends using <code>SDL_GetDisplayBounds()</code> to get the real resolution.</span>
		</p>
	</li>
	<li>
		<p>
			<span>Unity has separate APIs for “<strong>render resolution</strong>” and “<strong>display resolution</strong>”.</span>
		</p>
	</li>
	<li>
		<p>
			<span>Unreal uses <code>GetDesktopResolution()</code> only at startup, never after fullscreen.</span>
		</p>
	</li>
</ul>

<hr />
<h3>
	<span class="ipsEmoji">✅</span> The Solution: Cache It Like It's Gold!
</h3>

<p>
	We created a system that:
</p>

<ol>
	<li>
		<p>
			<span>Detects the real desktop resolution <strong>the first time the game starts in windowed mode</strong>.</span>
		</p>
	</li>
	<li>
		<p>
			<span>Saves it in the configuration file as:</span><br />
			<br />
			 
		</p>

		<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="pln">desktop_resolution</span><span class="pun">=</span><span class="lit">1920</span><span class="pln">x1080</span></pre>

		<p>
			3. <span>Uses that value <strong>whenever we need to center the window</strong>, and <strong>never touches it again</strong>.</span>
		</p>

		<p>
			<span>Additionally, we made a small <strong>local cache</strong> in Lua to avoid reading the file all the time.</span>
		</p>

		<hr />
		<h3>
			<span class="ipsEmoji">💾</span> BONUS: Temporary Backup in Case Everything Explodes
		</h3>

		<p>
			<span>We also created a system to save the current resolution in a temporary file <strong>before applying any screen changes</strong>.</span><br />
			<span>So, if the player presses <em>"CANCEL"</em>, we simply restore from the backup, and the universe is back in balance.</span>
		</p>

		<hr />
		<h3>
			<span class="ipsEmoji">💙</span> Conclusion
		</h3>
	</li>
	<li>
		<p>
			<span class="ipsEmoji">⚠️</span> <span>Don't trust <code>display:GetSize()</code> after fullscreen.</span>
		</p>
	</li>
	<li>
		<p>
			<span class="ipsEmoji">🛡️</span> <span>Save the real desktop resolution once, and protect it like it's your HUD's lifeline.</span>
		</p>
	</li>
	<li>
		<p>
			<span class="ipsEmoji">🤓</span> <span>Understanding how graphics engines work at a low level saves you hours of yelling at the monitor.</span>
		</p>
	</li>
	<li>
		<p>
			<span class="ipsEmoji">😂</span> <span>And remember: sometimes, the real bug... is the implicit logic the system didn't tell you about</span><br />
			<br />
			 
		</p>

		<pre class="ipsCode prettyprint lang-lua prettyprinted"><span class="com">-- Last Update 5 de Abril 2025</span><span class="pln">

Window</span><span class="pun"> = {}</span><span class="pln">
Window</span><span class="pun">.</span><span class="pln">__index</span><span class="pun"> = </span><span class="pln">Window

</span><span class="com">-- Variable local para almacenar la resolución de escritorio de forma persistente</span><span class="pln">
</span><span class="kwd">local</span><span class="pun"> </span><span class="pln">cachedDesktopResolution</span><span class="pun"> = </span><span class="kwd">nil</span><span class="pln">

</span><span class="kwd">function</span><span class="pun"> </span><span class="pln">Window</span><span class="pun">:</span><span class="pln">New</span><span class="pun">(</span><span class="pln">title</span><span class="pun">, </span><span class="pln">x</span><span class="pun">, </span><span class="pln">y</span><span class="pun">, </span><span class="pln">width</span><span class="pun">, </span><span class="pln">height</span><span class="pun">, </span><span class="pln">display</span><span class="pun">, </span><span class="pln">style</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">this</span><span class="pun"> = </span><span class="pln">setmetatable</span><span class="pun">({}, </span><span class="pln">Window</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">title</span><span class="pun"> = </span><span class="pln">title</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="str">"Ventana"</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">x</span><span class="pun"> = </span><span class="pln">x</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">0</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">y</span><span class="pun"> = </span><span class="pln">y</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">0</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">display</span><span class="pun"> = </span><span class="pln">display</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="pln">GetDisplays</span><span class="pun">()[</span><span class="lit">1</span><span class="pun">]</span><span class="pln">

    </span><span class="com">-- Cargar configuración</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">settingsManager</span><span class="pun"> = </span><span class="pln">SettingsManager</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">settings</span><span class="pun"> = </span><span class="pln">settingsManager</span><span class="pun">:</span><span class="pln">Load</span><span class="pun">()</span><span class="pln">

    </span><span class="com">-- Guardar backup temporal de resolución y fullscreen antes de crear la nueva ventana</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">tempSettings</span><span class="pun"> = {</span><span class="pln">
        resolution</span><span class="pun"> = </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">width</span><span class="pun">) .. </span><span class="str">" x "</span><span class="pun"> .. </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">height</span><span class="pun">),</span><span class="pln">
        fullscreen</span><span class="pun"> = </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"fullscreen"</span><span class="pun">] </span><span class="kwd">or</span><span class="pun"> </span><span class="str">"0"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    settingsManager</span><span class="pun">:</span><span class="pln">SaveTemporary</span><span class="pun">(</span><span class="pln">tempSettings</span><span class="pun">)</span><span class="pln">
    Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">📝</span> Backup temporal guardado: "</span><span class="pun"> .. </span><span class="pln">tempSettings</span><span class="pun">.</span><span class="pln">resolution</span><span class="pun">)</span><span class="pln">

    </span><span class="com">-- Inicializar la resolución de escritorio solo una vez y guardarla en un caché local</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun"> </span><span class="kwd">not</span><span class="pun"> </span><span class="pln">cachedDesktopResolution</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
        </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">storedDesktopRes</span><span class="pun"> = </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"desktop_resolution"</span><span class="pun">]</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">storedDesktopRes</span><span class="pun"> </span><span class="kwd">and</span><span class="pun"> </span><span class="pln">storedDesktopRes</span><span class="pun">:</span><span class="pln">match</span><span class="pun">(</span><span class="str">"^(%d+)x(%d+)$"</span><span class="pun">) </span><span class="kwd">then</span><span class="pln">
            </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">w</span><span class="pun">, </span><span class="pln">h</span><span class="pun"> = </span><span class="pln">storedDesktopRes</span><span class="pun">:</span><span class="pln">match</span><span class="pun">(</span><span class="str">"(%d+)x(%d+)"</span><span class="pun">)</span><span class="pln">
            cachedDesktopResolution</span><span class="pun"> = { </span><span class="pln">x</span><span class="pun"> = </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">w</span><span class="pun">), </span><span class="pln">y</span><span class="pun"> = </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">h</span><span class="pun">) }</span><span class="pln">
            Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🖥️</span> Resolución de escritorio cargada desde config: "</span><span class="pun"> .. </span><span class="pln">storedDesktopRes</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">else</span><span class="pln">
            </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">size</span><span class="pun"> = </span><span class="pln">display</span><span class="pun">:</span><span class="pln">GetSize</span><span class="pun">()</span><span class="pln">
            cachedDesktopResolution</span><span class="pun"> = { </span><span class="pln">x</span><span class="pun"> = </span><span class="pln">size</span><span class="pun">.</span><span class="pln">x</span><span class="pun">, </span><span class="pln">y</span><span class="pun"> = </span><span class="pln">size</span><span class="pun">.</span><span class="pln">y</span><span class="pun"> }</span><span class="pln">
            settings</span><span class="pun">[</span><span class="str">"desktop_resolution"</span><span class="pun">] = </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">size</span><span class="pun">.</span><span class="pln">x</span><span class="pun">) .. </span><span class="str">"x"</span><span class="pun"> .. </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">size</span><span class="pun">.</span><span class="pln">y</span><span class="pun">)</span><span class="pln">
            settingsManager</span><span class="pun">:</span><span class="pln">Save</span><span class="pun">(</span><span class="pln">settings</span><span class="pun">)</span><span class="pln">
            Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🖥️</span> Resolución de escritorio guardada por primera vez: "</span><span class="pun"> .. </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"desktop_resolution"</span><span class="pun">])</span><span class="pln">
        </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
        Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🖥️</span> Usando resolución de escritorio en caché: "</span><span class="pun"> .. </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">cachedDesktopResolution</span><span class="pun">.</span><span class="pln">x</span><span class="pun">) .. </span><span class="str">"x"</span><span class="pun"> .. </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">cachedDesktopResolution</span><span class="pun">.</span><span class="pln">y</span><span class="pun">))</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">savedDesktopW</span><span class="pun"> = </span><span class="pln">cachedDesktopResolution</span><span class="pun">.</span><span class="pln">x
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">savedDesktopH</span><span class="pun"> = </span><span class="pln">cachedDesktopResolution</span><span class="pun">.</span><span class="pln">y

    </span><span class="com">-- Cargar o asignar resolución de ventana</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"resolution"</span><span class="pun">] </span><span class="kwd">then</span><span class="pln">
        </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">w</span><span class="pun">, </span><span class="pln">h</span><span class="pun"> = </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"resolution"</span><span class="pun">]:</span><span class="pln">match</span><span class="pun">(</span><span class="str">"(%d+)%s*x%s*(%d+)"</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">w</span><span class="pun"> </span><span class="kwd">and</span><span class="pun"> </span><span class="pln">h</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
            width</span><span class="pun"> = </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">w</span><span class="pun">)</span><span class="pln">
            height</span><span class="pun"> = </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">h</span><span class="pun">)</span><span class="pln">
            Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">📐</span> Resolución de ventana cargada desde config: "</span><span class="pun"> .. </span><span class="pln">width</span><span class="pun"> .. </span><span class="str">"x"</span><span class="pun"> .. </span><span class="pln">height</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">else</span><span class="pln">
            width</span><span class="pun"> = </span><span class="pln">width</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">800</span><span class="pln">
            height</span><span class="pun"> = </span><span class="pln">height</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">600</span><span class="pln">
        </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
        width</span><span class="pun"> = </span><span class="pln">width</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">800</span><span class="pln">
        height</span><span class="pun"> = </span><span class="pln">height</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="lit">600</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="com">-- Determinar modo ventana o fullscreen</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">fullscreen</span><span class="pun"> = </span><span class="kwd">false</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> = </span><span class="pln">settings</span><span class="pun">[</span><span class="str">"fullscreen"</span><span class="pun">]</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
        fs</span><span class="pun"> = </span><span class="pln">fs</span><span class="pun">:</span><span class="pln">lower</span><span class="pun">()</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"true"</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"1"</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"yes"</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
            fullscreen</span><span class="pun"> = </span><span class="kwd">true</span><span class="pln">
        </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">fullscreen</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
        style</span><span class="pun"> = </span><span class="pln">WINDOW_FULLSCREEN</span><span class="pun"> 
        </span><span class="pln">Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🖥️</span> Modo pantalla completa activado."</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
        style</span><span class="pun"> = </span><span class="pln">WINDOW_TITLEBAR
        Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🪟</span> Modo ventana activado."</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="com">-- Calcular posición centrada</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">posX</span><span class="pun"> = </span><span class="pln">savedDesktopW</span><span class="pun"> / </span><span class="lit">2</span><span class="pun"> - (</span><span class="pln">width</span><span class="pun"> / </span><span class="lit">2</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">posY</span><span class="pun"> = </span><span class="pln">savedDesktopH</span><span class="pun"> / </span><span class="lit">2</span><span class="pun"> - (</span><span class="pln">height</span><span class="pun"> / </span><span class="lit">2</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">window</span><span class="pun"> = </span><span class="pln">CreateWindow</span><span class="pun">(</span><span class="pln">title</span><span class="pun">, </span><span class="pln">posX</span><span class="pun">, </span><span class="pln">posY</span><span class="pun">, </span><span class="pln">width</span><span class="pun">, </span><span class="pln">height</span><span class="pun">, </span><span class="pln">display</span><span class="pun">, </span><span class="pln">style</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">framebuffer</span><span class="pun"> = </span><span class="pln">CreateFramebuffer</span><span class="pun">(</span><span class="pln">window</span><span class="pun">)</span><span class="pln">

    Print</span><span class="pun">(</span><span class="str">"[Window] Ventana creada con éxito: "</span><span class="pun"> .. </span><span class="pln">title</span><span class="pun">)</span><span class="pln">

    </span><span class="com">-- Métodos públicos</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">Closed</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">window</span><span class="pun">:</span><span class="pln">Closed</span><span class="pun">() </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">GetWindow</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">window</span><span class="pun"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">GetFramebuffer</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">framebuffer</span><span class="pun"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">KeyDown</span><span class="pun">(</span><span class="pln">key</span><span class="pun">) </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">window</span><span class="pun">:</span><span class="pln">KeyDown</span><span class="pun">(</span><span class="pln">key</span><span class="pun">) </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">GetWidth</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">width</span><span class="pun"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">GetHeight</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">height</span><span class="pun"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">GetTitle</span><span class="pun">() </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">title</span><span class="pun"> </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">SetTitle</span><span class="pun">(</span><span class="pln">newTitle</span><span class="pun">)</span><span class="pln">
        title</span><span class="pun"> = </span><span class="pln">newTitle
        window</span><span class="pun">:</span><span class="pln">SetTitle</span><span class="pun">(</span><span class="pln">newTitle</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">function</span><span class="pun"> </span><span class="pln">this</span><span class="pun">:</span><span class="pln">Destroy</span><span class="pun">()</span><span class="pln">
        window</span><span class="pun"> = </span><span class="kwd">nil</span><span class="pln">
        framebuffer</span><span class="pun"> = </span><span class="kwd">nil</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">self</span><span class="pun">.</span><span class="pln">settings</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
            self</span><span class="pun">.</span><span class="pln">settings</span><span class="pun">:</span><span class="pln">Destroy</span><span class="pun">()</span><span class="pln">
            self</span><span class="pun">.</span><span class="pln">settings</span><span class="pun"> = </span><span class="kwd">nil</span><span class="pln">
        </span><span class="kwd">end</span><span class="pln">
        Print</span><span class="pun">(</span><span class="str">"[Window] <span class="ipsEmoji">🧹</span> Recursos liberados correctamente."</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">this
</span><span class="kwd">end</span><span class="pln">

</span><span class="com">-- <span class="ipsEmoji">💾</span> Método estático para restaurar resolución desde el archivo temporal</span><span class="pln">
</span><span class="kwd">function</span><span class="pun"> </span><span class="pln">Window</span><span class="pun">.</span><span class="pln">RestoreFromTemp</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">sm</span><span class="pun"> = </span><span class="pln">SettingsManager</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">temp</span><span class="pun"> = </span><span class="pln">sm</span><span class="pun">:</span><span class="pln">LoadTemporary</span><span class="pun">()</span><span class="pln">

    </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">temp</span><span class="pun"> </span><span class="kwd">and</span><span class="pun"> </span><span class="pln">temp</span><span class="pun">[</span><span class="str">"resolution"</span><span class="pun">] </span><span class="kwd">then</span><span class="pln">
        </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">w</span><span class="pun">, </span><span class="pln">h</span><span class="pun"> = </span><span class="pln">temp</span><span class="pun">[</span><span class="str">"resolution"</span><span class="pun">]:</span><span class="pln">match</span><span class="pun">(</span><span class="str">"(%d+)%s*x%s*(%d+)"</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">w</span><span class="pun"> </span><span class="kwd">and</span><span class="pun"> </span><span class="pln">h</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
            </span><span class="kwd">local</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> = </span><span class="pln">temp</span><span class="pun">[</span><span class="str">"fullscreen"</span><span class="pun">]</span><span class="pln">
            </span><span class="kwd">if</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"1"</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"true"</span><span class="pun"> </span><span class="kwd">or</span><span class="pun"> </span><span class="pln">fs</span><span class="pun"> == </span><span class="str">"yes"</span><span class="pun"> </span><span class="kwd">then</span><span class="pln">
                fs</span><span class="pun"> = </span><span class="kwd">true</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
                fs</span><span class="pun"> = </span><span class="kwd">false</span><span class="pln">
            </span><span class="kwd">end</span><span class="pln">
            Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">🔁</span> Restaurando resolución temporal: "</span><span class="pun"> .. </span><span class="pln">w</span><span class="pun"> .. </span><span class="str">"x"</span><span class="pun"> .. </span><span class="pln">h</span><span class="pun"> .. </span><span class="str">" | fullscreen: "</span><span class="pun"> .. </span><span class="pln">tostring</span><span class="pun">(</span><span class="pln">fs</span><span class="pun">))</span><span class="pln">
            </span><span class="kwd">return</span><span class="pun"> </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">w</span><span class="pun">), </span><span class="pln">tonumber</span><span class="pun">(</span><span class="pln">h</span><span class="pun">), </span><span class="pln">fs
        </span><span class="kwd">end</span><span class="pln">
    </span><span class="kwd">end</span><span class="pln">

    Print</span><span class="pun">(</span><span class="str">"<span class="ipsEmoji">⚠️</span> No se pudo restaurar resolución: archivo temporal no encontrado o malformado."</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">return</span><span class="pun"> </span><span class="kwd">nil</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

</span><span class="kwd">return</span><span class="pun"> </span><span class="pln">Window</span></pre>

		<p>
			 
		</p>
	</li>
</ol>
]]></description><guid isPermaLink="false">2870</guid><pubDate>Sun, 06 Apr 2025 17:50:43 +0000</pubDate></item><item><title>Exploring New Horizons: My Journey with Ultra Engine and Realistic Map Development</title><link>https://www.leadwerks.com/community/blogs/entry/2845-exploring-new-horizons-my-journey-with-ultra-engine-and-realistic-map-development/</link><description><![CDATA[<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="20505" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2024_06/image.png.706e00929853e4f09774230b9ae712c4.png" rel=""><img alt="image.thumb.png.2d3011990977c182870eeab40f325a6f.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20505" data-ratio="54.27" style="height:auto;" width="750" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2024_06/image.thumb.png.2d3011990977c182870eeab40f325a6f.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png"></a>
</p>

<p>
	 
</p>

<p>
	In the thrilling world of game development, I've had the incredible opportunity to work with Ultra Engine, a platform in early access that has opened up countless possibilities for creating impressive worlds. My latest project focuses on mapping, a process that has allowed me not only to explore the capabilities of Ultra Engine's map editor but also to actively contribute to its development by identifying and reporting bugs.
</p>

<p>
	From the start, I have created numerous prototypes, experimenting with brushes, adjusting scales, applying textures, and gaining a better understanding of PBR (Physically Based Rendering) materials and PBR lighting. This learning journey has been incredibly enriching, allowing me to understand how diffuse textures, cubemaps, and specular textures work together to create a visually appealing environment.
</p>

<p>
	One of the most fascinating aspects of this process has been lighting. Learning to use light probes to make lighting more realistic and understanding light bounce has been a rewarding challenge. Light probes not only simulate reflection at a local level but also add a level of realism that brings the environment to life. Every time I use a probe, I can see how the lighting changes and reflects on the textures and surfaces of the map, creating a visually coherent and immersive experience.
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2024_06/image.png.ee3ce8bd18563d582f122bc9e43bf8b1.png" data-fileid="20516" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="20516" data-ratio="56.40" width="750" alt="image.thumb.png.5f113f8187743e2661b081435d85a54d.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2024_06/image.thumb.png.5f113f8187743e2661b081435d85a54d.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png"></a>
</p>

<p>
	Despite the challenges, such as issues with prefabs and the precision of the editor's grid, each obstacle has been an opportunity to learn and improve. Prefabs, although still in development, have been a crucial piece in constructing my base on Mars. The editor's grid, while not always precise when scaling, has been fundamental in structuring and organizing the elements of my map.
</p>

<p>
	My approach has been learning by doing, repeating processes over and over until I perfect my skills. This methodology has not only improved my proficiency in using the map editor but also allowed me to better understand the limitations and potential of Ultra Engine.
</p>

<p>
	I hope that future updates will resolve the issues with prefabs and enhance the precision of the editor's grid. This will enable me to focus even more on developing my base on Mars, taking the project to new heights.
</p>

<p>
	Working with Ultra Engine has been a transformative experience, and I am excited to continue exploring and creating on this platform. If you are interested in game development and want to be part of a growing community, I encourage you to join us on this adventure. Creating and exploring new worlds awaits you!<img alt="Mars.jpg.89ab63a64eebc1f5ada0ab82b66a1f8c.jpg" class="ipsImage ipsImage_thumbnailed" data-extension="core_Attachment" data-fileid="20487" data-ratio="29.01" style="height:auto;" width="524" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2024_06/Mars.jpg.89ab63a64eebc1f5ada0ab82b66a1f8c.jpg" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png">
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2845</guid><pubDate>Wed, 05 Jun 2024 01:14:00 +0000</pubDate></item><item><title>My game in development | Astrocuco</title><link>https://www.leadwerks.com/community/blogs/entry/2745-my-game-in-development-astrocuco/</link><description><![CDATA[<p>
	We are already in 2022, and we continue to do things in order to learn, to understand how to design a video game.
</p>

<p>
	To date, Astrocuco is the result of many intermittent years of learning where the challenge is always the same, to create prototypes of how programming works.
</p>

<p>
	What I have learned, I have managed to master to an acceptable degree the subject of programming, understand concepts of classes, objects and most importantly apply them when writing code, in this case Lua Script. This has helped me a lot to focus my efforts in writing readable, reusable code, where I can understand what it does, why it is done and how to use it.
</p>

<p>
	At this point the future game is about a teenage girl who lands in emergency on the red planet and her mission is to stay alive, initially pending her health, stamina and oxygen. About the character I can say that it represents a very personal aspect of my life with my daughter who today is 18 years old, and somehow I want to capture in the game a very personal situation.
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed ipsAttachLink_image ipsAttachLink_right" data-fileid="16857" data-ratio="63.34" style="width:611px;height:auto;float:right;" width="611" alt="Daniela.png.ba254beafbae73883b99a6b430d11ea2.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Daniela.png.ba254beafbae73883b99a6b430d11ea2.png">
</p>

<p>
	The character initially has two accessories, a helmet and a backpack.  And his life, stamina and oxygen are measured with a Hud system that is positioned in the upper right corner.
</p>

<p>
	The character initially has two accessories, a helmet and a backpack.  And his life, stamina and oxygen are measured with a Hud system that is positioned in the upper right corner.
</p>

<p>
	Although I can model characters and animate them, they would never look professional, so I resort to external tools like Mixamo to animate biped characters and to create them I use tools like Fuse, both systems are currently free.
</p>

<p>
	In this case the head of the character is created with Fuse, and the body of the character has its own story.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:36px;"><span style="color:#e74c3c;">The initial character</span> </span></strong>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image ipsAttachLink_right" href="https://leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Original.png.f48421f00281e79ea612d7d30cd02ae8.png" style="float:right;" rel="external nofollow"><img class="ipsImage ipsImage_thumbnailed" data-fileid="16858" data-ratio="113.81" style="width:200px;height:auto;" width="659" alt="Original.thumb.png.524df9623e617da6b4ab5e4b5efde2ea.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Original.thumb.png.524df9623e617da6b4ab5e4b5efde2ea.png"></a>
</p>

<p>
	The initial character was purchased from an art store and looked very different from what he is now.  The changes arose due to the family situation we are going through and I decided to give her a more human aspect where the model pretends to be my daughter on the red planet (cancer). Then as the model underwent these changes to with the Fragmotion program which is for 3D modeling and where he received a successful head transplant.  The rigging is created automatically by Mixamo and in the process the character is what it is today.
</p>

<p>
	I have to mention that I am not an expert in 3D art and the only tool I use is Fragmotion, where I can create basic architectural and organic models and give them an animation, but I would not have professional results like Mixamo and Fuse (free tools).
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:36px;"><span style="color:#e74c3c;">The creation process</span></span></strong>
</p>

<p>
	I am not an expert in this, I have gone through a lot of engines, each one with its pros and cons, however I highlight that Leadwerks engine is just what I need from a technical aspect where my computer runs it very well. ( Hardware from a decade ago ). I love writing scripts compared to visual systems that offer other environments, so this is more for personal taste and circumstances. 
</p>

<p>
	The most difficult thing at this point is to learn something and then put it into practice, for me this is a great achievement because I do not speak English and my learning process is usually complex. For some reason I am going a little slower but consolidating knowledge, making me skilled in this tool.
</p>

<p>
	So it is where for several years I have been trying to make the ragdoll effect, and evidently it could be done, not that it is perfect, but in the end it is a game and I am not creating a simulator of life. But I'm happy with the result, although partly because I would have liked the character to stand up.  I am convinced that it can be done, however I don't want to invest more time in this and rather as soon as possible to have a playable demo.  The problem to make the character stand up has to do with bones, rigid bodies and currently I use SetParent to hook the bones to those rigid bodies, but this prevents to free the skeleton to use it in an animation, the most reasonable would be to use SetPosition, SetRotation, but you see strange effects that surely have a solution, but would involve a process of learning and understanding to achieve the goal to stand up, such as detecting that the character is with his chest against the ground or back and unleash an animation to stand up. But possibly in the future it could be done. 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image ipsAttachLink_right" href="https://leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Ragdoll.png.584146e228f6a058b2f5454a149177f7.png" style="float:right;" rel="external nofollow"><img class="ipsImage ipsImage_thumbnailed" data-fileid="16859" data-ratio="75.47" style="width:750px;height:auto;" width="750" alt="Ragdoll.thumb.png.b18fc0626959fdecd09424666d893a43.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Ragdoll.thumb.png.b18fc0626959fdecd09424666d893a43.png"></a>
</p>

<p>
	Doing this part of the ragdoll involves being aware of many things, the most complicated thing for me to make a game is to unite several systems and that all work as a gear in a harmonious way, I always emphasize I am not an expert in this, but I get by with the way I have learned, and something that happens is that when we learn by our means, what will happen is that we learn wrong in a high degree of percentage. 
</p>

<p>
	For example when the character dies, it was a tremendous problem because I could not return it to its initial position, like a checkpoint, and what happened was that I loaded the character on the map. The solution was to load the character by means of script in a global variable, to later eliminate it of the memory but not if before loading it again, apparently what it does is not to load it from the hard disk, but from the memory where the other one was. 
</p>

<p>
	 
</p>

<p>
	But at the moment for me this is a feat, this works and all my experience is based as a player. 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:36px;"><span style="color:#e74c3c;">User-facing parts of the project</span></span></strong>
</p>

<p>
	When the user launches the application, he will initially see a representative drawing of Mars, with a sign that reads the name of the game. ( Astrocuco).
</p>

<p>
	The interesting thing about this is that I have put a fade in and fade out effect on each scene like this. For example when entering the menu it appears little by little and when leaving it happens the same way.
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Splash.png.ebeabe198ef18acca35ce5503c389403.png" rel="external nofollow"><img class="ipsImage ipsImage_thumbnailed" data-fileid="16860" data-ratio="72.00" style="width:750px;height:auto;" width="750" alt="Splash.thumb.png.0a47a3fd687ef76298a2ddf33c2686ae.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Splash.thumb.png.0a47a3fd687ef76298a2ddf33c2686ae.png"></a>
</p>

<p>
	 
</p>

<p>
	Subsequently, the menu is passed in 3D, a scene of a place that is intended to simulate a spatial environment of loading and unloading of resources. 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Menu3D.png.0ca81606b375ba3af7abc6fd81b934e1.png" data-fileid="16861" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="16861" data-ratio="56.40" width="750" alt="Menu3D.thumb.png.37c40b65f0a1cd893a16b8d70c91c7f7.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Menu3D.thumb.png.37c40b65f0a1cd893a16b8d70c91c7f7.png"></a>
</p>

<p>
	This menu is a prototype of what should be in the future, more specifically in the options section, where initially the player can change the screen resolution, or switch from windows windowed mode to full screen ( It works <img alt=":D" data-emoticon="" height="20" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" srcset="https://leadwerksstorage.s3.us-east-2.amazonaws.com/emoticons/biggrin@2x.png 2x" title=":D" width="20" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/emoticons/default_biggrin.png"> )
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Options.png.80ce7ee02a82e08e6a581f6467d2b2cc.png" data-fileid="16862" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="16862" data-ratio="56.40" width="750" alt="Options.thumb.png.419c86db9b097fd8cb261444427f008d.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2022_01/Options.thumb.png.419c86db9b097fd8cb261444427f008d.png"></a>
</p>

<p>
	 
</p>

<p>
	I have to comment that creating the resolution change and all this was a kick in the balls as well as the ragdoll. But in the end it works and that is gratifying from a developer's point of view.
</p>

<p>
	 
</p>

<p>
	To finish I have to work on gameplay aspects, in the future I need a radar or a compass, also a simple inventory GUI. The idea is to collect certain elements (scrap, Polymer and other things to make things and repair them. I am aware that this prototype is very basic, and I don't know if I really make a game of this, but I have an 18 year old girl who tells me which looks very good, and it usually happens that over the years in my case we lose our ingenuity and see the world as children do not see it.
</p>

<p>
	So my daughter wants to see the game on Steam, would it be possible? I'm very pessimistic, but my daughter thinks so.
</p>

<p>
	So without further ado, we'll see you later.
</p>

<p>
	I would like to know your opinion, constructive and realistic criticism, you do not have to hurt my feelings, I highly value sincerity.
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2745</guid><pubDate>Fri, 21 Jan 2022 16:35:32 +0000</pubDate></item><item><title>Scripting tutorial in Leadwerks development environment</title><link>https://www.leadwerks.com/community/blogs/entry/2656-scripting-tutorial-in-leadwerks-development-environment/</link><description><![CDATA[<p>
	I do not pretend that this tutorial is an absolute truth, it is just how I have learned to do things, very possibly I am wrong, but always willing to learn. 
</p>

<p>
	When programming, it is extremely necessary to plan what you want to do, a coding project should be divided into blocks, function files. 
</p>

<p>
	It is like writing a book, by pages, by chapters, I speak of a book of modern times, those books that you can touch and pass its pages with a finger wet in saliva, of course because of the pandemic I think that is a danger to do.
</p>

<p>
	<br>
	<img alt="Resultado de imagen de Libro" data-ratio="84.00" width="750" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="https://staticr1.blastingcdn.com/media/photogallery/2017/3/16/660x290/b_1200x630/libro-la-leccion-de-vida-de-alicia-todos-somos-uno-com-mx_1210369.jpg">
</p>

<p>
	 
</p>

<p>
	Well, it is another thing to make a codification as if we were in the first century of our era writing the history of Egypt on a parchment.<br>
	<br>
	<img alt="Resultado de imagen de rollos mar muerto" data-ratio="56.29" width="620" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="https://static2.abc.es/media/ciencia/2019/09/06/viewer-Isaiah-kDrE--620x349@abc.jpg">
</p>

<p>
	 
</p>

<p>
	What I mean by these two examples of the book and the papyrus is that it is good to break the whole code into parts, as when you create a wall, which is made up of much smaller blocks. Unless you are a machine, you will surely put all the code of the player entity in a single script (scroll), but as I have found it easier and more comfortable to simulate a development environment focused on object programming in Lua Script. 
</p>

<p>
	And how do I do this, through the use of tables. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">function Script:Start()


end</span></pre>

<p>
	This is the Start function of a file attached to a player entity. Inside it I can put everything I can think of for the player entity, ragdoll effect, movement, hud system for life indicators, oxygen, animations, etc.  But I feel more comfortable splitting this into files, let's see an example.
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">import</span><span class="pun">(</span><span class="str">"Scripts/Objects/Player/Classes/CPlayer.lua"</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> Script</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">


		self</span><span class="pun">.</span><span class="pln">player </span><span class="pun">=</span><span class="pln"> CPlayer</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">

</span><span class="kwd">end</span></pre>

<p>
	With the Import command, I link another file called CPlayer ( Player Class ), remember this is a kind of simulation of classes and objects. 
</p>

<p>
	And in that file I have the following. 
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">import</span><span class="pun">(</span><span class="str">"Scripts/Objects/Player/Classes/CRagDoll.lua"</span><span class="pun">)</span><span class="pln">

CPlayer</span><span class="pun">={}</span><span class="pln">
	</span><span class="kwd">function</span><span class="pln"> CPlayer</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">

		</span><span class="kwd">local</span><span class="pln"> this</span><span class="pun">={}</span><span class="pln">
			this</span><span class="pun">.</span><span class="pln">ragDoll </span><span class="pun">=</span><span class="pln"> CRagDoll</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">
			
			

			
			
			

			</span><span class="kwd">function</span><span class="pln"> this</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">

		
			</span><span class="kwd">end</span><span class="pln">

			this</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">

		</span><span class="kwd">return</span><span class="pun">(</span><span class="pln"> this </span><span class="pun">)</span><span class="pln">
	</span><span class="kwd">end</span></pre>

<p>
	As you can see, inside that CPlayer file, I import another file called CRagdoll, and the principle is totally the same, I repeat this is the way I have found this is more comfortable for me, possibly you feel better putting everything in one file.<br>
	<br>
	<br>
	<strong><span style="font-size:18px;">What is a class?</span></strong><br>
	 
</p>

<p>
	The best way to understand what a class is, is to think of a cookie mold, from which many cookie objects come out, these objects differ from each other in the flavor of the cookie, its color, its texture. That is to say, from a House class, we can create many houses, where their properties such as color and materials vary a little, making each house different. 
</p>

<p>
	 
</p>

<p>
	So let's create a Globe class in Lua Script.<br>
	<br>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">CGlobe</span><span class="pun">={}</span><span class="pln">
	
	</span><span class="kwd">function</span><span class="pln"> CGlobe</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">




	</span><span class="kwd">end</span></pre>

<p>
	That's how simple we create our mock class in Lua, a balloon class, where we create balloon objects. The next step is to define the properties of the balloon object, for example its color.
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">CGlobe</span><span class="pun">={}</span><span class="pln">
	
	</span><span class="kwd">function</span><span class="pln"> CGlobe</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">

			</span><span class="kwd">local</span><span class="pln"> this</span><span class="pun">={}</span><span class="pln">
  
  				this</span><span class="pun">.</span><span class="pln">color </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Red"</span><span class="pln">
  
  			</span><span class="kwd">function</span><span class="pln"> this</span><span class="pun">:</span><span class="pln">Create</span><span class="pun">()</span><span class="pln">
				System</span><span class="pun">:</span><span class="pln">Print</span><span class="pun">(</span><span class="str">"Create Globe... OK!)
			end
    		this:Create()

			function this:SetColor(color)
      				this.color = color
      		end
    
    		function this:GetColor()
      				return ( this.color )
      		end
      		
			return ( this )

	end</span></pre>

<p>
	At this point I create the constructor of the object, it is simply the New function, which returns me the table this, and this calls the start function, creating a default object of red color. 
</p>

<p>
	We have two methods or functions, SetColor, to give a new color to the balloon, and one called GetColor to retrieve the color of the balloon<br>
	<br>
	It should be noted that by handling this file system, you can have a large number of well-organized "objects" on your project that do something. In this case you can create different balloons of different colors.
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">import</span><span class="pun">(</span><span class="str">"Scripts/Objects/Player/Classes/CGlobe.lua"</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> Script</span><span class="pun">:</span><span class="pln">Start</span><span class="pun">()</span><span class="pln">
	self</span><span class="pun">.</span><span class="pln">myGlobeRed </span><span class="pun">=</span><span class="pln"> CGlobe</span><span class="pun">:</span><span class="pln">Create</span><span class="pun">()</span><span class="pln">
	
	System</span><span class="pun">:</span><span class="pln">Print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">myGlobeRed</span><span class="pun">:</span><span class="pln">GetColor</span><span class="pun">())</span><span class="pln">

	self</span><span class="pun">.</span><span class="pln">myGlobeOrange </span><span class="pun">=</span><span class="pln"> CGlobe</span><span class="pun">:</span><span class="pln">Create</span><span class="pun">()</span><span class="pln">
	self</span><span class="pun">.</span><span class="pln">myGlobeOrange</span><span class="pun">:</span><span class="pln">SetColor</span><span class="pun">(</span><span class="str">"Orange"</span><span class="pun">)</span><span class="pln">


</span><span class="kwd">end</span></pre>

<p>
	This is the idea I want to convey, dividing a project into smaller parts will make your life much easier. <img alt="viewer-Isaiah-kDrE--620x349@abc.jpg" class="ipsImage" data-ratio="56.29" height="349" width="620" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="https://static2.abc.es/media/ciencia/2019/09/06/viewer-Isaiah-kDrE--620x349@abc.jpg">
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2656</guid><pubDate>Sat, 06 Feb 2021 20:47:00 +0000</pubDate></item><item><title>Prototype of Mars!!</title><link>https://www.leadwerks.com/community/blogs/entry/2481-prototype-of-mars/</link><description><![CDATA[<p>
	It's interesting that when you become an expert on something, you're not sparing any effort to see how something works, but rather you're focusing on creating something. And so everything becomes easier.
</p>

<p>
	At this point of learning there is a glimpse of a low idea of creating a game, but the secret of all this is to keep it simple and to be very clear that a game is a game, and not an exact simulation of the real world. For example anyone who has a low idea of the red planet, will understand no matter the colors of the scene that is a terrain of Mars, even if it is not very real what is transmitted, a game, that's just it.
</p>

<p>
	At this point I already have an astronaut character who runs from one place to another on a very large 4096 x 4046 terrain that would surely take a long walk. My previous prototype projects involve a vehicle, but I didn't get the best implementation prospect in that time and I always found performance problems in my machine, something that isn't happening with the character controller for a third person player. 
</p>

<p>
	As always, I think I'm a scavenger looking for game resources, that's where this community exposes links to websites with interesting hd textures, and one or another model searched on the net, but what I've greatly improved is learning to write code, I have a better workflow, writing Lua code focused on the paradigm of object programming.
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="14215" data-ratio="62.61" width="920" alt="image.png.d6a7a28efe64302299906f13c12855a4.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.d6a7a28efe64302299906f13c12855a4.png">
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="14216" data-ratio="62.61" width="920" alt="image.png.9b260dc49ab55933bf836c000674caac.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.9b260dc49ab55933bf836c000674caac.png">
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.a7ac138609f568dc67e6f76385e6ec84.png" data-fileid="14217" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="14217" data-ratio="75.00" width="1000" alt="image.thumb.png.f16079230262edd7da29ca337373b1ca.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.thumb.png.f16079230262edd7da29ca337373b1ca.png"></a>
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="344" width="459" src="https://www.ultraengine.com/community/applications/core/interface/index.html" data-embed-src="https://www.youtube.com/embed/W3Kfs8T-2Ao?feature=oembed"></iframe>
	</div>
</div>

<p>
	Something interesting is the system of putting rocks, all very nice from the point of implementing them. And it works very well with the character controller if you put collision in cube form.
</p>

<p>
	I've been thinking about implementing a car system, I think it would be necessary in such a large terrain, but I think it's not the time, my previous experience, involves deterioration in performance and something I think is the physics of the car with respect to the terrain and rocks that in the previous project involve deterioration in the fps. Although if you implement a car would have an option would be to remove the rocks, but I prefer not to have a car and if you have rocks. 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2481</guid><pubDate>Wed, 13 Nov 2019 20:03:57 +0000</pubDate></item><item><title>A simple prototype</title><link>https://www.leadwerks.com/community/blogs/entry/2476-a-simple-prototype/</link><description><![CDATA[<p>
	Coming to the end of my prototype of a 3d game, and with background music by Hanz Zimmer ( Time ). I saw my progress in many aspects, always something to learn, always something to improve, I didn't intend to make a game, that has never been the goal. 
</p>

<p>
	Rather, the effort and dedication immeasurably, was to improve on something learned. And here I was with the powerful leadwerks engine, where his greatest power lay in making everything very easy.  
</p>

<p>
	<strong>About the project</strong>
</p>

<p>
	The prototype is very simple, a third person character goes through a stage, an orbital camera that follows him with many interesting things when scripting.  A character who runs, walks, ducks, jumps, and suffers damage when he falls from different heights. 
</p>

<p>
	The interesting thing about all this is that just like when you're little and learn to write, repetition is key to learning to program, understand concepts and improve.  So as I've always said, you learn to program by programming, although I sincerely think that lua script is not programming, but the experts say it is, so I go into that elitism of those of us who think we are programmers. 
</p>

<p>
	The final part of the project consists of creating a death animation, this will be activated when the player falls from a high part and separates the legs (that is very cruel). 
</p>

<p>
	But that feeling of improvement is the same that I feel when in the mornings when I have a coffee I solve a riddle of the newspaper, but I don't know when I'm going to stop, it turns out and it happens that technology advances very fast and this continues and continues without stopping. Starting with LE 5, and the only thing that can happen is that I die or that my old computer doesn't work anymore. 
</p>

<p>
	Translated with www.DeepL.com/Translator<br>
	<br>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.06238fd4660b7710a8fb0f9b2b1855cf.png" data-fileid="14181" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="14181" data-ratio="53.70" width="1000" alt="image.thumb.png.145a1f2e45e223caa31ce25c04765b82.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.thumb.png.145a1f2e45e223caa31ce25c04765b82.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.b6dbb6697856333cc5ad0dff734157cc.png" data-fileid="14184" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="14184" data-ratio="53.70" width="1000" alt="image.thumb.png.a4c4bd0c1e4ccc929b2d2af285f65b26.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.thumb.png.a4c4bd0c1e4ccc929b2d2af285f65b26.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.f1a6fb808b03c4fbe1c8603c6043ef72.png" data-fileid="14183" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="14183" data-ratio="56.30" width="1000" alt="image.thumb.png.e18ebd3ae711e3430aa2940336832fa5.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.thumb.png.e18ebd3ae711e3430aa2940336832fa5.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.png.f473000ac7a831f53cb4b75247d4efd5.png" data-fileid="14182" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="14182" data-ratio="75.40" width="1000" alt="image.thumb.png.30287e4130b118f2bf5fbd00fae288a8.png" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_11/image.thumb.png.30287e4130b118f2bf5fbd00fae288a8.png"></a>
</p>
]]></description><guid isPermaLink="false">2476</guid><pubDate>Wed, 06 Nov 2019 17:37:36 +0000</pubDate></item><item><title>Shock absorbers !!</title><link>https://www.leadwerks.com/community/blogs/entry/2439-shock-absorbers/</link><description><![CDATA[<p>
	<a href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_07/CodeAmortiguadores.jpg.3c7d9bf110e97aa9ade8c34592117056.jpg" data-fileid="13900" data-fileext="jpg" rel=""><img data-fileid="13900" data-ratio="20.00" width="1000" alt="CodeAmortiguadores.thumb.jpg.d413598d95bbcd3f39d9617500aa9144.jpg" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_07/CodeAmortiguadores.thumb.jpg.d413598d95bbcd3f39d9617500aa9144.jpg"></a><br>
	<br>
	There is always something new to learn, and when my native language is not English, there is a way of learning called brute force, this leads to two things, first, you learn, and second a high percentage is learning to do things wrong, of course not always.
</p>

<p>
	Today I had a kind of Eureka, I actually discovered how to properly implement the sliding joints to create springs for a vehicle, the point here is to get to understand how this should work and I think I've achieved it. In the end I'm left with the doubt of whether I have a learning disability, because torture is the same as always, trial and error. 
</p>

<p>
	Translated with www.DeepL.com/Translator<br>
	<br>
	<br>
	<a href="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_07/Amortiguadores.jpg.e21be1b6978eac36295421b831f95033.jpg" data-fileid="13902" data-fileext="jpg" rel=""><img data-fileid="13902" data-ratio="56.40" width="1000" alt="Amortiguadores.thumb.jpg.939c53ba9a2fdc6079efee06d6a1856f.jpg" src="https://www.ultraengine.com/community/applications/core/interface/js/spacer.png" data-src="//leadwerksstorage.s3.us-east-2.amazonaws.com/monthly_2019_07/Amortiguadores.thumb.jpg.939c53ba9a2fdc6079efee06d6a1856f.jpg"></a>
</p>

<p>
	 
</p>

<p>
	<br>
	So I expose the code to recreate the shock absorbers, it should be noted that only I understand this, because I do not give any explanation regarding the case, but it works.<br>
	<br>
	 
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted">
<span class="pln">cVehicle</span><span class="pun">={}</span><span class="pln">

	</span><span class="kwd">function</span><span class="pln"> cVehicle</span><span class="pun">:</span><span class="pln">New</span><span class="pun">()</span><span class="pln">
		
		</span><span class="kwd">local</span><span class="pln"> this </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
	

		this</span><span class="pun">.</span><span class="pln">mesh </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
		
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis     </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
	
		
		</span><span class="com">--## pivots Springs. </span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFL    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFR    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBL    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBR    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		
		</span><span class="com">--## Meshs Wheels.</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelFL    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelFR    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelBL    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelBR    </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		
		</span><span class="com">--## Meshs Axles Dir.</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">AxleL      </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln"> 
		this</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">AxleR      </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln">
		
		</span><span class="com">--## Motor Springs.</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">={}</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">force </span><span class="pun">=</span><span class="pln"> </span><span class="lit">300</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">={}</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Down </span><span class="pun">=</span><span class="pln"> </span><span class="lit">-0.5</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Up </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln">
		this</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">={}</span><span class="pln">


		
		</span><span class="kwd">function</span><span class="pln"> this</span><span class="pun">:</span><span class="pln">StartSystem</span><span class="pun">(</span><span class="pln"> springs</span><span class="pun">,</span><span class="pln"> wheels</span><span class="pun">,</span><span class="pln"> axles</span><span class="pun">,</span><span class="pln"> chassis</span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis   </span><span class="pun">=</span><span class="pln"> chassis
			
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFL 	</span><span class="pun">=</span><span class="pln"> springs</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFR 	</span><span class="pun">=</span><span class="pln"> springs</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBL 	</span><span class="pun">=</span><span class="pln"> springs</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBR 	</span><span class="pun">=</span><span class="pln"> springs</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelFL  	</span><span class="pun">=</span><span class="pln"> wheels</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelFR  	</span><span class="pun">=</span><span class="pln"> wheels</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelBL  	</span><span class="pun">=</span><span class="pln"> wheels</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">WheelBR  	</span><span class="pun">=</span><span class="pln"> wheels</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">AxleL		</span><span class="pun">=</span><span class="pln"> axles</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">AxleR		</span><span class="pun">=</span><span class="pln"> axles</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			
			self</span><span class="pun">:</span><span class="pln">StartMotorSprings</span><span class="pun">()</span><span class="pln">

		</span><span class="kwd">end</span><span class="pln">

		</span><span class="kwd">function</span><span class="pln"> this</span><span class="pun">:</span><span class="pln">StartMotorSprings</span><span class="pun">()</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFL</span><span class="pun">:</span><span class="pln">GetPosition</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> Joint</span><span class="pun">:</span><span class="pln">Slider</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">x</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">y</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">z</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFL</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis </span><span class="pun">)</span><span class="pln"> 
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]:</span><span class="pln">EnableLimits</span><span class="pun">()</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]:</span><span class="pln">SetLimits</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Down</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Up</span><span class="pun">)</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]:</span><span class="pln">SetSpring</span><span class="pun">(</span><span class="pln"> this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">force </span><span class="pun">)</span><span class="pln">
			
			self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFR</span><span class="pun">:</span><span class="pln">GetPosition</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> Joint</span><span class="pun">:</span><span class="pln">Slider</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">x</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">y</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">z</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringFR</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis </span><span class="pun">)</span><span class="pln"> 
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]:</span><span class="pln">EnableLimits</span><span class="pun">()</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]:</span><span class="pln">SetLimits</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Down</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Up </span><span class="pun">)</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]:</span><span class="pln">SetSpring</span><span class="pun">(</span><span class="pln"> this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">force </span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBL</span><span class="pun">:</span><span class="pln">GetPosition</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> Joint</span><span class="pun">:</span><span class="pln">Slider</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">].</span><span class="pln">x</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">].</span><span class="pln">y</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">].</span><span class="pln">z</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBL</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis </span><span class="pun">)</span><span class="pln"> 
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]:</span><span class="pln">EnableLimits</span><span class="pun">()</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]:</span><span class="pln">SetLimits</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Down</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Up </span><span class="pun">)</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]:</span><span class="pln">SetSpring</span><span class="pun">(</span><span class="pln"> this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">force </span><span class="pun">)</span><span class="pln">
			
			self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBR</span><span class="pun">:</span><span class="pln">GetPosition</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">

			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> Joint</span><span class="pun">:</span><span class="pln">Slider</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">x</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">y</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">z</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="pln">self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">SpringBR</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis </span><span class="pun">)</span><span class="pln"> 
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]:</span><span class="pln">EnableLimits</span><span class="pun">()</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]:</span><span class="pln">SetLimits</span><span class="pun">(</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Down</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">limits</span><span class="pun">.</span><span class="pln">Up </span><span class="pun">)</span><span class="pln">
			self</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]:</span><span class="pln">SetSpring</span><span class="pun">(</span><span class="pln"> this</span><span class="pun">.</span><span class="pln">motorSprings</span><span class="pun">.</span><span class="pln">force </span><span class="pun">)</span><span class="pln">

		</span><span class="kwd">end</span><span class="pln">


		</span><span class="kwd">function</span><span class="pln"> this</span><span class="pun">:</span><span class="pln">Update</span><span class="pun">()</span><span class="pln">


			</span><span class="kwd">if</span><span class="pln"> Window</span><span class="pun">:</span><span class="pln">GetCurrent</span><span class="pun">():</span><span class="pln">KeyDown</span><span class="pun">(</span><span class="pln">Key</span><span class="pun">.</span><span class="pln">J</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">then</span><span class="pln">
				self</span><span class="pun">.</span><span class="pln">mesh</span><span class="pun">.</span><span class="pln">chassis</span><span class="pun">:</span><span class="pln">AddForce</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">150</span><span class="pun">,</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
				
			</span><span class="kwd">end</span><span class="pln">
				
		</span><span class="kwd">end</span><span class="pln">
		
		
		
		

	



		</span><span class="kwd">return</span><span class="pln"> this 
	</span><span class="kwd">end</span></pre>

<p>
	And there's still the question of whether this is well implemented, but I guess I've learned something new.<br>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="270" width="480" src="https://www.ultraengine.com/community/applications/core/interface/index.html" data-embed-src="https://www.youtube.com/embed/mzp_45tIAV0?feature=oembed"></iframe>
	</div>
</div>
]]></description><guid isPermaLink="false">2439</guid><pubDate>Fri, 19 Jul 2019 19:27:39 +0000</pubDate></item></channel></rss>
