Detecting Collisions
Explore how to implement collision detection and animations within reactive game development using RxJS. Understand how to track game states and animate explosions using sprite sheets to create dynamic, interactive gameplay. This lesson helps you integrate collision functions and rendering into your RxJS application.
We'll cover the following...
Collision detection
This game won’t be any fun if there’s no element of danger. Let’s open up collisions.ts and take a look around. I’ve filled in the math stuff that isn’t as relevant to the Rx core. There’s a checkCollision function that operates much like the other updates you’ve seen. This one’s filled out since it’s more of the same that you’ve already written.
One thing that sticks out is a tracker for how many frames have elapsed since an explosion happened.
gameState.explosions.forEach(e =>
e.framesSince++;
);
Game animations
We need to track this value since the explosion is animated. Canvas doesn’t allow traditional gifs, so we need to manually animate. Let’s skip ahead to the renderExplosions function and see how that plays out:
This function iterates over all of the explosions attached to the game state, skipping over the ones that completed their animation. If an explosion is still animating, we draw an image (just like the player/pirate ships), but instead of a static image, we draw a single frame from a sprite sheet.
Sprite sheet
This sprite sheet is a single image that contains every frame of the animation. Instead of drawing the entire image, we draw only a subsection.
Let’s add checkCollision and renderExplosions to the Rx backbone in index.ts. At this point, you have a colliding function, a type definition for explosion, and two sets of lasers to check.
Let’s add the following code write inside checkCollision to get the game to update.
Please open the game in a separate tab after running the application by using the link given next to
Your app can be found at:
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 m6GhEay13JvUeYOmXGQCcRQTRzGbrDBVqRPH8RpiS8+4pkpFFQFEhDiJWYyr 1KxlMLZEkWUosrxV29wf1/BRRF9fP3Nzc494xGtkeiyZjTHMWsvpKFZUaXqH 7fa9Nw5rx6Z34Zze2FoyE0H101g95QJxnjNcKhTOOcbyVE75QJZlLC4uMj4+ 3jsE/pSJpdlshv7+fiYmJpj0gXVZhnOOoih0IM/EuoLJENQ5p5/H6Ekf9CUr i4aiWBU4y7LVtWqe5zTSjgykKSHPmUG0pY/IJN1UmF6u09qB6v18+PBhjDE0 m02iKGKbUQ4nNX5NV3i9ZFQjy6bYcDqpESfxGRpbD0pNA0m3SdN1nuIk5lRS 5QIrXG6UP/ALJJFhm4HYWIaGh/Hes7CwcIYsa0g9Q/YeWqrMIBrynIE0pZF2 ZPUBX7O8KYoCikJfsrJoTvqgn8eoc04nQ1DrCgbyTIqiUOcc67KMSR84efIk g4ODNBqNx43yPS6xWZaZG264gTRNuaPVZkPZAK7rSIU8Z8Z57T19t4nVY0H1 Ja0lS1dLe9rq8lzXt1syknZwec6kop01XrOuOjSCtVa7SWLfNognT56k2t22 q1rDNcbx3uoQv1YbZ6dRfkVbFFFC1l2O9IhNutpaC7o6x4oYku73JpM6N5Pz U3R4T22Y36qNMRMlPM+47hIq5vDhw4/5sK2VGVjtTwiBTrlc1CLPGUk7bGy3 xHUf9N7YaFHw4taSmfZBbxOrPU0+XTjVPGcoX1Uo1ueZfHWlRZZlXH/99WRZ 9rj8Pd5/zLXb7eC9Z9u2bfzt7DyDaQfXfcIG01RWnNesayJ6T+JXAnrSef3B 5UXRR55G9rRXzFjaoZUXHPJB24+YI7z339a4iJCIMKyBnRrYFxwvK1Jay8s0 m31Ya7kax/GowmyUMBcn/GVtiH5rKKKEuBuFgpLYuEtqTZV4zRwbdT3pIo4Z jAyfT/r4VlInshFfqPRxvWZYa6jWaixPT/GyImVfcOzUwLAGkkdpaQ+95UtR FLTznMM+aCsvGEk77GmvGO32X4uCFy8vyinn+ZzKGaY6854V53UoTUuFKgr6 Om1umVtgx44dOOdot9sBmH0sAh/Pefr04uKizszMsHnzZiYPH+bXFlsMDOcs W8uoT5mJYvI8X+2YMUZFRL5UqYTne29evLxo7mj2h+fnHdOIYyZqdT0QVE2e E0WRCFARoRo8sfNUXCEVV1ArMmnkGdUsJXI51mVIkXHf/BwuBPr6+rHW8lI6 fCEZIooskY14lWZ8odbHNbEwEEe4OEZMKVusUNNAjtA71iXGECelw7TVwD9W +7mpmOELtsbpyHJbXOePZZaaMQwMDHLy+DH2Bk9cZKgVvAWfQ4dAS9R0jGgm ZZGKQgOFsWSqKOCc0/1Bdbv3sjntyDVFYf63SrhyZVkmvOdLmFAUGcWaaSzP c2adY8R5nIWBIudXl9oY0I0bN8rMzAyLi4sKfPo7IfahEEJ7//79/QAdWP5Q 7uvrpqZMc8PGMOYy5kS0KAo1xkjPdIqIGmPk9iQJkffm5cvzJiQVjiO6YjJ2 BC9VG1ExRnpPuwASAsE5Cu9JVfWUsbISJywizKth3la49Z77Vx2XPlGeI553 xw2sjbjYBDZZ+FjS5ILIs8UKx+O4vDcQU0acBLBrQopRFGNiz1hk2C8VNicN Xt7p8H5jWYxiDkRVXpgX3FJvgAhvW2xxyYVjDFnDUBwzEMU0jaWhqv2ukFgD JnjUGZTSLOeqZCGQekercEwWTrekqbwsz8w3A/plTCiK/AxSu5fOeq+jWUoe CUcnp8zXCu8LpL1///4+gBBCm8epTvd4xKKqf5/n+Ru6P/9tDp88vrD43g21 um6Ognw+ikNRFKua2ptvugeV5L44Cs9xhRVgi6qod2RxzHKcsBJHmkYxqRhS ETpi6ESJOvF4sRQUmgc1hVEKqxShdO+TpIK1lh+k4FtRlZaNaFjDj2jKPyQj BBtxMonZYoXJrlcMYBSqofyht09pjBBHEaNOmI4rBIn4TKXJW7NlPmsMh43l 1rjOjekcnzTlvH78+HG2bduGsxELJiI2EUkUhziOsdZqZC01QWrdQEhVA1VX UC2crC8KKkWO5L21bM59Jg55qZ3fRmpRFMw4r9ekHTNfpDK5uGiAfw36w3me /2iPo8fj74kqm4VmsxmazWag3GN9P/BHU5OTVtttOR50rTCrDkFRFPii0JuW F4zNMmyWkRc5i3lBpft5JS+YKLwe80FP+6DLzmvRna97Mee1ThXA4uIilUoV EeF6zflC0sRaw4s0R6OI++IaNrJMxFXWW4i7zhOARYlRIgXp3rIX5txsDRNx lchaOlHC5+Mmr9MOxhq+Gje4UjxDQrmpPjOz9sFfvVbnVOdYdl5P+6DHfNCJ wutKXmCzjEqWspgX5EVOb1xuWl4w/lHmd63mHg+qtt2W6akpSxk2/NBj8PKd E9tut2m326y5wVus6jdeNr+iD60hcq1geZ5zdWvJXJB25K5AkCzjSOHVFBm3 iA0PhRAG0pQXrCyaa1tLZlenJYNZKt65M+KnIQRdS26eF1xbtfwnv8RF4vlG VKNhDK8i4+/jPow1RNYyHyU0o4hGFNHbbu6ZYLumw8YYojhivYXJuILperlf TBpsNnA5no6x3BFV+X23wA8khqxMFlvr+erauLhzjkaRs63Tkhe2lsw1K4tm NO3IEef1k9hginIsJMu4KxAuSDvy/NaSWes0rb32pxk3zK+oVb0d+Pkn4OXb 8LimGPifCwsLvZoG7+r9soCrDgc9ePzYyS07dtZ0zRpORUQ2a+CGomNmqzX9 pErY5XI5lAQ9Zay+eHnRfKreDAfjJNSMkfUBNrlMnqdBgiKTIjphrJ5QKPcJ gu1phGrg5liZMRG/VB3BGcPLNOXhqMKRKKFubElOZJmJLJuMYuXbs+56NsCK MBRZho0wHSVEtoxu5cbyN1GTH01n+Iat8seVIfZlgRuTJT67lJ+xnFHVgPcy Gjyb8iAbQ5CKwLQYfVhMOGEiWj5o1RdyY3vZ3IWEVghsLwpusZWwrXByU9ox d0fVcMiHVW3tbbB//MSEcUEPcWbq77sXFhZ62aL/8+kQ+0UeObpwfM3vA3Cx 8/7YoUOHRnbs2BGgfIot6E+utKMktnyg3hfazjHrHUNZh68Zq5mRcNPygvl0 oz8sRLEetpYjYoiM1fXBs8kV8hyfmucHz2RQPYjhQFCOd8Nnb6+P0ajUqdsK mwSuCym/H410AwUGaw0VY8HCXqPUBNpAQHAiuDXEDotyLY48jml4pdU9HinG 8M24zrVieXFI+TsT8fGkj8WGJ59eRlUx3rNVAztcbrYaJBjLpLF6b5yE48aS q6JB1XtHv3NyQ2vRfMXEYX9QvSrtyJxzpGr5gInC2/LM/nS7bX85qrmsq7lZ lnHo0CHjvJ8G9nKmZj4eL0+Z2Cf6wwzY7Zw7cODAgcEdO3YEEeF1WdtuVycf jYfCwy5okudMqdfRTltym+gDcayZ2HDT8oL5VK0ZZuJERUSdMRwBjohVsYZR nGz3mVyVt3lJUfDnp6f4+1UvWhCBnwgtbov6mbcRDTHERrgcz+XaIbNN5uKE NqV3GoBcSnK1q8JzYtmf1Lgoz3gVLQ5qzm3WkHYDEH+V9PMfOif5PDU6AklS AeDa2WkubzbIbMTxJOHzthImbKwqAj6AD6uBl2FXyE3tZfMZicJBH7QoCkY6 bZnyQXOfc9AF/Ts14TXtJfM6yey7TOzTNOXgwYPWez9HefY2+w54ecrEPhEW VPVC59xDBw8eHH/Ftgv0ta5jDtUa+hGJvC2P8zFJ0KtzL3lSV1XlgLVkNvKv XF40n601OBEn2vOoodT8k6p6XCL9XGwYxZoHVBZVdwAAEA1JREFUV1oiUn4n Bl7sUy4Nyq/GdWIRrqDgWu9p08eX43722oipqEIvduAFMhEyAdcVvozpJuy1 lluSPrblC/y0W+K+kHMLgcM25j5b4d+mK/yJWDrdB+uexWUeGBzWmTgJxhiM gjh3hvwhBDa6ghvaK/K3UeKP+oD3ZZRufafDl8VqTqAoCv7axP4KH+R1nXnz WVMJf3PkmAkhnFLVXZQG52nhu633uwJc6Jw7/I8HD9v97ZTfi6q+vSZGfMJ5 XZd2pFgTJz1aOD4iUXjJypJcmLYlyzKT57ktimJ1o6HnlJxCdH8nxRjhF4tF /jqf5tWhw58lA6Ri+bd+heeFjM/GDT6R9DFvIoYE5m3pFStQIKQiZCL4Htsi qLXMmYgRUW6Parw37sMCv+IWGUD5YNTHEIGPpFP8QT5LReC2dodTiK7dIO9G mSTPc5tlmdmStuWG5UXzEbHhsPOrY1HkOeNpR04434syaTvL+P2o6u9tp3zq 8FHrvT+gqtu/G1Lhu9PYHnLgolYIH79uev6VG6KajI2NaTf9Q49ElnqW0shS WVZVay0hBD1pLR8wcfixlSUbJzW+FScAxhjje55wN5lLvfelhpmIX6oMM1EZ oG4rbCWwXgP/Pe6namLqApsJzNkE7R0KFSgEOiIU8sjGpVCuZSdtzBY6PCDC krF8PG4STJt9mvEJY/nNyjDVIuYH8xkQKWPfzmkvZgz08pgMwF6Xy4uyjnww rvpp53VtdkR/nkk9SzkqsebOr3q/X5+dk5dMz2soE82fkTqNz2SF7puD6m+e PHnSHDp0yKRpWobFCkc7L3Q87Tyyfdd17aeKgv9PYp7bXua5nVavo9KLs3YH RJ1zKmJ4b9zkYRND1yxepTn3RBVCLziCsJnAtIm6UeLSWSpE6BihYwzF2tiu CNMmYoMGInlkh+muqMq+kK1+njMRH0j6KRDyPNeuTKsyds8FcXmnxQtay7xb Ik4Vj9qyLLWVVl7obFHG19M05dChQ+bkyZMmqP4Gz2DxzWe69PqvAy9YXl5u 79+/387NzZnSHDtd32mv3bZavWaLgnfZhL3tFte1l8nzvLdN1bvw3iNrBr6H 54aUu0xZwUUps9/H1TMt9pE5j9JxaktpjvPu73v3ysUwL4ZNwa3e92ETM6yB DXrmBkU3Z0m75re3E6N5nsvVnRWubLf4M5swUxL3bf1d32nLCec0z3Pm5ubM fffdZ5eXl1vAC3iGi4GdjZr6X1XVIefcLYcOHTJHjhyxx5xjU6fdm2v00R1e KhzvtAkb0w6vWFnEd+et3lWuHc9sZGtwVBSOyGq1NjapY0EMOWuyACkdp44R OmuIXRs5OikRF+ojxAbgG6bCC/yZJzR693SPku+mlSV2ddr8iU1YKNy3Pby9 fm/qtDnmHEeOHLGHDh0yIYS/V9Vh4KvPNAln62UJHniFqr5mdna2eMvDh+Vb s3PyqI6esWe74hx/Ziv05xmvWZq3fs3WXjmX6RlkXO073C7xI3u5wIXqOIE9 IxzZI7Ytho4pPePVZ6T7nZNiuUDdGYPxNVvlhT49o03tnmzvmWGf57x2ad6O 5Cl/Yissd7cwH2WCV/t618ycvOXhwzI7O5ur6o+o6iu7Y/WM42y+BQPgY6ra v+T8n//+xJTefffdZnZ21jy6w7093Vae86cmQYuCn15ZsNIdQBFhvQZ+pVjg Bt9mI54X+Iw7bFkRSFUZVM8mlzMppktCuaZXZFVj22s0tvw7CBpY7uYgXe4z 6BJ4CAuqXOFzXhBSfq5YZEM30NxNZeFNywvWFjnvNAmtR/VlbR9nZmbM3Xff bf6vU1O67Py7VbUP+JuzOfDPhFf8ZMiBn1LVt+V5/hcPP/zwDbVajY0bN64e fOodeVBVnAjvtol/Q9Y2P5/N2HfU+r21VheDyqwarndtLk49Wm8wgaWOst4X vDYvSOMmNe9Z0kAI5V6oAmmX1CCQrjHF3ns0KKhS957nuQ6F93xGFUWZFcNv 5LMczDO+FQILAYajCFsU/Fxn2U4Zox+sNIIrCtvLn/a+9HZDCJw+fdqcOnWK TqdjgE+q6o9RnmU66zgXxPYwp6o3ATvb7fafHjx48MVHjhyR0dFRNm/e3Kvl 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 y/j/AVlhoxcmXbH+AAAAAElFTkSuQmCC