<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://devmauvillegas.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://devmauvillegas.github.io/" rel="alternate" type="text/html" /><updated>2026-05-16T19:10:05+00:00</updated><id>https://devmauvillegas.github.io/feed.xml</id><title type="html">Martin Villegas Garcia</title><subtitle>Game Programmer</subtitle><author><name>Martin Villegas Garcia</name></author><entry><title type="html">Patterns: Command</title><link href="https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Command-Pattern/" rel="alternate" type="text/html" title="Patterns: Command" /><published>2025-06-22T00:00:00+00:00</published><updated>2025-06-22T00:00:00+00:00</updated><id>https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Command-Pattern</id><content type="html" xml:base="https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Command-Pattern/"><![CDATA[<h1 id="command-pattern">Command Pattern</h1>

<p>Hello! This is Game Programming Patterns 101 and this video is about the Command Pattern.</p>

<p>Going straight to the point, there’s two definitions we can use:</p>
<ol>
  <li>The original one, from the gang of four original book, where almost all known patterns were first explained formally.</li>
  <li>And the one offered by wikipedia because this is the internet.</li>
</ol>

<h3 id="book-definition">Book Definition</h3>
<p>As the book defines: Encapsulate a request as an object thereby letting users parameterize clients with different requests, queue or log requests, and support undoable operations.</p>

<h3 id="wiki-definition">Wiki definition</h3>
<p>And as wikipedia defines: .. An object is used to encapsulate all information needed to perform an action or trigger an event at a later time.</p>

<p>Both definitions mean taking some concept and turning it into a piece of data, an object in our case, that you can stick in a variable, pass to a function, store or whatever.</p>

<p>To picture it better, we can make an example.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">InputHandler</span><span class="o">::</span><span class="n">handleInput</span><span class="p">()</span>
<span class="p">{</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_X</span><span class="p">))</span> <span class="n">jump</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_Y</span><span class="p">))</span> <span class="n">fireGun</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_A</span><span class="p">))</span> <span class="n">swapWeapon</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_B</span><span class="p">))</span> <span class="n">lurchIneffectively</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Imagine we are handling our inputs like this. Not too flexible since the mapping of buttons and actions is hardcoded and once the action was made, it disappear, no record, no nothing.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Command</span> <span class="p">{</span>
<span class="nl">public:</span>
	<span class="k">virtual</span> <span class="o">~</span><span class="n">Command</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">execute</span><span class="p">()</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>To make it better, we can add something in between the handler function and the ultimate action.</p>

<p>Introducing the core concept of the command pattern. An empty abstract class that’s gonna be used to create our commands inheriting from it. Like, for example, <code class="language-plaintext highlighter-rouge">Jump()</code></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">JumpCommand</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Command</span> <span class="p">{</span>
<span class="nl">public:</span>
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">execute</span><span class="p">()</span> <span class="p">{</span> <span class="n">jump</span><span class="p">();</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The JumpCommand class inherits from the base one, Command.</p>

<p>Something we’re going to have in all commands is the <code class="language-plaintext highlighter-rouge">execute()</code> function. In each derived class, we’re going to implement the action we really need in there.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">InputHandler</span> <span class="p">{</span>
<span class="nl">public:</span>
	<span class="kt">void</span> <span class="n">handleInput</span><span class="p">();</span>
<span class="nl">private:</span>
	<span class="n">Command</span><span class="o">*</span> <span class="n">buttonX</span><span class="p">;</span>
	<span class="n">Command</span><span class="o">*</span> <span class="n">buttonY</span><span class="p">;</span>
	<span class="p">...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In our Input Handler class that we saw before, we can store a Pointer to a command for each button we have, then, the buttons can be mapped to different command clases, maybe to nothing, or even be set and changed later by the player.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">InputHandler</span><span class="o">::</span><span class="n">handleInput</span><span class="p">()</span> <span class="p">{</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_X</span><span class="p">))</span> <span class="n">buttonX</span><span class="o">-&gt;</span><span class="n">execute</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_Y</span><span class="p">))</span> <span class="n">buttonY</span><span class="o">-&gt;</span><span class="n">execute</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_A</span><span class="p">))</span> <span class="n">buttonA</span><span class="o">-&gt;</span><span class="n">execute</span><span class="p">();</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">isPressed</span><span class="p">(</span><span class="n">BUTTON_B</span><span class="p">))</span> <span class="n">buttonB</span><span class="o">-&gt;</span><span class="n">execute</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>All we need to do after is to access those pointers to call each <code class="language-plaintext highlighter-rouge">execute()</code> function in the input handler. Since all of them are commands in their base class, we can let the inheritance do the trick.</p>

<p>The same result can be obtained by using interfaces, but since the parent class is just empty with minimal implementation, it would be enough.</p>

<p>So far, we managed to improve the code by making possible exchanging the behavior of the buttons; but there’s more useful things we can do with this pattern.</p>

<p>A common case, is to implement a Redo operation. To make the commands undo or redo, we need to define another operation in our command base class or interface.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Command</span> <span class="p">{</span>
<span class="nl">public:</span>
	<span class="k">virtual</span> <span class="o">~</span><span class="n">Command</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">execute</span><span class="p">()</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">undo</span><span class="p">()</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>This new function reverses the state changed by the corresponding <code class="language-plaintext highlighter-rouge">execute()</code> function. In order to use the <code class="language-plaintext highlighter-rouge">undo()</code> function, we need to save the needed information inside our child command class. Information like the original position if moved, a potion name if it was used, and things like that.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MoveUnitCommand</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Command</span> <span class="p">{</span>
	<span class="n">Unit</span><span class="o">*</span> <span class="n">ThisUnit</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">Pos_X</span><span class="p">,</span> <span class="n">Pos_Y</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">Prev_X</span><span class="p">,</span> <span class="n">Prev_Y</span><span class="p">;</span>
		
<span class="nl">public:</span>
	<span class="n">MoveUnitCommand</span><span class="p">(</span><span class="n">Unit</span><span class="o">*</span> <span class="n">NewUnit</span><span class="p">,</span> <span class="kt">int</span> <span class="n">X</span><span class="p">,</span> <span class="kt">int</span> <span class="n">Y</span><span class="p">)</span> <span class="o">:</span>
		<span class="n">ThisUnit</span><span class="p">(</span><span class="n">NewUnit</span><span class="p">),</span> <span class="n">Pos_X</span><span class="p">(</span><span class="n">X</span><span class="p">),</span> <span class="n">Pos_Y</span><span class="p">(</span><span class="n">Y</span><span class="p">),</span> <span class="n">Prev_X</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">Prev_Y</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
			
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">Execte</span><span class="p">();</span>
	<span class="k">virtual</span> <span class="kt">void</span> <span class="n">Undo</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">virtual</span> <span class="kt">void</span> <span class="nf">execute</span><span class="p">()</span> <span class="p">{</span>
	<span class="c1">// Remember the unit's position before the move so we can restore it.</span>
	<span class="n">Prev_X</span> <span class="o">=</span> <span class="n">ThisUnit</span><span class="o">-&gt;</span><span class="n">GetPosition</span><span class="p">().</span><span class="n">X</span>
	<span class="n">Prev_Y</span> <span class="o">=</span> <span class="n">ThisUnit</span><span class="o">-&gt;</span><span class="n">GetPosition</span><span class="p">().</span><span class="n">Y</span><span class="p">;</span>
	<span class="n">ThisUnit</span><span class="o">-&gt;</span><span class="n">moveTo</span><span class="p">(</span><span class="n">Pos_X</span><span class="p">,</span> <span class="n">Pos_Y</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">virtual</span> <span class="kt">void</span> <span class="n">undo</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ThisUnit</span><span class="o">-&gt;</span><span class="n">moveTo</span><span class="p">(</span><span class="n">Prev_X</span><span class="p">,</span> <span class="n">Prev_Y</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This example considers a class where we have values to store the position before the execution. To let the player undo a move, we keep around the last command executed.
When the player bangs <code class="language-plaintext highlighter-rouge">ctrl+Z</code> (or whatever) we call that command’s <code class="language-plaintext highlighter-rouge">undo().</code></p>

<p>After all this, supporting multiple levels of <code class="language-plaintext highlighter-rouge">undo()</code> and <code class="language-plaintext highlighter-rouge">redo()</code> is not much more conplicated. Instead of remembering the last command, we can keep a list of them. To <code class="language-plaintext highlighter-rouge">redo()</code> or <code class="language-plaintext highlighter-rouge">undo()</code> we just do the same than before but moving across the list instead.</p>

<p>With this little example we can have a pretty much operational implementation following the Command Pattern. But as a final thought: Notice that some commands are just stateless junks of pure behavior. In cases like this, having more than one instance of that class can waste memory. Flywheight pattern addresses that and we are going to review it in the following posts.</p>]]></content><author><name>Martin Villegas Garcia</name></author><category term="Game Programming Patterns" /><category term="Learning Content" /><category term="blog" /><category term="GameProgramming Patterns" /><category term="Educational" /><category term="Learning Content" /><summary type="html"><![CDATA[Overview and explanation about the Command pattern oriented to videogames]]></summary></entry><entry><title type="html">Patterns: Flyweight</title><link href="https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Flyweight-Pattern/" rel="alternate" type="text/html" title="Patterns: Flyweight" /><published>2025-06-22T00:00:00+00:00</published><updated>2025-06-22T00:00:00+00:00</updated><id>https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Flyweight-Pattern</id><content type="html" xml:base="https://devmauvillegas.github.io/game%20programming%20patterns/learning%20content/blog/Flyweight-Pattern/"><![CDATA[<h1 id="flyweight-pattern">Flyweight Pattern</h1>

<p>As always, we can share the definitions from the gang of 4 and Wikipedia to have a broad picture.</p>

<h3 id="the-official-design-patterns-book-said">The official design patterns book said:</h3>

<blockquote>
  <p>“Use sharing to support large numbers of fine-grained objects efficiently.”</p>
</blockquote>

<h3 id="and-wikipedia-mentioned-it-this-way">And Wikipedia mentioned it this way:</h3>

<blockquote>
  <p>“The Flyweight pattern minimizes memory usage by sharing some of its data between similar objects.”</p>
</blockquote>

<p>Basically — <strong>it’s about sharing heavy data across many objects</strong> instead of duplicating and multiplying it everywhere.</p>

<hr />

<p>So picture this: You’re walking through a dense and ancient forest.</p>

<p>Thousands of leaves floating in the air and trees stretch down the hills getting lost into the misty distance.</p>

<p>Every game developer dream of creating epic scenes like this.</p>

<p><strong>But</strong> — rendering thousands of leaves and trees can obliterate your memory and computer bus communication.</p>

<p>Even if your machine could somehow hold all that data, moving it back and forth GPU and CPU would <em>choke</em> the performance anyways.</p>

<p>Coding a not efficient tree like that might look like this:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Tree</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="n">Mesh</span> <span class="n">StaticMesh</span><span class="p">;</span>
    <span class="n">Texture</span> <span class="n">Bark</span><span class="p">;</span>
    <span class="n">Texture</span> <span class="n">Leaves</span><span class="p">;</span>
    <span class="n">Vector</span> <span class="n">Location</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">Height</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">Thickness</span><span class="p">;</span>
    <span class="n">Color</span> <span class="n">BarkTint</span><span class="p">;</span>
    <span class="n">Color</span> <span class="n">LeafTint</span><span class="p">;</span>
</code></pre></div></div>

<p>This is a quite a bit of data per tree; and the <strong>mesh</strong> and <strong>textures</strong> are the ones hitting heavier.</p>

<p>But lucky us, in reality, most trees are probably using <strong>the same mesh and textures, so</strong> this case  sounds like a good candidate for the Flyweight pattern.</p>

<p>We could split the the class to keep the heavy parts separately.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">TreeModel</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="n">Mesh</span> <span class="n">StaticMesh</span><span class="p">;</span>
    <span class="n">Texture</span> <span class="n">Bark</span><span class="p">;</span>
    <span class="n">Texture</span> <span class="n">Leaves</span><span class="p">;</span>
</code></pre></div></div>

<p>The rest goes to each individual <strong>Tree.</strong> They just need to hold lightweight unique info — like its position, size, or tint.</p>

<p>This is the concept of Intrinsic and Extrinsic data for the Flyweight pattern.</p>

<p>Intrinsic is the static data that could be shared across  many trees. Like the Mesh, Texture. Is the same for all.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Tree</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="n">TreeModel</span><span class="o">*</span> <span class="n">IntrinsicTreeData</span><span class="p">;</span>
    
    <span class="n">Vector</span> <span class="n">Location</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">Height</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">Thickness</span><span class="p">;</span>
    <span class="n">Color</span> <span class="n">BarkTint</span><span class="p">;</span>
    <span class="n">Color</span> <span class="n">LeafTint</span><span class="p">;</span>
</code></pre></div></div>

<p>Extrinsic is the data that cannot be shared, like the position or the state. The amount of wood left if you can loot it, etc.</p>

<p>Now, thousands of trees can <em>share</em> one <code class="language-plaintext highlighter-rouge">TreeModel</code>, saving a potentially massive amounts of memory using it as the Intrinsic instance of the data.</p>

<p>The Intrinsic Tree Data can be pass to the class upon creation, so its instance is created only once.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Tree</span> <span class="p">{</span>
	<span class="n">Tree</span><span class="p">(</span><span class="n">TreeModel</span><span class="o">*</span> <span class="n">newIntrinsicTreeData</span><span class="p">)</span> <span class="o">:</span> 
		<span class="n">IntrinsicTreeData</span><span class="p">(</span><span class="n">newIntrinsicTreeData</span><span class="p">)</span> <span class="p">{}</span>
		
	<span class="kt">void</span> <span class="n">SetExtrinsicValues</span><span class="p">(</span>
		<span class="n">Vector</span> <span class="n">Location</span><span class="p">,</span>
    <span class="kt">double</span> <span class="n">Height</span><span class="p">,</span>
    <span class="kt">double</span> <span class="n">Thickness</span><span class="p">,</span>
    <span class="n">Color</span> <span class="n">BarkTint</span><span class="p">,</span>
    <span class="n">Color</span> <span class="n">LeafTint</span><span class="p">);</span>
</code></pre></div></div>

<p>At first glance, this seems like simple asset reuse, kind of a stretch calling it a pattern.</p>

<p>But the Flyweight pattern becomes <em>really clever</em> when we apply it in places without obvious sharable pieces in the objects.</p>

<p>Let’s look at another example: <strong>terrain tiles for a world map</strong>.</p>

<p>We could model terrain with an enum like this:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">enum</span> <span class="n">TerrainType</span> <span class="p">{</span>
    <span class="n">TERRAIN_GRASS</span><span class="p">,</span>
    <span class="n">TERRAIN_HILL</span><span class="p">,</span>
    <span class="n">TERRAIN_RIVER</span>
</code></pre></div></div>

<p>And a world map could contain something like this:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">World</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="n">TerrainType</span> <span class="n">Tiles</span><span class="p">[</span><span class="n">WIDTH</span><span class="p">][</span><span class="n">HEIGHT</span><span class="p">];</span>
</code></pre></div></div>

<p>Let’s say we want to check if a tile is water; we could do something like this:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="n">World</span><span class="o">::</span><span class="n">IsWater</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">Tiles</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">])</span> <span class="p">{</span>
        <span class="k">case</span> <span class="n">TERRAIN_GRASS</span><span class="p">:</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">TERRAIN_HILL</span><span class="p">:</span>  <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">TERRAIN_RIVER</span><span class="p">:</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>This is fine, It kinda works</strong>… but it’s clunky and a little awful to be honest.</p>

<p>Switches everywhere. Hard to extend. Messy when adding new behaviors.</p>

<p><strong>SO!</strong> Instead of that, we create a new class for our Terrain type:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Terrain</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Terrain</span><span class="p">(</span><span class="kt">int</span> <span class="n">moveCost</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">isWater</span><span class="p">,</span> <span class="n">Texture</span> <span class="n">texture</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">MoveCost</span><span class="p">(</span><span class="n">moveCost</span><span class="p">),</span> <span class="n">bIsWater</span><span class="p">(</span><span class="n">isWater</span><span class="p">),</span> <span class="n">TerrainTexture</span><span class="p">(</span><span class="n">texture</span><span class="p">)</span> <span class="p">{}</span>

    <span class="kt">bool</span> <span class="n">isWater</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">bIsWater</span><span class="p">;</span> <span class="p">}</span>
    <span class="kt">int</span> <span class="n">getMoveCost</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">MoveCost</span><span class="p">;</span> <span class="p">}</span>

<span class="nl">private:</span>
    <span class="kt">int</span> <span class="n">MoveCost</span><span class="p">;</span>
    <span class="kt">bool</span> <span class="n">bIsWater</span><span class="p">;</span>
    <span class="n">Texture</span> <span class="n">TerrainTexture</span><span class="p">;</span>
</code></pre></div></div>

<p>Attributes like the cost of moving through it or if is water will be stored here.</p>

<p>Along with the texture and any other element independent from the world.</p>

<p>Now, our world class can store <em>pointers</em> to shared Terrain objects instead of dumb enumerators inside an enum.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">World</span> <span class="p">{</span>
<span class="nl">private:</span>
    <span class="n">Terrain</span><span class="o">*</span> <span class="n">Tiles</span><span class="p">[</span><span class="n">WIDTH</span><span class="p">][</span><span class="n">HEIGHT</span><span class="p">];</span>
</code></pre></div></div>

<p>Every grass tile points to the <strong>same</strong> <code class="language-plaintext highlighter-rouge">GrassTerrain</code> instance.</p>

<p>Every river tile will point to a <strong>shared</strong> <code class="language-plaintext highlighter-rouge">RiverTerrain</code> instance.</p>

<p>Much better. Clean. No switch statements.</p>

<p>In a super simple version, we can just create terrains upfront.</p>

<p>When creating the world, the terrain types can be already created and stored in within the world.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">World</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">World</span><span class="p">()</span> <span class="o">:</span> <span class="n">GrassTerrain</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="n">GRASS_TEXTURE</span><span class="p">),</span>
          <span class="n">HillTerrain</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="n">HILL_TEXTURE</span><span class="p">),</span>
          <span class="n">RiverTerrain</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">RIVER_TEXTURE</span><span class="p">)</span> <span class="p">{}</span>

<span class="nl">private:</span>
    <span class="n">Terrain</span> <span class="n">GrassTerrain</span><span class="p">;</span>
    <span class="n">Terrain</span> <span class="n">HillTerrain</span><span class="p">;</span>
    <span class="n">Terrain</span> <span class="n">RiverTerrain</span><span class="p">;</span>
    <span class="n">Terrain</span><span class="o">*</span> <span class="n">Tiles</span><span class="p">[</span><span class="n">WIDTH</span><span class="p">][</span><span class="n">HEIGHT</span><span class="p">];</span>
</code></pre></div></div>

<p>When generating the map, you just assign pointers to these shared terrains.</p>

<p>This can be done by a function following location instructions or by noise or something like that.</p>

<p>But that topic goes beyond the intention of this video so let’s avoid it.</p>

<p>If you want even more flexibility, for example, dynamically creating terrains based on data files, you can create terrains <strong>on demand</strong> using a <strong>Factory Method.</strong></p>

<p>That’s another pattern that we’ll explore in future videos so stay tuned.</p>

<p>Anyways. With this setup, querying terrain properties becomes super clean: Bravo!</p>

<p>No switch statements or asking stuff to the world. Everything shared and holding its own stuff.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">walkingCost</span> <span class="o">=</span> <span class="n">world</span><span class="p">.</span><span class="n">GetTile</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">).</span><span class="n">getMoveCost</span><span class="p">();</span>
</code></pre></div></div>

<p>Now, this is awesome and all but you might worry:</p>

<p>“Isn’t using pointers slower than using enums directly?”. And you might sound like you should be right.</p>

<p>But in the tests from <em>Game Programming Patterns author</em>, <strong>Flyweight objects were actually faster</strong> than using enums, thanks to better data layout and fewer branch mispredictions.</p>

<p>Sounds really convincing, but performance can vary depending on how your memory is organized, so it might not be always the case.</p>

<p>Always profile if you’re unsure, at least to see for yourself.</p>

<p>In summary and to close already. If you find yourself using <strong>enums and switch</strong> statements everywhere, <strong>consider using this pattern. The Flyweight Pattern</strong>.</p>

<p>It will make your code: Easier to extend. Cleaner. Maybe faster.</p>

<p>And Much more memory efficient, since the point is sharing.</p>

<p>This sounds like a sponsorship from this pattern.</p>]]></content><author><name>Martin Villegas Garcia</name></author><category term="Game Programming Patterns" /><category term="Learning Content" /><category term="blog" /><category term="GameProgramming Patterns" /><category term="Educational" /><category term="Learning Content" /><summary type="html"><![CDATA[Overview and explanation about the Flyweight pattern oriented to videogames]]></summary></entry></feed>