Under the Bridge

PaintCode By Numbers

Been waiting patiently for that vector drawing in code PaintCode vs. Android report we promised last year? Well, that kinda wandered off into the weeds. Oops. However, PaintCode continues its relentless march towards ever greater heights of awesomeness in freeing you from PNG tyranny:

PaintCode 2.3 adds 15+ new features, including SVG export

  1. SVG code generation
  2. PDF, AI and EPS import
  3. Completely rebuilt image export
  4. Animated sequence export (“Great for Apple Watch animations!”)
  5. Copy & paste support from Sketch, Illustrator, Pages
  6. Live shape thumbnails in the Shapes & Groups browser
  7. New multithreaded renderer
  8. Support for cut, copy & paste of entire canvases
  9. Support for canvas multi-selection
  10. New way to find out where your library items are used
  11. New, easy way to replace one library item with another
  12. Replace Symbol with its content
  13. Improved PSD and SVG import
  14. Canvas Arrangement
  15. Built-in feedback form

So it’a a better time than ever to check that out. And besides their own excellent tutorials and documentation, there’s an ever growing oeuvre of tips and samples:

A First Project With PaintCode & The Story of Look Up’s Arrow

Create a Resolution Independent iOS8 App and Set Your Images Free

Using PaintCode to Dynamically Create Images in the iOS Football Manager Game Title Challenge

Working With PaintCode And Interface Builder In Xcode

Xcode Live Views: Killing them softly with PaintCode

Responsive iOS Buttons with PaintCode

Creating Custom Animated Buttons

Increasing The Tap Area Of UIButtons Made With PaintCode

Creating Beautiful iOS Controls with PaintCode

And just in case you’re taking this all seriously, here is what we confidently predict is the most chuckle-worthy UISwitch you have ever seen:

A rapid prototype of UISwitch built with Swift and PaintCode

Continue Reading →
0

Tip: Check Your Layout Privilege

On the off chance you haven’t bothered to read carefully the 8.3 point release notes, having been busy fixing up your broken Swift code and all, there’s a subtle time bomb lurking therein for next time you get it building again:

When linking against iOS 8.3, any code that relies on layout information (such as the frame) of a UIButton subview when the button is not in the window hierarchy will need to send layoutIfNeeded to the button before retrieving layout information (such as button.titleLabel.frame) to ensure that the layout values are up to date.

For example, if you had something like this:

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
// code that sets up the button, but doesn’t yet add it to a window
CGRect titleFrame = button.titleLabel.frame;
// code that relies on the correct value for titleFrame

You now need:

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
// code that sets up the button, but doesn’t yet add it to a window
; // This is also safe pre-iOS 8.3
CGRect titleFrame = button.titleLabel.frame;
// code that relies on the correct value for titleFrame

Yikes. Not sure if there’s any currently in development, but we’ve certainly used and/or written ourselves many pieces of code of that form that are now problematic. Probably a sound plan to audit all your button-creating code … just in case.

h/t: @sanjeetsuhag via @mariozullo!

UPDATES:

Looks like layout’s got some pretty serious under the hood revisions: for instance this example

If you construct layout constraints manually … pass in nil for the second view, and that contradicts the the attribute being specified, you’ll now get an exception. Previous OS releases appear to have quietly ignored this transgression on your code’s part.

So yep, better give all your layout stuff a good checking under 8.3. It’s the only way to be sure.

Adaptability Changes in iOS 8.3

Continue Reading →
0

Evolving Swiftly

What, you say reading the title, a followup to “Swiftly Improving” before 1.2 is even final? No, no, because the language is an example of Intelligent Design, not evolution. (At least, we hope, yes?) The now-for-something-completely-different topic of today is the ever so cleverly logoed

logo_mendel.png

Mendel - Swift miliframework for implementing evolutionary/genetic algorithms:

The framework provides an Engine protocol, describing the necessary interface for evolutionary/genetic computation using functions. Individual instantiation, population evaluation, selection, genetic operators (like mutation and crossover) and even termination conditions are all described as functions. This allows you to use techniques such as partial application and function composition to a great effect.

Here’s a video showing the sample application that’s build on top of Mendel in action.

Mendel provides a number of canned implementations for some of those functions, see:

Selections for individual selection functions, such as RouletteWheel and StochasticUniversalSampling

Operators for genetic operators, such as Mutation and Crossover

TerminationConditions for termination conditions, such as terminating after a number of iterations (NumberOfIterations) or terminating when a given fitness threshold is reached (FitnessThreshold)…

Even if you’re not fascinated by GA stuff — and who isn’t? — there’s some pretty nifty Swiftiness to take a look at there! And if you are, the background to this project is

Inspired by http://chriscummins.cc/s/genetics/ and the Functional Programming in Swift book. Hat tip to Watchmaker and Nacho Sotos’ swift-genetics.

And if you’re short of initial ideas to run with this; why, what could be more canonical than Genetic algorithm for “Hello World” ?

h/t: @iosgoodies!

Continue Reading →
0

Revenge of the ASCII Artist

Now here’s some news most appropriate for April 1st, the best part of the prank being that it’s completely real. Had a look through the resources in our Art For Non-Artists post and still come up short on skills? Well, then, we have just the thing for all of you who cut your teeth back in the Oldskool ASCII art days:

Replacing Photoshop With NSString : “Create UIImage / NSImage instances from NSString, by combining ASCII art and Kindergarten skills.”

…After a while, though, I realized that the most interesting part of the code was actually the ASCII art I was using as a guide to my drawing code: The actual drawing code suddenly seemed superflous. What if I could just pass the ASCII art into NSImage directly?

Xcode does not compile ASCII art, so I decided I would write the necessary ‘ASCII art compiler’ myself. OK, I did not write a compiler, but a small fun project called ‘ASCIImage’! It works on iOS and Mac as a simple UIImage / NSImage category with a couple of factory methods…

So you go from this

to this!

Now that’s some real programmer artistry. Never mind all these newfangled graphic editors, we do our UI with STRINGS, by Knuth.

Check out the rest of the article for algorithm details, notes on layering, and so forth; there’s also a followup with slides. And an editor. (Also note that the apparent be-all end-all of ASCII art editors, Monodraw, offers ASCIImage support if demand warrants.) And a landing page. With links to ports in JavaScript, Node.js, Go, Ruby, C#/WPF, Qt/C++, F#, and Xojo. And then check out the discussions on Hacker News and reddit. Apparently up until now, there has been a crying need for a way to specify vector graphics in ASCII. Who knew?

Continue Reading →
0

Thrash Metal

Since all you Dear Readers seemed to think our Daft Punk allusion last post was clever, let’s do another music callout this time. Not that it really takes a whole lot of clever to connect up Metal with a particularly extreme genre of such, but hey, it gives us an excuse to link to the thrashiest of thrash bands playing the Duke Nukem theme for your post-reading background music, which we just haven’t done enough of so far.

Any-ways, in case like us you’d pretty much skipped over stuff about Metal figuring it was only of interest to game engine writers, there’s some interesting stuff around that people are doing with it you might like to be aware of. In particular, this FlexMonkey post caught @NatashaTheRobot‘s eye (and if you’re not subscribed to her Swift newsletter, you should be):

Two Million Particles at 25 Frames Per Second on an iPad

Following on from my last post where I managed to calculate and render over 1,000,000 particles in realtime, I’ve done some pretty effective tweaking of the code to create an app that calculates and renders (with blur and trails) over 2,000,000 particles at around 25 frames per second on my iPad Air 2…

Not bad, not bad. Also note followup:

Swarm Chemistry: Creating an Advanced GPU Based Particle System with Metal

…With Metal, I’ve been able to create a kernel shader that can calculate and render 4,096 swarm members at 30fps – so that’s 16,777,216 particle interactions per frame or 503,316,480 particle interactions per second! Pretty impressive stuff for a tablet computer!

Code at FlexMonkey / MetalParticles, with UI described in Adding a User Interface to my Swarm Chemistry App on an iPad

So that’s pretty cool, but still a little niche. A good number of you probably run into need for parallel computation, particularly image processing, not all that rarely though, yes? Start over at Metal-dedicated site Metal By Example and check out these articles:

Introduction to Compute Programming in Metal

This post is an introduction to topics in compute (or data-parallel) programming. It is designed to be read before its companion article, Fundamentals of Image Processing. In this article, we will cover the basics of setting up the compute pipeline and executing kernel functions on large sets of data in parallel…

Fundamentals of Image Processing in Metal

In this post, we will start exploring the world of image processing with the Metal shading language. We will create a framework capable of representing chains of image filters, then write a pair of image filters that will allow us to adjust the saturation and blur of an image. The end result will be an interactive app that allows you to control the image filter parameters in real-time…

Back at FlexMonkey there’s a project FlexMonkey / MetalReactionDiffusion building off that described in these posts:

Metal Kernel Functions / Compute Shaders in Swift

Reaction Diffusion Cellular Automata with Metal Compute Shaders

Swift & Metal: 1,000 Reaction Diffusion Solver Iterations per Second

And as long as we’re mining for Metal nuggets here, if this has inspired you to go learn more about it from scratch, here’s some good intros:

Ray Wenderlich’s iOS 8 Metal Tutorial with Swift: Getting Started and Part 2: Moving to 3D

LiquidFun Tutorial with Metal and Swift – Part 1 and Part 2 and Part 3

objc.io’s Metal

An Introduction to 3D Graphics with Metal in Swift

If you want to get more into the rendering side than that, then check out all the rest of the articles at Metal By Example.

UPDATES:

iOS GPU Programming with Swift & Metal

Particles Set Free! High Performance Particles for Swift Developers

Audio Visualisation for iOS with AudioKit & ParticleLab

Rendering Text in Metal with Signed-Distance Fields

Swifter Swift Image Processing With GPUImage

Stream Video Textures into 3D Scene with Metal

Continue Reading →
0

Swiftly Improving

So you catch the new Swift 1.2 seed yet? If not, looks like we could call this the Daft Punk release:

  • Harder — “compiler crashes have been fixed”, “fewer SourceKit warnings” …
  • Better — “Source files that haven’t changed will no longer be re-compiled by default…”
  • Faster — “Debug builds produce binaries that run considerably faster, and new optimizations…”
  • Stronger — “the language has been further refined to ensure safe, predictable behavior. We also continue to improve the interaction between Swift and Objective-C…”

Time to get on the latest rewrite round! Here’s a selection of good discussions of those “has been further refined” details:

NSHipster’s Swift 1.2

RayWenderlich.com’s What’s New in Swift 1.2

SwiftDoc.org’s Major content update for Swift 1.2

Let’s Talk About Sets, Baby!; Swift Set Type in Swift 1.2

Changes to the Swift Standard Library in 1.2 beta 1

Swift 1.2 Performance: Pretty Much Fine; Performance Case Study on Swift 1.1, Swift 1.2, and Objective-C; Swift Performance in Xcode 6.3 Beta

Also, we’d like to draw your attention to a couple so far generally overlooked points that have shown up on boards and mailing lists. First off, the souped up if let

The “if let” construct has been expanded to allow testing multiple optionals and guarding conditions in a single if (or while) statement using syntax similar to generic constraints:

if let a = foo(), b = bar() where a < b, let c = baz() {}

This allows you to test multiple optionals and include intervening boolean conditions, without introducing undesirable nesting (i.e., to avoid the “pyramid of doom”). (19382942)

is actually more souped up than those notes make fully clear:

  • can be an arbitrary number of let + where clauses in a single statement
  • can also be used with ‘if var’ should you wish to mutate values in the conditions
  • can also use a full multiple clause statement in a while loop!

That should be quite enough conditional flow expressivity to quiet all the grumbling on that front.

Next, if you’re chomping at the bit to add the new return value contract annotations to your legacy Objective-C headers, “nullability” is the so far undocumented clang feature for that, so here is a currently-submittable way to add that to production code, from Jens Alfke on the Xcode list:

So the magic invocation I’m putting in my header files (after the #includes) is:

#if __has_feature(nullability) // Xcode 6.3+
#pragma clang assume_nonnull begin
#else
#define nullable
#define __nullable
#endif

… interface declarations go here…

#if __has_feature(nullability)
#pragma clang assume_nonnull end
#endif

In property declarations you’ll need to make “nullable” the last meta-attribute, otherwise you’ll get syntax errors in earlier versions of Xcode; so for example “(readonly, nonatomic, nullable)” works but “(readonly, nullable, nonatomic)” is a syntax error because in Xcode 6.1 the parser will see two adjacent commas.

[This is working well, but in converting my interfaces I found a nasty compiler bug that I’m about to submit to Apple — if you declare multiple properties on a single line, adding the (nullable) attribute will cause the parser to lock up in an infinite loop:
@property (readonly, nullable) id a, b, c; // don’t do this!
I spent an hour or so with my MBP’s fan running full speed before figuring out which exact line triggered this.]

Lastly, one of the more subtle consequences of Swift 1.2 no-op cleanup is that you can no longer cleanly use ? as a postfix on an optional optional, as for instance when using map on an optional dictionary lookup:

let x:Int? = dict.map { $0["a"] }?

The Chris Lattner approved way to rewrite this pattern for 1.2 is

let x:Int? = dict.map { $0["a"] } ?? nil

to make it more clear to the reader exactly what the intention is here.

So we’re pretty chuffed with how this Swift thing is coming along; pretty much every undue pain point seems addressed to wide satisfaction around teh intertubes — so if you’ve been holding off on jumping in, NOW might be a very good time to get on that!

UPDATES:

Swift: And Xcode 6.3 beta 2 did drop as the gentle rain

New Playgrounds; New Playgrounds Part 2 – Sources

Nullability and Objective-C

Swift 1.2 Update (Xcode 6.3 beta 2) – Performance

Swift v1.2 β2 Performance

Changes to the Swift standard library in 1.2 betas 2 and 3

Xcode 6.3: Wheeeee! Beta threeeeee!

Swift Style Guide: April 2015 Update

Continue Reading →
2

Join the Sprite Illuminati

Now this looks like a wicked awesome new sprite game making tool: Andreas Löw, already revered in sprite game maker circles for sprite sheet maker TexturePacker which has just continued getting more awesome since we reviewed 2.4 ages ago and for PhysicsEditor the premiere collision shape creator, has decided that the next thing that needs to be made easy is … dynamic lighting, with SpriteIlluminator!

Screen Shot 2015-01-27 at 9.01.52 PM.png

What is that exactly being edited there, you ask? Why, that’s a normal map. Not clear yet? Well, here’s a good writeup on the theory, but simply:

Screen Shot 2015-01-27 at 9.04.05 PM.png

These are supported in pretty much whatever major sprite framework you’re using, including SpriteKit’s SKLightNode as of iOS 8. So if you’re doing any 2D sprite work that would benefit FROM ADDING EXTRA AWESOME, we strongly suggest that you head right on over to the beta signup page while that’s still open!

UPDATES:

Adding 2D Lighting to Your Game

Continue Reading →
0

Art For Non-Artists

Like to make a game, but held up somewhat by the practical issue of having absolutely no artistic ability whatsoever? Yep, we feel your pain. Quite thoroughly indeed. But here’s a series of videos to watch that might help you fake it enough to get by –

2D Game Art for Non-Artists

  1. Introduction
  2. Sky and Mountains
  3. Making Happy Little Trees
  4. Earth Blocks
  5. Awesome 2D Grass
  6. I Wanna Rock
  7. Creating our Buzz Saw
  8. Character

‘Course, those of us who are really non-artists need some more help than that. PixelProspector is an excellent resource for all things related to indie game development, and specifically for graphics they set out the options

  1. Create Graphics by Yourself
    1. Graphics Programs
    2. Tutorials (Drawing, Animation, Pixel Art)
  2. Get Graphics from someone else
    1. Download Assets (Royalty Free Graphics)
    2. Hire Graphic Designer
    3. Big List of Fonts
    4. Big List of Icons

which does pretty well cover the options. Other interesting link collections for the artistically challenged:

Game Programming Wiki’s Game Content Resources

Freebies For Designers – Icons, Vectors, Photoshop Brushes, Stock Images & Templates

Best Sites For Getting Free Vector Art Images – 35 Of Them

40+ Websites Providing Useful and Free 3D Models

Cool Text: Logo and Graphics Generator

Any particular goto resources for finding art as a substitute for any kind of talent that you rely on, Dear Readers?

UPDATES:

Complete Blender Game Art Tutorial. From zero experience to 2D or 3D game ready asset

300 Awesome Free Things covers various design/asset resources and also business/marketing/productivity services, tools, analyzers, …

A programmer’s guide to creating art for your game

From Programmer To Artist

Continue Reading →
2

Procedural Level Generation

Here’s an interesting set of links from an HN discussion, should you be interested in making a roguelike of your own some day as All True Programmers Are:

Another cheap and very effective technique for procedural level and maze generation is to create a “walker” or series of walkers that start at some point, walk in a direction and then turn at random intervals, leaving a path of corridors and occasionally rooms in their wake. This is how Vlambeer’s Nuclear Throne generates its levels, and there’s a good article from Jan Willem Nijman, it’s developer, here

If you’d like a more academic look into procedural 2d game generation, there’s a nice research paper here, that describes a method and talks about Spelunky a lot (the king of procedural 2d level generation, in my book)…

Additionally, Derek Yu open sourced the code to the original Spelunky, and Darius Kazemi created a great breakdown of its level generation techniques here, also with interactive examples…

The action roguelike genre, particularly the roguelike FPS, is a vital new area being explored by indie game developers. It reminds me of the way 2D platformers were mined, explored, and iterated upon starting around 7 or 8 years ago…

Cool stuff! At least to us old school types who still think ASCII Nethack is TEH BESTEST GAME EVAR!!!1!one!!!

UPDATES:

Rooms and Mazes: A Procedural Dungeon Generator

Building a Procedural Dungeon Generator In C#

Procedural Content Generation in Games: A textbook and an overview of current research

Continue Reading →
0

A Forest Of Loggers

So since we moved off Lightspeed Pascal as our Macintosh development environment way back in the day, we’ve been toting around this suite of logging, timing, and so forth debugging macros that by this time can be called transparently from .c/.cpp/.m/.mm files in development environments ranging from Lightspeed C through Metrowerks CodeWarrior up to Xcode 6+; but as we gear up to take on our intended New Year’s resolution of shipping a full hand of Swift apps next year … oh wait, there’s no macros in .swift code now! Well, there goes two and a half decades of accumulated cleverness out the window, bah humbug.

Not that it would be too terribly hard to rewrite said suite using NDEBUG and @autoclosure like assert(), but why bother with that when no doubt there’s somebody else’s projects for native Swift logging out there doing that already we can join? And why yes, here’s two that the exemplarily diligent ManiacDev folk have turned up on Github:

XCGLogger looks considerably more active than Swell, so we’ll go with that one. Unless any of you Dear Readers have an excellent reason why not. But long as we’re on the topic, let’s take a look at what Objective-C options checking CocoaPods brings up that we could raid for feature additions … my, there are a lot, aren’t there now?

  • CCLogSystem (5/54/18) “A Log system for iOS.Support print, record and review logs.”
  • CocoaLumberjack (270/4131/705) “A fast & simple, yet powerful & flexible logging framework for Mac and iOS”
  • DLLog (1/2/1) “NSLog-like logging API with support for level and context filtering”
  • GRLogger (1/2/1) “a logger utility for debugging and tracing”
  • LibComponentLogging (5/101/13) “Logging for Objective-C with log levels and log components.”
  • Log4Cocoa (12/80/29) “is a Log4j port for iOS and Mac OS X”
  • MTLog(11/218/24) (ManiacDev) “NSLog replacement for coders!”
  • NALog (1/3/0) “An easy, lightweight, and simple NSLog-based logging tool”
  • NBULog (13/22/5) “Log framework based on CocoaLumberjack…”
  • NSLogger (147/2447/299) “A modern, flexible logging tool”
  • NWLogging (7/14/4) “A minimalistic logging framework for Cocoa”
  • OCLogTemplate (8/9/3) “A flexible logging header for Objective-C”
  • TFLogger (7/2/0) “Dependency free logging library”
  • TULogging (1/7/0) “Better logging that uses ASL log levels”
  • UALogger (11/235/21) “A powerful and flexible logging utility for Mac/iOS apps”
  • WZLog (1/2/0) “A log system for iOS” … and that’s about it not in Japanese.
  • XLFacility (8/97/2) “Elegant and extensive logging facility for OS X & iOS (includes database, Telnet and HTTP servers)”

CocoaLumberjack is pretty much the venerably accepted standard, as the numbers there attest, but some of these othes look interesting too. Particularly that very last one, XLFacility; from the ManiacDev writeup,

Some of the features of XLFacility include:

  • Viewing of logging messages in real-time via Telnet or TCP
  • An HTTP server for viewing real-time log messagess and browsing past logging messages
  • Different logging levels, and macros for easy logging at each level
  • Customizable logging formats
  • An in-app logging overlay that can appear when messages are sent to XLFacility
  • A nice syntax for creating your own custom loggers

With XLFacility you can log to the console, a file, a SQLite database, and you can also view messages in realt-time via Telnet or TCP and there is a built-in http server so you can browse past log messages or see live updates…

That’s some serious feature-laden logging there, that is.

UPDATES:

honghaoz / ZHSwiftLogger: “…will use println() for development and use NSLog() for production.”

ArtSabintsev / PrintlnMagic “An alternative for Swift’s println() function along the lines of DLog.”

Debug Logging In Swift

Open Source Library Enhancing NSLog Allowing You To Log To A Remote Server

sgtsquiggs / ARAnalyticsLogger: “A bridge between CocoaLumberjack and ARAnalytics,” derived from TechSmith / CrashlyticsLumberjack

orta / ARAnalytics : “is a analytics abstraction library offering a sane API for tracking events and user data. It currently supports on iOS: TestFlight, Mixpanel, Localytics, Flurry, GoogleAnalytics, KISSmetrics, Crittercism, Crashlytics, Bugsnag, Countly, Helpshift, Tapstream, NewRelic, Amplitude, HockeyApp, ParseAnalytics, HeapAnalytics, Chartbeat, Yandex Mobile Metrica, and Branch. And for OS X: KISSmetrics and Mixpanel.”

Continue Reading →
0
Page 1 of 119 12345...»