Hello :) I make a small Game for a school project. It`s a basic Javascript 2D Canvas game with a Tile Map from an Array.
My problem is, i cant get the collision working. In my Example i want to "walk" with my "Hero" on the tiles with the 1. 0 are the Tiles where the "Hero" don`t walk.
I have a simple Collision detection for the Canvas border, so my Hero can`t walk outside of the Canvas. But i dont know how to make it working for the rest .
HTML
<script type="text/javascript">
var Spielfeld, Spieler, Zuletzt, Collision;
function initialisieren( Anzeige ) {
Spielfeld = Anzeige ;
Spieler = new Spieler( Spielfeld ) ;
Spieler.Name = 'Ich' ;
Zuletzt = 0 ;
document.getElementsByTagName('body')[0].onkeydown = steuern ;
document.getElementsByTagName('body')[0].onkeyup = steuern ;
window.requestAnimationFrame( aktualisieren ) ;
}
function steuern( Ereignis ) {
switch( Ereignis.keyCode ) {
case 87: Spieler.setOben( Ereignis.type == 'keydown'); break;
case 83: Spieler.setUnten( Ereignis.type == 'keydown'); break;
case 65: Spieler.setLinks( Ereignis.type == 'keydown'); break;
case 68: Spieler.setRechts( Ereignis.type == 'keydown'); break;
case 38: Spieler.setOben( Ereignis.type == 'keydown'); break;
case 40: Spieler.setUnten( Ereignis.type == 'keydown'); break;
case 37: Spieler.setLinks( Ereignis.type == 'keydown'); break;
case 39: Spieler.setRechts( Ereignis.type == 'keydown'); break;
}
}
function aktualisieren() {
var Jetzt = new Date();
var Dauer = Jetzt.getTime() - Zuletzt ;
Zuletzt = Jetzt.getTime() ;
loeschen( Spielfeld ) ;
Spieler.aktualisieren( Dauer ) ;
window.requestAnimationFrame( aktualisieren ) ;
}
function loeschen( Anzeige ) {
Stift = Anzeige.getContext('2d') ;
Stift.clearRect( 0,0 , Anzeige.width, Anzeige.height ) ;}</script>
</head>
<body onload="initialisieren( document.getElementById('Spielfeld') ) ;">
<canvas id="Laufweg" width="1280" height="768" style="position: absolute; z-index: 3">Funktioniert nicht!</canvas>
<canvas id="Hintergrund" width="1280" height="768" style="position: absolute; z-index: 1">Funktioniert nicht!</canvas>
<canvas id="Spielfeld" width="1280" height="768" style="position: absolute; z-index: 2">Funktioniert nicht!</canvas>
<script type="text/javascript" src="./javascript/Charakter.js"></script>
</body>
Charakter.js
function Spieler( Spielfeld ) {
var Held = document.createElement('img');
Held.src = '../Arbeitsdateien/items/item_berliner.png';
var Anzeige = Spielfeld ;
var Breite = 32 ;
var Hoehe = 32 ;
var PosX = 32 ;
var PosY = 192 +32 ;
var Schritt = 400 ;
var hero = Held;
var Oben, Unten, Links, Rechts ;
Oben = Unten = Links = Rechts = false ;
this.setOben = function( Schalter ) { Oben = Schalter == true ; }
this.setUnten = function( Schalter ) { Unten = Schalter == true ; }
this.setLinks = function( Schalter ) { Links = Schalter == true ; }
this.setRechts = function( Schalter ) { Rechts = Schalter == true ; }
this.aktualisieren = function( Dauer ) {
bewegen( Dauer ) ;
anzeigen() ;
}
//--------------------------------------------------------------------------------------------------------------------------
//Kollision für die Laufwege -----------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
var fliese = {
fliesenGroesse: 32
};
var mapKollision = [ //004
[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],
[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],
[0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,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,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,1,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,1,1,0,1,1,1,1,0,0,0,1,1,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,1,1,1,1,1,1,1,0,0],
[1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0],
[0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,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,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,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,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,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
[0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0],
[0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,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,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]
];
var viewport = document.getElementById('Laufweg');
var ctx = viewport.getContext('2d');
function renderMap() {
var i, j;
ctx.clearRect( 0, 0, 1280, 768 );
ctx.fillStyle = "rgba(255,0,0,0.5)";
for( i = 0; i < mapKollision.length; i++ ) {
for( j = 0; j < mapKollision[ i ].length; j++ ) {
if( mapKollision[ i ][ j ] !== 0 ) {
ctx.fillRect(
j * fliese.fliesenGroesse, i * fliese.fliesenGroesse,
fliese.fliesenGroesse, fliese.fliesenGroesse
);
}
}
}
}
renderMap();
function bewegen( Dauer ) {
var Etappe = Dauer / 1000 ;
if( Links ) PosX -= Schritt * Etappe ;
if( Rechts ) PosX += Schritt * Etappe ;
if( Oben ) PosY -= Schritt * Etappe ;
if( Unten ) PosY += Schritt * Etappe ;
if( PosX < 0 ) PosX = 0 ;
if( PosX > Anzeige.width -32 ) PosX = 1248 ;
if( PosY < 0 ) PosY = 0 ;
if( PosY > Anzeige.height -32 ) PosY = 736 ;
}
function anzeigen() {
Stift = Anzeige.getContext('2d') ;
Stift.drawImage( Held, PosX,PosY) ;
}
}
With this code part i got my border collision work:
if( PosX < 0 ) PosX = 0 ;
if( PosX > Anzeige.width -32 ) PosX = 1248 ;
if( PosY < 0 ) PosY = 0 ;
if( PosY > Anzeige.height -32 ) PosY = 736 ;
Maybe you can help me with my Problem to get the collision work for my 0 tiles. Here an img how it look (Red is the path to walk on (1) white are the non walkable tiles(0)) (https://i.sstatic.net/z9XBP.jpg)
I hope you can understand what my Problem is. I´m realy new to Javascript but until this, it is working ok for me :)