Handmade Hero»Episode Guide
Preventing Overlapping Rooms
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:00Recap and set the stage for the day continuing with room layout
🗩
0:00Recap and set the stage for the day continuing with room layout
🗩
0:00Recap and set the stage for the day continuing with room layout
🗩
0:45Run the game to show our strange situation with the camera placement
🏃
0:45Run the game to show our strange situation with the camera placement
🏃
0:45Run the game to show our strange situation with the camera placement
🏃
1:39Enable CreateWorld() to set a sane initial camera position
1:39Enable CreateWorld() to set a sane initial camera position
1:39Enable CreateWorld() to set a sane initial camera position
4:24Run the game to see the camera oddly positioned
🏃
4:24Run the game to see the camera oddly positioned
🏃
4:24Run the game to see the camera oddly positioned
🏃
5:13Step in to CreateWorld() to inspect the camera and room data
🏃
5:13Step in to CreateWorld() to inspect the camera and room data
🏃
5:13Step in to CreateWorld() to inspect the camera and room data
🏃
7:49Step in to GenerateRoom() to inspect its values
🏃
7:49Step in to GenerateRoom() to inspect its values
🏃
7:49Step in to GenerateRoom() to inspect its values
🏃
9:06Fix Layout() to not include the bounding edges in the volume dimensions
9:06Fix Layout() to not include the bounding edges in the volume dimensions
9:06Fix Layout() to not include the bounding edges in the volume dimensions
10:41Run the game to see that our camera is now correctly initialised
🏃
10:41Run the game to see that our camera is now correctly initialised
🏃
10:41Run the game to see that our camera is now correctly initialised
🏃
11:09TODO(casey): Fix 2-high room bug - camera seems to get confused
11:09TODO(casey): Fix 2-high room bug - camera seems to get confused
11:09TODO(casey): Fix 2-high room bug - camera seems to get confused
11:45Check out our orphanage, and determine to implement the doors
🏃
11:45Check out our orphanage, and determine to implement the doors
🏃
11:45Check out our orphanage, and determine to implement the doors
🏃
13:26Make PlaceRoomsAlongEdge() knock out the entire wall between connecting rooms
13:26Make PlaceRoomsAlongEdge() knock out the entire wall between connecting rooms
13:26Make PlaceRoomsAlongEdge() knock out the entire wall between connecting rooms
15:54Run the game to see that we actually don't overlap our rooms in this placement scheme
🏃
15:54Run the game to see that we actually don't overlap our rooms in this placement scheme
🏃
15:54Run the game to see that we actually don't overlap our rooms in this placement scheme
🏃
16:42Determine to make PlaceRoomsAlongEdge() expand the door dimensions into each room
16:42Determine to make PlaceRoomsAlongEdge() expand the door dimensions into each room
16:42Determine to make PlaceRoomsAlongEdge() expand the door dimensions into each room
19:37Step in to PlaceRoomsAlongEdge() and inspect MinDoor and MaxDoor
🏃
19:37Step in to PlaceRoomsAlongEdge() and inspect MinDoor and MaxDoor
🏃
19:37Step in to PlaceRoomsAlongEdge() and inspect MinDoor and MaxDoor
🏃
21:39Make PlaceRoomsAlongEdge() flip the door's Min and Max dimensions along the axis pointing to the adjoining room
21:39Make PlaceRoomsAlongEdge() flip the door's Min and Max dimensions along the axis pointing to the adjoining room
21:39Make PlaceRoomsAlongEdge() flip the door's Min and Max dimensions along the axis pointing to the adjoining room
22:01Run the game to see that the door placement is almost there
🏃
22:01Run the game to see that the door placement is almost there
🏃
22:01Run the game to see that the door placement is almost there
🏃
22:20Fix typo in PlaceRoomsAlongEdge()
22:20Fix typo in PlaceRoomsAlongEdge()
22:20Fix typo in PlaceRoomsAlongEdge()
22:59Hop around the world and consider fixing the camera and lighting once the world generation is done enough
🏃
22:59Hop around the world and consider fixing the camera and lighting once the world generation is done enough
🏃
22:59Hop around the world and consider fixing the camera and lighting once the world generation is done enough
🏃
24:54Make PlaceRoomsAlongEdge() constrain the door width to 1 unit wide
24:54Make PlaceRoomsAlongEdge() constrain the door width to 1 unit wide
24:54Make PlaceRoomsAlongEdge() constrain the door width to 1 unit wide
26:57Run the game and consider tweaking the eccentricity of the perspective projection
🏃
26:57Run the game and consider tweaking the eccentricity of the perspective projection
🏃
26:57Run the game and consider tweaking the eccentricity of the perspective projection
🏃
28:04Adjust the camera focal length and zoom in UpdateAndRenderWorld() and UpdateCameraForEntityMovement()
28:04Adjust the camera focal length and zoom in UpdateAndRenderWorld() and UpdateCameraForEntityMovement()
28:04Adjust the camera focal length and zoom in UpdateAndRenderWorld() and UpdateCameraForEntityMovement()
31:27Run the game and note the reduced eccentricity of the perspective projection, with a few thoughts on the camera in The Binding of Isaac and Hotline Miami
🏃
31:27Run the game and note the reduced eccentricity of the perspective projection, with a few thoughts on the camera in The Binding of Isaac and Hotline Miami
🏃
31:27Run the game and note the reduced eccentricity of the perspective projection, with a few thoughts on the camera in The Binding of Isaac and Hotline Miami
🏃
33:32Determine to get things up to a playable state, generating more stuff, and making a separately moveable debug camera
🏃
33:32Determine to get things up to a playable state, generating more stuff, and making a separately moveable debug camera
🏃
33:32Determine to get things up to a playable state, generating more stuff, and making a separately moveable debug camera
🏃
36:00Make CreateWorld() create multiple orphanages, and Layout() to take an initial room
36:00Make CreateWorld() create multiple orphanages, and Layout() to take an initial room
36:00Make CreateWorld() create multiple orphanages, and Layout() to take an initial room
38:22Run the game to see some Z-fighting, and determine to make the layout code check for overlap
🏃
38:22Run the game to see some Z-fighting, and determine to make the layout code check for overlap
🏃
38:22Run the game to see some Z-fighting, and determine to make the layout code check for overlap
🏃
40:38Make CreateWorld() call Connect() on the orphanages
40:38Make CreateWorld() call Connect() on the orphanages
40:38Make CreateWorld() call Connect() on the orphanages
41:24Run the game and walk between our two orphanages
🏃
41:24Run the game and walk between our two orphanages
🏃
41:24Run the game and walk between our two orphanages
🏃
42:39Make CreateOrphanage() create smaller rooms
42:39Make CreateOrphanage() create smaller rooms
42:39Make CreateOrphanage() create smaller rooms
43:19Run the game to see that the camera correctly handles traversal between the orphanages
🏃
43:19Run the game to see that the camera correctly handles traversal between the orphanages
🏃
43:19Run the game to see that the camera correctly handles traversal between the orphanages
🏃
44:16Make CreateWorld() create 64 orphanages all chained together
44:16Make CreateWorld() create 64 orphanages all chained together
44:16Make CreateWorld() create 64 orphanages all chained together
45:45Run the game to see that our debug system runs out of space for the timings
🏃
45:45Run the game to see that our debug system runs out of space for the timings
🏃
45:45Run the game to see that our debug system runs out of space for the timings
🏃
46:16Remove TIMED_FUNCTION() calls pertaining to simulation regions
46:16Remove TIMED_FUNCTION() calls pertaining to simulation regions
46:16Remove TIMED_FUNCTION() calls pertaining to simulation regions
47:20Traverse the world, with a few words on structuring our code to ease procedural generation
🏃
47:20Traverse the world, with a few words on structuring our code to ease procedural generation
🏃
47:20Traverse the world, with a few words on structuring our code to ease procedural generation
🏃
49:21Note the low loading time of our game considering its anticipated length
🏃
49:21Note the low loading time of our game considering its anticipated length
🏃
49:21Note the low loading time of our game considering its anticipated length
🏃
51:06Remove TIMED_FUNCTION() from BeginTicketMutex()
51:06Remove TIMED_FUNCTION() from BeginTicketMutex()
51:06Remove TIMED_FUNCTION() from BeginTicketMutex()
51:24Note that our high entity count does not affect our performance
🏃
51:24Note that our high entity count does not affect our performance
🏃
51:24Note that our high entity count does not affect our performance
🏃
53:34Step in to the game and inspect the LastUsedEntityStorageIndex
🏃
53:34Step in to the game and inspect the LastUsedEntityStorageIndex
🏃
53:34Step in to the game and inspect the LastUsedEntityStorageIndex
🏃
54:41Make CreateWorld() create 1024 orphanages
54:41Make CreateWorld() create 1024 orphanages
54:41Make CreateWorld() create 1024 orphanages
55:29Disable HANDMADE_INTERNAL and redefine DEBUG_STRING and HUD_TIMED_FUNCTION to do nothing in this mode
55:29Disable HANDMADE_INTERNAL and redefine DEBUG_STRING and HUD_TIMED_FUNCTION to do nothing in this mode
55:29Disable HANDMADE_INTERNAL and redefine DEBUG_STRING and HUD_TIMED_FUNCTION to do nothing in this mode
56:10Run the game in release mode and inspect the LastUsedEntityStorageIndex, noting that it is computationally free to have many entities
🏃
56:10Run the game in release mode and inspect the LastUsedEntityStorageIndex, noting that it is computationally free to have many entities
🏃
56:10Run the game in release mode and inspect the LastUsedEntityStorageIndex, noting that it is computationally free to have many entities
🏃
58:39Increase the world_room array size in the world struct by × 4
58:39Increase the world_room array size in the world struct by × 4
58:39Increase the world_room array size in the world struct by × 4
59:09Run the game one last time with this large world
🏃
59:09Run the game one last time with this large world
🏃
59:09Run the game one last time with this large world
🏃
1:00:06Restrict CreateWorld() to create a single orphanage
1:00:06Restrict CreateWorld() to create a single orphanage
1:00:06Restrict CreateWorld() to create a single orphanage
1:00:25Determine to address the room overlapping bug
🏃
1:00:25Determine to address the room overlapping bug
🏃
1:00:25Determine to address the room overlapping bug
🏃
1:04:09Consider augmenting the world struct with a two-tiered representation of the world at both entity- and room-granularity
🗩
1:04:09Consider augmenting the world struct with a two-tiered representation of the world at both entity- and room-granularity
🗩
1:04:09Consider augmenting the world struct with a two-tiered representation of the world at both entity- and room-granularity
🗩
1:08:17Setup PlaceRoomsAlongEdge() for overlap testing before room placement
1:08:17Setup PlaceRoomsAlongEdge() for overlap testing before room placement
1:08:17Setup PlaceRoomsAlongEdge() for overlap testing before room placement
1:10:37Highly recommend Milton
🖌
1:10:37Highly recommend Milton
🖌
1:10:37Highly recommend Milton
🖌
1:12:09Edge Subscription
🖌
1:12:09Edge Subscription
🖌
1:12:09Edge Subscription
🖌
1:15:44Directed Search vs Blind Search
🖌
1:15:44Directed Search vs Blind Search
🖌
1:15:44Directed Search vs Blind Search
🖌
1:19:21Introduce a TestVol in PlaceRoomsAlongEdge()
1:19:21Introduce a TestVol in PlaceRoomsAlongEdge()
1:19:21Introduce a TestVol in PlaceRoomsAlongEdge()
1:22:52Consider that we may have hit a 4coder bug
1:22:52Consider that we may have hit a 4coder bug
1:22:52Consider that we may have hit a 4coder bug
1:25:16Continue setting up PlaceRoomsAlongEdge() for overlap testing
1:25:16Continue setting up PlaceRoomsAlongEdge() for overlap testing
1:25:16Continue setting up PlaceRoomsAlongEdge() for overlap testing
1:26:38Overlap testing each room from the start of the placement edge
🖌
1:26:38Overlap testing each room from the start of the placement edge
🖌
1:26:38Overlap testing each room from the start of the placement edge
🖌
1:28:03Coffee at Molly Rocket and in indie development in general
🎲
1:28:03Coffee at Molly Rocket and in indie development in general
🎲
1:28:03Coffee at Molly Rocket and in indie development in general
🎲
1:30:16Finish setting up PlaceRoomsAlongEdge() for overlap testing, introducing GetDeltaAlongAxisForCleanPlacement()
1:30:16Finish setting up PlaceRoomsAlongEdge() for overlap testing, introducing GetDeltaAlongAxisForCleanPlacement()
1:30:16Finish setting up PlaceRoomsAlongEdge() for overlap testing, introducing GetDeltaAlongAxisForCleanPlacement()
1:34:25Run the game to see all connected rooms placed on top of each other
🏃
1:34:25Run the game to see all connected rooms placed on top of each other
🏃
1:34:25Run the game to see all connected rooms placed on top of each other
🏃
1:34:39Don the pig hat with a few words on working on one thing at a time
🎩
🗩
1:34:39Don the pig hat with a few words on working on one thing at a time
🎩
🗩
1:34:39Don the pig hat with a few words on working on one thing at a time
🎩
🗩
1:36:37Enable GetDeltaAlongAxisForCleanPlacement() to perform overlap testing and clean room placement
🎩
🖮
1:36:37Enable GetDeltaAlongAxisForCleanPlacement() to perform overlap testing and clean room placement
🎩
🖮
1:36:37Enable GetDeltaAlongAxisForCleanPlacement() to perform overlap testing and clean room placement
🎩
🖮
1:40:35Run the game and crash in PlaceRoomsAlongEdge()
🎩
🏃
1:40:35Run the game and crash in PlaceRoomsAlongEdge()
🎩
🏃
1:40:35Run the game and crash in PlaceRoomsAlongEdge()
🎩
🏃
1:41:25Prevent GetDeltaAlongAxisForCleanPlacement() from considering unplaced rooms
🎩
1:41:25Prevent GetDeltaAlongAxisForCleanPlacement() from considering unplaced rooms
🎩
1:41:25Prevent GetDeltaAlongAxisForCleanPlacement() from considering unplaced rooms
🎩
1:41:55Step through PlaceRoomsAlongEdge()
🎩
🏃
1:41:55Step through PlaceRoomsAlongEdge()
🎩
🏃
1:41:55Step through PlaceRoomsAlongEdge()
🎩
🏃
1:42:18Fix PlaceRoomsAlongEdge() to correctly loop over the edges
🎩
1:42:18Fix PlaceRoomsAlongEdge() to correctly loop over the edges
🎩
1:42:18Fix PlaceRoomsAlongEdge() to correctly loop over the edges
🎩
1:42:39Run it to see that the room placement is all totally correct
🎩
🏃
1:42:39Run it to see that the room placement is all totally correct
🎩
🏃
1:42:39Run it to see that the room placement is all totally correct
🎩
🏃
1:43:53Q&A
🎩
🗩
1:43:53Q&A
🎩
🗩
1:43:53Q&A
🎩
🗩
1:44:25thebirkisreal Q: Do you plan on making an in-game editor similar to the one in The Witness?
🗪
1:44:25thebirkisreal Q: Do you plan on making an in-game editor similar to the one in The Witness?
🗪
1:44:25thebirkisreal Q: Do you plan on making an in-game editor similar to the one in The Witness?
🗪
1:45:19therainbowmask Q: The "4coder bug" was not a bug, it was a missing ']'
🗪
1:45:19therainbowmask Q: The "4coder bug" was not a bug, it was a missing ']'
🗪
1:45:19therainbowmask Q: The "4coder bug" was not a bug, it was a missing ']'
🗪
1:45:27Insert a ']' in PlaceRoomsAlongEdge() (not a 4coder bug)
1:45:27Insert a ']' in PlaceRoomsAlongEdge() (not a 4coder bug)
1:45:27Insert a ']' in PlaceRoomsAlongEdge() (not a 4coder bug)
1:45:46naysayer88 Q: How can I earn a piggy hat for myself?
🗪
1:45:46naysayer88 Q: How can I earn a piggy hat for myself?
🗪
1:45:46naysayer88 Q: How can I earn a piggy hat for myself?
🗪
1:46:43garryjohanson Q: I think I know the answer to this question, but do you know of some simple preprocessor library that has iteration as a feature? I really don't want to write my own at the moment
🗪
1:46:43garryjohanson Q: I think I know the answer to this question, but do you know of some simple preprocessor library that has iteration as a feature? I really don't want to write my own at the moment
🗪
1:46:43garryjohanson Q: I think I know the answer to this question, but do you know of some simple preprocessor library that has iteration as a feature? I really don't want to write my own at the moment
🗪
1:50:23mmd966 Q: Hello sir. I just started creating my first game using SDL in C++. Can you give me some advice? Am I going the right way or I should change my tools? Plus, I'm looking for a game programming book. Do you know a good one to start with? (I worked a little with Unity3D)1
🗪
1:50:23mmd966 Q: Hello sir. I just started creating my first game using SDL in C++. Can you give me some advice? Am I going the right way or I should change my tools? Plus, I'm looking for a game programming book. Do you know a good one to start with? (I worked a little with Unity3D)1
🗪
1:50:23mmd966 Q: Hello sir. I just started creating my first game using SDL in C++. Can you give me some advice? Am I going the right way or I should change my tools? Plus, I'm looking for a game programming book. Do you know a good one to start with? (I worked a little with Unity3D)1
🗪
1:54:57cvaucher Q: The current generator always creates two-tile wide walls when rooms are adjacent. Will you leave it like this because it's easier to include the walls inside the room volume? Would you take the same approach if the tile size were not tied to the traversable size, which would allow for thinner walls, for example?
🗪
1:54:57cvaucher Q: The current generator always creates two-tile wide walls when rooms are adjacent. Will you leave it like this because it's easier to include the walls inside the room volume? Would you take the same approach if the tile size were not tied to the traversable size, which would allow for thinner walls, for example?
🗪
1:54:57cvaucher Q: The current generator always creates two-tile wide walls when rooms are adjacent. Will you leave it like this because it's easier to include the walls inside the room volume? Would you take the same approach if the tile size were not tied to the traversable size, which would allow for thinner walls, for example?
🗪
1:56:26butwhynot1 Q: libclang can parse your code and give you the AST. It's a simple C interface
🗪
1:56:26butwhynot1 Q: libclang can parse your code and give you the AST. It's a simple C interface
🗪
1:56:26butwhynot1 Q: libclang can parse your code and give you the AST. It's a simple C interface
🗪
1:56:38vaualbus Q: Can you show the game? Just fell asleep and missed all of the coding
🗪
1:56:38vaualbus Q: Can you show the game? Just fell asleep and missed all of the coding
🗪
1:56:38vaualbus Q: Can you show the game? Just fell asleep and missed all of the coding
🗪
1:56:44Run the game to show the orphanage layout
🏃
1:56:44Run the game to show the orphanage layout
🏃
1:56:44Run the game to show the orphanage layout
🏃
1:57:11toolegit2quit_ Q: What to do if CS course enforces OOP?
🗪
1:57:11toolegit2quit_ Q: What to do if CS course enforces OOP?
🗪
1:57:11toolegit2quit_ Q: What to do if CS course enforces OOP?
🗪
2:02:28netcha_ Q: What do you think about Lua and Love2D?
🗪
2:02:28netcha_ Q: What do you think about Lua and Love2D?
🗪
2:02:28netcha_ Q: What do you think about Lua and Love2D?
🗪
2:02:35keepingtrckofthisacct handmade_hero What paradigm do you use instead of OOP?
🗪
2:02:35keepingtrckofthisacct handmade_hero What paradigm do you use instead of OOP?
🗪
2:02:35keepingtrckofthisacct handmade_hero What paradigm do you use instead of OOP?
🗪
2:02:49naysayer88 Q: The problem is that understanding why OOP is really bad probably requires 5+ years of experience, because it takes that long to be able to build sufficiently complex programs such that you know what "should" be easy, or which complications are unnecessary
🗪
2:02:49naysayer88 Q: The problem is that understanding why OOP is really bad probably requires 5+ years of experience, because it takes that long to be able to build sufficiently complex programs such that you know what "should" be easy, or which complications are unnecessary
🗪
2:02:49naysayer88 Q: The problem is that understanding why OOP is really bad probably requires 5+ years of experience, because it takes that long to be able to build sufficiently complex programs such that you know what "should" be easy, or which complications are unnecessary
🗪
2:03:38On the problem with languages whose design philosophy is divorced from the computer
🗩
2:03:38On the problem with languages whose design philosophy is divorced from the computer
🗩
2:03:38On the problem with languages whose design philosophy is divorced from the computer
🗩
2:07:42Close down
🗩
2:07:42Close down
🗩
2:07:42Close down
🗩