Jak napisał Commandeer Guru w komentarzu, kolejnym problemem jest to, że kiedy wykonuje się linia
var can = document.getElementById('gra');
element 'gra' jeszcze nie został zainicjowany, ponieważ przeglądarka czyta każdą stronę, którą napiszesz od góry do dołu i kiedy widzi kod JavaScriptu, od razu zaczyna go wykonywać, a w tym wypadku będzie go wykonywać przed zadeklarowaniem jeszcze obiektu 'gra' w HTML, czyli tego canvasa
<canvas id="gra" width = "1280px" height = "580px"> </canvas>
Aby naprawić ten problem, można obudować cały kod JavaScriptu w funkcję i wywołać tą funkcję dopiero wtedy, kiedy nasz element <body> się załaduje do końca
function kiedyElementBodySieZaladuje(){
//twoj kod JavaScript
}
...
<body onLoad="kiedyElementBodySieZaladuje()">
...
Tutaj używamy tzw. zdarzeń po angielsku "Eventów", którym to jest ewent onLoad - kiedy element się załaduje. Ale co to ma znaczyć? Przecież element body załaduje się przed elementem 'gra'... no właśnie nie, bo element body to specjalny element, który opakowuje wszystkie inne elementy, które zostaną znalezione w pliku. Chociaż ten kod, który napisałeś działa, to takie użycie tagu <body> jest nieintuicyjne, dlatego dobrą praktyką jest zawieranie w tagu <body> wszystkich elementów graficznych strony, tak jak przeglądarka zreinterpretowałaby ten kod.
<body onLoad="kiedyElementBodySieZaladuje()">
<h1> gra </h1>
<canvas id="gra" width = "1280px" height = "580px"> </canvas>
</body>
Gdybyś odpalił swój stary kod i włączył inspektor obiektów to właśnie taki kod byś zobaczył, a nie ten, który ty napisałeś, ponieważ przeglądarka musiała "zmodyfikować" twój kod w taki sposób, aby zgadzał się on z jej oczekiwaniami - wszystkie elementy strony w tagu <body>. No i tutaj algorytm, który interpretuje twój kod może się pomylić, a wtedy będzie bardzo trudno znaleźć błąd, który przecież może nie być błędem w kodzie, a błędem w algorytmie przeglądarki.
Całość po tych poprawkach wyglądałaby tak:
<!DOCTYPE html>
<html>
<head>
<meta charset= "utf-8">
<title> gra </title>
<style>
canvas
{
background: lightblue;
display: block;
margin: 0 auto;
}
h1
{
text-align: center;
}
</style>
<script>
function kiedyElementBodySieZaladuje()
{
var can = document.getElementById('gra');
var ctx = can.getContext('2d');
var GrafikaPlatformy = new Image();
GrafikaPlatformy.src = 'platforma.jpg'
var plat = [];
plat[0] = new Platforma(0,500, 750, 80);
function Platforma (px, py, pszer, pwys)
{
this.x=px;
this.y=py;
this.szer=pszer;
this.wys=pwys;
}
function rysujplatformy()
{
for (var i = 0;i<plat.length;i++)
{
ctx.drawImage(GrafikaPlatformy, plat[i].x, plat[i].y, plat[i].szer, plat[i].wys);
}
}
function rysuj()
{
ctx.clearRect(0,0, can.width, can.height);
rysujplatformy();
}
setInterval(rysuj,10);
}
</script>
</head>
<body onLoad="kiedyElementBodySieZaladuje()">
<h1> gra </h1>
<canvas id="gra" width = "1280px" height = "580px"> </canvas>
</body>
</html>