- (BREAK) removed all deprecated functions in v2000.2
- game objects can have children with
obj.add()now which share the parent transform - (BREAK) raised esbuild target to
esnext - added
make()to make a game object without adding to the scene - added support for
add()to add unattached game objects to the sceneadd(make([...comps])) - added
colorsoption todrawPolygon()that controls the color of each corner - added
gradientoption todrawRect()that specifies the start and end color - added
loadProgress()that returns a0.0 - 1.0that indicates current asset loading progress - added
kaboom()optionloadingScreenwhere you can turn off the default loading screen - added
drawMasked()anddrawSubtracted() - (BREAK) removed
layers()in favor of parent game objects (see "layers" demo) - added
pushRotateX(),pushRotateY()andpushRotateZ() - added
pixelDensityoption tokaboom() - added support for non bitmap fonts
- (BREAK) rename
loadFont()toloadBitmapFont() - added
loadFont()to load.ttf,.otf,.woff2or any font supported by browserFontFace - (BREAK)
originno longer controls text alignment, usealignoption instead - added
quit()to end everything - shader error logs now yields the correct line number
- changed object update order from reversed to not reversed
- added
download(),downloadText(),downloadJSON(),downloadBlob() - added
Recording#stop()to stop the recording and returns the video data as mp4 Blob - added
debug.numFrames()to get the total number of frames elapsed - fixed visual artifacts on text
- fixed text always being wrapped if updated
- fixed text comp properties
letterSpacing,charSpacing,transform,stylesnot being exposed
- fixed updating
fontproperty on gameobj not updating the text font
- fixed
focus()not properly exported - deprecated
focus()in favor ofcanvas.focus()due to name collision
- fixed
kaboom.d.tscompletely messed up
- fixed doc for
TextCompOpt#stylesandDrawTextOpt#styles
- fixed updates not running at all when
kaboom({ debug: false })
- added
formatText()anddrawFormattedText() - added
charSpacingandlineSpacinginTextCompOptandDrawTextOpt - added optional
transitionsargument instate()to define allowed transitions - added
StateComp#onStateTransitionto register event for specific transitions - added syntax to style a piece of text
"this is a [styled].wavy text"andstyleoption inTextCompOptandDrawTextOptto define the styles withCharTransformFunc - deprecated
dir()in favor ofVec2.fromAngle() - fixed
onTouchEnd()fired ontouchmove - added
outview()component to control behavior when object leaves visible area - deprecated
cleanup(delay?: number)in favor ofcleanup(opt?: CleanupOpt) - deprecated
mouseWorldPos()in favor oftoWorld(mousePos()) - deprecated
rng()in favor ofnew RNG() - added classes
Vec2,Color,Mat4,Timer,Quad,RNG,Line,Rect,Circle - added deprecation warning
- fixed letterbox view mode
- allow non-stretch letterbox
- fixed mouse position malfunction in fullscreen, stretch and letterbox mode
- fixed
Color#eq()not giving correct result
- fixed not having export if installed from github repo with npm
- fixed event canceller returned by raw
onUpdate()andonDraw()crashing
- fixed debug widget scale
- fixed
enterState()not passing args toonStateEnter()callback
- fixed
state()to not require registeringonStateUpdate()before using any state
- fixed
onKeyRelease()wrongfully check for key press instead of release
- fixed
StateComp#enterState()not accepting any state
- added
hsl2rgb()for converting HSL color to kaboom RGB - added
record()to start a screen recording - added F5 to screenshot and F6 to toggle record mode in debug mode
- added
DrawTextOpt#transform()andTextCompOpt#transform()for defining style and transformation for each character - added
state()component for finite state machine - added support for multiple tags in
get()andevery() - added UI indicator for
debug.pausedanddebug.timeScale - changed inspect mode UI style
- added color constants
WHITE,BLACK,BLUE,GREEN,RED,MAGENTA,CYAN,YELLOW - added new API style (
onprefix for all event handler function,isprefix for all boolean state getters)onLoad()onUpdate()onDraw()onKeyPress()onKeyPressRepeat()onKeyDown()onKeyRelease()onMousePress()onMouseDown()onMouseRelease()onMoueMove()onTouchStart()onTouchMove()onTouchEnd()onCollide()onClick()onHover()isFocused()isKeyDown()isKeyPressed()isKeyPressedRepeat()isKeyDown()isMouseDown()isMousePressed()isMouseReleased()isMouseMoved()isMouseMoved()GameObj#onUpdate()GameObj#onDraw()AreaComp#onCollide()AreaComp#onHover()AreaComp#onClick()BodyComp#onGround()BodyComp#onFall()BodyComp#onHeadbutt()BodyComp#onDoubleJump()BodyComp#isGrounded()BodyComp#isFalling()SpriteComp#onAnimEnd()SpriteComp#onAnimStart()HealthComp#onDeath()HealthComp#onHurt()HealthComp#onHeal()AudioPlay#isStopped()AudioPlay#isPaused()
- version jumped to v2000.0.0 (still semver, just big)
- added
burp()for easy burping - added decent typescript / autocomplete support and jsdocs
- introducing new character "bean"

- added
loadBean()to load"bean"as a default sprite - changed default font to APL386, as
"apl386o"(default outlined version) and"apl386" - included font kitchen sink as
"sinko"(outlined version) and"sink"(standard version with extended characters for text-mode games) - added
fontfield inKaboomOptto set the default font - added
loadSpriteAtlas(src, entries)to load sprite atlas - inspect mode now displays every comp's state
- BREAK added continuous collision resolution which checks collision in
move()if 2 objects are both "solid" (objects now won't pass through other solid object at high speed or low framerate)
// before
add([
sprite("player"),
area(),
]);
add([
sprite("rock"),
solid(),
]);
keyDown("left", () => {
player.move(-120, 0);
});
player.action(() => {
player.resolve(); // or pushOutAll() in beta versions
});
// after
const player = add([
sprite("player"),
area(),
solid(),
]);
// both should be solid
add([
sprite("rock"),
area(),
solid(),
]);
keyDown("left", () => {
// this will handle collision resolution for you, if the other obj is also "solid"
player.move(-120, 0);
});- added comp
opacity()to set opacity - added comp
health()to manage health related logic - added comp
move()to manage projectile-like behavior - added comp
cleanup()to auto destroy obj when it leaves screen - added comp
outline()to draw a lil outline - added comp
timer()to attach timers to a game obj - added comp
fixed()to make a game obj unaffected by camera - added comp
stay()to make a game obj stay after scene switch - added comp
lifespan()to destroy game obj after certain amount of time - added comp
z()to define draw order for objs on the same layer - added
weighttoBodyCompandBodyCompOptto control the gravity multiplier - added
djump()toBodyCompfor double jump - added
dir()to calculate directional vector from angle - added constants
LEFT,RIGHT,UP,DOWNfor unit directional vector - added
fullscreen()to enable real fullscreen mode - BREAK separated color and opacity, removed
rgba()in favor ofrgb, use componentopacity()to define opacity - BREAK changed color from 0-1 range to 0-255, angles from radians to degrees
// before
add([
rotate(Math.PI / 2),
color(0, 0.5, 1.0, 0.5),
]);
// after
add([
rotate(90),
color(0, 127, 255),
opacity(0.5)
]);globalanddebugflag now are enabled by default, need to turn off manually if you don't want- added input events
touchStart(id, pos),touchMove(id, pos),touchEnd(id, pos),mouseMove(pos) - added
mouseDeltaPos() - added
touchToMouseto control if touch events should be translated to mouse events - added
mousePos()now gets the screen mouse pos, usemouseWorldPos()to get the mouse position affected by camera - added
animfield inSpriteCompOptto play an anim on start - beter type support for components
scene()andstart()(also removed in favor ofgo()) are optional now, if you don't need multiple scenes yet you can just go directly
kaboom();
// no mandatory scene() to start kabooming
add(...);
keyPress(...);- BREAK
area()is now explicit and not automatically added bysprite(),rect(), andtext(), removed eachnoAreaorareaconfig field - BREAK
area()now takes anAreaCompOpt, where you can define the area size, scale, and hover cursor
add([
sprite("bean"),
area(), // empty area will derive from sprite size
area({ scale: 0.5, }), // 0.5x the sprite size
area({ offset: vec2(0, 12), width: 4, height: 12, }), // more control over the collider region
]);- BREAK renamed
isCollided()toisColliding(),isHovered()toisHovering() - BREAK removed
overlaps()andisOverlapped()and replaced withisColliding()andcollides()only checks doesn't return true when 2 objects are just touching each other, useisTouching()to check if they're not colliding but just touching each other - added
isTouching()to check if 2 objects are collided or just touching other - audio is now paused when you leave the tab
- audio is now paused on
debug.paused = true - added local storage helper
getData(key, default?)andsetData(key, data) - added
loadShader(id, vert, frag, isUrl) - added
shader()comp for attaching custom shader to an obj - different layers do not prevent collisions now
- BREAK changed last argument of
loadFont()toFontLoadOpt - all event handlers like
keyPress(),mouseClick(),action(),collides()now returns a function to cancel that listener - added
requireon component definitions, making it possible to declare dependencies for components, e.g.
function alwaysRight() {
return {
// the id of this component
id: "alwaysRight",
// list of component ids that this requires
require: [ "pos", ],
update() {
// so you can use `move()` from pos() component with no worry
this.move(100, 0);
},
};
}- BREAK overlapping component fields are not allowed, e.g. you can't have a custom comp that has a
collidesfield if it already have aareacomponent, since it already has that - BREAK changed
text(txt, size, conf)totext(txt, conf)withsizeas a field - added
obj.c(id)for getting a specific comp's state (by default all comps' states are mounted to the obj byObject.defineProperty)
// both works
obj.play("anim");
obj.c("sprite").play("anim");- pedit, aseprite plugins are now included by default
- added
addKaboom()for quick kaboom explosion load*()now acceptsnullas name and not load into assets manager, instead just return the resource data handle- BREAK renamed event
headbumptoheadbutt - BREAK renamed event
groundedtoground - added
width,height, andtiledattrib toSpriteCompOpt, for better control over sprite size and tiled sprite support - BREAK renamed
resolve()topushOutAll()onareacomp - added
pushOut()for pushing a single object out from another withareacomp - fixed
"add"event getting called twice for tagged objs - added
moveTo(dest: Vec2, speed?: number)topos()comp - added
keyPress()(and all other key events) with no arg to check for any key - BREAK renamed
camShake()toshake() - added
flipXandflipYonsprite()comp configuration, andflipX()flipY()methods - BREAK remove
flipX()andflipY()onscale()comp - BREAK removed
start()in favor ofgo() - BREAK removed
changeSprite()in favor ofuse(sprite("newsprite")) - tags and components are converged, tags are just empty components now
- added
unuse()to remove a component or tag - BREAK removed
rmTag()in favor ofunuse() - BREAK removed
camIgnore()in favor offixed() - BREAK renamed
makeRng()torng() - sprite animation now supports defining properties like loop and speed in load step and play step
loadSprite("hero", "hero.png", {
sliceX: 9,
anims: {
idle: { from: 0, to: 3, speed: 3, loop: true },
run: { from: 4, to: 7, speed: 10, loop: true },
hit: 8,
},
});- BREAK changed
.play(anim, ifLoop)undersprite()to accept a dict of properties.play(anim, { loop: true, speed: 60, pingpong: true }) - BREAK now every symbol definition in
addLevel()should be a function returning the component list, to ensure there's no weird shared states
addLevel([
"* *",
"* *",
"======",
], {
"*": () => [
sprite("wall"),
area(),
solid(),
],
"=": () => [
sprite("floor"),
area(),
solid(),
],
})- BREAK renamed
clearColortobackground - added collision detection functions
testLineLine(),testRectRect(),testRectLine()etc. - added drawing functions
drawSprite(),drawRect(),drawCircle(),drawPolygon(),drawEllipse(),drawLine(),drawLines() - added transformation functions
pushTransform(),popTransform(),pushTranslate(),pushRotate(),pushScale() - BREAK removed
areaWidth()andareaHeight()since they won't make sense if the area shape is not rectangle, useworldArea()if you need area data
const area = player.worldArea();
if (area.shape === "rect") {
const width = area.p2.x - area.p1.x;
const height = area.p2.y - area.p1.y;
}- added plugins npm package support e.g.
import asepritePlugin from "kaboom/plugins/aseprite"
- platforms are now sticky
- moved to TypeScript
- improved graphics performance
- improved inspect drawing performance
- added on-screen log that catches all kinds of errors
- added
cursor() - added
curPlatform()bybody() - added
falling()bybody() - added
changeSprite()bysprite() - added
duration()andtime()for the handle returned byplay() - added optional
seekfield to the audio play confplay([conf]) - added
LoopHandlereturned byloop()that has astop() - added a default background (can be dismissed by setting
clearColor) - fixed
sound.pause()to work on firefox - fixed collisions not treating explicit default layer the same as implicit default layer
- fixed unable to play another anim in
onAnimEnd() - fixed scene switches happen in the middle of a frame
- fixed
scale(0)not working - fixed
mosuePos()not returning the camera affected pos with no layers - BREAK changed
dbg()to plaindebugobject - BREAK moved
fps(),objCount(),stepFrame(),log(),error()underdebug - BREAK removed
debug.logTime - BREAK changed component
debugInfo()hook toinspect() - BREAK removed
timer()component - BREAK renamed
removeTag()tormTag() - BREAK changed
SpriteAnimfrom[ from, to ]to{ from: number, to: number } - BREAK removed
onAnimPlay()andonAnimEnd()in favor of generic eventon("animEnd", (anim: string) => {}) - BREAK removed
obj.addTag()in favor ofobj.use() - BREAK merged
debug.hoverInfoanddebug.showAreaintodebug.inspect - BREAK removed
sound.resume()in favor ofsound.play()
- fixed
on("destroy")handler getting called twice - fixed sprite
play()not playing
- BREAK removed
init()andkaboom.global(), in favor ofkaboom(), also allows multiple kaboom games on one page
// replaces init(), and added a 'global' flag for previous kaboom.global()
kaboom({
global: true,
width: 480,
height: 480,
});or not global
const k = kaboom();
k.scene();
k.start();
k.vec2();- BREAK changed
clearColoronkaboom(conf)to accept a 4 number array instead ofrgba() - added a plugin system, see the
multiboomexample andsrc/plugins - BREAK removed support for
.kbmsprite, supports newer version of.peditthrough pedit plugin - BREAK
loadAseprite()and made it an external plugin underplugins/aseprite.js - added
sceneData()for custom scene data kv store - fixed
mouseClickdoesn't work on mobile - disabled context menu on canvas
- prevented default behavior for 'tab' and function keys
- added
numFrames()bysprite() - added
screenshot()that returns of a png base64 data url for a screenshot
- BREAK removed
pause()andpaused()in favor tokaboom.debug.paused - BREAK removed
velY,curPlatformandmaxVelfields bybody() - BREAK changed
curAnimbysprite()to methodcurAnim() - fixed
dt()surge on page visibility change (#20) - pause audio when page is not visible
- added built in debug control with
init({ debug: true, })`: toggleshowLog(default on withdebug: true)f1: toggleshowAreaf2: togglehoverInfof8: togglepausedf7: decreasetimeScalef9: increasetimeScalef10:stepFrame()
- added on screen logging with
log()anderror() - fixed
loadRoot()sometimes doesn't work in async tasks
- BREAK removed
aseSpriteSheetconf field fromloadSprite(name, src, conf) - added
pause(),resume(),stop(),loop(),unloop(),volume(),detune(),speed()methods to the handle returned byplay() - added
camShake()for built in camera shake - added
loadAseprite(name, imgSrc, jsonSrc) - added area component generation for
text() - added
noAreato conf field ofsprite(),rect()andtext(), allowing to disable auto area component generation - added a
quadfield to sprite comp creation configsprite(id, { quad: quad(0, 0, 0.5, 0.5) }) - fixed
resolve()not working if the obj also hassolid, so it does not check for itself (#8) mousePos()accepts a layer argument, which returns the mouse position affected by camera transform if that layer is notcamIgnore()-ed- fixed camera position getting calculated before completing every object's update (#14)
- fixed some cases
on("grounded", f)called multiple times when moving on a smooth platform - added
revery()to iterate objects in reverse order - added
readd()to re-add an object to the scene without triggering events - added
level.spawn()
- BREAK changed default origin point to
"topleft", so if you want object origin point to be at center you'll need to manualorigin("center") - BREAK integrated
kit/physicsandkit/levelto main lib - BREAK makes
collides()only run on first collision, not run every frame during the same collision - BREAK
camPos()by default focuses to center, socamPos(player.pos)puts player in the center of the screen - BREAK renamed
kaboom.import()tokaboom.global() - added an arg field to
start(scene, ...)to forward args to start scene - added
camScale(),camRot()andcamIgnore() - added
obj.overlaps()byarea(), andoverlaps() - added 3 ext fonts under
ext/fonts