This weekend I participated in the GMTK Game Jam and ending up making this - I'm pretty proud of the gameplay, I wish we'd had more time to add music and sounds though haha.
I took part in the GMTK Jam with some fellow coworkers from Splash Damage.
And in the interest of knowledge sharing, I've been writing a twitter thread with a little "making of" to share some of my process.
I haven't jammed in a while, so it was good to get back to it again. Really enjoyed making characters too, I really feel I'm starting to improve in this area. Let me know what you think!
You can play and rate it here! https://oursbleu.itch.io/hamma-hat
I've got a Unity physics question - specifically regarding low FPS and accuracy.
When testing our game on low spec laptops, the game predictably runs sub 30FPS. What was a surprise is that the physics by which the player moves around is also affected - specifically both the movement speed and rotation while on the ground (could be friction related) are seriously slowed and sometimes halted altogether.
Usually I'd think that this was due to code being framerate dependent, but all of my AddForce usage is in the FixedUpdate, so that was a dead end (I didn't actually realize this before when using AddForce). I did try changing the friction type in the player settings to Two Directional which lowered the FPS more, but actually allowed for some movement. Lastly, I've mucked about with the timestep/max timestep and that usually introduces more problems than it solves. At best I can lower the max timestep for "accurate" physics at low FPS, but the game speed runs in slow motion.
This isn't an area I'm particularly well suited to, but if anyone has had experience with Unity physics and low FPS, I'm, all ears.
Unity will try to run your physics update at least as often as you tell it to. I believe this is 50 times per second by default
Things get really ugly really fast when either your physics are costly enough, or the hardware running it is underpowered enough, that your game can't keep up with that. Because the physics update is always running late, and it's actually running more often than frames are updated, it starts taking significant time away from the frame refresh. In the worst case scenario, physics themselves take all the CPU time leaving none for frame updates, meaning the game becomes a slideshow.
One solution you can try to solve this is to simply increase the physics step. Go to Edit -> Project Settings -> Time and increase Fixed Timestep (don't change Maximum Timestep, it's unlikely your game will ever hit that long in physics calculation). The higher the value, the less often Unity will calculate physics, and the less often FixedUpdate will be called. Unity interpolates and takes into account the time step for all its physics calculations so it should work fine; you may just lose a bit of precision.
Of course, this is assuming you're doing all of your FixedUpdate calculations by using Time.fixedDeltaTime as a factor of everything that is time-sensitive. If you don't, your physics code will run in slow motion when you change the timestep.
This sounds like exactly what is happening on lower end hardware and laptops that we're testing for, super helpful.
I'll give this a try since as far as I'm aware we are using Time.fixedDeltaTime on our forces, thanks!
Has any RPG game done well with losing equipment and translating it all into perks?
Looking over the setting of my game it doesn't make much sense to be constantly getting better gear if at all. Since you're ultimately in a very limited part of the world that wouldn't really be in the situation to provide better and better armor and weapons.
Cause right now I'm thinking of having a stat/perk system wherein every time you level up you get X number of points to allocate to either learning a new skill, increasing defense, etc.
And there would be "Hidden Perks" for all of the characters that you can unlock by completing side content (although some will be part of the main quest).
Neither SMT: Nocturne nor Digital Devil Saga (that I can remember) have equipment in the traditional sense. In Nocturne, you have the Magatama which is used to learn skills and has buffs and debuffs associated with each. In DDS, you have a skill line you proceed through. Both of those games are among my favorites so it can definitely be done.
It's cool that the space station appears twice. How does the effect hold up when objects are closer like an accretion disk?
Looks pretty neat, I especially like the space station.So I had never properly used blender (or any other modeling software really...) before. But since the game is getting more complicated using probuilder just wasn't cutting it. So I spent last night learning some low poly modeling in blender and ended up with a new space station design for the 2nd faction in the game.
As well as some small ship designs:
front: https://i.imgur.com/DPTuibu.jpg
back: https://i.imgur.com/t0GkNig.jpg
Will actually have to try this out later. Maybe just shooting at the thing or making some AI fly around it.
One of the fascinating things about game design for what I'm talking about (fighting games/beat'em ups/spectacle action) is that one of the only places to get a good idea of the kinds of things you need to make it actually sing is reddits, steam forums and gamefaqs boards. There is a real dearth of specialist knowledge publicly posted on the web on basic melee combat mechanics planning.
I should probably compile all the good stuff I've found re combat design, but so much of the cooler ideas and observations aren't in gamasutra articles but rather in obscure forum posts where people argue about why X is better than Y or in mechanics guides on the Steam community. Good shit.
I would agree with this. It's what makes Slay the Spire work. If a game is live-action, it operates on slightly different rules, since reacting happens in real time, but for anything turn or card based, like jarekx 's concept is, you need to know in advance so you can plan your move.Most people think of games as active, but I actually think the opposite - I think games are fundamentally reactive, where players observe a state, predict an outcome from incoming stimuli, and react accordingly. This is a long winded way of saying I think games are more interesting when you can see what's coming to some degree instead of just having to guess.
You know, even though it's nearly impossible to avoid that video in indie dev, I actually can't recall if I've watched it before or not. lmao! Maybe that'll be my lecture for the day... though I really should finish the main menu video as well
So I'm just wondering if it is more interesting not knowing what the enemy is going to do / be able to do., or being able to see what's going to happen on the their upcoming turn(s).
so, my PR guy is setting up a poll for players who enjoy indie titles and metroidvanias. Would I be able to post the link to the poll here?
I've never used particles in Gamemaker before, that's something I'll definitely look into. One thing I tried out was cutting the number of objects by a third then have each object in it's draw event draw itself and two more sprites either side of it a random distance apart, which seems to run a bit better but doesn't look as good.
If you have any links or resources please share, I always love reading about that stuff!One of the fascinating things about game design for what I'm talking about (fighting games/beat'em ups/spectacle action) is that one of the only places to get a good idea of the kinds of things you need to make it actually sing is reddits, steam forums and gamefaqs boards. There is a real dearth of specialist knowledge publicly posted on the web on basic melee combat mechanics planning.
I should probably compile all the good stuff I've found re combat design, but so much of the cooler ideas and observations aren't in gamasutra articles but rather in obscure forum posts where people argue about why X is better than Y or in mechanics guides on the Steam community. Good shit.
By the way, this reminds me of a video that correojon sent me a while back. It's a fantastic and very entertaining showcase of several dozen techniques to give games more oomph. It's a presentation by, uh.. the other guy of Vlambeer that is not Rami Ismail. :D
Some of them, like the one that gives the title to the video (screen shake) are more obvious, but keep watching, there's quite a few hidden gems. I ended up using several of these on Divinoids' look and feel to great effect.
There's a GDC talk from Platinum games about the way they design their combat systems and they say something similar, that their games are "passive", because the player usually has to react to the enemies' actions by dodging at the right moment and attacking in between enemy actions. It's like the normal state is the player comboing enemies and the game then provides those stimuli through enemy attacks to force dodging/parrying to drive gameplay.Most people think of games as active, but I actually think the opposite - I think games are fundamentally reactive, where players observe a state, predict an outcome from incoming stimuli, and react accordingly. This is a long winded way of saying I think games are more interesting when you can see what's coming to some degree instead of just having to guess.
I understand you're emulating the 3D effect by hand, doing the calculations yourself, then zooming and positioning sprites, right? I can't overstate how that seriously incredible work, especially for a two-day prototype! Feel free to go into detail about how it all works, because I'm sure most of us will find it fascinating.
If particles work anything like Unity, then the improvement in performance would be massive. The biggest issue is probably to coerce them into doing what you want, especially because, as I understand, GameMaker is not a 3D engine, so you would have to scale and move them every frame by hand, which may incur in its own performance hit. If you were doing it in a 3D engine it would be as easy as setting their position and forgetting about it, but I understand that would kind of defeat the point of what you want to make.
Still, I think particles is the way to go. I have an effect in my game where snow falls as hundreds or thousands of particles, and even on Switch it doesn't affect the framerate at all, whereas effects with individual objects, even just a few dozens of them, seriously tanked the framerate on Switch and had to be reworked.
Thanks a lot, although I think what I've done is probably less complex and less flexible than what you're imagining. It's all very much cobbled together stuff.
Here's an explanation of what I'm doing for anyone interested. Please feel free to poke holes in it
I started out by getting the horizon in. It's controlled by two objects, call them oHorizonLeft and oHorizonRght, placed slightly off-screen, one to the left and one the the right. They are locked to their x coordinates but they each have a variable, yTarget, which is a y axis position, which they constantly move towards, and which I change depending on player input. So if you press left, the left object moves up towards y position 300 and the right object moves down towards y position 800 for example. If there is no input they return to default positions, say 500 and 500.
I then have a second pair of objects, oEndLeft and oEndRight, that do a similar job. They are positioned slightly wider apart and just off the bottom of the screen. They are locked to their y positions but move to target positions on the x axis based on player control. Gamemaker has a function called draw_sprite_pos which draws a sprite stretched between four x,y coordinates, and I use this to draw my ground sprite between these four objects.
Scenery objects are spawned at a random position along the line between oHorizonLeft and oHorizonRight, and move towards the equivalent position along the line between oEndLeft and oEndRight. They are scaled up depending on how far along from their start position to their goal position they are, and rotated based on the angle between the two horizon objects. Altitude is then just an additional variable that modifies the scaling.
Here's a crude MS Paint job to better visualise it:
The scenery objects need to constantly be running code because their start and end points are constanly moving as the horizon moves, which is why they are game objects at the moment. I should try and read up on how Sega actually did this stuff as I'm sure there is a better way.
Gamemaker is the only engine I have any experience with so far, so a 3D engine is off the cards at the moment for me. And as you say, it kind of defeats the purpose. I'm going to look into particles though. Even if I can't use it for this, it's something I should probably be familiar with for other uses anyway.
Thanks a lot, although I think what I've done is probably less complex and less flexible than what you're imagining. It's all very much cobbled together stuff.
Here's an explanation of what I'm doing for anyone interested. Please feel free to poke holes in it
I started out by getting the horizon in. It's controlled by two objects, call them oHorizonLeft and oHorizonRght, placed slightly off-screen, one to the left and one the the right. They are locked to their x coordinates but they each have a variable, yTarget, which is a y axis position, which they constantly move towards, and which I change depending on player input. So if you press left, the left object moves up towards y position 300 and the right object moves down towards y position 800 for example. If there is no input they return to default positions, say 500 and 500.
I then have a second pair of objects, oEndLeft and oEndRight, that do a similar job. They are positioned slightly wider apart and just off the bottom of the screen. They are locked to their y positions but move to target positions on the x axis based on player control. Gamemaker has a function called draw_sprite_pos which draws a sprite stretched between four x,y coordinates, and I use this to draw my ground sprite between these four objects.
Scenery objects are spawned at a random position along the line between oHorizonLeft and oHorizonRight, and move towards the equivalent position along the line between oEndLeft and oEndRight. They are scaled up depending on how far along from their start position to their goal position they are, and rotated based on the angle between the two horizon objects. Altitude is then just an additional variable that modifies the scaling.
Here's a crude MS Paint job to better visualise it:
The scenery objects need to constantly be running code because their start and end points are constanly moving as the horizon moves, which is why they are game objects at the moment. I should try and read up on how Sega actually did this stuff as I'm sure there is a better way.
Gamemaker is the only engine I have any experience with so far, so a 3D engine is off the cards at the moment for me. And as you say, it kind of defeats the purpose. I'm going to look into particles though. Even if I can't use it for this, it's something I should probably be familiar with for other uses anyway.
Thanks! The bushes actually already do appear from behind the horizon, it's just hard to see in the video because of the speed they move and the choppiness of the video (you can see it happening in the thumbnail before you click play - although they shouldn't be slightly visible through the semi-transparent ground, that's a result of my quick and dirty implementation of the day/sunset effect where the ground is actually two sprites which change alpha). At the moment they start behind the ground and slightly below the horizon and move upwards until their y <= horizon then switch to being drawn in front of the ground and moving downwards. Although my implementation of it isn't perfect - I currently don't move them on the x axis until they appear over the horizon because if I do they tend to rise slightly too high before moving downwards when the horizon is tilted, because they have moved on the x axis but are still checking the horizon at their starting x position (if that makes any sense!).This is delightful, and fantastically communicated as well; I understood all of it with a single read! I think particles will be really the way to go; I've checked out of curiosity and it does seem that GM allows you to position, scale and rotate particles at will. You would simply create a fixed number of particles and manipulate them exactly like you're already doing with each individual bush right now, including recycling them by moving them up top once they hit the bottom of the screen.
Also, if you don't mind an idea, I think it would make the illusion particularly convincing if the bushes started to appear "over the curve of the world" so to speak, i.e. having their tops become visible over the horizon first, instead of popping into existence. I think it could be done by having the furthest bushes (beyond the horizon):
- Render under the ground sprite instead of over it.
- Keep the size and rotation logic.
- Set their Y position as starting on the horizon and becoming lower the further away they are from the horizon, instead of being lower the closer they are to the camera.
- Set their Y position as starting on the horizon and becoming lower the further away they are from the horizon, instead of being lower the closer they are to the camera.
Thanks! The bushes actually already do appear from behind the horizon, it's just hard to see in the video because of the speed they move and the choppiness of the video (you can see it happening in the thumbnail before you click play - although they shouldn't be slightly visible through the semi-transparent ground, that's a result of my quick and dirty implementation of the day/sunset effect where the ground is actually two sprites which change alpha). At the moment they start behind the ground and slightly below the horizon and move upwards until their y <= horizon then switch to being drawn in front of the ground and moving downwards. Although my implementation of it isn't perfect - I currently don't move them on the x axis until they appear over the horizon because if I do they tend to rise slightly too high before moving downwards when the horizon is tilted, because they have moved on the x axis but are still checking the horizon at their starting x position (if that makes any sense!).
Do you mind elaborating on your suggestion a bit? In particular, what do you mean by this?
I'm blind, you're completely right, you already do this. >_< I think the effect might benefit from being a bit slower, perhaps.
I think you already do this, but I meant that the far back bushes should "move upwards" on the screen as they get closer until they reach the horizon; then once they do, start moving downwards as they do now. Basically simulating them going "over" the horizon, or the curve of the world:
Again, I assume you already do this, although it's so quick it's hard to notice.
Another thing I've noticed on rewatch is that the bushes seem to "grow" as they get closer to the camera. This seems to be because the speed at which their sprites scale up seems to be smaller than the speed at which the distance between bushes scales up. As a consequence you have e.g. bushes that didn't touch when they were far away, seeming to "grow" and eventually overlap each other. My intuition is that this would be solved by tweaking either the rate of growth, or alternatively, how far apart the blue circles in your diagram (oEndLeft and oEndRight) are.
I've been cutting a lot of features from my game in order to improve the core and stick to my release target.
Multiplayer mode? Gone
VR option? Gone
Procedural maps and campaigns? Gone
It also really helps with describing the game. It was Civilization X Minecraft X Skyrim which could be interpreted a million different ways. 'Twas a mess trying to explain all the ways it could be played.
Now it's just structured as an action-adventure game and the experience itself is what makes it special. It's kinda scary since it's a very competitive genre with botw, assassin's creed, ghost of tsushima, etc. all made by huge teams but I'm confident at least some players will enjoy my take on it.
I'm still over 6 months away from my release target but it kinda feels like scrambling haha.It's good that you're making those cuts and tough decisions now, rather than scrambling later. I don't have much experience in either of those 3 things, but those don't seem like small undertakings.
hope theres a bunch of yaoi hands in this one
for real though hope to see some good shit. i'm keeping my eye out for the next yuri jam