Привет :) Я делаю небольшую Игру для школьного проекта.Это базовая Javascript 2D Canvas игра с картой тайлов из массива.
Моя проблема в том, что я не могу заставить столкновение работать.В моем примере я хочу «ходить» с моим «Героем» по плиткам с 1. 0 - это плитки, по которым «Герой» не ходит.
У меня есть простое обнаружение столкновений для границы холста, поэтому мой герой не может выйти за пределы холста.Но я не знаю, как заставить это работать для остальных.
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) ;
}
}
С этой частью кода я получил мое столкновение границыработа:
if( PosX < 0 ) PosX = 0 ;
if( PosX > Anzeige.width -32 ) PosX = 1248 ;
if( PosY < 0 ) PosY = 0 ;
if( PosY > Anzeige.height -32 ) PosY = 736 ;
Может быть, вы можете помочь мне с моей проблемой, чтобы получить работу столкновения для моих 0 плиток.Вот как это выглядит (красный - путь, по которому можно ходить (1) белый - это плитки, которые нельзя пройти (0)) (https://imgur.com/a/YLu6HU2)
Надеюсь, вы понимаете, в чем заключается моя проблема. Ядействительно плохо знаком с Javascript, но до этого он работал нормально для меня:)