Entwickler-Ecke

Multimedia / Grafik - Kollisionsabfrage?


G-McKree - So 07.09.03 22:38
Titel: Kollisionsabfrage?
Also folgendes: ich hab ein kleines Panzerspiel gebastelt, aber mit der Kollisionsabfrage bin ich nicht weitergekommen. Die Kugel fliegt alle ca. 25 millisekunden 20 Pixel in einer bestimmten Richtung weiter, und es sollt natürlich was passieren, wenn ein Panzer getroffen wird. Der Panzer is nur ein schwarzes Viereck mit nem blauen bzw. roten Strich drauf. Die Panzer und Kugeln sind nur als TPoints gespeichert, um die der (das?) Canvas den Rest herumzeichnet.


UGrohne - Mo 08.09.03 09:19

Poste doch einfach mal Deinen bisherigen Kollisions-Code, da lässt sich einfacher dran rumschrauben.


G-McKree - Mo 08.09.03 19:44

der sieht ungefär so aus:

Quelltext
1:
2:
if (Pt.X > RedTankPosition.X - 20) and (Pt.X < RedTankPosition.X + 20) and (Pt.Y > RedTankPosition.Y - 20) and (Pt.Y < RedTankPosition.Y + 20) then
//irgentetwas//


Pt und RedTankPosition sind TPoints; Pt is der Pounkt an dem sich das Projectil nach dem Neuzeichnen befinden wird und RedTankPosition erklärt sich von selbst. Die Bedingung is natürlich total ungenau, da der Panzer ja nicht 40*40 Pixel groß ist


Anonymous - Mo 08.09.03 21:36

guck doch mal in der OH nach PtInRect. oder willst du punktgenaue abfrage?


G-McKree - Mo 08.09.03 21:55

Is praktisch, thx
aber das Problem is, dass das Projektil manchmal über den Panzer hinwegfliegt, da es sich in 20-Pixel Schritten bewegt


Anonymous - Di 09.09.03 14:03

Da fällt mir jetzt auch nur ein, dass du die Schritte verkleinern könntest. Und dann direkt mehrere berechnest.
Ich hatte auch irgendwo mal eine Funktion, die berechnet, ob eine linie durch ein viereck geht, ich weiß aber nicht mehr wo...


G-McKree - Di 09.09.03 19:48

das hab ich schon versucht, aber die berechnung war zu langsam. Also hab ich mir gedacht, das ich threads benutzte (hab ich nie zufor gemacht, aber es funtz), allerding hab ich jetzt das problem das manchmal ein projektil schneller fliegt als die anderen


mimi - Di 09.09.03 20:01

Zitat:

manchmal ein projektil schneller fliegt als die anderen

ist doch praktisch, aber um dieses problem zu umgehen baue doch einen zähler in den thread ein bzw. setzt alle trehds auf die gleichen start wert.


G-McKree - Di 09.09.03 20:47

mimi hat folgendes geschrieben:
Zitat:

manchmal ein projektil schneller fliegt als die anderen

ist doch praktisch, aber um dieses problem zu umgehen baue doch einen zähler in den thread ein bzw. setzt alle trehds auf die gleichen start wert.


nicht ganz, mimi, es spielt kein role, ob alle threads zugleich beginnen, denn die geschwindigkeit der projektile würde dadurch nich beeinflust werden


mimi - Mi 10.09.03 17:38

Zitat:

nicht ganz, mimi, es spielt kein role, ob alle threads zugleich beginnen, denn die geschwindigkeit der projektile würde dadurch nich beeinflust werden

stimmt, fält mir auch erst jetzt wieder ein, ein Trehad wie ja nur ausgfürht wenn die zeit da ist sonst wird er auf pausegestellt aber nur im MS bereich.


G-McKree - Mi 10.09.03 19:28

weiss vieleicht jemand, warum die projektile ab und zu schneller fliegen als sonst?


umpani - Mi 10.09.03 20:03

Lade doch mal deinen Quelltext als Zip auf deine Homepage, so dass wir ihn uns anschauen können.


Anonymous - Mi 10.09.03 20:50

mit threads hab ich noch nix gemacht, aber versuch doch mal, ein "sleep" einzubauen. In Threads dürfte dann doch eigentlich nicht die ganze Anwendung stehen bleiben, oder?


mimi - Mi 10.09.03 21:32

der grund ist folgnder: wenn ein Threads ausgefürht wird und danach ein zweiter wird zuerst der erste ausgefürht und sobalt der fertig ist der zweite und so weiter somit würde sich folgender geschwingkeit bei dem geschuss ergeben:
1 Thread: geschwindigkeit + 1
2 Thread: geschwindigkeit + 2
3 Thread: geschwindigkeit + 3

und soweiter mach doch mal folgendes:
nimm nur einen Thread und einen array[0..max] of interger
und jetzt lasse einfach in den einem Thread einen zähler laufen und fertig
genauso gut kannst du dafür einen timer nehmen.

EDIT:
windows läst nie ein sachen gleichzeitig laufen genauso wenig wie linux und die andren ose sie werden immer zeitversetzt gestartet.
das ist auch noch ein grund

das mit dem Sleep ist keine schlechte idee solltes du mal testen


G-McKree - Mi 10.09.03 22:08

hab ich ja ales schon, der thread läuft so lange, bis das projektil die bedingungen erfüllt um verschwinden zu dürfen. und nich genug zeit zum rechnen is auch keine ausrede, da der fehler immer da ist, egal ob ich sleep(500) oder sleep(25) sage. aussedem hat jeder thread ein projektil zugewiesen, und kann mit den anderen nichts machen.


maximus - Do 11.09.03 01:15

G-McKree hat folgendes geschrieben:
weiss vieleicht jemand, warum die projektile ab und zu schneller fliegen als sonst?


ich könnte mir vorstellen, das dein frame-rate schwankt, watt logisch dazu führt, dass die bullets schneller fliegen als sonst!? Es sei denn du benutzt time-based-movement :wink: ...sprich, du lässt die aktuelle framerate in deine bewegungs-weite einfliessen :D


mimi - Do 11.09.03 08:14

währe eine möglichekit eine andre währe wenn du einfach sagst sleep(1) sollte ausreichen.


maximus - Do 11.09.03 10:34

mimi hat folgendes geschrieben:
währe eine möglichekit eine andre währe wenn du einfach sagst sleep(1) sollte ausreichen.


warum sollte man seinem spiel leistung klauen wollen?...statische frame-raten sind unprofessionell :wink: behaupte ich jetzt einfach mal (als profi)


mimi - Do 11.09.03 16:09

das weiß ich aus einger erfarung:
in einem Thread im einem Spiel war die FPS anzahl der ungleichmäsig mal bei 60 mal bei 55 oder bei 20 und soweiter als ich im thread ein sleep eingebaut hatte funktionierte es *G*


G-McKree - Do 11.09.03 21:42

ich kann mir aber nich vorstellen, das die projektile schneller fliegen, da die CPU wohl kaum zu kurze sleep-pausen macht, sondern wohl eher zu lange.
aber wenn wer ne idee hat freu ich mich, insbesondere, da ich nich die leiseste ahnung hab wie dieses problem entsteht.

ich will euch mal den prog-ablauf schildern

es gibt 3 timer:
1. das drehen des geschützes
2. das bewegen des panzers
3. neuzeichnen
jedes von maximal 128 projektilen hat einen thread der sich drum kümmert und der sieht ungefähr so aus:
die neue position wird berechnet (aber noch nich zugewiesen) dann wird geprüft, ob die position nich ausserhalb des schlachtfeldes liegt, was die terminierung des threads und das verschwinden des projektils zu folge hätte, wenn dem nich so is, dann wird dem projektil die zuvor errechnete position zugewiesen


Anonymous - Do 11.09.03 21:54

wenn ich das richtig verstanden habe dann sollte es so gehen:

mach einen array of boolean[0..127]
jedes mal wenn ein projektil berechnet wird,wird die entsprechende nummer des arrays auf true gesetzt.
wenn die nummer schon true ist, wird sofort aus der procedure gesprungen.
wenn alle werte true sind, werden alle wieder auf false gesetzt.


mimi - Do 11.09.03 22:31

wenn ich das richtig verstehte gibt es also 128 Treahd ?
mein beitrag von weiter oben sollten das problem doch beschreiben:
TD= thread
du hast mehr als einen TD und keiner rechner kann mehre pro. gleichzeitig ausführen sondern nur zeitgesteuert das es besonders bei den spielen im MS bereich ankommt kann es durchaus sein das die TD hintereinander ausgefürht werden(was es auch wird) und die zeit unterschiede sind dann so enorm das man es sehen kann, der letze schuss sollte dann sehr langsamm fliegen oder ?
wenn es nicht so ist verstehe ich es auch nicht :(


umpani - Do 11.09.03 22:34

Nur auf die Gefahr hin, mich zu wiederholen, aber bitte poste doch Deinen Quelltext, oder stelle den Quelltext zum Download bereit.

Dann können wir auch besser helfen.


G-McKree - Fr 12.09.03 19:14

ich bin ja doof

hab den fehler gefunden. die threads wurden nie beendet und so passierte es dann ab und zu, dass ein projektil von 2 threads bewegt wurde