Seite 1 von 5

level

Verfasst: 10.01.2006 17:28
von diGGa
hi
wollte mal eure standardmäßigen vorgehensweisen zum level einladen erfahren :)
also wie macht ihr level?
ich wollte als erneuten einstieg (hab vor einiger zeit schon n bisschen was geschrieben, aber nichts bewegtes sondern nur statische spiele) mal nen mouse avoider schreiben (http://www.actionflash.com/mouseavoider2.php zb)
und dafür muss ich ja auch levels einladen.
ne idee wäre tile mäßig daran zu gehen.. muss doch aber auch einfacher gehen?

Verfasst: 10.01.2006 18:53
von Zaphod
nein, tiles sind die einfachste möglichkeit. eine andere variante, die aber komplizierter ist, währe ein polygonbasiertes level (in 2d).

Verfasst: 10.01.2006 19:24
von diGGa
is halt so das ich neben kastenförmigen tiles auch schräge/runde tiles haben will und ausserdem bewegliche "gegner" halt wie in dem flash so mit balken die sich drehen oder aus der wand fahrenden blöcken.

darum geht kein einfaches tileset... bzw es geht wahrscheinlich schon aber meine einzige idee sowas umzusetzen ist bei der kollisionsabfrage zu differenzieren zwischen "graden" und "ungraden" tiles.. also die kastenförmigen ganz normal per koordinaten und die anderen per SpritePixelCollision...
ausserdem 2 datensets, eins für tiles und eins für objekte (also die "gegner"), wobei das bei den objekten irgend ne art script sprache braucht damit ich einfach nur zB schreibe "objektname, positionx, positiony, breite, länge, geschwindigkeit"

mal nebenbei.. gibts ein tutorial für tilesets (+ collision)? hab zwar mir eins geschrieben aber das ist nich unbedingt optimal ;)

Verfasst: 10.01.2006 22:18
von Konne
Das wäre auch etwas was mich interessieren würde:
Wie sieht ein effektives Kartenformat aus? Also wo die Karten gespeichert sind?

Verfasst: 11.01.2006 01:18
von Zaphod
darauf gibt es keine allgemeine antwort, denn das ist extrem abhängig davon, was du machen willst. für ein simples, tilebasiertes spiel gehe ich meistens so vor, dass ich ein zweidiemensionales array von typ long als karte benutze (das verschwendet ein bischen speicherplatz, ist dafür aber schneller). der long-wert ist gleichzeitig die id des sprites, dass an dieser stelle in der karte angezeigt werden soll. bestimmte wertebereiche haben dann noch spezielle bedeutungen, also 0 bis 999 sind wände, 1000 bis 1999 sind böden, und 2000 bis x sind felder mit spezieller bedeutung.

bei komplexeren, tilebasierten spielen kann es von vorteil sein, die feldbeschreibung in einer struktur fest zu legen und dann ein 2d array vom typ dieser struktur zu benutzen.

bei nicht-tilebasierten spielen wäre so ein ansatz in den meisten fällen aber nicht besonders gut.

Verfasst: 11.01.2006 11:22
von diGGa
bei strukturen hätte man dann per array die position auf der map und in den variablen diverse infos wie zerstörbar oder ähnliches? hört sich sehr sinnvoll an :)

hmm wie macht ihr das mit kollisionen bei tilemaps? also so eckige kollisionen sind schon schwer genug (hab da ne hohe fehlerquote die ich nich ausschließen kann.. hab mal n jnr versucht.. is immer in den boden gerutscht) aber wie macht ihr das bei eckigen oder runden?

Verfasst: 11.01.2006 12:33
von Zaphod
SpritePixelCollision() nehmen ;)

bei schrägen tiles ist das noch nicht das problem, zumindest wenn du nicht viele verschiedene steigungswinkel hast. wenn du einen ball an einer runden fläche abprallen lassen willst und den korrekten ausfallwinkel berechnen willst, dann wird es schon ein bischen komplizierter.

so auf die schnelle könnte ich da auch kein patentrezept für aufschreiben, aber du könntest über die tangente bei der aufprallstelle den genauen vektor finden (der orthogonal auf der tangente steht), um den du den aufprallwinkel spiegeln musst, um den ausfallwinkel zu ermitteln.

ist allerdings nur so ne idee, vieleicht gibt es da auch eine viel einfachere lösung, aber die fällt mir grade nicht ein.

Verfasst: 11.01.2006 14:03
von diGGa
also quasi einfach

(case: tile 1-3 sind eckig und 4 ist schräg)

pseudo
procedure collisionsberechnung()
if map(x,y) <> 4
per koordinaten oder spritecollision() berechnen
else
spritepixelcollision(..)
endif
endprocedure

dazu natürlich noch for schleifen damit man durchgeht...
im endeffekt: ich differenziere zwischen graden und nicht graden tiles und mach 2 kollisions routinen die einfach jeh nach tile id abgerufen werden?

und mit kreis-abstoßen... ja tangente etc wäre ne idee.. aber dazu komm ich später erstmal muss ich nur die kollision hinbekommen :) (würde ja schon in grenzwert berechnungen gehen und ich hasse grenzwert ^^)

//////

aber jetzt mal was wichtiges.. wie kann ich level per datei in einen array laden? ich hab überhaupt keine peilung vom parsen und das muss doch irgendwie anders gehen..

Verfasst: 11.01.2006 14:50
von NicTheQuick
Ich würde das ungefähr so machen. Ich hoffe es ist selbsterklärend:

Code: Alles auswählen

Structure Boden
  Typ.l
  ;blabla
EndStructure

Structure Haus
  Typ.l
  ;blabla
EndStructure

Structure Wasser
  Typ.l
  ;blabla
EndStructure

Structure Speziell
  kaputt.l
  halbfertig.l
  ;blabla
EndStructure

Structure Field
  Typ.l
  StructureUnion
    *Boden.Boden
    *Haus.Haus
    *Wasser.Wasser
  EndStructureUnion
  Speziell.Speziell
EndStructure

SizeX.l = 100
SizeY.l = 100

Dim Field.Field(SizeX - 1, SizeY)

NewList Boden.Boden()
NewList Haus.Haus()
NewList Wasser.Wasser()

;Verschiedene Böden, Häuser und Gewässer in LinkedLists einladen

;Map laden und in Field(x, y)\Boden den Pointer zu dem entsprechenden Boden o.a. speichern

Verfasst: 11.01.2006 15:03
von Konne
Das mit LinkedLists zu machen wird aber wohl langsamer als ein array sein.
So jetzt noch eine Frage:
Wie speichert ihr die Karten auf der Festplatte?