<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Graphics | Learn C Games Programming Blog</title>
	<atom:link href="https://learncgames.com/category/graphics/feed/" rel="self" type="application/rss+xml" />
	<link>https://learncgames.com</link>
	<description>A blog about C, programming games and my ebook(s).</description>
	<lastBuildDate>Wed, 18 Feb 2026 13:48:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://learncgames.com/wp-content/uploads/2020/03/cropped-favicon-32x32.png</url>
	<title>Graphics | Learn C Games Programming Blog</title>
	<link>https://learncgames.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">181446779</site>	<item>
		<title>Tiled is the clear winner</title>
		<link>https://learncgames.com/tiled-is-the-clear-winner/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tiled-is-the-clear-winner</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 18 Feb 2026 13:48:00 +0000</pubDate>
				<category><![CDATA[Dart]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[fps]]></category>
		<category><![CDATA[frame rate]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3516</guid>

					<description><![CDATA[<p>I thought maybe the non-tiled hex map program mentioned in my last blog entry would be easier to work with and as fast but just to be on the safe side, I measured the frame rate of both programs. I did this with a nifty bit of Flutter code ceated by an AI that I&#8217;ve [&#8230;]</p>
The post <a href="https://learncgames.com/tiled-is-the-clear-winner/">Tiled is the clear winner</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:837,&quot;href&quot;:&quot;https:\/\/al-e-shevelev.medium.com\/flutter-flame-tiled-a-simple-game-field-prototype-for-a-strategy-game-46518d9c3adc&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20231201064019\/https:\/\/al-e-shevelev.medium.com\/flutter-flame-tiled-a-simple-game-field-prototype-for-a-strategy-game-46518d9c3adc&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-18 13:48:28&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-21 22:45:39&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-25 11:44:03&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-28 22:21:14&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-04 04:16:04&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-07 12:47:53&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-10 16:51:08&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-13 20:06:45&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-16 22:46:46&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-20 02:27:00&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-23 13:14:03&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-26 15:24:46&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-29 21:06:57&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-01 21:47:11&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-05 00:09:44&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-08 08:47:36&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-11 09:31:25&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-14 18:36:42&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-17 22:45:47&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-21 08:09:25&quot;,&quot;http_code&quot;:403}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-21 08:09:25&quot;,&quot;http_code&quot;:403},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img fetchpriority="high" decoding="async" class="alignleft size-full wp-image-3517" src="https://learncgames.com/wp-content/uploads/2026/02/tiled_framerate.png" alt="Tiled frame rate program (link in article)" width="979" height="915" srcset="https://learncgames.com/wp-content/uploads/2026/02/tiled_framerate.png 979w, https://learncgames.com/wp-content/uploads/2026/02/tiled_framerate-300x280.png 300w, https://learncgames.com/wp-content/uploads/2026/02/tiled_framerate-768x718.png 768w" sizes="(max-width: 979px) 100vw, 979px" />I thought maybe the non-tiled hex map program mentioned in my last blog entry would be easier to work with and as fast but just to be on the safe side, I measured the frame rate of both programs.</p>
<p>I did this with a nifty bit of Flutter code ceated by an AI that I&#8217;ve included below. I added it to the program created by <a href="https://al-e-shevelev.medium.com/flutter-flame-tiled-a-simple-game-field-prototype-for-a-strategy-game-46518d9c3adc">Alexander Shevelev</a> who wrote a Medium article about using Flutter + Flame + Tiled. That&#8217;s his program running.</p>
<pre><code class="language-c" data-line="">
import &#039;dart:math&#039; as math;
import &#039;dart:ui&#039;;
import &#039;package:flame/components.dart&#039;;
import &#039;package:flame/events.dart&#039;;
import &#039;package:flame/game.dart&#039;;
import &#039;package:flame/input.dart&#039;;
import &#039;package:flame_tiled/flame_tiled.dart&#039;;
import &#039;package:flame_tiled_example/background.dart&#039;;
import &#039;package:flame_tiled_example/tile_info.dart&#039;;
import &#039;package:flutter/foundation.dart&#039; show kIsWeb;
import &#039;package:flutter/scheduler.dart&#039;;
import &#039;package:flutter/widgets.dart&#039; hide Animation, Image;
import &#039;package:web/web.dart&#039; as web;

class FpsCounter {
  // Singleton instance
  static final FpsCounter _instance = FpsCounter._internal();

  factory FpsCounter() =&gt; _instance;

  FpsCounter._internal();

  bool _running = false;
  int _frameCount = 0;
  double _elapsedMs = 0;

  double fps = 0;

  /// Start measuring FPS
  void start() {
    if (_running) return; // avoid double registration

    _running = true;
    SchedulerBinding.instance.addTimingsCallback(_onTimings);
  }

  /// Stop measuring FPS and remove the global callback
  void stop() {
    if (!_running) return;

    SchedulerBinding.instance.removeTimingsCallback(_onTimings);
    _running = false;
    _frameCount = 0;
    _elapsedMs = 0;
    fps = 0;
  }

  /// Internal callback fired for every frame timing
  void _onTimings(List&lt;FrameTiming&gt; timings) {
    if (!_running) {
      return;
    }

    for (final t in timings) {
      _frameCount++;
      _elapsedMs += t.totalSpan.inMicroseconds / 1000.0;
    }

    // Update about 4 times per second
    if (_elapsedMs &gt;= 250) {
      fps = _frameCount / (_elapsedMs / 1000.0);

      if (kIsWeb) {
        web.document.title = &quot;Hex Map — ${fps.toStringAsFixed(1)} FPS&quot;;
      }

      _frameCount = 0;
      _elapsedMs = 0;
    }
  }
}
void main() { 
    WidgetsFlutterBinding.ensureInitialized(); 
    FpsCounter().start(); // &#x1f448; start measuring FPS 
    runApp( Background( child: GameWidget(game: TiledGame()), 
    ), 
  ); 
}</code></pre>
<p>That puts the FrameRate in the caption. My 40 x 40 hex frame rate was between 6 and 10 FPS,</p>
<p>The Tiled program displayed a 30 x 30 hex grid at just between 250 and 400 FPS! A clear and deserved winner.</p>The post <a href="https://learncgames.com/tiled-is-the-clear-winner/">Tiled is the clear winner</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3516</post-id>	</item>
		<item>
		<title>And with a bit of help I got it fixed</title>
		<link>https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=and-with-a-bit-of-help-i-got-it-fixed</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 09 Mar 2022 00:00:27 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[SkiaSharp]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3026</guid>

					<description><![CDATA[<p>Thanks to suggestions in the Reddit CSharp subreddit (you can view the entire thread here), I fixed the missing file issue and SkiaSharp is now happily outputting graphics on the VPS.  I&#8217;m referring to the More Programming Joys blog entry I posted yesterday. There were two things that were needed to fix it. Add a [&#8230;]</p>
The post <a href="https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/">And with a bit of help I got it fixed</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:60,&quot;href&quot;:&quot;https:\/\/www.reddit.com\/r\/dotnet\/comments\/t8yg53\/c_application_with_skiasharp_on_ubuntu_2004_is&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:61,&quot;href&quot;:&quot;https:\/\/www.nuget.org\/packages\/SkiaSharp.NativeAssets.Linux\/2.88.0-preview.209&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260206113019\/https:\/\/www.nuget.org\/packages\/SkiaSharp.NativeAssets.Linux\/2.88.0-preview.209&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:35:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 00:39:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 02:24:16&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-16 18:55:21&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 16:38:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-26 04:32:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-02 12:31:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 00:39:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-10 00:34:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 20:46:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:12:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:56&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:56&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:62,&quot;href&quot;:&quot;https:\/\/nuget.org&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260204222129\/https:\/\/www.nuget.org\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:28:55&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 04:39:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-14 01:16:46&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 14:30:35&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 00:43:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-26 04:32:14&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-02 12:31:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 00:38:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-10 08:30:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:32&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:22&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-02 20:46:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:51&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:13:00&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:52&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:52&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img decoding="async" class="alignleft wp-image-3028 size-full" src="https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog.png" alt="Visual Studio Publish Target runtime dialog" width="545" height="499" srcset="https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog.png 545w, https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog-300x275.png 300w" sizes="(max-width: 545px) 100vw, 545px" />Thanks to suggestions in the Reddit CSharp subreddit (you can view the entire thread <a title="Link to Csharp subreddit on Reddit" href="https://www.reddit.com/r/dotnet/comments/t8yg53/c_application_with_skiasharp_on_ubuntu_2004_is/" target="_blank" rel="nofollow noopener">here</a>), I fixed the missing file issue and SkiaSharp is now happily outputting graphics on the VPS.  I&#8217;m referring to the <a title="Link to Blog entry on More Programming Joys" href="https://learncgames.com/more-programming-joys/" target="_blank" rel="noopener">More Programming Joys</a> blog entry I posted yesterday.</p>
<p>There were two things that were needed to fix it.</p>
<ol>
<li>Add a package to the solution. This was the <a title="Link to SkiaSharp.NativeAssets.Linux" href="https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux/2.88.0-preview.209" target="_blank" rel="nofollow noopener">SkiaSharp.NativeAssets.Linux</a> package and I used Nuget to add it to my Windows solution. If you haven&#8217;t used <a title="Link to Nuget.org" href="https://nuget.org" target="_blank" rel="noopener">Nuget</a>, it&#8217;s a great package manager and makes it very easy to add packages.</li>
<li>On the <em>Visual Studio Publish page</em>, I needed to change the Target Runtime to <strong>linux-x64</strong>. That&#8217;s the dialog above. When I clicked the Publish it put all the files including the library that was missing (libSkiaSharp.so) into the Target location and once uploaded it worked.</li>
</ol>The post <a href="https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/">And with a bit of help I got it fixed</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3026</post-id>	</item>
		<item>
		<title>More Programming Joys</title>
		<link>https://learncgames.com/more-programming-joys/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=more-programming-joys</link>
					<comments>https://learncgames.com/more-programming-joys/#comments</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 08 Mar 2022 00:00:48 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Serilog]]></category>
		<category><![CDATA[Skia]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3021</guid>

					<description><![CDATA[<p>So I&#8217;ve been doing some .NET programming. First on Windows because I can debug it there then &#8220;Publish it&#8221; which puts all the files (compiled in release) needed, including any dlls into one folder and upload it to a VPS using WinSCP. I&#8217;ve also got a terminal session connected by Putty. I use Serilog for [&#8230;]</p>
The post <a href="https://learncgames.com/more-programming-joys/">More Programming Joys</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:63,&quot;href&quot;:&quot;https:\/\/serilog.net&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260103212351\/https:\/\/serilog.net\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:28:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 04:39:36&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-14 10:25:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 14:30:37&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 04:35:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-24 12:51:47&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-28 00:38:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-03 20:03:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 18:33:19&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-12 00:39:19&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-16 00:37:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-19 22:43:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-23 11:58:53&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 20:35:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-31 00:31:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-03 10:33:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-10 03:41:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-13 11:32:39&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-20 03:16:26&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:26&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:64,&quot;href&quot;:&quot;https:\/\/github.com\/serilog\/serilog&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20251216014112\/https:\/\/github.com\/serilog\/serilog&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 00:39:46&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 02:24:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 18:55:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 08:35:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 12:51:48&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-28 00:38:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 20:03:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-07 18:33:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 00:39:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 00:37:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-19 22:43:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-23 11:58:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 20:35:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 00:31:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 10:33:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-10 03:41:50&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-13 11:32:40&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-20 03:16:30&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:30&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:65,&quot;href&quot;:&quot;https:\/\/stackoverflow.com\/questions\/44428405\/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20181104053240\/https:\/\/stackoverflow.com\/questions\/44428405\/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 20:36:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 01:01:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-19 00:40:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 19:08:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 04:24:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-03 00:39:27&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 10:44:08&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-09 17:23:49&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 20:46:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:12:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:54&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:54&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:66,&quot;href&quot;:&quot;https:\/\/github.com\/mono\/SkiaSharp\/issues\/1341&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250109034858\/https:\/\/github.com\/mono\/SkiaSharp\/issues\/1341&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 10:18:17&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-14 12:39:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:30:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 16:38:54&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-26 04:32:15&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-02 04:40:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-05 17:31:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-08 18:37:14&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 06:24:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 00:37:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-19 22:43:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-23 11:59:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 20:35:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 00:31:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 10:33:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-10 03:41:44&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-13 11:32:41&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-20 03:16:21&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:21&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img decoding="async" class="alignleft size-full wp-image-3023" src="https://learncgames.com/wp-content/uploads/2022/03/map.jpg" alt="Game Map" width="100" height="100" />So I&#8217;ve been doing some .NET programming. First on Windows because I can debug it there then &#8220;Publish it&#8221; which puts all the files (compiled in release) needed, including any dlls into one folder and upload it to a VPS using WinSCP. I&#8217;ve also got a terminal session connected by Putty. I use Serilog for logging and SkiaSharp for graphics.</p>
<p>First bug was a missing file but it was a stupid error on my part. I had the file in a path under the home folder and had used ~ in the file&#8217;s path. You can use ~ in Bash- it means your home folder, but not in a file path in an application. Putting in the full path fixed the bug. D&#8217;oh.</p>
<p>Because it&#8217;s .NET (6) that I&#8217;m using, you don&#8217;t get configuration stuff the same as you did with .NET Framework. I store some config information in a file and define the path with these lines of code which work on both Linux and Windows.</p>
<pre><code class="language-csharp" data-line=""> bool IsWindows =&gt; RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
 var appSettingsFilePath = IsWindows ? @&quot;c:\turfwar\twConfig.json&quot; : &quot;/home/user/turfwar/twConfig.json&quot;;</code></pre>
<p>I like <a title="Link to serilog website" href="https://serilog.net/" target="_blank" rel="noopener">Serilog</a> ( with project on <a title="Link to Serilog on GitHub" href="https://github.com/serilog/serilog" target="_blank" rel="nofollow noopener">Github</a> at ). Nice and simple logging but flexible enough. As this application is a command line app run whenever, it&#8217;s easier to view the logs afterwards.</p>
<h2>Why use SkiaSharp?</h2>
<p>I was quite happy to use System.Drawing but <a title="Link to StackOverflow question about .NET Core on Linux" href="https://stackoverflow.com/questions/44428405/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing" target="_blank" rel="nofollow noopener">according to this</a>, There are issues with libgdiplus. So I thought I&#8217;d try SkiaSharp as I&#8217;m doing stuff with Flutter and Skia is the library that underpins that. This is what it takes to create a 100 x100 grey coloured Bitmap in SkiaSharp, add yellow dots and save it to disk as a .jpg. That&#8217;s what you see up above.</p>
<pre><code class="language-csharp" data-line="">        internal void SaveBitMap(int id, string filename, Gang gang)
        {
            var info = new SKImageInfo(100, 100);
            using var surface = SKSurface.Create(info);
            SKCanvas myCanvas = surface.Canvas;

            // clear the canvas / fill with white
            myCanvas.DrawColor(new SKColor(0x99, 0x99, 0x99));

            // draw the dots, one for each block
            foreach (var block in Blocks)
            {
                if (block.Owner == id)
                {
                    myCanvas.DrawPoint(block.X*5/2, block.Y*5/2, SKColors.Yellow);
                }
            }

            // Now save to filename
            var mainCanvasImage = surface.Snapshot();
            var TempTIFbitmap1 = SKBitmap.Decode(mainCanvasImage.Encode());
            using (var image = SKImage.FromBitmap(TempTIFbitmap1))
            using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 100))
            {
                // save the data to a stream
                using (var stream = File.OpenWrite(filename))
                {
                    data.SaveTo(stream);
                }
            }
        }</code></pre>
<p>It works fine on Windows but on Linux, (Ubuntu 20.04) I hit bug #2. &#8220;System.TypeInitializationException: The type initializer for &#8216;SkiaSharp.SKImageInfo&#8217; threw an exception.&#8221;. And that&#8217;s where I am at the moment.  <a title="Link to Bug discussion for SkiaSharp" href="https://github.com/mono/SkiaSharp/issues/1341" target="_blank" rel="nofollow noopener">This</a> is similar.  I&#8217;ll keep you informed.</p>The post <a href="https://learncgames.com/more-programming-joys/">More Programming Joys</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://learncgames.com/more-programming-joys/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3021</post-id>	</item>
		<item>
		<title>Dealing with artists for game graphics</title>
		<link>https://learncgames.com/dealing-with-artists-for-game-graphics/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dealing-with-artists-for-game-graphics</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 02 Mar 2022 00:00:38 +0000</pubDate>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[artists]]></category>
		<category><![CDATA[artwork]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3012</guid>

					<description><![CDATA[<p>I&#8217;m working on three game projects (my side projects), One is Flutter front end plus C# back end, another is the same but a different type of back end and the third is a mobile game with C# backend but its put to one side until the others are done. These are all side projects. [&#8230;]</p>
The post <a href="https://learncgames.com/dealing-with-artists-for-game-graphics/">Dealing with artists for game graphics</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-3014" src="https://learncgames.com/wp-content/uploads/2022/03/factories-300x112.jpg" alt="Factory graphics" width="300" height="112" srcset="https://learncgames.com/wp-content/uploads/2022/03/factories-300x112.jpg 300w, https://learncgames.com/wp-content/uploads/2022/03/factories-1024x383.jpg 1024w, https://learncgames.com/wp-content/uploads/2022/03/factories-768x287.jpg 768w, https://learncgames.com/wp-content/uploads/2022/03/factories-1536x574.jpg 1536w, https://learncgames.com/wp-content/uploads/2022/03/factories-2048x765.jpg 2048w" sizes="auto, (max-width: 300px) 100vw, 300px" />I&#8217;m working on three game projects (my side projects), One is Flutter front end plus C# back end, another is the same but a different type of back end and the third is a mobile game with C# backend but its put to one side until the others are done. These are all side projects.</p>
<p>I&#8217;ve bought graphics and they do up to a point- e.g. kenney.nl is very good. But sometimes you need something a bit better or that&#8217;s not covered by that library.</p>
<p>Now one of the things I&#8217;ve done is use low costs artists from sites like Fivesquid.com and fiverr.com. Many of these artists are very good but live in countries where things are a lot cheaper than here in the West. Exploitation? Maybe, but they are happy to do the work and it saves me a fortune. What might cost me a couple of hundred pounds here in the UK can be done for say £20.</p>
<p>But I&#8217;ve found when dealing with them that you can&#8217;t take anything for granted. You have to have a bit of patience and explain everything including your expectations. And make sure you nail the price down exactly. I had arranged everything with one to do 35 small graphics and he wanted £35 for each graphic. Despite his advert saying 5 graphics for £10!</p>
<p>So I&#8217;ve found, you need to specify file format (.png or .jpg), layout- single files or in a sheet in a grid. Also fivesquid have a thing where when the order is delivered, you have three days to mark it complete or asks for changes. One artist said it was complete but hadn&#8217;t quite got it ready and the three day period expired before I&#8217;d received anything. So I could hardly accept nothing. It was though a genuine mistake on the part of the artist and I did get the graphics eventually.</p>The post <a href="https://learncgames.com/dealing-with-artists-for-game-graphics/">Dealing with artists for game graphics</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3012</post-id>	</item>
		<item>
		<title>A fabulous collection of game icons</title>
		<link>https://learncgames.com/a-fabulous-collection-of-game-icons/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-fabulous-collection-of-game-icons</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Sun, 21 Feb 2021 00:00:02 +0000</pubDate>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[icons]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=2714</guid>

					<description><![CDATA[<p>These are from game-icons.net and are 512 x 512 pixels two colour icons and completely free to use so long as you give credit and include a copy of the licence or a link to it. There are over 4,000 but you can download a subset if you don&#8217;t want the lot. The download file [&#8230;]</p>
The post <a href="https://learncgames.com/a-fabulous-collection-of-game-icons/">A fabulous collection of game icons</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:153,&quot;href&quot;:&quot;https:\/\/game-icons.net&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260205004355\/https:\/\/game-icons.net\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:20:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 05:10:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:30:45&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-22 19:08:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 11:19:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 04:29:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 05:23:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 19:54:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 03:45:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-12 19:33:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 03:26:42&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-19 08:18:53&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 08:18:53&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:153,&quot;href&quot;:&quot;https:\/\/game-icons.net&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260205004355\/https:\/\/game-icons.net\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:20:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 05:10:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:30:45&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-22 19:08:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 11:19:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 04:29:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 05:23:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 19:54:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 03:45:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-12 19:33:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 03:26:42&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-19 08:18:53&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 08:18:53&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:154,&quot;href&quot;:&quot;https:\/\/creativecommons.org\/licenses\/by\/3.0&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260205223054\/https:\/\/creativecommons.org\/licenses\/by\/3.0\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:21:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 05:10:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:30:45&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-22 19:08:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 11:19:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 04:29:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 05:23:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 19:54:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 03:45:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-12 11:34:51&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 12:27:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 18:24:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-22 03:12:08&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 03:12:08&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<figure id="attachment_2715" aria-describedby="caption-attachment-2715" style="width: 300px" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="size-medium wp-image-2715" src="https://learncgames.com/wp-content/uploads/2021/02/building-icons-300x206.png" alt="Building icons" width="300" height="206" srcset="https://learncgames.com/wp-content/uploads/2021/02/building-icons-300x206.png 300w, https://learncgames.com/wp-content/uploads/2021/02/building-icons.png 650w" sizes="auto, (max-width: 300px) 100vw, 300px" /><figcaption id="caption-attachment-2715" class="wp-caption-text">Building icons from <a href="https://game-icons.net">game-icons.net</a></figcaption></figure>
<p>These are from <a title="Link to game-icons,net" href="https://game-icons.net/" target="_blank" rel="noopener">game-icons.net</a> and are 512 x 512 pixels two colour icons and completely free to use so long as you give credit and include a copy of the licence or <a title="Link to Creative commons licence by attribution 3.0" href="https://creativecommons.org/licenses/by/3.0/" target="_blank" rel="nofollow noopener">a link to it</a>. There are over 4,000 but you can download a subset if you don&#8217;t want the lot. The download file zip file size for all of them as .png is only 33 MB.</p>
<p>Subsets include Animal (182),  Building &amp; Place (181), Weapon (172), Symbol &amp; Emblem (171),  Body (158), Arrow &amp; Spear (146), GUI (140), Spike, Slash &amp; Crack (138), Head &amp; Face (126), Blade, Sword &amp; Knife (126), Food (125), Liquid (122)Creature &amp; Monster (119), Tool (117) and Board &amp; Card (116).</p>
<p>What&#8217;s nice is you can have them as .svg (<em>vector</em>) or .png and have black on white or white on black.</p>
<p>They may look small when shown here but each is 512 x 512 pixels which is a lot.</p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/a-fabulous-collection-of-game-icons/">A fabulous collection of game icons</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2714</post-id>	</item>
		<item>
		<title>Interesting Visualisation &#8211; like tixy.land</title>
		<link>https://learncgames.com/interesting-visualisation-like-tixy-land/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=interesting-visualisation-like-tixy-land</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Fri, 15 Jan 2021 00:00:43 +0000</pubDate>
				<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[visualisation]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=2401</guid>

					<description><![CDATA[<p>If you remember tixy.land that I mentioned back in November last year, here is another website that lets you control a visualisation. In this case, tileflip.xyz lets you create a single function and applies it to every square on a board. You can control how many squares the board has and how often they are [&#8230;]</p>
The post <a href="https://learncgames.com/interesting-visualisation-like-tixy-land/">Interesting Visualisation – like tixy.land</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:250,&quot;href&quot;:&quot;https:\/\/tileflip.xyz\/#&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20210623151437\/https:\/\/tileflip.xyz\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 13:07:48&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-11 13:20:11&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-17 14:30:46&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-22 19:08:22&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-26 10:42:27&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-05 13:10:59&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-09 15:14:53&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-14 23:31:08&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-19 01:14:53&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-23 16:34:18&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-27 03:58:54&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-01 01:26:10&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-04 09:24:19&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-07 19:49:26&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-11 11:37:51&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-14 16:20:55&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-18 03:21:43&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-21 11:13:36&quot;,&quot;http_code&quot;:404}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-21 11:13:36&quot;,&quot;http_code&quot;:404},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:251,&quot;href&quot;:&quot;https:\/\/tileflip.xyz\/#\/help&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20210623151437\/https:\/\/tileflip.xyz\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 13:07:49&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-11 13:20:12&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-17 14:30:46&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-22 19:08:23&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-26 15:55:28&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-05 13:10:59&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-09 15:14:56&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-13 05:55:23&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-20 13:40:49&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-24 04:29:26&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-29 12:56:53&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-02 05:23:24&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-05 19:54:16&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-09 03:45:12&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-12 11:34:54&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-16 01:01:45&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-19 11:18:50&quot;,&quot;http_code&quot;:404}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 11:18:50&quot;,&quot;http_code&quot;:404},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-2402" src="https://learncgames.com/wp-content/uploads/2021/01/tileflip-224x300.png" alt="Tileflip visualisation" width="224" height="300" srcset="https://learncgames.com/wp-content/uploads/2021/01/tileflip-224x300.png 224w, https://learncgames.com/wp-content/uploads/2021/01/tileflip.png 510w" sizes="auto, (max-width: 224px) 100vw, 224px" />If you remember <a title="Link to blog post about Tixy.land" href="https://learncgames.com/so-much-fun-from-16-x-16-tixy-land/" target="_blank" rel="nofollow noopener">tixy.land</a> that I mentioned back in November last year, here is another website that lets you control a visualisation. In this case, <a title="Link to Tileflip.xyz" href="https://tileflip.xyz/#/" target="_blank" rel="nofollow noopener">tileflip.xyz</a> lets you create a single function and applies it to every square on a board. You can control how many squares the board has and how often they are updated through a pair of sliders. You can pause the animation and toggle squares by clicking on them in the mouse. One of the early examples runs Conway&#8217;s Life and has a really short function.</p>
<p>The functions can be quite complicated (<em>it&#8217;s JavaScript</em>) as this example shows which moves a ball around the screen while changing colours.</p>
<p>The ctx (<em>short for context</em>) object has various properties and functions that you can call on it. For example ctx.resolution is how many squares there are on the board and <a title="Link to tileflip help page" href="https://tileflip.xyz/#/help" target="_blank" rel="nofollow noopener">this page list</a>s all the properties and functions.</p>
<pre><code class="language-javascript" data-line="">function rule(ctx){
  
  ctx.color = ctx.floatToColor(10/ctx.t)
  
  let r = Math.min(ctx.t**2/10, ctx.resolution/4);
  let cx = ctx.t*2%(2*ctx.resolution+1);
  let cy = ctx.t*3%(2*ctx.resolution+1);

  
  if(cx &gt;= ctx.resolution+1){
    cx = 2*ctx.resolution - cx;
  }
  
  if(cy &gt;= ctx.resolution){
    cy = 2*ctx.resolution - cy;
  }
  
  cx = cx/(ctx.resolution)*(ctx.resolution-2*r+1)
  cx += r - 1;
  
  cy = cy/(ctx.resolution)*(ctx.resolution-2*r+1)
  cy += r - 1;
  
  let toReturn = inCircle(cx, cy, ctx.x, ctx.y, r);
  
  if(!toReturn){
    ctx.color = &#039;black&#039;
    ctx.invert = true;
  }
  
  return toReturn;
}

function inCircle(cx, cy, x, y, r){
  return (cx-x)**2 + (cy-y)**2 &lt; r**2 ? 1 : 0
}</code></pre>
<p>JavaScript is like C in many ways and while not the main purpose of LearnCGames.com, websites like this are an inspiration to games creators. My other interest is C# and I&#8217;m currently learning about Blazor a technology that lets you create webpages in C# using WebAssembly so it&#8217;s quite possible that things like this could be done in Blazor.</p>
<p>But it&#8217;s fun to look at the different example functions and you can also download the images as gifs via a link at the bottom of the page,</p>The post <a href="https://learncgames.com/interesting-visualisation-like-tixy-land/">Interesting Visualisation – like tixy.land</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2401</post-id>	</item>
		<item>
		<title>Tilengine &#8211; for creating Retro games</title>
		<link>https://learncgames.com/tilengine-for-creating-retro-games/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tilengine-for-creating-retro-games</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 16 Dec 2020 00:00:12 +0000</pubDate>
				<category><![CDATA[engines]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Retro]]></category>
		<category><![CDATA[tiles]]></category>
		<category><![CDATA[toolkit]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=2077</guid>

					<description><![CDATA[<p>Tilengine is an open source, cross-platform 2D graphics engine in C for creating classic/retro games with tile maps, sprites and palettes. It&#8217;s intended use is for developing 2D games of old. Written in C99, it can be used on Windows (32/64), Linux PC(32/64), Mac OS X and Raspberry Pi. Internally it uses some SDL2 libraries. [&#8230;]</p>
The post <a href="https://learncgames.com/tilengine-for-creating-retro-games/">Tilengine – for creating Retro games</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:320,&quot;href&quot;:&quot;https:\/\/github.com\/megamarc\/Tilengine&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250929182132\/https:\/\/github.com\/megamarc\/Tilengine&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:00:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 05:10:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 15:23:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-20 23:37:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 05:28:46&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 04:40:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 15:42:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 11:18:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-21 16:13:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 20:35:29&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-30 14:17:30&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 01:49:30&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 11:54:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 19:43:16&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-13 03:32:47&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 07:43:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-20 03:16:32&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:32&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:321,&quot;href&quot;:&quot;http:\/\/www.tilengine.org\/doc\/md_sprites.html&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250806025807\/https:\/\/www.tilengine.org\/doc\/md_sprites.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:00:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-12 05:10:25&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 06:26:16&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-20 23:37:59&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 05:28:47&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 04:40:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 01:10:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 11:18:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-24 04:29:27&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-27 08:38:54&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-30 14:17:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 01:49:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 11:54:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 19:43:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-13 03:32:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 07:43:06&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-19 19:17:23&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 19:17:23&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><a title="Link to Tileengine on GitHub" href="https://github.com/megamarc/Tilengine" target="_blank" rel="nofollow noopener"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-2078" src="https://learncgames.com/wp-content/uploads/2020/12/tileengine-300x180.png" alt="Tileengine" width="300" height="180" srcset="https://learncgames.com/wp-content/uploads/2020/12/tileengine-300x180.png 300w, https://learncgames.com/wp-content/uploads/2020/12/tileengine.png 400w" sizes="auto, (max-width: 300px) 100vw, 300px" />Tilengine</a> is an open source, cross-platform 2D graphics engine in C for creating classic/retro games with tile maps, sprites and palettes. It&#8217;s intended use is for developing 2D games of old.</p>
<p>Written in C99, it can be used on Windows (32/64), Linux PC(32/64), Mac OS X and Raspberry Pi. Internally it uses some SDL2 libraries. There are bindings for other programming languages as well as native support for C/C++.</p>
<p>You&#8217;d use this for parallax effects using sprites over background layers. It makes it easier than coding yourself. In particular <a title="Link to tilengine sprites documentation on GitHub" href="http://www.tilengine.org/doc/md_sprites.html" target="_blank" rel="nofollow noopener">sprite animation</a> is excellent with pixel perfect collision detection and 17 different functions for manipulating them. Rather than roll my own in my Asteroids game I could have used this.</p>
<p>The other documentation is a little spare with placeholders, but I imagine you can work it out from the header files and samples.</p>The post <a href="https://learncgames.com/tilengine-for-creating-retro-games/">Tilengine – for creating Retro games</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2077</post-id>	</item>
		<item>
		<title>Drawing  dungeon rooms using characters</title>
		<link>https://learncgames.com/drawing-dungeon-rooms-using-characters/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=drawing-dungeon-rooms-using-characters</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 01 Dec 2020 00:00:36 +0000</pubDate>
				<category><![CDATA[design]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[roguelike]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=1932</guid>

					<description><![CDATA[<p>The final game will use graphics but those graphics will be based on characters, so I&#8217;ve started off by drawing a room or two using the provided extended ASCII characters. Here for example is an 8 x 8 cell room with four inner columns and four possible doors. I&#8217;ve used spaces in one and full [&#8230;]</p>
The post <a href="https://learncgames.com/drawing-dungeon-rooms-using-characters/">Drawing  dungeon rooms using characters</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:346,&quot;href&quot;:&quot;https:\/\/theasciicode.com.ar\/extended-ascii-code\/box-drawing-character-single-line-lower-left-corner-ascii-code-192.html#:~:text=1)%20Press%20the%20%22Alt%22,%22%E2%94%94%22%20in%20ASCII%20table.&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260206141426\/https:\/\/theasciicode.com.ar\/extended-ascii-code\/box-drawing-character-single-line-lower-left-corner-ascii-code-192.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-1936" src="https://learncgames.com/wp-content/uploads/2020/12/some-roguelike-rooms.png" alt="Some roguelike rooms" width="102" height="244" />The final game will use graphics but those graphics will be based on characters, so I&#8217;ve started off by drawing a room or two using the provided extended ASCII characters.</p>
<p>Here for example is an 8 x 8 cell room with four inner columns and four possible doors. I&#8217;ve used spaces in one and full stops in the other to see which looks better. I think I prefer full stops as you can count them but it&#8217;s not a big difference.</p>
<pre>╔════╬═╗  ╔════╬═╗  /----\
║      ║  ║......║  |....|
║ ╬  ╬ ║  ║.╬..╬.║  #....|
╬      ╬  ╬......╬  |....|
║      ║  ║......║  \.||./
║ ╬  ╬ ║  ║.╬..╬.║
║      ║  ║......║
╚═╬════╝  ╚═╬════╝
</pre>
<p>The 3rd room is smaller and roughly octagonal though not as nice looking. I used the normal ASCII characters for that with the two slashes ( / and \ ) as well as # for a vertical wall door and two | for a double door. Here&#8217;s a corridor that goes round two corners and then meets another one.</p>
<pre>═══     ╔════╦══
   ╚════╝    ║
</pre>
<p>There are plenty of ASCII character charts and I used <a title="Link to extended ASCII chart" href="https://theasciicode.com.ar/extended-ascii-code/box-drawing-character-single-line-lower-left-corner-ascii-code-192.html#:~:text=1)%20Press%20the%20%22Alt%22,%22%E2%94%94%22%20in%20ASCII%20table." target="_blank" rel="nofollow noopener noreferrer">this one</a> which describes all the graphical chars making it easy, albeit a bit tedious to draw these in any text editor. There are single box characters as well as the double ones I&#8217;ve used. The ╬ character has proved very versatile as it provides not only columns but doors in both horizontal and vertical walls.</p>
<p>It&#8217;s noticeable that despite this room being square, it looks rectangular thanks to characters being taller than wide. Also in WordPress, the gaps between lines are more noticeable as gaps whereas in Notepad++ (<em>the editor I used to create these</em>) as shown in the image at the top, these gaps are absent.</p>The post <a href="https://learncgames.com/drawing-dungeon-rooms-using-characters/">Drawing  dungeon rooms using characters</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1932</post-id>	</item>
		<item>
		<title>So I&#8217;ve decided- graphics it is for the roguelike</title>
		<link>https://learncgames.com/so-ive-decided-graphics-it-is-for-the-roguelike/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=so-ive-decided-graphics-it-is-for-the-roguelike</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 10 Nov 2020 00:00:02 +0000</pubDate>
				<category><![CDATA[design]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[rogue]]></category>
		<category><![CDATA[sources]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=1769</guid>

					<description><![CDATA[<p>I did a quick search for free rogue graphics yesterday and found an astonishing quantity of rogue type graphics in sizes varying from 8 x 8 (pixels), 10 x 10, 16 x 16, 32 x 32 and 64 x 64. I haven&#8217;t quantified these sizes exactly but the 16 x 16 ones seems to be [&#8230;]</p>
The post <a href="https://learncgames.com/so-ive-decided-graphics-it-is-for-the-roguelike/">So I’ve decided- graphics it is for the roguelike</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:392,&quot;href&quot;:&quot;https:\/\/opengameart.org\/content\/16x16-dawnhack-roguelike-tileset&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20240323012805\/https:\/\/opengameart.org\/content\/16x16-dawnhack-roguelike-tileset&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:42:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-12 05:10:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 13:13:40&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-18 20:32:05&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-23 10:10:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 11:05:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-04 14:14:51&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 17:17:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 17:29:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 22:16:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 04:29:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-27 13:09:47&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 16:15:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 03:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 11:44:16&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-13 03:32:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 11:26:21&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-20 09:36:15&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 09:36:15&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:393,&quot;href&quot;:&quot;https:\/\/www.reddit.com\/r\/roguelikedev\/comments\/436sop\/roguelike_tilesets&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250330005949\/https:\/\/www.reddit.com\/r\/roguelikedev\/comments\/436sop\/roguelike_tilesets\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:42:36&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-12 05:10:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 13:13:39&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-18 20:32:04&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-23 10:10:25&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-27 11:05:33&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-07 17:17:24&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-11 17:29:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 04:31:08&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-21 01:17:12&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-27 03:58:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 16:15:30&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-06 03:55:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-09 11:44:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-13 03:32:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 11:26:19&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-20 09:36:17&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 09:36:17&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:394,&quot;href&quot;:&quot;https:\/\/kenney.nl\/assets\/roguelike-rpg-pack&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260105012624\/https:\/\/kenney.nl\/assets\/roguelike-rpg-pack&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:42:39&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-12 05:10:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 13:13:40&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-18 20:32:08&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-23 10:10:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 11:05:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 17:17:25&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 17:29:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 22:16:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 04:29:30&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 16:15:30&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 03:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 11:44:15&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 19:33:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 03:26:45&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 11:18:53&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 11:18:53&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:395,&quot;href&quot;:&quot;https:\/\/imgur.com\/gallery\/UvrzmBt&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20220812072122\/https:\/\/imgur.com\/gallery\/UvrzmBt&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:42:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-12 05:10:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 13:13:39&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-18 20:32:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-22 21:48:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:05:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 17:17:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-11 17:29:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 04:31:12&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-21 01:18:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-25 15:07:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 02:13:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-05 11:55:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-08 19:15:47&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 03:35:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 18:46:16&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-19 03:20:16&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 03:20:16&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:396,&quot;href&quot;:&quot;https:\/\/www.gog.com\/game\/ultima_1_2_3&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20240813051724\/https:\/\/www.gog.com\/game\/ultima_1_2_3&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 14:42:43&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-02-12 05:10:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 13:13:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-19 13:37:43&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 21:48:46&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 11:05:33&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-03-04 14:14:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-11 17:29:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 22:15:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 04:29:27&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-27 13:09:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 02:13:24&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-05 11:55:43&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-08 19:15:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 03:35:39&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 18:44:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 03:20:13&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 03:20:13&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'></div>
<figure id="attachment_1771" aria-describedby="caption-attachment-1771" style="width: 410px" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="size-full wp-image-1771" src="https://learncgames.com/wp-content/uploads/2020/11/Dawnlike-iopengameart.png" alt="Dawnlike on OpenGameart" width="410" height="306" srcset="https://learncgames.com/wp-content/uploads/2020/11/Dawnlike-iopengameart.png 410w, https://learncgames.com/wp-content/uploads/2020/11/Dawnlike-iopengameart-300x224.png 300w" sizes="auto, (max-width: 410px) 100vw, 410px" /><figcaption id="caption-attachment-1771" class="wp-caption-text"><a href="https://opengameart.org/content/16x16-dawnhack-roguelike-tileset">Dawnlike on OpenGameArt.org</a></figcaption></figure>
<p>I did a quick search for free rogue graphics yesterday and found an astonishing quantity of rogue type graphics in sizes varying from 8 x 8 (<em>pixels</em>), 10 x 10, 16 x 16, 32 x 32 and 64 x 64. I haven&#8217;t quantified these sizes exactly but the 16 x 16 ones seems to be the most frequent and so that&#8217;s what I&#8217;ll pick.  <a title="Link to Reddit post on sourcing rogue graphics" href="https://www.reddit.com/r/roguelikedev/comments/436sop/roguelike_tilesets/" target="_blank" rel="nofollow noopener noreferrer">This post on Reddit</a> provided links to many free (<em>and some paid</em>), most on the OpenGameArt website.</p>
<p>As a programmer sorting out graphics, it can be a very time consuming thing to do, so expect to spend a lot of time on it. You&#8217;ve got to satisfy yourself that you have enough graphics.  Not just for terrain (<em>e.g. dungeons and cities</em>) but also for monsters. There are artists who will draw you more on sites like fiverr.com but that&#8217;s all cost.  If you can draw or recolour then that&#8217;s a major plus.</p>
<p>Recolouring is another problem. With game graphics, you ideally want them all from the same source or else you&#8217;ll have the problem of mismatched sets. Nothing jars visually more than mixing graphics with different palettes. I&#8217;m no artist but even I can tell when something works and when it doesn&#8217;t.</p>
<p>Also there&#8217;s the question of perspective. The Dawnlike graphics are a sort of mix of from above but with a slant so you see front walls. Whereas something like the <a title="Link to kenney.nl rogue rpg game pack" href="https://kenney.nl/assets/roguelike-rpg-pack" target="_blank" rel="nofollow noopener noreferrer">Kenney rogue game pack</a> is front on. So you have to decide which you are going to go with.</p>
<p>My ideal game would be one of my favourites- Ultima 3. This is probably because its the only Ultima that I have played right through to the end and finished it! It was also the first. It took me about three months of one hour&#8217;s play a night. And I took copious notes. But as you can see its a bit more than a rouge like game! Those screenshots are from a CBM-64 which had a 320 x 200 screen (<em>the image below is a composite of nine screens</em>) borrowed from <a title="Link to imgur.com" href="https://imgur.com/gallery/UvrzmBt" target="_blank" rel="nofollow noopener noreferrer">https://imgur.com/gallery/UvrzmBt</a>. You can of course get the PC version sof Ultima III (and I and II) from <a title="Link to Ultima I+II+III on gog.com" href="https://www.gog.com/game/ultima_1_2_3" target="_blank" rel="nofollow noopener noreferrer">gog.com.</a>  (<em>Note these are straight links <strong>not</strong> affiate. I receive nothing from them</em>). I did buy Ultima I-VI from gog.com.</p>
<p><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-1772" src="https://learncgames.com/wp-content/uploads/2020/11/ultima3-300x223.png" alt="Ultima 3 screens" width="300" height="223" srcset="https://learncgames.com/wp-content/uploads/2020/11/ultima3-300x223.png 300w, https://learncgames.com/wp-content/uploads/2020/11/ultima3.png 682w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>The post <a href="https://learncgames.com/so-ive-decided-graphics-it-is-for-the-roguelike/">So I’ve decided- graphics it is for the roguelike</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1769</post-id>	</item>
		<item>
		<title>Another mini project &#8211; a resource manager</title>
		<link>https://learncgames.com/another-mini-project-a-resource-manager/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=another-mini-project-a-resource-manager</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 07 May 2020 23:00:53 +0000</pubDate>
				<category><![CDATA[Graphics]]></category>
		<category><![CDATA[resource manager]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=543</guid>

					<description><![CDATA[<p>In my ebook I talked about professional games using a resource manager. Games like Quake 2 use a .pak file which stores all images, levels etc. The first stage towards writing a resource manager is to have some way of compressing files. Most graphic file formats such as jpg, gif and png are already compressed. [&#8230;]</p>
The post <a href="https://learncgames.com/another-mini-project-a-resource-manager/">Another mini project – a resource manager</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:541,&quot;href&quot;:&quot;https:\/\/www.libsdl.org\/projects\/SDL_image&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260204203014\/https:\/\/libsdl.org\/projects\/SDL_image\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 15:57:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 02:51:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 09:33:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:31:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 12:06:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 15:37:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-02 03:16:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-05 22:55:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-09 09:13:02&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-13 09:10:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 21:38:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-22 18:33:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 10:10:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-29 10:16:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 02:13:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 11:55:42&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-08 19:15:59&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-12 03:35:38&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 10:27:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 19:20:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-22 03:01:46&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 03:01:46&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:737,&quot;href&quot;:&quot;https:\/\/gamedev.stackexchange.com\/questions\/131138\/how-to-pass-png-image-data-directly-to-sdl&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20241127183904\/https:\/\/gamedev.stackexchange.com\/questions\/131138\/how-to-pass-png-image-data-directly-to-sdl&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 18:05:43&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-12 05:10:22&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 23:29:43&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 21:48:46&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 10:52:35&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-05 22:55:37&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-12 18:18:22&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-17 18:45:17&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-24 04:29:29&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-27 15:39:36&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 02:13:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-05 11:55:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-08 19:15:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 03:35:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-15 18:44:36&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 03:20:08&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 03:20:08&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-544" src="https://learncgames.com/wp-content/uploads/2020/04/castle.png" alt="Castle image" width="288" height="209" />In my ebook I talked about professional games using a resource manager. Games like Quake 2 use a .pak file which stores all images, levels etc. The first stage towards writing a resource manager is to have some way of compressing files. Most graphic file formats such as jpg, gif and png are already compressed. But other files like level files aren&#8217;t, typically text and so will compress well.</p>
<p>So a resource manager if it understands the type of resources it is handling can compress or not according to the file type. It will bundle everything into one archive file, and maintain a simple directory indicating where in the archive file each resource file starts, length and type.</p>
<p>However there is the issue of security. The idea of the resource manager is to protect your assets. I have two old games from the Dos days (<em>bought recently on gog.com and playable in Windows</em>)  and a quick glance in the games folder shows some interesting files! That&#8217;s one of them shown above. It&#8217;s parts of a castle. There are hundreds of graphic files just lying there in the open. They are in an older graphic format (.pcx) but <a title="Link to SDL2_Image webpage" href="https://www.libsdl.org/projects/SDL_image/" target="_blank" rel="noopener noreferrer">SDL2_image</a> can read those quite happily.</p>
<p>So not only should a resource manager protect your files, it should obscure them so anyone inspecting them with a binary file editor can&#8217;t easily spot them.</p>
<p>That brings me to the 2nd point about security. Your program has to be able to use the resources directly from the resource manager rather than say unpack them into a folder on disk. According to this <a title="Link to gamedev.stackexchange.com answer" href="https://gamedev.stackexchange.com/questions/131138/how-to-pass-png-image-data-directly-to-sdl" target="_blank" rel="noopener noreferrer">stackexchange answer</a>, SDL2 can do that, so something for me to experiment with.</p>
<p>So I&#8217;m starting on a simple and easy to use resource manager. It&#8217;ll be implemented as a simple library that provides access to images, text files etc. all loaded from a resource file. And there will be a standalone utility to add, delete and list files in that resource file.</p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/another-mini-project-a-resource-manager/">Another mini project – a resource manager</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">543</post-id>	</item>
	</channel>
</rss>
