Volledige versie bekijken : [Tilebased]Tiles om je heen bekijken
Jordy
%Europe/Berlin %717 %2005, 17:13
Ik had t al in het pacman topic geschreven maar heb t verwijdert omdat t beter is om hiervoor n eigen topic te openen (op verzoek van roenes :D).
charMcXtile = Math.round(characterMC._x / tileWidth)-1; //er gaat -1 af omdat er geteld wordt vanaf 0 en niet vanaf 1
charMcYtile = Math.round(characterMC._y / tileHeight)-1;
trace("horizontale tile is "+charMcXtile)
trace("verticale tile is "+charMcYtile)
zo check ik welke tile hij staat (of t een walkable of een niet walkable is). Is het handig om voordat je op n knop drukt te kijken welke tiles om hem heen walkable zijn?
kortom, als ik op een knop druk, hoe laten jullie checken of die tile walkable is :). (of zijn dat geheimen van de smit* )
* nederlandse uitspraak :p
Dauntless
%Europe/Berlin %722 %2005, 17:19
Je hebt toch een 2d array met al je tiles in?
map[charMcYtile + 1][charMcXtile].walkable // voor de tile onder je
map[charMcYtile - 1][charMcXtile].walkable // voor de tile boven je
map[charMcYtile][charMcXtile + 1].walkable // voor de tile rechts map[charMcYtile][charMcXtile - 1].walkable // voor de tile links
...
Jordy
%Europe/Berlin %726 %2005, 17:26
hahaha dit is echt om te schamen :D Je wilt niet weten wat voor berekeningen ik allemaal zat te doen :D.
Roenes
%Europe/Berlin %727 %2005, 17:27
Je hoeft niet van te voren te kijken of een tile walkable is. De meest gebruikte manier is de volgende. Stel je werkt met een key listener. in de if zet je bv dit: (ff vluchtig, het gaat om het idee)
if(Key.isDown(KEY.DOWN))
{
var newX = pacman._x;
var newY = pacman._y + speed;
if(map[Math.floor(newY/tileHeight)][Math.floor(newX/tileWidth)] == walkableWaarde)
{
pacman._x = newX;
pacman._y = newY;
}
}
Je slaat dus eerst de mogelijke nieuwe plaats op. Daarna ga je die plaats terug bregen naar een tile in je map array. Dat doe je door de nieuwe xwaarde te delen door de breedte van een tile en de uitkomst af te ronden naar beneden (floor). Een array begint immers op 0. Hetzelfde doe je voor y. Afhankelijk welke waardes je krijgt, krijg je de bijbehorende tile uit de array. Meestal wordt die voorgesteld door een waarde. In een if check je of de tile die je terug krijgt de waarde van walkable heeft. zo jah, dan zet je de nieuwe x en y waardes voor pacman en zo niet, dan doe je niets.
Als je met classes werkt, krijg je bij map[y][x] een tile object terug naar alle waarschijnlijkheid. Van die tile class gebruik je dan de methode getWalkable of zoiets om te kijken of die true of false is. Dit is een beetje afhankelijk van hoe de classe Tile in elkaar zit. Maar je snapt het idee lijkt me wel :)
//Edit
DL, walkable maak je toch wel private he? ;) Dus nix geen .walkable maar gewoon de get methode gebruiken. Een beetje OOP AS'er doet aan datahiding ;):D
Dauntless
%Europe/Berlin %730 %2005, 17:32
Ik denk zelfs niet dat Jordy een Tile classe gebruik :p. Was gewoon als voorbeeld :).
En die floor moet soms 'ceil' zijn (hangt ervanaf hoe je tile uitgelijnt is).
Roenes
%Europe/Berlin %732 %2005, 17:34
En die floor moet soms 'ceil' zijn (hangt ervanaf hoe je tile uitgelijnt is).En hangt ook af of je 2D array begint op 0 of 1 :) Maar goede toevoeging :)
Jordy
%Europe/Berlin %761 %2005, 18:15
ahja ik ga t zo even goed bekijken :) maar iig de basis van mn pacmannetje is gelegd :)
Jordy
%Europe/Berlin %811 %2005, 19:29
Volgens mij snap ik het Delegate verhaaltje, en ik heb t ook goed toegepast (althans :P t werkt ;) ). maar nu heb ik nog steeds n probleempje met een onEnterFrame:
Code:
listener.onKeyDown = Delegate.create(this,moveCharacter);
Key.addListener(listener);
}
private function moveCharacter() {
if(Key.isDown(37) && mapArray[charMcXtile-1][charMcYtile] == 1) {
trace(speed)
characterMC.onEnterFrame = function() {
this._x -= speed;
trace(speed);
}
de 1e traced ie goed, maar de 2e is undefined. Hoe krijg ik dit wel werken zonder weer allemaal attributen mee te geven in de methods
Dauntless
%Europe/Berlin %819 %2005, 19:39
characterMC.speed = this.speed; zetten, buiten de onEnterFrame. In de onEnterFrame 'this.speed' gebruiken.
Roenes
%Europe/Berlin %871 %2005, 20:55
Is een oplossing, maar delegaten vind ik netter in dit geval :)
Jordy
%Europe/Berlin %877 %2005, 21:04
oke het bewegen werkt nu allemaal :) maar heb alleen nog een probleem met het uitlijnen van de tiles en de character, wat ze colliden elkaar niet echt mooi :P
Jordy
%Europe/Berlin %811 %2005, 19:28
ik kom er echt niet uit met het colliden tijdens een onEnterFrame();
charMcXtile = Math.floor(characterMC._x / tileWidth);
charMcYtile = Math.floor(characterMC._y / tileHeight);
characterMC.speed = this.speed
characterMC.charMcXtile = this.charMcXtile
characterMC.charMcYtile = this.charMcYtile
characterMC.mapArray = this.mapArray
characterMC.tileWidth = this.tileWidth
characterMC.tileHeight = this.tileHeight
characterMC.onEnterFrame = function() {
if(Key.isDown(37)) { // naar links
if(this.mapArray[this.charMcYtile][this.charMcXtile-1] == 0) {
this.onEnterFrame = function() {
this._x -= this.speed
}
} else {
delete this.onEnterFrame
trace("de huidige tile ="+this.mapArray[this.charMcYtile][this.charMcXtile]);
trace("de volgende rechter tile ="+this.mapArray[this.charMcYtile][this.charMcXtile+1]);
trace("de volgende linker tile ="+this.mapArray[this.charMcYtile][this.charMcXtile-1]);
}
}
het werkt echt voor geen meter zo :P
stukje hierboven delegate ik een keylistener.
zie SWF
Dauntless
%Europe/Berlin %819 %2005, 19:39
Ik denk dat het vlotter gaat als je even al je bestanden online gooit :).
Jordy
%Europe/Berlin %832 %2005, 19:59
as you wish ;)
Ik zal erbij zeggen dat dit eigenlijk mijn eerste AS2.0 projectje is, dus er kunnen nog fouten inzitten :).
Jordy
%Europe/Berlin %862 %2005, 20:42
na wat tips van Dauntless via msn heb k besloten om het geheel overnieuw te maken omdat het niet echt gestructereerd is :). Weer wat geleerd :P
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.