level

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

level

Beitrag 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?
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

nein, tiles sind die einfachste möglichkeit. eine andere variante, die aber komplizierter ist, währe ein polygonbasiertes level (in 2d).
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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 ;)
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Das wäre auch etwas was mich interessieren würde:
Wie sieht ein effektives Kartenformat aus? Also wo die Karten gespeichert sind?
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Zuletzt geändert von Zaphod am 11.01.2006 12:24, insgesamt 1-mal geändert.
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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?
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag 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..
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag 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?
Antworten