This is Serious Business so I’ll be using Caps and Ponctuation correctly for the duration of this topic.
…just kidding lol
hi folks! @pannocatto, ClockMaker and i recently started working on a spiritual expansion to our ludumdare 53 game, Pizza Dash, a gimmicky precision/adventure platformer hybrid
this new game (call it pzd2 for now) is focusing on environmental narration through level structuring and its relation to movement (like most of the games i designed)
the custom engine i wrote for the project makes use of Tiled for room design. i conceived an entity based trigger system, that allows in world events to trigger many various effects, inspired by the very expressive geometry dash editor group system. you can see it in the screenshot bellow, the purple box in the bottom right is a touch triggered event that moves in the group 2 objects (in occurence, the uwu-girl object). groups are set through the object name in the editor, i intend on writing a tiled plugin if group management becomes too complex down the line
here’s a (possibly outdated?) screenshot of the first screen (note that the game is using a 4:3 aspect ratio, my screen is 3:2 so there is small black bands on the sides but it fits pretty well)
here’s some gameplay (and a cringe showcase at the end)
we’re about two weeks in now. this is a lot of work, so much that it might be hard to justify releasing it for free (this project is eating all my energy), but i really want to finish this because i think it’s really cool :)
i want to keep this first post short, if you have any questions/remarks regarding the engine, the game design or anything else go ahead and interact :>
i constantly forget whether to commit to capitalization/grammar on my posts
the animation/tweening on the player sprite makes the movement look super smooth even from just a viewer standpoint. something super satisfying about it! i feel like gifs of it should do pretty well
is the stock photo a loading screen - or a placeholder for some actual ‘level complete’ type graphic? i would say as a piece of feedback, so far, for a screen like that this seems more like a game where moving between rooms should feel continuous - so i would think about preloading everything unless you are planning on it being bigger, more discrete ‘levels’
also: parannoul spotted :)
thank you! it was pretty easy to throw together (maths being
i’m super paranoid with performance and loading times, that’s part of the reason why i make everything myself lol. so yeah you’re right, it’s a placeholder for level complete. this choice was based on what games like super meat boy and katana zero do, having a end screen you can skip in 0 frames if you press a key (or disable it in the settings in the case of kz). i like skipping end screen idk why it feels so good
yeaaah i like that album. cloud rap×shoegaze feels very fresh
but on a (kinda weird) end note, i decided to take the project in another direction, because i felt i couldn’t move in very interesting design-wise from there. i really liked the movement, but designing levels for it felt like making x4 speed layout for geometry dash. until you get really good at playing it.
so yeah, rn it’s in a bit of a transitive state. we just fixed on a square layout in a larger rectangular viewport, i’ve a (much) slower, simpler gameplay that allows for interesting level design but much less cool movement (a tradeoff i’m not super happy with). basically hit your head on a ceiling to flip gravity
but to keep it short: the focus of the game changed drastically a couple of times (that’s how i work lol), but it is now at a point where i can work on it 5 to 8 hours a day without getting tired (the trick: making movement with a very high skill ceiling so i don’t get bored), and it feels pretty stable now
there’s some delay on the art side, but i hope it’ll come soon enough so i can start communicating on the project
i wanted to write a list of “what changed since [last post date]”, but i basically redid everything so take a look at this fancy video instead (same format as before, “somewhat normal gameplay” and then “i spent too much time playtesting” gameplay)
the game design stabilized, and i’m quite happy with how the graphics are turning out. the project is now an abstract platformer with very snappy gameplay and high polish
since i spent an embarrassing amount of time optimizing the engine, it is now Very Quite Fast™. i’m having a lot of fun using it though, and the game looks fun, so i’d say it was all worth it
a very cool (and simple) feature i wanted to share: i use tiled for map editing, and added a script shortcut in my tiled project to run the current scene in engine. this is pretty standard workflow for me, opening tiled and running the game from it. in an effort to reduce editing friction, i had the idea to add a binding in game to open the current scene in tiled. thanks to the fact i embed the path alongside the maps, it was really easy to do!
the video bellow showcases the game, in a state i’m pretty proud. please tell me what you think about it
i now want to spend some time adding cool shit (i define “cool shit” very loosely on purpose) and some level design. the coolest thing i wanna work on would be very fancy screen transitions, hopefully i’ll come back soon with stuff to show
Yeah the visuals have definitely come together here - i think it makes a lot more sense to me when you bring up geometry dash now - though i don’t have a lot of reference for it myself. It sounds like you’ve done a lot of work with its tools before, though.
I’d definitely be curious to hear what you’ve pulled together to optimize too! it seems like your whole app, other than text maybe (?) Is just doing quads right now, most of em untextured. to me i’m fairly certain you could draw the entire game batched in a single call. maybe we can compare notes!
thank you!! although i spent more time studying geometry dash tools than actively using them, i admire them a lot for how fresh it feels as a creation paradigm in the game creation scene, especially the concepts of groups and triggers. i’ll try to introduce these quickly, since they’re now central to my workflow i’ll mention them a bunch
in a nutshell: every game object can be assigned groups. triggers interact with these groups at runtime and apply logic based on them and diverse game engine events.
for example, i have a move trigger, that moves every object of a group and takes various settings such as 1. the movement vector 2. the target group 3. the duration of the movement 4. the easing curve to use. i can give any groups i want to this move trigger (triggers being entities in engine), this allow (for example) to make an event trigger activate a move trigger each time the player jumps, lands, die, you name it
although i don’t use it in very flashy ways so far, this is a very powerful (turing complete) spacial scripting system that can implement a lot of mechanics quickly that would otherwise require a bunch of code
since i use SDL2, the batching is done for me. i just need to write sensible code that doesn’t require too much context switches, especially texture swapping (hence why i use a single spritesheet). reading your message made me realize that in some situations, batching is disabled by default to avoid conflict if the user tries to make calls to the underlying API in the middle of a SDL batch, so i added this line SDL_SetHint("SDL_HINT_RENDER_BATCHING", "1"); to my code and gained a couple percents of (overall) CPU usage (lmao)
knowing this, my game is very CPU heavy, most of the optimization was done in data layout optimization and code structuring. this is in large part due to my choice of having everything be an object (necessary for quick iteration and getting the group/trigger system to work), including every tile(!) in every tile layer being instantiated as an object. i also need to specify than i use my own polymorphism system and runtime variable declaration shenanigans (what a daily dose of C does to a programmer)
i recently adopted a data oriented design strategy (here’s a great talk by Andrew Kelly this topic) that dramatically increased the performance of my entire game, mostly by reducing the size of the generic entity object from ~280 bytes (i know, it was huge) to about ~60 bytes, still very big, i can bring it down if necessary, but i try to avoid premature optimization. right now, the slowest part of my code is collision detection, but it’s still very fast (it looks bad on benchmarks because the rest of my code is way faster), and since it’s an isolated problem i’m not worrying about optimizing it unless it becomes a problem
i might have to add, i’m very paranoid about performances and correctness because i want my games to be playable on low end systems. but all my efforts would be considered to be overkill by regular indie devs (this might be part of the reason why i’ll never “breakthrough” in this space lol). i also consider code to be part of the craft, so i try to write good code, as subjective as this concept is
marketing genius: i let the thousand streamers that will definitely play this game (not) insert their own face on my death screen, the arrow is already there i’m saving steps
hi! between a couple depressive episodes and a sleepless night, i made progress. i was gonna write a cool, well structured post, but it would be like 5 pages long and i don’t think you’d read it. i wouldn’t. so i compiled a list of the most important changes of the past few days in a list, and made another video so you can see it all in game
modifiers prototype!! expanded below
gave a bunch of titles to levels. titles are cringe, and so am i
prototyped some tile variations (most visible in cyan area)
temp transition effects: i need stuff to look at godamit
restart is now manual
new font rendering style
modifiers :OO
modifiers are a self-handicap system i wanted to try out. the idea is than you can choose to add difficulty to a chapter by, for example, adding a time limit or disabling live. i implemented three test rizz points that you will be able to see in the following video
bonus: some invisible code/design shit
use seeded RNG for fragile tiles and spikes, so i can choose to not update the seeds and keep the visuals static when paused
spent a few hours detaching the variable system from entities and added serialization capabilities (planning to reuse it for global game settings later on)
restructured menu management
defined the chapter structure (more on this another day)
coming next? i want to work on the graphics a bit more, but i’ll try to force myself and do some level design instead