<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Breaking your program ... on purpose</title>
		<link>http://www.allegro.cc/forums/view/618702</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 03 Aug 2022 01:21:48 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So, everything is running smoothly and I decided to change something up river. Part of the framework. I wasn&#39;t happy with my object handler code. It is a basic wrapper for a std::unordered_map of objects. The problem was that the object being stored was a &#39;has&#39;. I changed it to an &#39;is&#39;. Then I had to rework everything down stream. Finally after a couple of hours it&#39;s back to running smoothly again.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 28 Jul 2022 22:00:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s nothing.</p><p>My game engine has 4 alpha versions right now.  Each one written from scratch because I didn&#39;t like how it looked after using them.  Next one will be alpha.5, and again written from scratch <b>3 times</b>.  Yep, I&#39;ve started from scratch alpha.5 3 times for different reasons.</p><p>Beat it. <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Niunio)</author>
		<pubDate>Fri, 29 Jul 2022 21:13:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I recently added multithreading to my game (splitting logic and rendering into two separate threads). Broke so much stuff in the process. Some stuff is still broken a over month later.</p><p>I also moved large parts of the renderer to C++, which created rendering glitches. I think those are all fixed but there&#39;s still more rendering code that needs to be migrated...</p><p>I&#39;m going to be adding support for multiplayer so massive breaking change #3 incoming.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Erin Maus)</author>
		<pubDate>Fri, 29 Jul 2022 21:41:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In programming, the more you love it, the more you have to break it. <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Sun, 31 Jul 2022 14:49:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I reworked the object system, then had to rework everything else.</p><p>Instead of storing the type in the object handler, I had to store the type in the object.</p><p>That meant, I couldn&#39;t just add a ALLEGRO_BITMAP to my handler.</p><p>So, I made a base object class with a single variable (int type).<br />And a derived wrapper sub class for Allegro objects.<br />Any custom objects are also derived from the main object class.</p><p>I also modified the manifest file. Display is still required, but the rest (timer, queue) I add in the background.</p><p>It&#39;s reworked and running great. </p><div class="source-code snippet"><div class="inner"><pre><span class="c">//Everying is loaded and/or created in the manifest parser</span>
<span class="k1">if</span> <span class="k2">(</span>Parser::parseManifest<span class="k2">(</span>manifest_file<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>


</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// draw code</span>
<span class="k1">bool</span> Game::OnRender<span class="k2">(</span>Allegro::Display<span class="k3">&amp;</span> display<span class="k2">)</span>
<span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>

  Allegro::Font<span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>Allegro::Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span>Object::getRegistry<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>at<span class="k2">(</span><span class="s">"@font/main"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span>font-&gt;get<span class="k2">(</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">40</span>, <span class="n">40</span>, <span class="n">0</span>, <span class="s">"Hello World!"</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>

  <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

result<br /><span class="remote-thumbnail"><span class="json">{"name":"613227","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/1\/916606dd990143214738360e83366eb9.png","w":1041,"h":818,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/1\/916606dd990143214738360e83366eb9"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/9/1/916606dd990143214738360e83366eb9-240.jpg" alt="613227" width="240" height="188" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Sun, 31 Jul 2022 22:49:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="">DanielH</a> said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>Allegro::Font<span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>Allegro::Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span>Object::getRegistry<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>at<span class="k2">(</span><span class="s">"@font/main"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>
That&#39;s terrifying.</p><p>Compare it to this :
</p><div class="source-code snippet"><div class="inner"><pre>...
   win-&gt;DrawText<span class="k2">(</span>font_registry-&gt;GetFont<span class="k2">(</span><span class="s">"font/main"</span><span class="k2">)</span> , <span class="s">"Hello World"</span> , <span class="n">10</span> , <span class="n">10</span> , EagleColor<span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span> , ALIGN_LEFT , ALIGN_TOP<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Anyway, if your font derives from an object, you need dynamic_cast, not static_cast.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 01 Aug 2022 09:43:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>&quot;C++ has become much better in the last ten years&quot;, they said... <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Niunio)</author>
		<pubDate>Mon, 01 Aug 2022 20:59:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>font_registry-&gt;GetFont(&quot;font/main&quot;)</p></div></div><p>

That would require a registry for every object type.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/618702/1052686#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>Anyway, if your font derives from an object, you need dynamic_cast, not static_cast</p></div></div><p>
Good to know. I&#39;ll fix them. static_cast and dynamic_cast weren&#39;t a thing when I learned C++.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Mon, 01 Aug 2022 21:16:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, but maybe a function. Just an example.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">inline</span> Font<span class="k3">*</span> Registry::GetFont<span class="k2">(</span>Object<span class="k3">*</span> o<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">return</span> <span class="k1">dynamic_cast</span><span class="k3">&lt;</span>Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span>o<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
<span class="c">//... This is literally what I have in Eagle</span>
win-&gt;DrawText<span class="k2">(</span>win-&gt;GetFont<span class="k2">(</span><span class="s">"Verdana.ttf"</span><span class="k2">)</span> , <span class="s">"Hello Verdana"</span> , <span class="n">10</span> , <span class="n">10</span> , EagleColor<span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span> , ALIGN_LEFT , ALIGN_TOP <span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 01 Aug 2022 22:52:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Cast before or after. Still needs casting. Looks nicer, but accomplishes the same thing.</p><p>My get function needs the cast before because the compiler cannot differentiate functions based on the return type alone.</p><p>I could do what you say and write a get function for each type. The library does have known types, but the type system is extendable. The program can/will add types to it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Mon, 01 Aug 2022 23:36:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You could also use simple templates
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> ObjectRegistry <span class="k2">{</span>
...
 <span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">typename</span> T&gt;
 T at<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span> <span class="k2">{</span>
  <span class="k1">return</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>T&gt;<span class="k2">(</span>__at<span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
 <span class="k2">}</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
where <span class="source-code">__at</span> is the function that accesses the registry. <br />Use like
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">auto</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> Object::getRegistry<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>at<span class="k3">&lt;</span>Allegro::Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="s">"@font/main"</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
If there&#39;s only one registry that&#39;s global I suppose you could alternatively 
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">typename</span> T&gt;
T get<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span> <span class="k2">{</span>
 <span class="k1">return</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>T&gt;<span class="k2">(</span>Object::getRegistry<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>at<span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
...
<span class="k1">auto</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> get<span class="k3">&lt;</span>Allegro::Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="s">"@font/main"</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Tue, 02 Aug 2022 01:38:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I originally had a templeted get function, then I realize I was casting twice.</p><p>oncein the get function
</p><div class="source-code snippet"><div class="inner"><pre> <span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">typename</span> T&gt;
 T at<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> <a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span> <span class="k2">{</span>
  <span class="k1">return</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>T&gt;<span class="k2">(</span>__at<span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
 <span class="k2">}</span>
</pre></div></div><p>

2nd at the get call
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">auto</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> Object::getRegistry<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>at<span class="k3">&lt;</span>Allegro::Font<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="s">"@font/main"</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

When I was doing the rewrite, I left out the template and left the getter return the base Object*.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Tue, 02 Aug 2022 02:50:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="remote-thumbnail"><span class="json">{"name":"613227","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/1\/916606dd990143214738360e83366eb9.png","w":1041,"h":818,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/1\/916606dd990143214738360e83366eb9"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/9/1/916606dd990143214738360e83366eb9-240.jpg" alt="613227" width="240" height="188" /></span></p><p>^^ What&#39;s the name of this fancy font you&#39;re using here?  I feel like I need to embrace more fantasy fonts in my designs. 🤔
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Wed, 03 Aug 2022 00:37:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve had it for years. Can&#39;t remember where I got it. It&#39;s called ds_mysticora.</p><p>I just grabbed it for testing the font loading code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Wed, 03 Aug 2022 01:21:48 +0000</pubDate>
	</item>
</rss>
