Search⌘ K
AI Features

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.

TypeScript 3.3.4
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { GameState } from './gameState';
import { config } from './config';
import { ctx } from './index';
let explosion = './img/explosion.png';
let explosionImg = document.createElement('img');
explosionImg.src = explosion;
function isColliding(laser, ship, shipType): boolean {
return laser.x > ship.x &&
laser.x < ship.x + config[shipType].width &&
laser.y > ship.y &&
laser.y < ship.y + config[shipType].height &&
ship.alive;
}
export function checkCollision(obs: Observable<GameState>) {
return obs
.pipe(
map(gameState => {
gameState.explosions.forEach(e => {
e.framesSince++;
});
gameState.player.lasers.forEach(l => {
if (isColliding(l, gameState.enemy, 'enemy')) {
let availableExplosion = gameState.explosions.find(e =>
e.framesSince > config.explosion.frames * config.explosion.gameFramesPer
);
// Fill in code here
}
});
gameState.enemy.lasers.forEach(l => {
if (isColliding(l, gameState.player, 'ship')) {
let availableExplosion = gameState.explosions.find(e =>
e.framesSince > config.explosion.frames * config.explosion.gameFramesPer
);
// Fill in code here
}
});
return gameState;
})
);
}

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:

TypeScript 3.3.4
export function renderExplosions (gameState: GameState) {
gameState.explosions.forEach(e => {
if (e.framesSince > config.explosion.frames *
config.explosion.gameFramesPer) { return; }
ctx.drawImage(
explosionImg,
Math.floor(e.framesSince / config.explosion.gameFramesPer) *
config.explosion.width,
0,
config.explosion.width,
config.explosion.height,
e.x,
e.y,
config[e.type].width,
config[e.type].height
);
});
}

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.

C++
availableExplosion.x = gameState.player.x;
availableExplosion.y = gameState.player.y;
availableExplosion.framesSince = 0;
availableExplosion.type = 'ship';
gameState.player.alive = false;

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
Rx fighter game