Raum bei 2D-spielen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

@Rockmaster: Das meinten die von Anfang an, nur du hast es nicht verstanden ;-) .
the Nameless hat geschrieben:(http://www.christian-gleinser.de/prog/isodemo.zip von PBZecke)
ZeHa, nicht PBZecke.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

aber der link ist 1. ohne code, und 2. eine isometrische umsetzung die nur das grundverständnis erschwert... dennoch, is der link ganz interessant. :)

<edit:>
wie nennt man eigentlich die perspektive der direkten draufsicht von oben, is doch nich' vogelperspektive, oder?
my pb stuff..
Bild..jedenfalls war das mal so.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

#NULL hat geschrieben:<edit:>
wie nennt man eigentlich die perspektive der direkten draufsicht von oben, is doch nich' vogelperspektive, oder?
Doch.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

*UPS* Tschulligung, ZeHa... ich glaube PBZecke hatte so ein ähnliches Bild :oops: Naja, jedenfalls habe ich in manchen Sachen ein ziemlich schlechtes Gedächtnis..
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

the Nameless hat geschrieben:(http://www.christian-gleinser.de/prog/isodemo.zip von PBZecke)
Wie programmiert man sowas??
v6.00
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

das ist ein beispiel wie du eine isometrische map dartellen kannst. die map ist in dem fall ein array, dessen element-werte die entsprechende SpriteID enthalten. die tiles sind hier 32x16 pixel groß:

Code: Alles auswählen

+ = transparente farbe
# = sichtbare farbe
++++++++++++######++++++++++++
+++++++++############+++++++++
++++++##################++++++
+++########################+++
##############################
+++########################+++
++++++##################++++++
+++++++++############+++++++++
++++++++++++######++++++++++++
++++++++++++++++++++++++++++++

Code: Alles auswählen

Procedure drawMap()
  For k=0 To mapHeight-1
    For i=0 To mapWidth-1
      xPos=xOff+i*16-k*16
      yPos=yOff+i*8+k*8
      DisplayTransparentSprite(map1(i,k), xPos, yPos )
      If mouseX > xPos And mouseX < 32+xPos And mouseY > yPos And mouseY < 16+yPos
        If SpritePixelCollision( courserPixel,mouseX,mouseY,  shape1Sprite,xPos,yPos )
          DisplayTransparentSprite(frameSprite,xPos,yPos )
        EndIf
      EndIf
    Next
  Next
EndProcedure
hier ist auch eine prüfung enthalten, über welchem tile sich die maus befindet (z.b. um das entsprechende tile hervorzuheben).
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich würde solche map-collisionen aber keinesfalls mit den collisions-routinen machen.
eine mathematische lösung ist immer performanter.
bei ner sprite-pixel kollision schläft man doch ein.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

in dem fall kann ich mir nicht vorstellen, dass es so schlimm wäre:
das erste sprite ist 1x1 pixel groß, das zweit 32x16, und die koll.-prüfung findet in der proc nur 4 mal für die ganze map statt.

..aber du kannst ja gerne mal zeigen wie du mit geometrie/mathe das tile unter der maus ermitteln würdest. :)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Am leichtesten geht das mit einer Tabelle. Die tabelle hat die selbe größe wie die Maptiles. Man stellt erst grob fest über welchen Sprites die maus sein könnte über division mit der tilegröße und in der tabelle kann man dann leicht nachschlagen über welchem tile sich die maus befindet. Ist aber auch mit der Pixelperfekten Kollision möglich, weil man ja nicht alle tiles überprüfen muß, sondern nur die in der nähe der tiles.

Es gibt in einigen tutorials auch rein mathematische lösungen, diese sind natürlich am elegantesten, aber da muß man sehr auf rundungsfehler achten.

Ich hab da mal was gemacht. Wenn bedarf besteht kann ich mal schauen ob ich noch die Quellcodes habe. War aber ziemlich schmutzig zusammengefrickelt...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Null

5x für die ganze Map, aber du hast recht, das hab ich in der eile übersehen.

ok, wenn schon collision, dann ist das so die beste lösung. :allright:

...mir stellen sich nur bei collision und tilemap im allgemeinen die haare auf,
weil ich da schon so viel grausige sachen gesehen habe...


die von zaphod vorgeschlagene lösung könnte man bei dir direkt einbaun.

einfach ein array erstellen, das exakt so aussieht, wie dein tile-demo-text.
da wo du das SpritePixelCollision stehen hast, einfach

Code: Alles auswählen

If CollArray( mouseX - xPos, mouseY - yPos )
das könnte sogar die aller performanteste lösung sein,
noch schneller als komplizierte mathematik.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten