From 6f0fe0dcaeaf726b5c8dd914f18eaee4b0fe04ba Mon Sep 17 00:00:00 2001 From: Brett Chalupa Date: Sun, 11 Dec 2022 13:13:23 -0500 Subject: [PATCH] feat: additional illustrations --- src/02-player-movement.md | 2 -- src/03-spit-fire.md | 2 -- src/04-target-practice.md | 4 ++-- src/img/c04-rect-overlap.png | Bin 0 -> 42055 bytes 4 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 src/img/c04-rect-overlap.png diff --git a/src/02-player-movement.md b/src/02-player-movement.md index 393b232..624235f 100644 --- a/src/02-player-movement.md +++ b/src/02-player-movement.md @@ -139,8 +139,6 @@ Whoa! We just refactored that code. It's easier to change (ETC) now, which is a You can move your dragon completely off the screen, lost in the great unknown! This isn't ideal. Let's make it so our little buddy can't leave the bounds of the screen. -[TODO: drawing about boundaries] - ``` ruby {{#include code/chapter_02/app/main.rb}} ``` diff --git a/src/03-spit-fire.md b/src/03-spit-fire.md index 60a9ea3..e1d071c 100644 --- a/src/03-spit-fire.md +++ b/src/03-spit-fire.md @@ -87,8 +87,6 @@ There's a lot of important concepts in those three newly added lines of code. In Looping through an array of data in each `#tick` and then doing _something_ is the stuff games are made of! Here are some ways this can be applied in all sorts of games: enemy behavior, checking for collision, animating. As our game (and any game you make) gets more complex, looping through collections of data becomes more and more common. -[TODO: illustration of game loop and then a little loop inside where we loop through collections] - ## Switching to Hashes So far throughout the book we've been using arrays to represent the entities in our game, whether it be the player's dragon sprite or our fireball text that gets displayed. Remember `[args.state.player_x, args.state.player_y, 'fireball']`? Arrays are wonderful and important, but they aren't so great for representing structured data because it's difficult to remember what each piece of data in the array's positions represents. Remembering that `fireball[2]` is the text value and not the y value is tricky. Luckily, DragonRuby has a more verbose and clear data structure we can use for managing our data. It's called a hash! Much like arrays, hashes are extremely useful. diff --git a/src/04-target-practice.md b/src/04-target-practice.md index e721bf4..f132583 100644 --- a/src/04-target-practice.md +++ b/src/04-target-practice.md @@ -58,9 +58,9 @@ The fireballs our dragon spits just fly behind our targets and off the screen in Collision detection is when one object overlaps with another object in our game. Because we're manufacturing the space the game exists in, there's no physics like we have in real life. We need to simulate that by checking to see if two objects are attempting to exist in the same point and react accordingly. -Our fireball sprite is a 32x32 square, so we want to check in every single game loop whether or not the points of the fireball's square overlapping with any of the points of the targets. If they are overlapping, then we do that _something_. +Our fireball sprite is a 32x32 square, so we want to check in every single game loop whether or not the points of the fireball's square overlapping with any of the points of the target sprites. If they are overlapping, then we do that _something_. -TODO: graphic of overlapping rects/squares explained +![diagram showing two rectangles overlapping and not overlapping](./img/c04-rect-overlap.png) We could employ trigonometry to determine if a given point in one shape overlaps with another, but DragonRuby gives us a helpful method to handle this for us: `args.geometry.intersect_rect? rect_1, rect_2` diff --git a/src/img/c04-rect-overlap.png b/src/img/c04-rect-overlap.png new file mode 100644 index 0000000000000000000000000000000000000000..8c29d9730297be7f7a202fb666305ee6c6e5a987 GIT binary patch literal 42055 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