Skip to content

Instantly share code, notes, and snippets.

@NOUIY
Created February 19, 2022 22:28
Show Gist options
  • Save NOUIY/242efb2ee9927eb8cccb2b55b05c2c2c to your computer and use it in GitHub Desktop.
Save NOUIY/242efb2ee9927eb8cccb2b55b05c2c2c to your computer and use it in GitHub Desktop.
Platforming w/ Gamepad Support
<!-- arrow keys to move and jump -->
<!-- also a double jump -->
<div id='game_console'>
<div id='player2'></div>
<div id='game_alert'></div>
<div id='deaths_counter'></div>
<div id='time_counter'></div>
</div>

Platforming w/ Gamepad Support

Still working on adding feature at the moment.

1-27-22 / added portals feature

A Pen by Nexuscompute on CodePen.

License.

const gc = document.querySelector('#game_console')
const gc_loc = gc.getBoundingClientRect()
const player = 'player2'
var pl;
var cols = 40 // multiple of 16
var rows = 22 // multiple of 9
const tile_size = gc_loc.width*(100/cols/100)
const pl_size = tile_size*2
document.body.style.setProperty('--tile-line-height', pl_size+'px')
gc.style.width = '1000px'
gc.style.height = tile_size*rows+'px'
var gravity = 8,
kd,
x_speed = 5,
pb_y = 0,
score = 0,
rot = 0,
data_p = 0,
bonus = 1,
dead = false,
kd_list = [],
d = {},
gp,
gpa,
dbljump = false,
dash = false,
timer = 0,
level_num = -1;
const levels = [
{
start:'19.5,0',
map: [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,9,9,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
},
{
start:'19.5,0',
map: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,8,8,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,8,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,8,8,8,8,8,8,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
8,8,8,8,0,1,1,1,1,1,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,1,1,1,1,1,0,8,8,8,8,
8,8,8,8,0,2,2,2,2,2,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,2,2,2,2,2,0,8,8,8,8,
8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,8,8,8,8]
},
{
start:'2,13',
map: [8,8,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,8,8,8,0,1,1,1,1,0,8,8,8,0,0,0,0,0,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,0,0,1,1,1,0,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,1,1,1,1,1,0,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,3,0,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,0,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,8,8,
1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,8,8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,8,8,
1,1,1,1,1,1,1,1,1,1,0,8,0,1,1,1,1,1,0,8,8,8,8,8,8,0,1,1,1,1,1,1,1,1,1,1,1,0,0,8,
0,0,0,0,0,1,1,1,1,1,0,8,0,2,2,2,2,2,0,8,8,8,8,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
8,8,8,8,0,1,1,1,1,1,0,8,0,0,0,0,0,0,0,8,8,8,8,8,8,0,2,2,2,1,1,1,1,1,1,1,1,1,1,0,
8,8,8,8,0,2,2,2,2,2,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,
8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0]
},
{
start:'1,2',
map: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,0,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,0,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,6,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,
0,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,
0,1,1,1,1,0,2,2,0,2,2,2,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,2,2,2,0,2,2,0,1,1,1,1,0,
0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,
0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,4,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,4,1,1,1,1,1,1,1,9,
0,1,7,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,0,0,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,9,
0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,
8,8,8,8,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,8,8,8,8,
8,8,8,8,0,2,2,2,0,2,2,2,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,2,2,2,0,2,2,2,0,8,8,8,8,
8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8]
},
{
start: '1,2',
map: [0,0,0,0,0,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,0,4,4,4,4,0,8,8,8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,
0,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,
0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,
0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,
0,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,1,1,1,9,
0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,8,0,1,1,1,1,1,1,1,1,1,0,1,1,1,9,
0,0,0,0,0,1,1,1,1,1,1,1,0,2,2,2,2,2,0,0,0,0,0,0,8,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
8,8,8,8,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,8,8,8,8,8,8,0,2,2,2,1,1,1,1,1,1,0,8,8,8,8,
8,8,8,8,0,2,2,2,2,2,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,1,1,1,1,1,1,0,8,8,8,8,
8,8,8,8,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,8,8,8,8]
},
{
start: '2,13',
map: [8,8,8,8,8,8,8,8,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,8,8,8,0,1,1,1,1,0,8,8,8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,8,0,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,8,8,8,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,0,0,0,0,0,1,1,1,1,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,
8,0,1,1,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,8,8,8,8,8,
0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,8,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,8,8,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,8,
0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
8,8,8,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
8,8,8,8,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
}
]
function buildGame(){
// clear tiles and update level number
gc.innerHTML = "<div id='"+player+"'></div><div id='game_alert'></div><div id='deaths_counter'></div><div id='time_counter'></div>"
if(level_num < levels.length - 1) {
level_num++
} else {
level_num = 0
}
let time = 0
let deaths = 0
let tc = document.querySelector('#time_counter')
let dc = document.querySelector('#deaths_counter')
tc.innerHTML = 'TIME<br>'+ time
dc.innerHTML = 'DEATHS<br>'+ deaths
// set random level color
document.body.style.setProperty('--root-clr', 'hsl('+Math.random()*360+'deg,75%,50%)')
// add tiles for new level
for(var i=0;i<cols*rows;i++) {
var d = document.createElement('div')
d.className = 'tile'
if(levels[level_num].map[i] == 0) {
d.className = 'tile ground'
// d.style.background = 'dimgray'
}
if(levels[level_num].map[i] == 2) {
d.className = 'tile lava'
}
if(levels[level_num].map[i] == 3) {
d.className = 'tile lava spleft'
}
if(levels[level_num].map[i] == 4) {
d.className = 'tile lava sptop'
}
if(levels[level_num].map[i] == 5) {
d.className = 'tile lava spright'
}
if(levels[level_num].map[i] == 6) {
d.className = 'tile portal1'
}
if(levels[level_num].map[i] == 7) {
d.className = 'tile portal2'
}
if(levels[level_num].map[i] == 8) {
d.className = 'tile innerwall'
}
if(levels[level_num].map[i] == 9) {
d.className = 'tile nextlevel'
}
d.setAttribute('grid_loc', [i % cols,Math.floor(i/cols)])
d.style.width = tile_size + 'px'
d.style.height = tile_size + 'px'
d.style.position = 'absolute'
// d.innerHTML = i
// d.style.outline = '1px dotted gray'
d.style.left = (i % cols)*tile_size + 'px'
d.style.top = Math.floor(i/cols)*tile_size + 'px'
gc.appendChild(d)
}
// add player stuff
const ga = document.querySelector('#game_alert')
var pl = document.querySelector('#'+player)
pl.style.width = tile_size + 'px'
pl.style.height = tile_size + 'px'
pl.style.top = (tile_size*levels[level_num].start.split(',')[1]) + 'px'
pl.style.left = (tile_size*levels[level_num].start.split(',')[0]) + 'px'
// add info box
ga.innerHTML = 'Arrow keys to move and jump<br>double jump / wall sliding'
ga.style.opacity = '1'
var pl_loc = pl.getBoundingClientRect()
var x = pl_loc.left
function updatePlayer() {
// get points based on player location
var pl_loc = pl.getBoundingClientRect()
var pl_center = document.elementFromPoint(pl_loc.x + (tile_size*.5), pl_loc.y + (tile_size*.75))
var pl_xy1 = document.elementFromPoint(pl_loc.x + (pl_loc.width*.25), pl_loc.y + pl_loc.height + gravity)
var pl_xy2 = document.elementFromPoint(pl_loc.x + (pl_loc.width*.75), pl_loc.y + pl_loc.height + gravity)
var pl_xy3 = document.elementFromPoint(pl_loc.x - (x_speed*.5), pl_loc.y + (pl_loc.height*.5))
var pl_xy4 = document.elementFromPoint(pl_loc.x + pl_loc.width + (x_speed*.5), pl_loc.y + (pl_loc.height*.5))
var pl_xy5 = document.elementFromPoint(pl_loc.x + (pl_loc.width*.5), pl_loc.y - (gravity*.5))
var pl_xy6 = document.elementFromPoint(pl_loc.x + (pl_size*.5), pl_loc.y + pl_size)
// console.log(pl_center)
function endGame() {
alert('you died')
}
//if dead stop, else update player and everything else
if(!pl_xy1 || !pl_xy2 || dead) {
// endGame()
} else {
// set player top
// if player on ground set new top
if(pl_xy1.classList.contains('ground') ||
pl_xy2.classList.contains('ground')) {
gravity = 0
} else {
if(gravity < 8) {
gravity += .51
} else {
gravity = 8
}
}
pl.style.top = pl_loc.top - 6.25 - gc_loc.top + gravity + 'px'
// console.log(gravity)
var gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads : []);
if (!gamepads) {
return;
}
var gp = gamepads[0];
// add jump-force (change the gravity)
if((d[38]
|| (gp && (gp.buttons[0].pressed
|| gp.buttons[1].pressed
|| gp.buttons[2].pressed
|| gp.buttons[3].pressed)))
&& gravity == 0) {
dbljump = false
gravity = -9
}
if((d[38]
|| (gp && (gp.buttons[0].pressed
|| gp.buttons[1].pressed
|| gp.buttons[2].pressed
|| gp.buttons[3].pressed)))
&& gravity > 0) {
if(!dbljump) {
gravity = -9
}
dbljump = true
}
if(gp){
var gpa = Math.round(gp.axes[0])
if(gpa == 0 || gravity == 0 ) {
pl.className = ''
pl.style.transform = 'rotate(0deg)'
}
}
// track left/right movement
if((d[37] || (gp && gpa == -1) ) && x > gc_loc.x) {
if(!pl_xy3.classList.contains('ground')) {
x -= x_speed
pl.className = ''
pl.classList.add('goleft')
} else {
if(gravity > 0) {
dbljump = false
gravity = 1
pl.style.transform = 'rotate(90deg)'
}
pl.className = ''
}
}
// console.log(x_speed)
if((d[39] || (gp && gpa == 1) ) && x + pl_loc.width < gc_loc.x + gc_loc.width) {
if(!pl_xy4.classList.contains('ground')) {
x += x_speed
pl.className = ''
pl.classList.add('goright')
} else {
if(gravity > 0) {
dbljump = false
gravity = 1
pl.style.transform = 'rotate(-90deg)'
}
pl.className = ''
}
}
pl.style.left = x - gc_loc.left + 'px'
// pl.style.left = x + x_speed - gc_loc.left + 'px'
// set different interactions based on tile type
if(pl_xy5.classList.contains('ground')) {
gravity = 8
}
if(pl_center.classList.contains('lava')) {
// console.log('lava')
pl.style.top = (tile_size*levels[level_num].start.split(',')[1]) + 'px'
pl.style.left = (tile_size*levels[level_num].start.split(',')[0]) + 'px'
pl_loc = pl.getBoundingClientRect()
x = pl_loc.left
deaths++
dc.innerHTML = 'DEATHS<br>'+ deaths
}
if(pl_center.classList.contains('portal1')) {
let p2 = document.querySelector('.portal2')
let p2_loc = p2.getBoundingClientRect()
pl.style.top = p2_loc.top - gc_loc.top + 'px'
pl.style.left = p2_loc.left - gc_loc.left + 'px'
pl_loc = pl.getBoundingClientRect()
x = pl_loc.left
}
if(pl_center.classList.contains('nextlevel')) {
buildGame()
}
timer++
function secondsToTime(e){
var h = Math.floor(e / 3600).toString().padStart(2,'0'),
m = Math.floor(e % 3600 / 60).toString().padStart(2,'0'),
s = Math.floor(e % 60).toString().padStart(2,'0');
return h + ':' + m + ':' + s;
//return `${h}:${m}:${s}`;
}
tc.innerHTML = 'TIME<br>' + secondsToTime(timer)
playerTrail()
setTimeout(updatePlayer, 1000/45) // update player 30-60 times a second
}
}
updatePlayer()
// add trail behind player b/c it's fun
function playerTrail() {
if(player == 'player') {
let x = pl.getBoundingClientRect().x
let y = pl.getBoundingClientRect().y
let b = document.createElement('div')
b.className = 'trailBall'
b.style.left = x + 11 - gc_loc.left + 'px'
b.style.top = y + 5 - gc_loc.top + 'px'
b.onanimationend = function(){
b.remove()
}
gc.appendChild(b)
}
if(player == 'player2') {
let x = pl.getBoundingClientRect().x
let y = pl.getBoundingClientRect().y
let b = document.createElement('div')
b.className = 'trailBall'
let xx = Math.floor(Math.random()*15) + 5
b.style.left = x + xx - gc_loc.left + 'px'
b.style.top = y - 3 - gc_loc.top + 'px'
b.onanimationend = function(){
b.remove()
}
gc.appendChild(b)
}
}
// key tracking
if(level_num > 0){
window.addEventListener('keydown', function(e) {
d[e.which] = true;
})
window.addEventListener('keyup', function(e) {
d[e.which] = false;
pl.className = ''
pl.style.transform = 'rotate(0deg)'
})
window.addEventListener("gamepadconnected", function(e) {
var gp = navigator.getGamepads()[e.gamepad.index];
// console.log("A " + gp.id + " was successfully detected! There are a total of " + gp.buttons.length + " buttons.")
});
} else {
timer = 0
deaths = 0
}
}
window.addEventListener('load', buildGame)
window.focus()
:root {
--root-clr: dimgray;
--tile-line-height: 30px;
--tile-size: 10px;
--clr: gray;
--pl-clr:
radial-gradient(circle at 75% 50%, white 1px, transparent 2px),
radial-gradient(circle at 25% 50%, white 1px, transparent 2px),
radial-gradient(circle at 75% 40%, black 3px, transparent 4px),
radial-gradient(circle at 25% 40%, black 3px, transparent 4px),
white;
}
html,
body {
min-width: 100vw;
min-height: 100vh;
overflow: hidden;
margin: 0;
display: grid;
place-items: center;
background: #111;
}
#game_console {
width: 100%;
max-width: 1000px;
aspect-ratio: 16 / 9;
position: relative;
background:
linear-gradient(to bottom, rgba(0,0,0,.65), rgba(0,0,0,1)),
var(--root-clr);
text-align: center;
line-height: var(--tile-line-height);
font-size: 0;
color: transparent;
user-select: none;
box-shadow:
0 20px 20px black;
/* overflow: hidden; */
}
#deaths_counter,
#time_counter {
padding: 0rem 1rem;
font-size: 16px;
font-family: system-ui, serif;
line-height: 100%;
color: white;
/* background: rgba(0,0,0,.75); */
position: absolute;
}
#deaths_counter {
top: 0;
left: 0;
transform: translate(0%,-125%);
/* text-align: left; */
}
#time_counter {
top: 0;
right: 0;
transform: translate(0%,-125%);
/* text-align: right; */
}
#game_alert {
padding: 1rem 2rem;
font-size: 16px;
font-family: system-ui, serif;
line-height: 100%;
color: white;
background: rgba(0,0,0,.75);
border: 1px dashed white;
position: absolute;
bottom: 0;
left: 50%;
transform: translate(-50%,125%);
z-index: 99999;
border-radius: 50px;
transition: .5s;
opacity: 0;
pointer-events: none;
user-select: none;
}
h2 {
margin: 0;
margin-bottom: 10px;
}
.tile {
/* outline: 1px dashed rgba(0,0,0,.5); */
}
.ground {
background: var(--root-clr);
box-sizing: border-box;
border-top: 5px solid rgba(0,0,0,.25);
border-right: 5px solid rgba(0,0,0,.65);
border-bottom: 5px solid rgba(0,0,0,.65);
border-left: 5px solid rgba(0,0,0,.25);
outline: 0;
z-index: 2;
/* filter: brightness(.75); */
}
.innerwall {
background: var(--root-clr);
outline: 0;
}
/* lava spikes */
.lava {
background:
conic-gradient(at 50% 0%, transparent 0deg 153deg, rgba(0,0,0,.5) 155deg 190deg, rgba(255,255,255,.5) 192deg 205deg, transparent 207deg 360deg),
conic-gradient(at 50% 0%, transparent 0deg 153deg, var(--root-clr) 155deg 195deg, var(--root-clr) 197deg 205deg, transparent 207deg 360deg);
}
.spleft {
transform: rotate(-90deg);
}
.sptop {
transform: rotate(180deg);
}
.spright {
transform: rotate(90deg);
}
.portal1:after,
.portal2:after {
content:'';
width: 150%;
height: 150%;
position: absolute;
top: -25%;
left: 0;
background:
radial-gradient(circle at 50% 50%,
rgba(0,0,0,1) 3px,
rgba(0,0,0,.75) 6px,
rgba(0,0,0,.75) 10px,
rgba(0,0,0,.5) 11px,
rgba(0,0,0,.5) 15px,
rgba(0,0,0,.25) 16px,
rgba(0,0,0,.25) 20px),
var(--root-clr);
animation: portal 2s linear infinite;
/* box-shadow:
inset 3px 0 0 3px rgb(0 0 0 / 25%),
3px 0px 0 2px rgb(255 255 255 / 50%); */
pointer-events: none;
border-radius: 50%;
}
@keyframes portal {
50% {
transform: scale(1.1);
}
}
.nextlevel {
/* background:
linear-gradient(to bottom right, transparent 10%, var(--root-clr) 10% 30%, transparent 30% 60%, var(--root-clr) 60% 80%, transparent 80%);
background-size: 25px 25px; */
}
#player,
#player:after {
content:'';
width: 25px;
height: 25px;
background: transparent;
position: absolute;
z-index: 10000;
pointer-events: none;
}
#player:before {
content:'';
width: 25px;
height: 25px;
position: absolute;
left: 0;
top: 0;
background:
radial-gradient(circle at 85% 15%, LightSeaGreen 3px, transparent 4px),
radial-gradient(circle at 15% 15%, LightSeaGreen 3px, transparent 4px),
radial-gradient(circle at 65% 90%, LightSeaGreen 2px, transparent 3px),
radial-gradient(circle at 35% 90%, LightSeaGreen 2px, transparent 3px);
}
#player:after {
width: 20px;
height: 25px;
background:
linear-gradient(to top, LightSeaGreen 0%, transparent 0%),
radial-gradient(circle at 60% 40%, PaleTurquoise 2px, transparent 3px),
radial-gradient(circle at 50% 50%, black 5px, transparent 6px),
DarkTurquoise;
position: absolute;
top: -2.5px;
left: 2.5px;
z-index: 10000;
border-radius: 50% 60% 50% 50% / 70% 70% 40% 40%;
pointer-events: none;
box-shadow:
inset 2px 2px 3px 3px rgba(255,255,255,.5),
inset -2px -2px 3px 3px rgba(0,0,0,.33);
animation: blink 4s linear infinite;
}
@keyframes blink {
5% {
background:
linear-gradient(to bottom, LightSeaGreen 35%, transparent 35%),
radial-gradient(circle at 60% 40%, PaleTurquoise 2px, transparent 3px),
radial-gradient(circle at 50% 50%, black 5px, transparent 6px),
DarkTurquoise;
}
10% {
background:
linear-gradient(to bottom, LightSeaGreen 60%, transparent 60%),
radial-gradient(circle at 60% 40%, PaleTurquoise 2px, transparent 3px),
radial-gradient(circle at 50% 50%, black 5px, transparent 6px),
DarkTurquoise;
}
15% {
background:
linear-gradient(to bottom, LightSeaGreen 0%, transparent 0%),
radial-gradient(circle at 60% 40%, PaleTurquoise 2px, transparent 3px),
radial-gradient(circle at 50% 50%, black 5px, transparent 6px),
DarkTurquoise;
}
}
/* player 2 player 2 player 2 */
#player2,
#player2:after {
content:'';
width: 25px;
height: 25px;
background: transparent;
position: relative;
z-index: 10000;
pointer-events: none;
}
#player2:before {
content:'';
width: 25px;
height: 25px;
position: absolute;
left: 0;
top: 0;
background:
radial-gradient(circle at 65% 90%, white 2px, transparent 3px),
radial-gradient(circle at 35% 90%, white 2px, transparent 3px);
z-index: 10001;
}
#player2:after {
width: 20px;
height: 25px;
background:
radial-gradient(circle at 60% 30%, white 2px, transparent 3px),
radial-gradient(circle at 50% 40%, black 5px, transparent 6px),
linear-gradient(to top, white, gold, orangered 50%),
orangered;
position: absolute;
top: -4px;
left: 2.5px;
z-index: 10000;
border-radius: 15px 15px 4px 4px;
pointer-events: none;
animation: blink2 4s linear infinite;
}
@keyframes blink2 {
5% {
background:
linear-gradient(to top, transparent 75%, orangered 75%),
radial-gradient(circle at 60% 30%, white 2px, transparent 3px),
radial-gradient(circle at 50% 40%, black 5px, transparent 6px),
linear-gradient(to top, white, gold, orangered 50%),
orangered;
}
10% {
background:
linear-gradient(to top, transparent 50%, orangered 50%),
radial-gradient(circle at 60% 30%, white 2px, transparent 3px),
radial-gradient(circle at 50% 40%, black 5px, transparent 6px),
linear-gradient(to top, white, gold, orangered 50%),
orangered;
}
15% {
background:
linear-gradient(to top, transparent 100%, orangered 100%),
radial-gradient(circle at 60% 30%, white 2px, transparent 3px),
radial-gradient(circle at 50% 40%, black 5px, transparent 6px),
linear-gradient(to top, white, gold, orangered 50%),
orangered;
}
}
.goleft:after {
transform: skewX(10deg);
}
.goright:after {
transform: skewX(-10deg);
}
.goleft:before,
.goright:before {
}
.trailBall {
position: absolute;
width: 3px;
height: 3px;
background: darkorange;
border-radius: 50%;
opacity: .75;
pointer-events: none;
opacity: 1;
animation: trail .75s linear forwards;
}
@keyframes trail {
100% { transform: translateY(-25px); opacity: 0; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment