Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.03.2012, 09:34

game loop / kollisions logik verständnisfrage ?

ich bastel gerade an einem 2d autorennen auf einem handy und habe da irgendwie nen logikproblem.

also die gameloop, wenn ich das richtig verstanden habe, baut man so, dass nen objekt z.b. x=x+pixel*deltatime bewegt wird.
dann ermittelt man doch, wie schnell das handy ist um ein frame zu berechnen und das wird dann die deltazeit für die verschiebung um auf allen geräten gleich schnell zu sein richtig ?

jetzt aber zum eigentlich problem. wie macht eine 1pixel genaue kollisionsabfrage.
mein auto fährt z.b. schnell genug, wenn ich 4pixel/s verschiebe, weil das handy nur 60fps schafft.

also sagen wir nen auto braucht bei mir für eine runde 1 minute, dann soll ein handy mit 30 fps ja nicht 2 minuten brauchen sondern auch 1 minute.
sprich es müssen ja dann zwischenbilder übersprungen werden.

wenn ich jetzt aber bei 30 fps 8 pixel schieben muss um schnell genug zu sein, ermittelt der ja nie nen objekt als hindernis von z.b. 5x5 pixel, weil es einfach übersprungen wird.

also wie macht man es jetzt richtig ?

aufbau sieht in etwa so aus

>thread start
startzeit messen
objekte verschieben um delta
bild anzeigen
endzeitmessen
delta errechnen
>thread ende

2

12.03.2012, 10:40

Hey,
Ich gehe davon aus, dass du mit Vektoren arbeitest?
Um dein Problem zu lösen, gibt es die Möglichkeit, zu prüfen ob der Vektor, um den das Auto verschoben wird, die Ebene des anderen Autos schneidet.

Dazu musst du den Vektor mit der Ebene gleichsetzen und ausrechnen, in Programmcode kann das unter Umständen recht kompliziert werden.
Ich hab das ganze in einem früherem Post auch mal gefragt und gelöst (2d): Liegt ein Punkt auf der zweidimensionale Ebene?

Dann noch Checken, ob das Ergebnis, auch nicht größer als das Auto ist, in deinem Fall also 5 (5 Pixel breit). Danach musst du es noch in die zweite Gleichung einsetzen und ebenfalls prüfen ob es auch das Auto trifft,
sollte aber aus dem mir verlinktem Post hervorgehen. Viel Erfolg noch

LG Dna

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

12.03.2012, 11:13

Oder du setzt in deinem Spiel eine Minimalgeschwindigkeit. Du schreibst einfach vor, 60 FPS muss das Handy bei deinem Spiel schaffen. Wenn Handys schneller sind, ist das schön und bei allen die langsamer sind läuft es dann in Zeitlupe ab. Da hast du dann halt leichte einbußen bei langsamen Handys, wobei man sich ab einer gewissen Geschwindigkeit eh fragen muss wie sehr Spielbar das ganze bleibt. Ansonsten könntest du die Bewegung nicht in einem Schritt durchführen, sondern in mehreren kleinen. Wenn deine kleinsten Objekte 4 Pixel groß sind, dann verschiebst du auch immer nur um 4 Pixel. Wenn in einem Frame dann um 8 Pixel verschoben werden soll, dann musst du das halt 2 mal in diesem Frame machen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

4

12.03.2012, 13:54

das mit der zeitlupe wäre nicht möglich, weil am ende ja nen netzwerkspiel draus werden soll.
dann wäre es schlecht, wenn das eine handy 30 zeitlupe macht und das andere eben 60 doppelt so schnell.

beide lösungen haben was für sich.
muss ich mir mal genauer durchdenken.

naja ich ermittle eigentlich ob eine bestimmte farbe auf einem pixel liegt. ist es z.b. schwarz ist es ein hindernis.

bei variante eins würde ja heissen, wenn ich das richtig verstanden habe.
nehmen wir an beim langsamen handy würde der 8 pixel springen.
dann teste ich einfach auf der linie von x1,y1 -> x2,y2 ob da nen hindernis pixel ist. und wenn ja, dann lass ich fas fahrzeug an der stelle stoppen.

naja so ich gelesen habe sind die android handys auf 60 fps begrenzt.
hab das bis jetzt mal auf 2 handys getestet das galaxy 1 macht z.b. 58 und das s2 30 pixel.
der emulator macht 6. und daran sehe ich eben bei den großen sprüngen, dass dann nur murks raus kommt.

variante 2 so ich verstanden haben:
ich ermittle 8 pixel und lass dann eben
4 schieben, hindernis testen
wenn ok 4 schieben, hindernis testen
nicht ok, auto anhalten lassen
danach
strecke rendern.
welches ist dann nun den effektivere methode ?

das problem besteht ja eigentlich nicht nur beu autorennen, sondern auch bei jump & run (z.b. balken wo der drauf spirngt) usw.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

12.03.2012, 16:45

das mit der zeitlupe wäre nicht möglich, weil am ende ja nen netzwerkspiel draus werden soll.
dann wäre es schlecht, wenn das eine handy 30 zeitlupe macht und das andere eben 60 doppelt so schnell.

Die Idee (welche auch immer Du da hattest) kannst Du gleich verwerfen, denn Du wirst es ohnehin nicht schaffen, dass das Netzwerk synchron und genauso schnell arbeitet wie die FPS der Telefone. Da musst Du einen asynchronen Ansatz verwenden und damit wäre es egal wie viele FPS welches Device schafft. Machbar klingt hier, dass die Spiele mit 20-60 FPS laufen und die Netzwerk-Events 5 bis 10mal pro Sekunde eintreffen und ausgehen. Alles andere wäre Datenspam, der zu zwei Sachen führt: Performance-Verlust und Probleme.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

12.03.2012, 19:09

also wenn ich malüberlege wie nen handy mit dualcore in die knie geht und damals nen amiga oder c64 das selbe mit 5-10mhz geschafft. gut ohne netzwerk.

naja die ideee war nen autorennen zu acht oder so. dachte die android sind mitlerweile schnell genug.
also doch lieber single player mit nen paar rafinessen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

12.03.2012, 20:37

Klar sind Android-Telefone schnell genug. aber Netzwerk ist um Größenordnungen langsamer und hat wahnsinnig hohe Latenz-Zeiten von locker 50 bis 200ms. Dass man das nicht synchron nutzen sollte (und auch gar nicht muss) sollte also offensichtlich sein.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

12.03.2012, 21:10

Für dein Kollisionsproblem könntest du auch Logik und das darstellen trennen. Die Logik wird mit festen schritten ausgeführt (z.B. 30 mal die Sekunde) wohingegen das rendern so oft wie möglich ausgeführt wird.

9

12.03.2012, 21:40

also 2 threads ?
muss ich mal testen ob das nur rechnen schnell genug macht.
heisst also da könnte ich mitunter auch 240 fps fahren, auch wenn das handy nur 30 anzeigt.
irgendwas hatte ich da mal. die malschleife würde sogar 300-500 fps schaffen aber die ganze sache eben nur 30,60

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

12.03.2012, 22:31

Genau. Ist eine gute Möglichkeit, da du da mit festen Zeitschritten arbeitest. Dadurch wird alles berechenbarer.

Werbeanzeige