A downloadable engine for Windows

Buy Now$4.99 USD or more

A Game Maker Studio source file containing the core engine for a racing game, in two different versions (2D and 3D).

  • Path-based racing: can be used for top-down, mode-7 or even fully 3D racetracks with no changes to car physics!
  • Cars still able to use normal GM collision system, letting you create new items and obstacles to interact with very easily!
  • Doodle a path and it'll become a racetrack, very simple to make new content! (You need two paths in 3D mode; one for XY coordinates and one for Z coordinates)
  • Very simple 2D top-down version, and a separate 3D version for advanced users!
  • Separates AI from physics, letting you make some racers smarter than others.
  • Custom racetrack drawing code using textured primitives!
  • Generates a 3D model of the racetrack automatically, including customizable foundation connecting it to the ground!
  • Swap out texture atlases to change the level's theme with minimal effort!
  • Only draws the part of the racetrack that's visible on-screen, speeding up processing.
  • Customizable number of laps per race.
  • Customizable number of AI racers.
  • Cars interact with each other, bump your rivals around!
  • Notes down the order cars finished in a global array, letting you change rooms for the results screen.
  • Once all players has finished, computer players automatically finish in their current ranking positions; you'll always have the full results!

NEW feature as of 2016-05-17: Added a new version of the 3D source code that creates hovercraft models from paths. If you don't like or aren't good at 3D modelling, you can still make wonders for the racetrack! The new scripts are also relatively easy to wedge into an existing project made from the original 3D source file.

StatusReleased
CategoryAssets
Rating
(3)
AuthorYal
GenreRacing
Made withGameMaker: Studio
TagsGame engine

Purchase

Buy Now$4.99 USD or more

In order to download this engine you must purchase it at or above the minimum price of $4.99 USD. You will get access to the following files:

Source Code (2D) 163 kB
Source code (3D) 443 kB
Source Code (3D + Car Models) 446 kB

Download demo

Download
Demo (3D) 2 MB
Download
Demo (2D) 2 MB
Download
Demo (3D + Car Models) 2 MB
Download
License Agreement 22 kB

Comments

Log in with itch.io to leave a comment.

(2 edits)

[SOLVED: read down below]

Awesome engine! It works quite well. The only problem I've found is that the car starts to move forward at a certain velocity, in my case it start to move at 7 units of the variable movespd... It depends on track length and step... The funny thing is it doesn't happen if the car is perpendicular to the track direction. I need your help, Yal!

Does it happen instantly or only when certain actions are performed? If it only happens when you're pointing in the direction of the track, it sounds like it could be the maths to translate between track position and room coordinates that glitch out.

Could you please answer the following questions? It'll help making it easier to narrow down the problem...

  • What version of GameMaker are you using, GMS1 or GMS2?
  • Did you make any changes to the movement logic or are you using it unchanged?
  • How do you cause this effect to happen? (the best would be a list of reproduction steps that makes it happen with 100% certainty, but any and all information is helpful)

It happens instantly only when pointing in the direction of the track. Take a close look at the demo, it also happens in there but is not easy to notice. If you enlarge the track you will see it well.

Your questions:

  • I'm using GMS2
  • No big changes. Only the way the "accel" variable is modified when pressing the up key to make it non linear (I'm trying to recreate an engine power curve). No changes were made to the d3d logics.
  • This effect happens when the car is stopped or under certain velocity, it just stops moving forward but keeps moving to both sides depending on direction. I've tried this with the source code unchanged with a larger track. 

Thanks, managed to get a 100% reproduction method working now... angle slightly, stand still, then tap 'accelerate'. I'll see i I can figure out what causes it.

I think I've figured out what's happening, but not WHY... the U position (how far you're along the track) seems to only update in increments of a set size, so at small speeds it get snapped back after updating. The W position (sidewaysness) isn't affected by this, so you can move sideways just fine.

Okay, I think I've figured it out! It's GM's float numbers being too imprecise, essentially. I added a bit of a hack to make the track position bigger to have more decimals around, and that solved the problem.


Here's the changes you need to do:

  • In obj_trackcontrol's create event, below the line that sets "global.ufactor", add something like global.uufactor     = 1000/global.tracklength
  • When trackcontrol creates cars, below the line "n.u = u", add the line n.uu= n.u*1000
  • In player_apply_movement, remove the line that sets u and replace it with the following two lines:
    • uu         += lengthdir_x(argument1*global.uufactor,alpha)
      u = uu/1000

You could substitute the 1000 for any number you want, I'll do that with a macro and then export an updated version of the engine file.

Fixed version is uploaded! It's just a change of like 3 lines, so it might be easier to just manually apply the git diff to your existing project:

diff --git a/SimpleRacingEngine_3D_carmodels.gmx/SimpleRacingEngine_3D_carmodels.project.gmx b/SimpleRacingEngine_3D_carmodels.gmx/SimpleRacingEngine_3D_carmodels.project.gmx
index 622e83f..59e20a7 100644
--- a/SimpleRacingEngine_3D_carmodels.gmx/SimpleRacingEngine_3D_carmodels.project.gmx
+++ b/SimpleRacingEngine_3D_carmodels.gmx/SimpleRacingEngine_3D_carmodels.project.gmx
@@ -105 +105 @@
-  <constants number="8">
+  <constants number="9">
@@ -108,0 +109 @@
+    <constant name="TRACK_U_PRECISION">10000</constant>
diff --git a/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_car.object.gmx b/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_car.object.gmx
index 3073c84..0d4bd06 100644
--- a/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_car.object.gmx
+++ b/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_car.object.gmx
@@ -36,0 +37 @@ u = 1.00//Forward coordinate
+uu = TRACK_U_PRECISION
diff --git a/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_trackcontrol.object.gmx b/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_trackcontrol.object.gmx
index c55c5c8..c8882e3 100644
--- a/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_trackcontrol.object.gmx
+++ b/SimpleRacingEngine_3D_carmodels.gmx/objects/obj_trackcontrol.object.gmx
@@ -73 +73,2 @@ global.ufactor      = 1/global.tracklength
+global.uufactor     = TRACK_U_PRECISION/global.tracklength
@@ -105,0 +107 @@ for(car = 0; car < global.cars_total; car++){
+    n.uu= n.u*TRACK_U_PRECISION
diff --git a/SimpleRacingEngine_3D_carmodels.gmx/scripts/player_apply_movement.gml b/SimpleRacingEngine_3D_carmodels.gmx/scripts/player_apply_movement.gml
index 3e6cf06..3f204c1 100644
--- a/SimpleRacingEngine_3D_carmodels.gmx/scripts/player_apply_movement.gml
+++ b/SimpleRacingEngine_3D_carmodels.gmx/scripts/player_apply_movement.gml
@@ -16 +16,2 @@ alpha       = angle_difference(trackdir,argument0)
-u          += lengthdir_x(argument1*global.ufactor,alpha)
+uu         += lengthdir_x(argument1*global.uufactor,alpha)
+u = uu/TRACK_U_PRECISION

Perfect!! It works like a charm now! Thanks Yal!! 

I must ask for something else if you don't mind: can you upload some documentation  about how to import 3d models into the engine? I mean, if that is possible. If don't, a tutorial explaining how to create them from paths, how to apply some textures and set the proper collision mask.

Thanks again, Yal!! You've made a wonderful job here!!

The models all are created from paths, I have no experience with "proper" 3D modelling (Blender etc) so I wouldn't really know how to import new ones.

  • Path0, 1 and 2 respectively are the silhouette of the car at the center, a bit outside the center, and at the left/right sides.
  • PxLengthFactor is the downscaling factor from path coordinates to model coordinates (the paths are pretty big thanks to how the grid is defaulted).
  • W0, W1, W2 and W3 are how far left/right from the center the paths are placed when used as a guide for the model. These are raw model coordinates, they don't use the PxLengthFactor. So for instance having a higher W0 means the cockpit is wider, having a W3 much higher than W2 makes the car have bigger wings, and so on.
  • W3 must always be greater than W2, W2 greater than W1, and so on. (You don't NEED them to be greater, but the model will clip into itself if not).
  • The texture is mapped like this: every horizontal 25% of the texture is used for the section between two W*s. So the first 25% of the texture are used for the section between -W0 and +W0, the next 25% are used for the section between W0 and W1 on both sides, and so on. It's stretched evenly from the front of the vehicle to the back (the top of the texture maps to the start of the path, the bottom to the end of the path)
  • Currently the model doesn't affect the collision mask at all, the cars all use the car sprite as a mask. You could extract the car's length from the modelling script by storing the "xx" variable of the first and last iteration (first iteration's lower value + last iteration's higher value, it's an array) and the W3 (outermost width)... those will give you the bounds of the car's model's bounding box, and then if you used an ellipsoid collision you'd get an okayish result. Probably would be the easiest to make a circle-shaped sprite for collision masks (with Ellipse collision mask settings, sprites default to "rectangle") and then scale image_xscale / image_yscale based on the bounding box size so the sprite covers the same region (e.g. if W3 is 8 and the sprite is 32x32, image_yscale should be 0.5 because (8*2)/32 = 0.5)

Hope this helps :)

This is neat.

Thanks ^__^