Introducing: hxpico8

Have you heard of PICO-8? It's a "fantasy console" with little built-in sprite/code/level/sound/music editors and a carefully crafted spec. And (slightly changed) Lua scripting. And a web player export (example). A rather interesting option if you like working with restrictions and/or tiny pixelart.

Long story short, I've made a little Haxe compiler target that generates compact Lua code that runs on PICO-8. This post covers reasoning, some technical details, and tricks used to accomplish this.

Continue reading

Love2d: Haxe: Ray-circle intersection test

By user request on Love2d IRC channel, yesterday I've made this nice function to do intersection/collision check between a ray (for clearance, here, a ray is a infinite line with starting point but no end point) and a circle.

Underlying code is fairly simple, though it does not even require understanding to use the function.

Love2d version takes advantage of multi-return values.
Haxe version has slightly longer code due for more optimal implementation of interface.

Download Haxe .hx Download Love2d .love

Snip:

--[[
Does a ray-circle intersection test.
Parameters:
	x1, y1, di - x, y, direction (radians) of ray
	x, y, r - position & radius of circle
Returns:
	result - whether collision occurred
	x - collision X
	y - collision Y
	distance - distance from ray start to collision point
]]
function ray2circle(x1, y1, di, x, y, r)
	local vx = math.cos(di)
	local vy = math.sin(di)
	
	-- get relative XY of circle (relative to ray origin):
	x = x - x1
	y = y - y1
	
	-- rotate it based on ray direction (as if ray starts at XY=0 and goes at +X):
	local tx = x * vx + y * vy
	local ty = x * vy + y * -vx
	
	-- clear misses:
	if (tx < -r) or (ty > r) or (ty < -r) then
		return false, nil, nil, nil
	end
	
	-- find X coordinate that line hits rotated circle at
	th = math.abs(math.cos(math.asin(ty / r))) * r
	
	-- too far behind
	if (tx + th < 0) then
		return false, nil, nil, nil
	end
	
	-- line start is inside the circle:
	tx = tx - th
	if (tx < 0) then
		return true, x1, y1, 0
	end
	
	--
	return true, x1 + tx * vx, y1 + tx * vy, tx
end

Love2d: Semi-turn-based platformer

A very rushed Haxe version to demonstrate how it looks in motion.
Does not necessarily represent features of love2d version in this post.

This was originally going to be a short reply-fix for a topic on love2d forum, but it seems that author did get somewhere with figuring that out on ones own, and I've quite overdone it in terms of a simple answer, so I formatted the code nicely, added several more features, and made this example.

Just in case above demonstration does not work, this example demonstrates a specific approach to game dynamic, where game logic occurs once per interval, while things are drawn and receive input at higher rate. I do not recall any actual platformer games that would use this principle, but a good example of such game is Snake (original grid-based version).
Example includes grid-to-point collision checking, actual specific platformer behaviour (with adjustable values), and value tweening (to make player movement nice & smooth).

Download (2KB .love)

Love2d: A game in 8 minutes


A video.

Yesterday I've made a game in Love2d. In a bit over 8 minutes.
Originally I planned to get everything done in 5 minutes (similar to previous GameMaker-related post), however I somewhat overrated my ability to type 3-segment function names that I'm not that similar with.