Best Illusion of The Year 2019

Holy cow, I won Best Illusion of the Year! Thank you to the contest organizers, other participants and fellow illusion chasers.

This spinning shape appears to defy logic by rotating around both the horizontal and vertical axis at the same time! To make things even more confusing, the direction of rotation is also ambiguous. Some visual cues in the video will help viewers change their perception.

More Info…

Posted in Projects | Tagged , , | Leave a comment

JSONCrush – Compress JSON into URL friendly strings

I just open sourced an amazingly useful tool called JSONCrush. This simple system allows for excellent compression of URI encoded JSON strings using the JSCrush algorithm. It seems almost like magic how well it works. The minified version is under 2k of JavaScript!

JSONCrush on GitHub


JSON – 103 bytes


URI Encoded Component – 199 bytes


JSONCrushed – 81 bytes! 59% smaller

Posted in JavaScript | Tagged , , | Leave a comment

ZzArt – Abstract Art Evolution

This tool generates GLSL shaders (basically a bunch of math equations) that you can evolve into incredibly varied works of abstract generative art.

Images can be bookmarked, save as HD pngs or exported as GLSL shader code. The satellite feature shows a full screen preview on a second monitor. It even works on most mobile devices.

This is a work currently underdevelopment but it’s far enough to share. I am constantly adding new features and improvements. If you make anything cool, please share, I’d love to see it!

Posted in JavaScript, Projects | Tagged , , , | Leave a comment

Dissecting A Dweet #8: Shattered Tunnel

Howdy, folks! Today we will be looking at the JavaScript code behind this amazing 3D tunnel effect. This code has an interesting lineage so we’ll also talk about some of the history behind it.

for(c.width|=k=i=960;z=--i;x.fillStyle=`hsl(0 99%${i/9}%`)x.fillRect(k-z*C(j=i/k+t/4)+S(m=k*j)*(r=1e5/z),540+C(m)*r-z*S(j),s=3e4/z*S(j*9),s)

Continue reading on for a full explanation of how it works!

Continue reading
Posted in JavaScript | Tagged , , , | 3 Comments

Bounce Back Postmortem

The JS13k competition has been going on every year since 2012 but this was my first year entering. Participants get 1 month to make an original 13 kilobyte JavaScript game. This year the theme was “Back” and there were 245 entries! Bounce Back got 2nd place!

My game “Bounce Back” is a procedurally generated adventure game using a boomerang as the primary weapon. I was inspired to create an homage to one of my favorite games “Zelda: Link’s Awakening”. The game was mostly written from scratch and took about two weeks to complete. For the past few months I’ve been practicing JavaScript every day and learning more about game design. So I pulled out all the stops and put everything I’ve learned into practice, hopefully it shows!

In this post I will explain how my game works and the process I went through. Before reading, please take a few moments to play the game if you haven’t already. The source code is also available on GitHub!

Play Bounce Back – Latest Version

Official JS13k Entry – 13 Kilobyte Version

Bounce Back Source Code – GitHub Repository

Continue reading
Posted in Game Dev, JavaScript | Tagged , , , | 4 Comments

Bounce Back: A Boomerang Roguelite for JS13k

When life gets you down, it’s never too late to…

A Boomerang Roguelite / Zelda Homage for JS13k.

Play it in your web browser!

The souce code is also available on GitHub!

Posted in Game Dev, JavaScript | Tagged , , | Leave a comment

ZzFX – Zuper Zmall Zeeded Zound Zynth

Major update to ZzFX, my JavaScript sound effect generator! The browser is greatly improved with many more options. You can even download wave files! The micro version is still under 500 bytes.

Live Demo:

Here’s the latest version of the ZzFXmicro JavaScript code…

// ZzFXmicro - Zuper Zmall Zound Zynth - MIT License - Copyright 2019 Frank Force
zzfx_v=.5;zzfx_x=new AudioContext;zzfx=(g,h,a,b=1,c=.1,k=0,f=0,l=0,m=0)=>{let q=44100,Q=Q=>Q*(Math.random()*2-1),d=2*Math.PI;a=d/q*a*(1+Q(h));k*=500*d/q**2;b=q*b|0;c=c*b|0;l=d/q*l;m=d/2*m;h=[];for(let n=d=0,e=0;e<b;++e)h[e]=g*zzfx_v*Math.cos(d*a*Math.cos(n*l+m))*(e<c?e/c:1-(e-c)/(b-c)),d+=1+Q(f),n+=1+Q(f),a+=k;g=zzfx_x.createBuffer(1,b,q);a=zzfx_x.createBufferSource();g.getChannelData(0).set(h);a.buffer=g;a.connect(zzfx_x.destination);a.start()}

Posted in JavaScript | Tagged , , , | 1 Comment

Dissecting A Dweet #7: Parallax Mountains

Today we will dissect the tiny JavaScript code that draws a parallax background with mountains and sky. This simple code can be used as a base to create different types of background scenes for your game or website.


Continue reading on for a full explanation of how it works!

Continue reading

Posted in JavaScript | Tagged , , , | 1 Comment

Bogus Roads: LowRez Game Jam

My 64×64 pixel game for LowRezJam is out, go play it now!

This game is a complete experience with everything from a main menu to a win screen and tons of polish. The gameplay is simple but I invested a lot of time tweaking it to feel awesome. I also recorded 6 news songs for the sound track!

The entire game was made in about week for lowrez jam 2019. I loved working in the 64×64 pixel resolution, it was a fun challenge. For development I used JavaScript, Three.js and Brackets as an editor. I recorded the music using Figure by Propellerhead.

You can play it in just about any web browser, and it supports mouse or gamepad. Have fun!

Update: The judging results are in! My game got 2nd place for gameplay and 8th place overall. I also scored 8th place in audio and 18th place in graphics.

Posted in Game Dev | Tagged , | Leave a comment

Dissecting A Dweet #6: Breaking Broke

Today we will examine the JavaScript code to make this awesome shatter effect. The concepts demonstrated by this dweet can be used for making a variety of cool effects. In one of my previous posts I showed a similar technique for making text spiral.

This effect can even be animated with just a bit more code which I will share at the end of the post. Keep reading full explanation of how it works!

Continue reading
Posted in JavaScript | Tagged , , , | 1 Comment