PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Freebasic - Shooter Problem



Teflo
04.04.2008, 20:23
Jo...
Ich habn Problem:
Ich habe angefangen einen 2D Shooter mit Freebasic zu basteln. Wenn man nun schießt (Leertaste) hat man einen Dauerfeuer \o/ Nun hab ich die maximal Anzahl an Schüssen auf 100 gesetzt. Wenn man nun 100 Schüsse geschossen hat passiert was blödes: Da nun die Schuus anzahl wieder auf 0 gesetzt wird, verschwinden alle Schüsse. Ist ja eigentlich klar. Nun, Jens hat mir geholfen und gesagt, dass ich jeden Schuss, der den Bildschirm verlässt, wieder freigebe. Ich hab mir gedacht, dass ich dann einfach von den Schüssen einen abziehe. Tja! Falsch gedacht! Statt dass der Schuss, der den Bildschirm verlässt, gelöscht wird, wird der letzte, den ich schieße gelöscht.

Ich hab die Zeile ausreichend mit Kommentaren geschmückt, damit man die Problemstelle erkennt. Das ' in Zeile 80 könnt ihr übrigens mal rausnehmen, um zu sehen, wie die Schüsse gelöscht werden.

Link:
http://www.file-upload.net/download-768350/Shooter.rar.html

Btw: Ich hab für die Schüsse Arrays genommen (maximal Anzahl Schüsse,2) 0= Schuss Nr. 1=X-Koordinate, 2=Y-K.
Und ja, ich weiß selbst, dass mein Programmierstil grottig ist! xD

€dit: Die Zahlen oben sie übrigens die X-und Y-Koordinaten und die Anzahl Schüsse. Sind nur zu Testzwecken da.

malu
04.04.2008, 20:50
Ich hab mir den Code noch nicht angesehen, aber ich nehme einfach mal an, dass du immer das letzte Element des Arrays löscht, welches wahrscheinlich das jüngste Element ist. Versuch mal, den Array irgendwie zu shiften, kA ob es sowas in FreeBasic gibt. Irgendwie muss halt das erste Element gelöcht werden und der Rest um eins nach vorne verschoben werden.

Edit: Den Code kann ich mir nicht ansehen, weil das Archiv leer ist. o.o

Teflo
05.04.2008, 21:14
HA!
Problem wurde von unserem allgeliebten jensma behoben! Danke nochmal! :D

Der Schuss, der den Bildschirm verlässt, wird einfach wieder zurück"geschoben". Also wenn der SchussX >1000 ist, dann wird er irgendwo <1000, wo man ihn nicht sehen kann, teleportiert (in diesem Fall hinter dem Raumschiff)! Oki, trotzdem danke an die hier so da so, ne? :A

Cherry
07.04.2008, 18:53
Ist zwar nciht die beste methode, aber was solls...

Ich würde mir an deiner Stelle die FreeBasic Extended Library (http://www.freebasic.net/forum/viewtopic.php?t=9791&sid=07b23c4a45c6d95f9278add2a1c9a0e1) ziehen, da sind u.a. Array-Shift-Funktionen dabei.

PS: jensma kann FB? oO

mfG Cherry

Ynnus
08.04.2008, 08:01
PS: jensma kann FB? oO

mfG Cherry

Ich vermute mal, dass allgemeine Programmierkenntnisse (egal welcher Sprache) im Prinzip ausreichen, um Algorithmen und Fehler in ihnen zu verstehen. Und wenn man dazu noch Basic beherrscht, ist der Umgang mit anderen Basic-Dialekten kein großes Thema mehr.

Cherry
08.04.2008, 18:38
Achso, stimmt. So gehts mir mit C++ :D

Ich hab mich nur gewundert, weil FB ja doch eher unbekannt und -beliebt ist.

R.D.
15.05.2008, 15:32
Meinst du?
Also ds würde mich wundern, wenn ich da an C++ denke @.@''
Freebasic ist doch da viel besser geeignet XD
Gut ich verstehe jetzt sicher nich soviel wei du davon, aber da ich ja schon ne Menge Sprachen probiert hab, fand ich FB bisher am besten^^

Teflo
27.05.2008, 18:56
Ich muss mich mal wieder melden. Es geht zwar nicht um den Shooter, aber auch um FB. Also:
Ich möchte kontrollieren, ob ein Punkt auf einer Geraden liegt. ich kenne Start- und Endpunkt dieser Geraden. Im Chat sagte mir Manni, dass man das so abfragen kann:
(x1-x2)/(y1-y2)=(x1-x3)/(y1-y3)
Wenn das eintrifft, liegt der Punkt (x3|y3) auf der Geraden zwischen (x1|y1)-(x2|y2)
Soweit so gut. Ich hab das nun in ein Code gepackt:

For i = 0 to Linie
For a = 0 to MaxPunkte
Vy(a)+=Grav
PunktY(a)+=Vy(a)
PunktX(a)+=Vx(a)
If (LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a)) Then
'Kollision
Endif
Next a
Next iAber komischerweise trifft das immer zu, also er führt den Kollosionscode immer aus. =/

Ineluki
27.05.2008, 20:17
Hast du auch bedacht, das Geraden UNENDLICH lang sind ?
Der Code von Manni testet nur, ob die Linearfunktion der geraden P1P2 den gleichen Anstieg hat, wie die Gerade P1P3. Und das funktioniert auch nur in 2D (was hinreichend sein sollte). Da Geraden unendlich lang sind, hat Manni mit seiner Methode recht.

Mir scheint es aber vielmehr, das du testen willst, ob sich ein Punkt auf der STRECKE P1-P2 befindet, also auf einem endlichen Teilabschnitt der Geraden P1P2. Hierzu muss ausser der obigen Bedingung zusaetzlich noch erfuellt sein, dass X1<=X3<=X2 oder X2<=X3<=X1 ist. Erst dann liegt der Punkt auf der Geraden und befindet sich auf der X-Achse zwischen X1 und X2.

Teflo
27.05.2008, 20:35
Okay, meine Abfrage sieht jetzt so aus:

If (LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a)) And( LinieX1(i)<=PunktX(a)<=LinieX2(i) Or LinieX2(i)<=PunktX(a)<=LinieX1(i) )And( LinieY1(i)<=PunktY(a)<=LinieY2(i) Or LinieY2(i)<=PunktY(a)<=LinieY1(i)) Then
'Kollision
Endif
Jedoch geht's immer noch nicht! :/ Wieder das Problem, dass er meint, es träfe immer zu...

Ineluki
27.05.2008, 20:46
Ich kenn mich mit FB nicht aus, aber DAS sieht nicht richtig aus ...

LinieX1(i)<=PunktX(a)<=LinieX2(i)

Das sieht aus, als ob da TRUE oder FALSE auf 0 bzw 1 gecastet wird und dann erst verglichen wird.

Ich wuerde es als ((LinieX1(i)<=PunktX(a)) AND (PunktX(a)<=LinieX2(i))) formulieren.

Den Vergleich mit den Y Werten kannst du dir sparen, es sei denn, du hast auch senkrechte Linien.

Moyaccercchi
27.05.2008, 21:10
Die Lösung für Delphi sähe folgendermaßen aus:


if (Liniex1 = Liniex2) and (Punktx = Liniex1) then
if (((liniey1 <= liniey2) and ((liniey1 <= punkty) and (punkty <= liniey2))) or ((liniey1 >= liniey2) and ((liniey2 <= punkty) and (punkty <= liniey1)))) then
result := true
else
result := false
else
if (Punkty = Liniey1 + ((Punktx - Liniex1) * (Liniey2 - Liniey1) / (Liniex2 - Liniex1)))
and (((liniex1 <= liniex2) and ((liniex1 <= punktx) and (punktx <= liniex2))) or ((liniex1 >= liniex2) and ((liniex2 <= punktx) and (punktx <= liniex1))))
and (((liniey1 <= liniey2) and ((liniey1 <= punkty) and (punkty <= liniey2))) or ((liniey1 >= liniey2) and ((liniey2 <= punkty) and (punkty <= liniey1)))) then
result := true
else
result := false;
Sicher ist das jetzt viel zu umständlich gedacht, und du musst es auch noch in die Sprache deiner Wahl umschreiben, aber immerhin - es funktioniert. ^^ (Hat zumindest bei zwanzig Tests funktioniert, natürlich kann ich für nichts garantieren...)

Teflo
28.05.2008, 14:22
Hm...

Rechnung1=(LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))
Rechnung2=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a))

If Rechnung1=Rechnung2 And ((LinieX1(i)<=PunktX(a)) AND (PunktX(a)<=LinieX2(i))) Then
BlaGeht nicht! xO
Ich schau mir auch immer schön die Werte an, aber wenn der Punkt exakt auf der Linie ist, sind die Werte trotzdem völlig verschieden (Rechnung1=1.blubb, Rechnung2=0.1blubb). :\

Manni
28.05.2008, 14:53
Hm...

Rechnung1=(LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))
Rechnung2=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a))

Wenn du aus Rechnung2 folgendes machst, sollte es gehen ;):

Rechnung2=(LinieX1(i)-PunktX(a))/(LinieY1(i)-PunktY(a))

Cherry
29.05.2008, 19:18
Du kannst in FB "_" benutzen, um eine Anweisung über mehrere Zeilen zu strecken, z.B. so:


If (LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i)) = (LinieX1(i)-PunktX(a))/(LinieY1(i)-PunktY(a)) And _
((LinieX1(i)<=PunktX(a)) AND (PunktX(a)<=LinieX2(i)) Then
' Kollision
EndIf

Bringt mehr Übersichtlichkeit rein.

mfG Cherry