<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home</title>
    <link>http://luminaryapps.com/blog/blog-rss.xml</link>
    <description>Luminary Apps : Luminary Apps Blog</description>
    <generator>Custom code by Joe Strout</generator>
    <atom:link href="http://luminaryapps.com/blog/blog-rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Math-Assignment Operators in MiniScript?</title>
      <link><<ROOT_PATH>>blog/math-assign-ops</link>
      <guid><<ROOT_PATH>>blog/math-assign-ops</guid>
      <description><![CDATA[ <p>Most people who discover MiniScript are delighted at its design and feature set.  It covers all the important functionality &mdash; things like true lists and maps, functions as first-class objects, and object-oriented programming &mdash; while still being minimal and clean, small enough to document in a <a href="https://miniscript.org/files/MiniScript-QuickRef.pdf">single page</a>.</p>

<p>But there is one omission that is sometimes a source of complaints: MiniScript, as of now, does not have math-assignment operators like <b><code>+=</code></b> and <b><code>-=</code></b>.
 ]]></description>
      <pubDate>Sat, 22 Oct 2022 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Retained vs. Immediate Mode Graphics</title>
      <link><<ROOT_PATH>>blog/retained-vs-immediate</link>
      <guid><<ROOT_PATH>>blog/retained-vs-immediate</guid>
      <description><![CDATA[ <p>A Mini Micro user today asked me to explain why it was designed with sprites that are retained between frames, instead of having users explicitly draw them on each frame.  This is an insightful question!  It's the difference between <i>retained mode</i> and <i>immediate mode</i> graphics.
</p>
 ]]></description>
      <pubDate>Mon, 22 Aug 2022 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>MiniScript CGI Programming</title>
      <link><<ROOT_PATH>>blog/miniscript-cgi</link>
      <guid><<ROOT_PATH>>blog/miniscript-cgi</guid>
      <description><![CDATA[ <p>The Common Gateway Interface, or CGI, remains a valid and simple way to create dynamic web pages and services.  MiniScript is an excellent choice for creating CGI scripts.  In this post, we'll go over how to set up your web environment and get started making your own CGI scripts, along with some simple examples.
 ]]></description>
      <pubDate>Sun, 31 Jul 2022 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Advanced Tricks with Import</title>
      <link><<ROOT_PATH>>blog/advanced-import</link>
      <guid><<ROOT_PATH>>blog/advanced-import</guid>
      <description><![CDATA[ <p>The <a href="https://miniscript.org/wiki/Import">import</a> function is not a standard part of the <a href="https://miniscript.org">MiniScript</a> language, but it is a feature common to many MiniScript environments, including <a href="https://miniscript.org/MiniMicro/">Mini Micro</a>, <a href="https://github.com/JoeStrout/Farmtronics">Farmtronics</a>, <a href="https://miniscript.org/cmdline/">command-line MiniScript</a>, and <a href="https://github.com/JoeStrout/soda/">Soda</a>.  In this post, we review how import works, and describe some techniques for advanced users.</p>

 ]]></description>
      <pubDate>Thu, 16 Jun 2022 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>String Fill and Match</title>
      <link><<ROOT_PATH>>blog/ms-fill-match</link>
      <guid><<ROOT_PATH>>blog/ms-fill-match</guid>
      <description><![CDATA[ <p>Version 1.1 of <a href="https://miniscript.org/MiniMicro/">Mini Micro</a> included a couple of very useful additions to the stringUtil module.  If you aren't already using the new <code>fill</code> and <code>match</code> methods, you probably should be!</p>

 ]]></description>
      <pubDate>Fri, 10 Jun 2022 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Debugging with a Validate Method</title>
      <link><<ROOT_PATH>>blog/validate</link>
      <guid><<ROOT_PATH>>blog/validate</guid>
      <description><![CDATA[ <p>I was <a href="https://www.twitch.tv/joestrout/schedule">live streaming</a> a coding session today, wrapping up a Tetris clone in Mini Micro.  All was going swimmingly until suddenly we noticed a bug: after clearing a line, subsequent pieces would sometimes stop before hitting anything.  Upon closer inspection, we noticed that the higher-up lines, after moving down to fill the cleared row, often had blocks in the wrong place.</p>

<p>What ensued was an abnormally long debugging session.  I tried confessional debugging; I tried walking through the code; I tried checking my assumptions by having the code print out what it was doing.  After 20 minutes of this I was still stumped.  In desperation, I reached for a tool I should have brought out much faster: the <b>validate method</b>.</p>

 ]]></description>
      <pubDate>Mon, 01 Nov 2021 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>VT100 Escape Codes in Command-Line MiniScript</title>
      <link><<ROOT_PATH>>blog/vt100-codes</link>
      <guid><<ROOT_PATH>>blog/vt100-codes</guid>
      <description><![CDATA[ <p><a href="https://miniscript.org/">MiniScript</a> is most commonly used either in the <a href="https://miniscript.org/MiniMicro/">Mini Micro</a> virtual computer, or embedded within some other game or application.  However it is also available on the <a href"https://miniscript.org/cmdline/">command line</a>.  A command-line MiniScript user asked me the other day: is there a way to clear the terminal window from code?</p>

<p>The answer is, yes and no.  There is no built-in API for it, but in most cases, it can be done with an ancient set of tricks known as VT100 escape codes.</p>

 ]]></description>
      <pubDate>Sun, 03 Oct 2021 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Why MiniScript?</title>
      <link><<ROOT_PATH>>blog/miniscript-why</link>
      <guid><<ROOT_PATH>>blog/miniscript-why</guid>
      <description><![CDATA[ <p>As more and more people discover <a href="https://miniscript.org/">MiniScript</a>, the question is occasionally asked: why?  Why was MiniScript created, and why should someone use it rather than some other language?</p>

<p>It's a perfectly valid question, so in this post I will try to clarify.  My purpose is not to convince anyone of anything, but to <i>explain</i> why, after years of using other scripting languages, I felt compelled to create something new.  I'll do this without attacking other languages, since every language has its fans and I don't want to kick anybody's dog; instead I'll focus on what I think is really cool about MiniScript, and how it offers a collection of advantages that, taken together, can't be found anywhere else.

 ]]></description>
      <pubDate>Fri, 06 Sep 2019 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>MiniScript Goes Open-Source</title>
      <link><<ROOT_PATH>>blog/miniscript-open-source</link>
      <guid><<ROOT_PATH>>blog/miniscript-open-source</guid>
      <description><![CDATA[ <p>MiniScript has been available as a <a href="https://www.assetstore.unity3d.com/#!/content/87926">Unity plugin</a> since 2017.  But it has been such a success with its users that it deserved wider distribution.  MiniScript in Unreal games, MiniScript on the command line, MiniScript in your browser... why not?   And while it was great to get a little financial support for working on MiniScript in the early days, in the long run keeping it commercial only slows down its adoption.  That's why, as of today, MiniScript is open-source.</p>
 ]]></description>
      <pubDate>Sun, 09 Jun 2019 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Getting Started with the Oculus Platform SDK</title>
      <link><<ROOT_PATH>>blog/oculus-platform</link>
      <guid><<ROOT_PATH>>blog/oculus-platform</guid>
      <description><![CDATA[ <p>I've been doing a lot of development for the <a href="https://www.oculus.com/go/">Oculus Go</a> lately, which is an absolutely marvelous VR platform &mdash; inexpensive, easy to use, and high quality (when the development is done right).  For the most part, developing for it in Unity is straightforward; the camera automatically tracks the rotation of the headset, and the OVRInput class provides controller tracking and touch/button inputs.</p>

<p>But at some point you may need to use some part of the extensive <a href="https://developer.oculus.com/documentation/platform/latest/concepts/book-dg/">"Oculus Platform" SDK</a>.  This provides information about the current user, such as their Oculus username, and also provides all manner of match-making and social services, including efficient voice (VoIP) chat.  Unfortunately, accessing this SDK isn't nearly as simple as you might expect.  This post explains how to do it.</p>

 ]]></description>
      <pubDate>Tue, 11 Sep 2018 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>How a Daily Purge Folder Changed My Life</title>
      <link><<ROOT_PATH>>blog/dailypurge</link>
      <guid><<ROOT_PATH>>blog/dailypurge</guid>
      <description><![CDATA[ <p>I used to be just like you.  I had a Downloads folder full of junk, and a desktop full of clutter.  Screen shots, temp files, email attachments, and more filled my computer like leaves on the ground in autumn.  Now and then I would try to clean up the mess, but it was a chore that all too often went undone.</p>

<p>Then I made a <b>DailyPurge</b> folder, and my whole life changed.</p>
 ]]></description>
      <pubDate>Sun, 04 Mar 2018 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Configurable Input in Unity</title>
      <link><<ROOT_PATH>>blog/configurable-input</link>
      <guid><<ROOT_PATH>>blog/configurable-input</guid>
      <description><![CDATA[ <p>I have long thought that Unity did not really support configurable input out of the box — at least not without using the ugly default Graphics/Input configuration dialog (which no polished game would ever inflict on its players).  Particularly if you wanted to support hot-swappable joysticks or gamepads, I always believed you had to use some third-party plug-in.</p>

<p>But I recently discovered that this is not true!  Making configurable, hot-swappable input in Unity can be done without any plug-ins, and it's not even all that difficult.  Read on to see how.</p>
 ]]></description>
      <pubDate>Fri, 26 May 2017 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Fading the Music on a Scene Change</title>
      <link><<ROOT_PATH>>blog/fading-the-music-on-a-scene-change</link>
      <guid><<ROOT_PATH>>blog/fading-the-music-on-a-scene-change</guid>
      <description><![CDATA[ <p>A lot of games in Unity are organized into several scenes, most notably a title scene and a play scene.&nbsp; If your game has background music, you're likely to want different background music for each scene.</p>
<p>Just sticking a music clip on an AudioSource in the scene would accomplish that, but the music would cut off abruptly when you change scenes, which is jarring and unprofessional.&nbsp; Much better to fade it out over several seconds.&nbsp; That requires not letting the object be destroyed when the scene changes, and handling the scene-change event — which thanks to <a href="https://forum.unity3d.com/threads/important-function-deprecated-what-is-the-new-alternative.424746/page-2" target="_blank">recent changes</a> in the Unity API, is not as easy as it used to be.</p>
 ]]></description>
      <pubDate>Wed, 21 Dec 2016 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Arcing Projectiles in Unity</title>
      <link><<ROOT_PATH>>blog/arcing-projectiles-in-unity</link>
      <guid><<ROOT_PATH>>blog/arcing-projectiles-in-unity</guid>
      <description><![CDATA[ <p>A frequently asked question in both the Unity forums and on Unity Answers is: How do I make a projectile arc to its target, like an arrow shot from a bow?&nbsp; I've seen (and given) lots of different answers to this question, and honestly, most of them are unjustified hacks.<br /><br />The right (and easy!) way to do this is: just add a bit of arc to your standard movement.&nbsp; Objects in freefall (ignoring air resistance) follow a <a href="https://www.mathsisfun.com/geometry/parabola.html" target="_blank">parabolic arc</a>, and the equation for a parabola is very simple.&nbsp; So, we can just use that equation to compute how must extra height we should have, and simply add it to our Y position, and the job is done.</p>
 ]]></description>
      <pubDate>Thu, 01 Sep 2016 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Implementing Cheat Codes</title>
      <link><<ROOT_PATH>>blog/implementing-cheat-codes</link>
      <guid><<ROOT_PATH>>blog/implementing-cheat-codes</guid>
      <description><![CDATA[ <p>Cheat codes are secret ways to alter the functionality of a game.&nbsp; It's a term that makes me cringe as a parent, since we teach our kids never to cheat — but once a game starts to grow complex, cheat codes are absolutely essential testing tools.&nbsp; They let you bypass minutes or hours of gameplay you already know is working, in order to get to the part you're trying to fix.</p>
<p>So, how do you actually implement them?&nbsp; This post explains how we do it in our Unity games.</p>
 ]]></description>
      <pubDate>Wed, 17 Aug 2016 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Use a PID loop to control Unity game objects</title>
      <link><<ROOT_PATH>>blog/use-a-pid-loop-to-control-unity-game-objects</link>
      <guid><<ROOT_PATH>>blog/use-a-pid-loop-to-control-unity-game-objects</guid>
      <description><![CDATA[ <p>One of the most general and common tricks ever to come out of industrial control theory is the <strong>proportional&ndash;integral&ndash;derivative controller</strong> (<a href="https://en.wikipedia.org/wiki/PID_controller" target="_blank">PID controller</a>), sometimes known as a "PID loop."&nbsp; It is a simple equation that you can use to control any one-dimensional variable, such as a throttle, a motorized hinge, etc.&nbsp; All it needs for an input is an "error" signal — that is, a measure of how far off something is from where you want it to be, plus three constants.&nbsp; Most importantly, it does not need any model of how the value it's controlling relates to the output.</p>
<p>In this post, I'll give you well-encapsulated code for a PID controller in C#, and show how to use this in Unity to control the throttle of a hovercar.&nbsp; The hovercar physics involves momentum, drag, and controls that don't respond instantly, just like a real hovercar!&nbsp; But the PID controller doesn't care about any of that; once you have the three constants tuned, and hook up the error signal (in this case, the difference between the current altitude and the altitude you want), it does the rest.</p>
 ]]></description>
      <pubDate>Mon, 04 Apr 2016 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>CallLater: deferred callbacks for Unity</title>
      <link><<ROOT_PATH>>blog/calllater-deferred-callbacks-for-unity</link>
      <guid><<ROOT_PATH>>blog/calllater-deferred-callbacks-for-unity</guid>
      <description><![CDATA[ <p>In many game projects, I've often found the need to execute some bit of code at a later time.&nbsp; Often this relates to audiovisual flourishes.&nbsp; For example, when the player does something scoreworthy, we may want to start a particle effect and sound right away, but then spawn a different effect after a short delay, and actually update the score a while after that.</p>
<p>You could certainly spread the code to do those things out into different classes or methods, triggered by events or other custom code.&nbsp; I've certainly been known to do that; I love Unity Event, and most of my classes that do anything over time expose events for when they start and finish their work, making it easy to chain them together.</p>
<p>But sometimes, dividing up the logic that way makes the code less clear, not more.&nbsp; There may be one place in the code that is handling everything related to this set of actions, and the only thing driving the code apart is that you want it to happen at different times.</p>
<p>CallLater was created to handle just this situation.&nbsp; It lets you write some code, right there in the middle of a method, to actually be run later, after whatever delay you specify.</p>
 ]]></description>
      <pubDate>Tue, 19 Jan 2016 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Announcing GRFON, a kinder, gentler serialization format</title>
      <link><<ROOT_PATH>>blog/announcing-grfon-a-kinder-gentler-serialization-format</link>
      <guid><<ROOT_PATH>>blog/announcing-grfon-a-kinder-gentler-serialization-format</guid>
      <description><![CDATA[ <p>For our <a href="http://HighFrontier.com" target="_blank">High Frontier</a> video game, we wanted a data file format that would be easy for people to read and write.&nbsp; This is partly for our own use — we would be hand-editing files defining various parts of the game internally — and partly for mod authors, who would be creating new content for the game.</p>
<p>The big players in the serialization space are JSON and XML.&nbsp; XML is, to be blunt, horrible.&nbsp; It's fine for data that is only ever looked at by computer programs, but for anything that might be read or written by a human, it's just awful.&nbsp; JSON is much better, and it's what we've often used in the past.&nbsp; But it too has more syntax than feels necessary.&nbsp; And at the same time, it lacks some features we really wanted, like comments.</p>
<p>So we have designed a new serialization format: <strong>GRFON</strong> (General Recursive Format Object Notation).&nbsp; We've been using it for over a year now, and loving every minute of it.&nbsp; And today, we are making it available for everyone else to use too, under the permissive <strong>MIT open-source license</strong>.</p>
 ]]></description>
      <pubDate>Wed, 30 Dec 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Showing the build date in a Unity app</title>
      <link><<ROOT_PATH>>blog/showing-the-build-date-in-a-unity-app</link>
      <guid><<ROOT_PATH>>blog/showing-the-build-date-in-a-unity-app</guid>
      <description><![CDATA[ <p>When doing rapid iterations of an app (a cornerstone of <a href="https://en.wikipedia.org/wiki/Agile_software_development" target="_blank">agile development</a>), testers sometimes find themselves with an older version of the app.&nbsp; This could be because they didn't get the update email, or they clicked the wrong link, or DropBox didn't sync like it's supposed to, or something got cached along the way... whatever the reason, there are few things less helpful than getting a bug report for something you've already fixed.</p>
<p>In C/C++, it's easy enough to use the standard __DATE__ macro, which the C preprocessor fills in with the actual build date.&nbsp; You can just display this on the title screen or wherever, and testers can easily see whether they're running the latest build.&nbsp; But, surprisingly, C# doesn't have any such feature.&nbsp; This makes displaying the build date in a Unity app a bit harder.</p>
<p>Fortunately, it can be done.&nbsp; Here is the arcane magic you need.</p>
 ]]></description>
      <pubDate>Tue, 10 Nov 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Code Signing &amp; Packaging Windows Apps on a Mac</title>
      <link><<ROOT_PATH>>blog/code-signing-and-packaging-windows-apps-on-a-mac</link>
      <guid><<ROOT_PATH>>blog/code-signing-and-packaging-windows-apps-on-a-mac</guid>
      <description><![CDATA[ <p>I've been a cross-platform developer for many years.&nbsp; Lately my development tool of choice is Unity, which makes it trivial to build Mac, Windows, and Linux apps right on my Mac.<br /><br />However, there is an important step that Unity doesn't do for you: code-signing your built apps.&nbsp; If your apps aren't signed, then recent versions of Windows (or Mac OS X, for that matter) will throw up scary warnings and make your users jump through extra hoops to run them.</p>
 ]]></description>
      <pubDate>Sat, 26 Sep 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Triangulating 3D Polygons in Unity</title>
      <link><<ROOT_PATH>>blog/triangulating-3d-polygons-in-unity</link>
      <guid><<ROOT_PATH>>blog/triangulating-3d-polygons-in-unity</guid>
      <description><![CDATA[ <p>I'm currently doing a job where I need to take 3D polygon data and display it in Unity.&nbsp; These polygons are planar, but oriented arbitrarily in 3D space.&nbsp; Moreover, they can contain holes (possibly multiple holes).&nbsp; Think of a building wall with window cut-outs, and you'll get the idea.</p>
<p>This turns out to be a surprisingly thorny problem in Unity.&nbsp; There is a simple script on the Unity wiki called <a href="http://wiki.unity3d.com/index.php?title=Triangulator" target="_blank">Triangulator</a>, but it only works with Vector2D and doesn't support holes.&nbsp; I found a blog post on <a href="http://tothemathmos.com/2013/05/17/advanced-triangulation-in-unity.html" target="_blank">Advanced Triangulation in Unity</a>, but it was neither sufficiently advanced (only works in the XY plane) nor actually in Unity (it wrote each polygon out to a file, invoked an external command-line tool to do the triangulation, and then read the result back in).</p>
<p>The utility referenced in that blog post is called <a href="http://www.cs.cmu.edu/~quake/triangle.html" target="_blank">Triangle</a>, which is widely regarded as a very good triangle library.&nbsp; It's open-source C code, so one could make a Unity plugin out of it.&nbsp; But it's not licensed for commercial use, which is a problem for this project.&nbsp; Also, making a native plugin means setting up a build chain for every platform you want to support.&nbsp; For both reasons, I kept looking — I really wanted something in pure C#.</p>
 ]]></description>
      <pubDate>Wed, 19 Aug 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>2D Animation Methods in Unity</title>
      <link><<ROOT_PATH>>blog/2d-animation-methods-in-unity</link>
      <guid><<ROOT_PATH>>blog/2d-animation-methods-in-unity</guid>
      <description><![CDATA[ <p>Unity has provided a built-in state machine editor for managing  animations since version 4.&nbsp; This is the officially recommended approach  to animating a game character.&nbsp; However, it often leads to game logic  being divided between code and the animator state machine.&nbsp; I would  prefer to have all my game logic in one place, to simplify development  and debugging.&nbsp; Moreover, in some cases — especially simple 2D sprite  games — the Animator can seem like more trouble than it's worth.</p>
<p>To help clarify the pros and cons, I built a 2D game character using three different approaches:</p>
<ol>
<li>A simple home-grown animation system that eschews Unity's built-in animation support completely.</li>
<li>Use of Unity animations, but without using the Animator state machine; instead each animation is invoked directly from code.</li>
<li>Full use of the built-in Unity components, with all game logic in the state machine, and only minimal supporting code.</li>
</ol>
<p>For the rest of the story, see the <a href="http://www.gamasutra.com/blogs/JoeStrout/20150807/250646/2D_Animation_Methods_in_Unity.php">full article on Gamasutra</a>!</p> ]]></description>
      <pubDate>Thu, 13 Aug 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>The Real Power of UnityEvent</title>
      <link><<ROOT_PATH>>blog/the-real-power-of-unityevent</link>
      <guid><<ROOT_PATH>>blog/the-real-power-of-unityevent</guid>
      <description><![CDATA[ <p>Unity had a "Live Training" demo called <a href="http://unity3d.com/learn/tutorials/modules/intermediate/live-training-archive/events-creating-simple-messaging-system" target="_blank">Events: Creating a Simple Messaging System</a>.&nbsp; This is often pointed to as an example of using the UnityEvent class that was introduced in Unity 4.6.</p>
<p>While this was a fun and educational video, it uses UnityEvents in a very odd way, wrapping them in a string-based notification system and hooking everything up in code.  Honestly, you could have done exactly the same thing using standard C# events, and it wouldn't have made any difference.  (Indeed, prior to UnityEvent, many Unity developers — myself included — did exactly that.)</p>
<p>So I decided to make my own video, accomplishing the same demo but using UnityEvent the way nature intended.  The result is a lot less code, easier to maintain, and harder to screw up.</p>
 ]]></description>
      <pubDate>Thu, 04 Jun 2015 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Interactive Mono C#</title>
      <link><<ROOT_PATH>>blog/interactive-mono-c</link>
      <guid><<ROOT_PATH>>blog/interactive-mono-c</guid>
      <description><![CDATA[ <p>I've&nbsp; been teaching my son C# programming lately.&nbsp; This is a great choice, because it's the best language to use with <a href="http://www.unity3d.com/">Unity</a>, and with Unity, he can make games for virtually every platform under the sun. With some luck, he'll be able to make enough money in the various app stores to pay his way through college (or at least pay his own car insurance).&nbsp; And as a bonus, when you know C#, you can also develop native apps for Mac, Windows, iOS, and Android, using various toolkits (such as <a href="http://xamarin.com/monotouch">MonoTouch</a> for example).</p>
<p>However, the code-run-test-debug cycle is slower in Unity than I would like for his purposes.&nbsp; Learning a language is easier when you can play around with it interactively.&nbsp; This is especially true when you're working through small programming problems like those at <a href="http://projecteuler.net/">Project Euler</a>.</p>
 ]]></description>
      <pubDate>Thu, 21 Feb 2013 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>InkPaint version 1.6</title>
      <link><<ROOT_PATH>>blog/inkpaint-version-1-6</link>
      <guid><<ROOT_PATH>>blog/inkpaint-version-1-6</guid>
      <description><![CDATA[ <p>Our popular drawing/painting application, <a href="../../products/inkpaint/index.html">InkPaint</a>, has been updated to version 1.6 today.</p>
<p>The new version contains an important fix for problem on iOS 6 that would cause it to abruptly exit.</p>
<p>Also, if you're running on iOS 6, we now use Apple's new standard sharing dialog to share your drawings via Facebook, Twitter, email, etc., as well as copy them to the clipboard or send them to your network printer.</p>
<p>The new update is recommended for all InkPaint users.&nbsp; And if you're not using InkPaint already, please <a href="../../products/inkpaint/index.html">check it out</a> — we are sure you will love how easy and fast it is to create professional-quality drawings.</p> ]]></description>
      <pubDate>Fri, 25 Jan 2013 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Unity Coroutine Confusion</title>
      <link><<ROOT_PATH>>blog/unity-coroutine-confusion</link>
      <guid><<ROOT_PATH>>blog/unity-coroutine-confusion</guid>
      <description><![CDATA[ <p>We've been delving into Coroutines in Unity lately, and ran into a strange behavior today that took all morning to sort out.  In brief, a routine we thought we were calling never got called at all -- a Debug.Log as the very first line of the function never logged anything.</p>
 ]]></description>
      <pubDate>Wed, 05 Oct 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>iPhone Tab Bar and Navigation</title>
      <link><<ROOT_PATH>>blog/iphone-tab-bar-and-navigation</link>
      <guid><<ROOT_PATH>>blog/iphone-tab-bar-and-navigation</guid>
      <description><![CDATA[ <p>We've had a lot of rather philosophical blog posts lately (mostly related to the <a title="BOSS: Sneak Peek" href="../boss-sneak-peek/index.html">BOSS text searching system</a>).  It seems time to put that aside a moment and get back to some nice, solid iOS coding.</p>
<p>A common pattern for iPhone apps is a tab bar on the bottom, with a navigation stack on each tab.  Today, we'll look at how to set up such a structure in code.&nbsp; (And we'll do it in pure, <a title="Sweeten your Cocoa with C++" href="../sweetened-cocoa-a-pinch-of-c/index.html">unsweetened</a> Cocoa for that nostalgic old-school feel.)</p>
 ]]></description>
      <pubDate>Fri, 23 Sep 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Better to be lazy or greedy?</title>
      <link><<ROOT_PATH>>blog/better-to-be-lazy-or-greedy</link>
      <guid><<ROOT_PATH>>blog/better-to-be-lazy-or-greedy</guid>
      <description><![CDATA[ <p>Last week, we gave a <a title="BOSS: Sneak Peek" href="../boss-sneak-peek/index.html">sneak peek of BOSS</a>, a new approach to string searching.  We mentioned a "bit of magic" with regard to the repetition modifiers, * (0 or more) and + (one or more): these would do a lazy match, except at the end of the search pattern, in which case they would be greedy.</p>
<p>We expect this to be the most controversial feature of the whole BOSS design, so it's worth some time to explain all the considerations behind it, why we made this decision, and what the heck "lazy" and "greedy" mean when it comes to string searching anyway.</p>
 ]]></description>
      <pubDate>Thu, 08 Sep 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>BOSS: Sneak Peek</title>
      <link><<ROOT_PATH>>blog/boss-sneak-peek</link>
      <guid><<ROOT_PATH>>blog/boss-sneak-peek</guid>
      <description><![CDATA[ <p>In the last couple of blog posts, we first reviewed some of the <a title="Time for an alternative to RegEx?" href="../time-for-an-alternative-to-regex/index.html">shortcomings of regular expressions</a> (RegEx).  We then took a look at <a href="../better-text-searching-with-peg/index.html">parsing expression grammars</a> (PEGs), which are a new formalism that has a lot of advantages for defining (and more importantly, parsing) computer languages.  But while they're great for that, using them directly for string searching is a bit of a square-peg-round-hole situation.</p>
<p>So, we at <a title="Luminary Apps home page" href="http://luminaryapps.com">Luminary Apps</a> have begun work on a string matching library that combines the best features of PEG and RegEx.  This blog post is the first public discussion of that library.  It's called <strong>BOSS</strong>, and I think you're going to love it.</p>
 ]]></description>
      <pubDate>Fri, 02 Sep 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Better Text Searching with PEG</title>
      <link><<ROOT_PATH>>blog/better-text-searching-with-peg</link>
      <guid><<ROOT_PATH>>blog/better-text-searching-with-peg</guid>
      <description><![CDATA[ <p>In our <a title="Time for an alternative to RegEx?" href="../time-for-an-alternative-to-regex/index.html">last entry</a>, I bemoaned the shortcomings of regular expressions for complex tasks.  (This was after spending a day wrestling with a three-page-long RegEx pattern for finding functions in a <a href="../a-cmono-language-module-for-bbedit/index.html">C# TextWrangler language module</a>.)  I sketched out what I thought an ideal string-matching system would look like.</p>
<p>Well, that was three weeks ago.  I've had time to do some more serious research, and it turns out that there is some modern work that is very relevant.  It almost fits exactly what we were looking for — but not quite.  It's a new construct called <a href="http://en.wikipedia.org/wiki/Parsing_expression_grammar">Parsing Expression Grammar</a>.</p>
 ]]></description>
      <pubDate>Fri, 19 Aug 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Time for an alternative to RegEx?</title>
      <link><<ROOT_PATH>>blog/time-for-an-alternative-to-regex</link>
      <guid><<ROOT_PATH>>blog/time-for-an-alternative-to-regex</guid>
      <description><![CDATA[ <p>RegEx is handy.&nbsp; I use it all the time.&nbsp; For simple tasks, it's quite pleasant to use.&nbsp; For intermediate-sized tasks, it's acceptable.&nbsp; But for complex tasks, it is a nightmare to write, read, and maintain.<br /><br />So, I'd like to suggest that it's time to design an alternative -- something that works just as well on complex tasks as it does for simple ones, and stays readable and maintainable.&nbsp; I agree with not reinventing the wheel... except when our current wheel is square and lumpy.</p>
 ]]></description>
      <pubDate>Fri, 29 Jul 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Luminary Apps Announces Newbie Chess 2.0</title>
      <link><<ROOT_PATH>>blog/luminary-apps-announces-newbie-chess-2-0</link>
      <guid><<ROOT_PATH>>blog/luminary-apps-announces-newbie-chess-2-0</guid>
      <description><![CDATA[ <p><em>New interactive Chess books provide a unique learning experience</em><br /><br />FORT COLLINS, July 20 - Luminary Apps today announced version 2.0 of <a title="Newbie Chess home page" href="../../products/newbiechess.1.html">Newbie Chess</a>, a chess program for iOS devices (including iPhone, iPad, and iPod Touch) designed especially for people new to the game.&nbsp; Version 2.0 adds a big new feature: interactive books by renowned chess authors.</p>
 ]]></description>
      <pubDate>Wed, 20 Jul 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Video Player Refinements</title>
      <link><<ROOT_PATH>>blog/video-player-refinements</link>
      <guid><<ROOT_PATH>>blog/video-player-refinements</guid>
      <description><![CDATA[ <p><a title="Playing a video with external display support" href="../playing-a-video-with-external-display-support/index.html">Last week</a>, we presented a method for playing videos that supports external monitors (like the <a href="http://store.apple.com/us/product/MC552ZM/B">Apple VGA Adapter</a>).  But we left out a few finishing touches.</p>
 ]]></description>
      <pubDate>Fri, 08 Jul 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Playing a video with external display support</title>
      <link><<ROOT_PATH>>blog/playing-a-video-with-external-display-support</link>
      <guid><<ROOT_PATH>>blog/playing-a-video-with-external-display-support</guid>
      <description><![CDATA[ <p>We have a client project that, at several points in the iPad app, displays videos that were embedded into the app.  This is an older app, originally written before there were such things as iPad VGA adapters.  One might hope that, in the absence of any programming directives telling it otherwise, the iPad would simply mirror its entire display to the video port.  Failing that (as Apple in fact has done), you might hope that the MPMoviePlayerController would automatically support the external display.  But that fails too.</p>
 ]]></description>
      <pubDate>Fri, 01 Jul 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>A C#/Mono Language Module for BBEdit</title>
      <link><<ROOT_PATH>>blog/a-cmono-language-module-for-bbedit</link>
      <guid><<ROOT_PATH>>blog/a-cmono-language-module-for-bbedit</guid>
      <description><![CDATA[ <p>Since I've been <a href="../my-new-love-unity/index.html">using Unity</a>, I've loved it for the most part.  Sure, it leaves a few socks on the floor, such my inability to post to their forum without pestering a moderator for help, or the way an infinite loop in your code locks up the whole Unity environment.  But on the whole, it's a really great development system.</p>
 ]]></description>
      <pubDate>Fri, 03 Jun 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Sweetened Cocoa: The Number Class</title>
      <link><<ROOT_PATH>>blog/sweetened-cocoa-the-number-class</link>
      <guid><<ROOT_PATH>>blog/sweetened-cocoa-the-number-class</guid>
      <description><![CDATA[ <p>Last week, we presented <a title="Sweetened Cocoa: The String Class" href="../sweetened-cocoa-the-string-class/index.html">the String class</a>, which gifts the standard Cocoa NSString class with such modern conveniences as operator overloading, allowing the developer to focus more on clearly expressing the intent of the code, and less on arcane 1980s syntax.  Today, we're going to look at another Cocoa class in dire need of some help: NSNumber.</p>
 ]]></description>
      <pubDate>Mon, 30 May 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Sweetened Cocoa: The String Class</title>
      <link><<ROOT_PATH>>blog/sweetened-cocoa-the-string-class</link>
      <guid><<ROOT_PATH>>blog/sweetened-cocoa-the-string-class</guid>
      <description><![CDATA[ <p>We've spent the <a title="Sweeten your Cocoa with C++" href="../sweeten-your-cocoa-with-c/index.html">last month</a> or so considering all the interesting ways that one can use Apple's Objective-C++ compiler to improve Cocoa code.  But so far, we've ignored perhaps the most interesting way: using C++ wrappers to improve the standard Cocoa classes.</p>
 ]]></description>
      <pubDate>Sat, 21 May 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>C++ with a pinch of Objective-C</title>
      <link><<ROOT_PATH>>blog/c-with-a-pinch-of-objective-c</link>
      <guid><<ROOT_PATH>>blog/c-with-a-pinch-of-objective-c</guid>
      <description><![CDATA[ <p>For the last several weeks, we've been going over how C++ can be mixed with the traditional Objective-C to make your Cocoa even <a title="Sweeten your Cocoa with C++" href="../sweeten-your-cocoa-with-c/index.html">sweeter</a>.  But today we're going to cover a somewhat different recipe: mostly C++, with just enough Objective-C to make it work on iOS.</p>
 ]]></description>
      <pubDate>Mon, 09 May 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Sweetened Cocoa: A Pinch of C++</title>
      <link><<ROOT_PATH>>blog/sweetened-cocoa-a-pinch-of-c</link>
      <guid><<ROOT_PATH>>blog/sweetened-cocoa-a-pinch-of-c</guid>
      <description><![CDATA[ <p>In the last couple of blog entries, we talked in general terms about how you can <a href="../sweeten-your-cocoa-with-c/index.html">sweeten your Cocoa with a bit of C++</a>, and covered a bit of <a href="../objective-c-a-history/index.html">history</a> to help us understand how Objective-C and C++ are related.<br /><br />Now it's time to get serious about actually applying this stuff.</p>
 ]]></description>
      <pubDate>Sun, 01 May 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Objective C++: A History</title>
      <link><<ROOT_PATH>>blog/objective-c-a-history</link>
      <guid><<ROOT_PATH>>blog/objective-c-a-history</guid>
      <description><![CDATA[ <p><a title="Sweeten your Cocoa with C++" href="../sweeten-your-cocoa-with-c/index.html">Last week</a>, we gave an overview of how a little sprinkling of C++ could make your Cocoa programming a lot sweeter.&nbsp; At the end we promised to delve more into details in future blog posts.&nbsp; So, here we go!&nbsp; We're going to begin with a little bit of relevant history.</p>
 ]]></description>
      <pubDate>Fri, 22 Apr 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Sweeten your Cocoa with C++</title>
      <link><<ROOT_PATH>>blog/sweeten-your-cocoa-with-c</link>
      <guid><<ROOT_PATH>>blog/sweeten-your-cocoa-with-c</guid>
      <description><![CDATA[ <p>In 2002, Apple quietly introduced the Objective-C++ compiler.  Almost nobody noticed.  This is a shame, because adding a little bit of C++ to your Objective-C programming can make your code shorter, clearer, more type-safe, faster, and easier to read and write.  It is nothing short of revolutionary.</p>
 ]]></description>
      <pubDate>Fri, 15 Apr 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Smooth scaling in a UIScrollView</title>
      <link><<ROOT_PATH>>blog/smooth-scaling-in-a-uiscrollview</link>
      <guid><<ROOT_PATH>>blog/smooth-scaling-in-a-uiscrollview</guid>
      <description><![CDATA[ <p>Not too long ago, we were working on an iOS project that involved drawing some custom content that the user can pan and zoom using a UIScrollView.&nbsp; Because all our drawing was done with CoreGraphics vector-based calls (that is, we're not just blitting any image maps), we thought that it would zoom up smoothly.&nbsp; Unfortunately, that's not the case; it appears that, under the hood, UIScrollView draws the content to a pixel map, and then just pans and zooms that.&nbsp; The result is, when the zoom scale is greater than 1.0, the content looks all pixely and ugly.</p>
 ]]></description>
      <pubDate>Fri, 01 Apr 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Hush For Now news</title>
      <link><<ROOT_PATH>>blog/hush-for-now-news</link>
      <guid><<ROOT_PATH>>blog/hush-for-now-news</guid>
      <description><![CDATA[ <p>We have just posted a new <a title="Hush For Now video" href="http://www.youtube.com/watch?v=qvrTSen6q8o">demo video</a>, this one introducing Hush For Now, our Android utility for automatically silencing and unsilencing your phone.</p>
 ]]></description>
      <pubDate>Fri, 25 Mar 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>iPhone&apos;s crippled UIWebView causes embarrassment</title>
      <link><<ROOT_PATH>>blog/iphones-crippled-uiwebview-causes-embarrassment</link>
      <guid><<ROOT_PATH>>blog/iphones-crippled-uiwebview-causes-embarrassment</guid>
      <description><![CDATA[ <p>A recent study by analytics firm Blaze Software found Android's web browser to be an average of 52% faster than a comparable iPhone.<br /><br />But as <a title="Is Android really faster than iOS?" href="http://www.csmonitor.com/Innovation/Horizons/2011/0317/Is-Android-really-faster-than-iOS">this article</a> points out, they weren't actually using the web browser app on either platform -- they wrote a custom app that used a WebView control on Android, and a UIWebView on the iPhone.</p>
 ]]></description>
      <pubDate>Fri, 18 Mar 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Avoiding Floppy Joints in Box2D</title>
      <link><<ROOT_PATH>>blog/avoiding-floppy-joints-in-box2d</link>
      <guid><<ROOT_PATH>>blog/avoiding-floppy-joints-in-box2d</guid>
      <description><![CDATA[ <p>We're working on an application that makes extensive use of <a href="http://www.box2d.org/">Box2D</a> to simulate not just rigid bodies, but also things like ropes, springs, rotary joints, and more.&nbsp; But we kept finding ourselves frustrated because the joints didn't appear to work as advertised.&nbsp; Rotary joints were easily pulled apart; weld joints didn't stay welded; distance joints didn't maintain distance; and in many cases, the whole simulation would simply explode, with parts flying everywhere at high speed.&nbsp; It was like what Egon said would happen if you crossed the streams.<br /><br />Reducing the timestep didn't help much.&nbsp; Google searches turned up nothing useful, and poring over the <a href="http://www.box2d.org/manual.html">manual</a> didn't provide the clue we were looking for.&nbsp; But we did finally find the problem, and -- no surprise here -- it wasn't really Box2D's fault.</p>
 ]]></description>
      <pubDate>Fri, 04 Mar 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>InkPaint tutorial video</title>
      <link><<ROOT_PATH>>blog/inkpaint-tutorial-video</link>
      <guid><<ROOT_PATH>>blog/inkpaint-tutorial-video</guid>
      <description><![CDATA[ <p>Following on last week's release of an introductory demo video, here is a more in-depth tutorial video for <a title="InkPaint home page" href="http://www.luminaryapps.com/products/InkPaint">InkPaint</a>.&nbsp; Watch over the artist's shoulder as he inks and paints a complete drawing.</p>
 ]]></description>
      <pubDate>Fri, 25 Feb 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>InkPaint demo video</title>
      <link><<ROOT_PATH>>blog/inkpaint-demo-video</link>
      <guid><<ROOT_PATH>>blog/inkpaint-demo-video</guid>
      <description><![CDATA[ <p>Well, we should have done it months ago, but in the spirit of "better late than never," here is a video demonstrating all the key features of InkPaint, the innovative drawing app for iPad.</p>
 ]]></description>
      <pubDate>Fri, 18 Feb 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>InkPaint 1.2 now available</title>
      <link><<ROOT_PATH>>blog/inkpaint-1-2-now-available</link>
      <guid><<ROOT_PATH>>blog/inkpaint-1-2-now-available</guid>
      <description><![CDATA[ <p>Luminary Apps is pleased to announce InkPaint version 1.2, available now in the app store.</p>
 ]]></description>
      <pubDate>Fri, 11 Feb 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>New InkPaint tutorials by Sebastien Dardenne</title>
      <link><<ROOT_PATH>>blog/new-inkpaint-tutorials-by-sebastien-dardenne</link>
      <guid><<ROOT_PATH>>blog/new-inkpaint-tutorials-by-sebastien-dardenne</guid>
      <description><![CDATA[ <p><a href="http://www.luminaryapps.com/products/InkPaint">InkPaint</a> has two new tutorials on drawing fantasy characters, by Sebastien Dardenne.</p>
 ]]></description>
      <pubDate>Fri, 04 Feb 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Snowball Fighting in the ACM Programming Challenge</title>
      <link><<ROOT_PATH>>blog/snowball-fighting-in-the-acm-programming-challenge</link>
      <guid><<ROOT_PATH>>blog/snowball-fighting-in-the-acm-programming-challenge</guid>
      <description><![CDATA[ <p>The <a href="http://acm.org">Association of Computing Machinery</a> is currently holding a neat <a href="http://queue.acm.org/icpc">programming contest</a>.&nbsp; Competitors write a program to control a team of virtual children engaged in a snowball fight withan opposing team.</p>
 ]]></description>
      <pubDate>Sat, 29 Jan 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>The Exciting Story of InkPaint 1.2</title>
      <link><<ROOT_PATH>>blog/the-exciting-story-of-inkpaint-1-2</link>
      <guid><<ROOT_PATH>>blog/the-exciting-story-of-inkpaint-1-2</guid>
      <description><![CDATA[ <div style="float: right; text-align: center; margin: 20px;"><a href="itms://itunes.apple.com/us/app/inkpaint/id393002492?mt=8"><img src="../../files/7512/8535/9535/InkpaintIcon256Composite.jpg" border="0" alt="" width="256" height="256" align="right" /></a><br /> <a href="itms://itunes.apple.com/us/app/inkpaint/id393002492?mt=8">[View in App Store]</a></div>
<p>Today we released a new version of <a title="InkPaint home page" href="../../products/InkPaint.1.html">InkPaint</a> for iPad.&nbsp; We're very pleased with InkPaint 1.1, and glad to get it to our users, but behind its release is an interesting story — and a cautionary tale for other developers.</p>
 ]]></description>
      <pubDate>Fri, 21 Jan 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>My new love: Unity</title>
      <link><<ROOT_PATH>>blog/my-new-love-unity</link>
      <guid><<ROOT_PATH>>blog/my-new-love-unity</guid>
      <description><![CDATA[ <p>Why Unity is my new favorite development tool</p>
 ]]></description>
      <pubDate>Mon, 10 Jan 2011 12:00:00 -0700</pubDate>
    </item>
    <item>
      <title>Welcome to Luminary Apps</title>
      <link><<ROOT_PATH>>blog/welcome-to-luminary-apps</link>
      <guid><<ROOT_PATH>>blog/welcome-to-luminary-apps</guid>
      <description><![CDATA[ <p>Welcome to the Luminary Apps blog!</p>
<p>I know, these "welcome" posts aren't terribly useful, but they're customary.&nbsp; So, since you're here, let me tell you a bit about who we are and what we do.</p>
 ]]></description>
      <pubDate>Fri, 07 Jan 2011 12:00:00 -0700</pubDate>
    </item>
  </channel>
</rss>
