Splatoon Learning Project

Hey, everyone!

I’ve been using PlayCanvas off and on for a while now, but after pretty thoroughly trying the other choices like Godot, Unity, and ThreeJS, I really feel PlayCanvas is the one that gives the most control and speed when it comes to developing 3D web apps, although it’s also been my go-to for a couple of Electron apps already as well. I really can’t say enough good things about it, so thank you to the maintainers who worked so hard to make PlayCanvas what it is!

Anyway, I started a new project today to really make sure I’ve got all the kinks ironed out of my PlayCanvas workflow. I’m a pretty big Splatoon fan, so I’m setting out to basically re-create little slices of the game in PlayCanvas, obviously just for my own personal learning rather than anything that I would publicly release to inevitably get C&D’d by Nintendo. There are a couple of things that I’m unsure of how to approach such as laying ink on the ground, but even if I can’t create ink maps the same way Nintendo did, I’m confident I can come up with something relatively close, even if it’s slightly wonky :laughing:

I’m not sure how far I’ll take the project, my goal is to at the very least get a single player running around and inking another AI opponent in a standard “deathmatch” fashion before moving on to something that I’ll make available for everyone to play. If I do get really into it though, I’d like a full ink turf war to be playable between player + AI on one team and enemy AI on the other. I’m pretty familiar with the YUKA AI library, and the creator, Mugen, even did his own deathmatch game with it in ThreeJS which is very impressive, I strongly suggest checking it out on his website.

Anyway, with that long-winded intro out of the way, I’ll be journaling screwing around with various things here. I hope you all get a kick out of it as much as I will :grinning_face_with_smiling_eyes:

Today I started out by sculpting my first inkling in Blender, creating the low-poly version from the sculpt, rigging her to a skeleton, and then baking out all of the texture maps:

There’s still a couple things on her I might go back and adjust later, but overall I’m pretty happy with how she turned out for now! For the rest of the day, I set up my development environment and started coding a third-person character controller:

For development I’m using ClojureScript, Emacs, Cider, and ShadowCLJS, all of which combined means 1. all of the code is in Lisp that is transpiled to Javascript in real-time and 2. the game can be programmed while it is running. I’ve never actually used the hot swap feature that PlayCanvas has, so I’m not 100% sure how it works, but in any case because of this setup I don’t really need it anyway.

I also noticed the inkling is a little more pale in-game, and I think she could use some ambient occlusion maps, but I’ll probably mess with the materials a little further down the line when I have more done. Tomorrow will be animations and programming the animation tree!

Thanks for reading, and I’ll keep you all updated!


Hi @ArooBaito and welcome,

Many thanks for sharing your indie dev journal, it’s inspiring to see how somebody starts with his project.

Good luck with it!


Thank you, I appreciate it!

Today I finished the run and idle animations and programmed the animation controller. I wanted to do jumping too, but I got into a debate with my brother what the best way to handle object properties in Lisp was, and we ended up trying a bunch out. Ended up taking a while! Still though, I’m glad we got it sorted, because I’m pretty happy with how the animation states are handled.

Anyway, I’ve got a couple of commissions to catch up on during the week, so I might continue this next weekend. Sooner if possible because the motivation is still burning pretty hot for me on this one :sweat_smile:

Next up will be some level art and most likely jumping!

I’ll keep you all updated, and thanks for following!


This is going to be interesting :grimacing:

There is an example of a painting textures to a material that may help? Character Damage Demo | Learn PlayCanvas

1 Like

That’s perfect actually, thank you! I was planning on doing exactly this or spawning grid based ink meshes if that didn’t work out. My assumption of how Nintendo did it was to have uninked versions of all of the static meshes with ink polygons on top of them but alpha’d out until the ink hits them and then it becomes unmasked with the second uv channel, most likely using the red channel for the color of team 1 and the green or blue channel for the color of team 2, but this is all just my random guessing.

So basically it’d be this exact project in reverse, the outside of the robot starts completely alpha’d out and then the bullet particles add the external part of the robot back in instead of removing it.

I’m sure you knew all that already though, otherwise you wouldn’t have posted it, I’m just thinking out loud here.

I appreciate it, that’s very helpful! We’ll see how that works out when I get there

I actually had a similar project 1-2 years ago. But I sold it, I found the link of it, but I don’t have rights the source code. Check it out : SkateParkMovement - PLAYCANVAS

I didn’t want to make it 3D since some players play with touch bar, but yeah it’s still something.


Hey, that’s awesome! Really impressive stuff! That’s pretty similar to everyone playing with ink rollers! My goal is basically exactly that, although I’d like to do a direct clone with splattershots only, won’t axe squid form, keep the classic camera etc.

I’ll probably also push the graphics quality a little bit more.

Do you mind giving me a high level overview of how you handled calculating which team won?

I don’t remember the details of this project, but I was basically adding number to team’s number to calculate team’s scores.

What you can do, resize texture to 16x16 and read pixels, that way you can easily calculate both team’s scores.

Good luck with your project.


Thank you, I appreciate it! I’ll keep that in mind, I’m sure I can figure something out.

Pretty rough week at the office, and I got into a fight with a macro and lost for ~12 hours yesterday. Learned a lot though, once I figured out where I went wrong it went from 50 lines to 4 :joy:

Pretty major over-sight on my part. In any case, I spent most of today re-writing the code with macros and making it more manageable and then I messed with PCUI a bit. My hat is really off to you guys for that, it’s incredibly simple to use!

Anyway my schedule isn’t looking great this week either, but I’ll update when I can!

1 Like

Alright, I’m pretty well caught up after last week! It’s been pretty rough, but things are pretty much back to normal now! I ended up modeling some map assets today, the first of many! Still pretty simple. So far I’m just adding my own spin on random items from Urchin Underpass, and I’ll probably be copying more graffiti and decals and stuff from there as I’m going along.

All the assets are modeled in Blender and textured using baked Blender procedurals, which are kinda like a very basic version of Substance Designer without the library of materials to work from. I tend to use them a lot because usually you can push them really far and it saves you the trouble of editing photos to remove all the lighting information or struggling to get free to use textures to look like they actually belong together. Basically the best of both worlds in that they’re fast to make and they’re really composable and modular! It’s kinda like using vector math to paint across your 3d object all at once in a non-destructive way, I highly recommend it.

Anyway, more to come when I get the chance! I’ll probably be busy tomorrow, but I think I’ll have some time during the week to re-code the object system. My brother was telling me I should commit to the Clojure data-structures a bit more and use them instead of the PlayCanvas built in script system, so I ended up calculating my own delta time from pc.app._time and creating my own update list using pc.app.on(“update”), which I imagine won’t be as efficient as the highly streamlined system the PC team has done, but it does add to the challenge and it was a lot of fun implementing. I still think I can do it better though, which is why I want to re-do it later this week.

Anyway, I’ll keep you guys updated, thanks for reading!


Hey, everyone! Nothing really new to show today, it’s actually literally the same thing with one key difference.

I spent the whole week re-writing the game in BiwaScheme because I’m a glutton for punishment :smiley:

I’m all caught up to where I was before, and I’m glad my brother convinced me to try it. He’s always been a bit of a Lisp purist, and while he originally liked Clojure, he’s more into Common Lisp these days, so he convinced me to try one of the older implementation styles instead. I got used to it pretty quick, in particular I really love BiwaScheme and Gauche Scheme and I’ve already re-written a couple of old tools I had in both throughout the week, it’s been a blast!

I’ve been meaning to add jumping, but I think I’ll put that off a little longer. Next up I want to get some AI inklings running around, so I’ll post when I get them patrolling around!

Will update soon!