17. januar 2013 - 21:11Der er
2 kommentarer og 1 løsning
Collision detection.
Goddag eksperter. Jeg roder lidt med et javascript 2d spil, som er bygget op om en masse "tiles", som en person kan gå rundt på. Tiles er 20x20 pixels.
Jeg har en række tiles i form af et 2 dimensionelt array, kaldet tiles[x][y]. Den enkelte tile, har en funktion der hedder "isWalkable()", for at tjekke om man kan "gå" på denne tile.
Min player har en move funktion, hvor inputtet er en vector (afgjort af input fra piletaster, 1,-1 eller 0). Mit problem er nu, at jeg gerne blokere spilleren i at gå på tiles der ikke er isWalkable().
Min funktion i spiller-klassen ser sådan ud:
var position = [10,10]; //Eksempel på spillerens nuværende position.
function move(vector){ //Funktion til at flytte spilleren position[0] += Math.round(vector[0]*speed*0.01); position[1] += Math.round(vector[1]*speed*0.01); }
Hvordan laver jeg min move funktion, således at spilleren ikke kan gå på de "forbudte" tiles? PS: spillerens position er i pixels, hvor tiles er et 2d array.
Hvis man bare tjekker, om spilleren er på et forbudt tile og blokerer input, resulterer det naturligvis i en deadlock hvor spilleren aldrig kan flytte sig igen. Jeg har også forsøgte at "raycaste" og tjekke om nabo-tiles er isWalkable(), men af mystiske årsager kan man "snyde" sig forbi dem. Der må være en pæn måde at blokere spillerens retning, således at man ikke kan træde ind på de forbudte tiles.
var leftTop = [position[0] + Math.round(vector[0]*speed*0.01),position[1] + Math.round(vector[1]*speed*0.01)]; var leftButtom = [position[0]+Math.round(vector[0]*speed*0.01),position[1]+tileSize+Math.round(vector[0]*speed*0.01)]; var rightTop = [position[0]+tileSize+Math.round(vector[0]*speed*0.01),position[1]+Math.round(vector[0]*speed*0.01)]; var rightButtom = [position[0]+tileSize+Math.round(vector[0]*speed*0.01),position[1]+tileSize+Math.round(vector[0]*speed*0.01)];
function checkValid(coordinate){ var leftTop = coordinateToTile(coordinate); var rightTop = coordinateToTile([coordinate[0]+tileSize-2,coordinate[1]]); var leftButtom = coordinateToTile([coordinate[0],coordinate[1]+tileSize-2]); var rightButtom = coordinateToTile([coordinate[0]+tileSize-2,coordinate[1]+tileSize-2]);
Og en move funktion, som testede akserne: this.move = function(vector){ var target = [position[0] + Math.round(vector[0]*speed*0.01),position[1] + Math.round(vector[1]*speed*0.01)];
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.