tater-hater

Ludum Dare 46

Welcome Aboard!

Just finished up my 8 or 9th Ludum dare. Strayed a bit from the theme, but freaking planet sized pirate ships fighting was too cool to pass up on. Screenshot2.png

Ludum Dare 55

Making Tracks: How I made a track

For my game, I wanted to make something with racing. I was a little fixated on that, since I made an arcade racer with the theme sort of shoehorned in. The hardest part for me was figuring out how to make tracks, manage progress on the track, record laptimes, etc. Fortunately, I had a really good place to start.

I watched this video from Sebastian Lague years ago and was enamored. The ability to dynamically generate road like curves on the fly in unity was exciting, because at the time, I really had no idea how to make roads for a racing game in unity other than hand make it. This showed that it was possible to do all sorts of fun designs and dynamic tracks. I wrote code that used his Unity plugin several years ago and made a little demo that allowed me to generate tracks from a JSON file.

It's great and all to make a mesh that looks like a track, but there are no rules for how that road should work. How do you know if you're cutting corners? how do you know if you completed a lap?

Checkpoints

I updated the code from Lague's generator to add a game object along the path created. I created a prefab with a trigger box collider and fence pieces and named them iteratively. Pasted image 20240417220911.png

This created a sequential list of trigger box colliders along the route that I could then use to check the user's progress along the track. I track the player's progress using an OnTriggerEnter function. ``` csharp void Generate()         {             if (pathCreator != null && prefab != null && holder != null)             {                 DestroyObjects();                 VertexPath path = pathCreator.path;                 spacing = Mathf.Max(minSpacing, spacing);                 float dst = 0;                 int cout = 0;

                while (dst < path.length)                 {                     Vector3 point = path.GetPointAtDistance(dst);

                    Quaternion rot = path.GetRotationAtDistance(dst);

                    var temp = Instantiate(prefab, point, rot, holder.transform);

                    if (isFromFile)                     {                         temp.transform.localScale = new Vector3(1, trackFromFile.roadWidth / 2, 1);

                        temp.gameObject.name = cout.ToString();

                        if (cout == 0)                         {                             var finish = Instantiate(finishLine, temp.transform.position, temp.transform.rotation, holder.transform);                             finish.transform.localScale = new Vector3(0.02f, trackFromFile.roadWidth * 2, 0.2f);                         }                     }                     dst += spacing;

                    cout++;

                    TotalCheckpoints = cout;                 }             }         } ```

With the following script, the player can't progress unless they hit each trigger sequentially. In the future, it might be more fair to give a time penalty instead, but with only 48 hours, making the player hit every single one was all I could really do. ``` csharp     private void OnTriggerEnter(Collider other)     {         int checkpointName = int.Parse(other.gameObject.name);

        if (currentCheckpoint == placer.getTotal())         {             //lap completed             Debug.Log("Lap Completed");

            nextCheckpoint = 1;

            currentCheckpoint = 0;

            RecordLapTime();         }         if (checkpointName + 1 == nextCheckpoint)         {             nextCheckpoint++;

            currentCheckpoint++;

            Debug.Log("next: " + nextCheckpoint + " current: " + currentCheckpoint);         }         if (checkpointName == 0 && !startTimer)         {             startTimer = true;         }     } ``` This was how I created the tracks for the game. I inputted a JSON file with the coordinates for the bezier curve, drew the mesh, installed checkpoints, and viola! A racetrack.

Check it out for yourself! Let me know if you have any other improvements I could implement. https://ldjam.com/events/ludum-dare/55/the-game-with-forced-financial-competitions-featuring-wizards-and-demons

5 tips from a long time jammer

Hey Everyone,

This is my nth game jam... I sort of stopped keeping track unfortunately. The Ludum dare is always my favorite and I've participated in an LD event every year for 11 years. Ah, so many good, stressed out memories. Over the years, there have been things that have stood out: I usually don't need a full 48 hours, I always end up with more work than expected, and my "Fun" rating is always one of the lowest... 🥲 I never admitted to being good at making jam games, but I am experienced.

In my experience, there are 5 learnings that I wanted to share. These can help in places outside of jams, especially in the context of the professional world. Unity_hEUrMtrLGw.gif

1. You don't actually need 48 hours. Get sleep. Live your life. Find a balance, don't celebrate burnout.

Jams are a great time to practice a lot of skills. Time management and work/life balance can be skills to practice as well. Learning to manage time can be just as beneficial as learning a programming/art skill.

2. Scope to one singular game mechanic/feature, and prioritize off of that. Never take more than twice as long as you initially expected. It's better to abandon one aspect than run out of time with no finished game.

If you get stuck on something, zoom out and check your priorities. You might need to just move on. Make and update a to-do list periodically, and when you get stuck, check back with the list and make sure you always have the full view of the project in the back of your mind.

3. Practice with your tools. Don't learn a new tool the weekend of.

Game jams are a great playground to learn. But I would recommend at the very least doing intro tutorials for all of the tools you plan on using ahead of time. You don't want to get stuck on export settings with 20 minutes left to go.

4. Develop a personal asset library

That list of unfinished projects you have? use it. Organize it, use it for inspiration. IF you have a texture that you like, or a model that fits well with anything, keep it in a safe place and make note of it.

5. It may be boring, but do a retro.

You don't need to share it but for your own sake, write what you did well, what you could improve for next time. Game Jams are an opportunity for learning.

6. BONUS TIP

If your goal is to get the most people possible to play your game, please please please export to a web GL build. I don't like downloading random people's executables onto my machine. All computers have a web browser too. You can read my tutorial here. How To Host your Jam Game on the Web - The Byte Bistro

I hope these tips help anyone who is new, and looking for ways to improve their jamming. I am by no means an expert, but I have progressively gotten more out of these jams over the years, even with less time and energy.

Ludum Dare 56

It's easier to play on the browser

This may not be a super popular idea, but it's a matter of fact that games that are hosted online and playable in a browser are more accessible and have a higher chance of being played and rated.

Unity especially can make this process a bit of a headache, but if you have never hosted a game this way before, I have a tutorial on hosting unity games on the web. Hope it helps! And good luck!

Hosting your game on the Web

Ludum Dare 59

Works on my machine

Just tested my game on my GBC emulator handheld and it works exactly like it should! For those interested, my game page does have a link to download the rom if you also want to play it the way it was intended. gbc_screenshot.jpeg The Lineman