Neuanfang... und schon problem mit schussfunktion

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Pingu_Killer

Betreff: Neuanfang... und schon problem mit schussfunktion

BeitragSa, Jun 16, 2007 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe ja mal vor einem jahr mit bb angefangen. Doch ich hab es nie sehr aktiv gelernt, so das ich nur die simpelsten sachen verstant und meine schussfunktion in "Evasion" nicht verstanden habe sondern fast nur mit copy/paste.....
Nun ja, nun habe ich mich noch einmal rangesetzt um es "vernünftig" zu lernen, und siehe da, die types habe ich einigermaßen verstanden. Ich habe in den letzten tagen schnell "Evasion II" angefangen, da das erste so mieserabel geproggt war.
Da ich jetze immer ein ein anfänger bin kam der beitrag zu "Beginners corner".

Nun ja, jetzt habe ich doch ein prob mit der schussfunktion.
wenn der schuss den asteroiden trifft, soll der schuss gelöscht werden, und der asteroid wieder neu ins bild kommen. Doch der schuss geht einfach durch ihn durch. Ich bin nicht aud den fehler gekommen.
(schussfunktion is in types und die gegner in dims)
der code zeigt die "schuss"-function und die "enemy"-function.

hier ist der Code: [AUSKLAPPEN]


Function schuss()
If KeyHit(57) Then
   bullet.shoot = New shoot
   bullet\x = player_x
   bullet\y = player_y
EndIf

For bullet.shoot = Each shoot
   DrawImage munition, bullet\x+33, bullet\y+15
   If ImagesOverlap (munition, bullet\x+33,bullet\y+15,asteroid,enemy_x(i),enemy_y(i)) Then ;hier ist die abfrage
      Delete bullet.shoot ;kugel löschen
      enemy_x(i) = 800 ;x auf anfang usw....
      enemy_y(i) = Rand(1,450)
      enemy_speed(i) = Rand(3,5)
   EndIf

   bullet\x = bullet\x + 5
   If bullet\x >= 800  Then
      Delete bullet.shoot
   EndIf
Next
End Function

;----------------------------------------------------

Function enemy()

For i = 1 To anz
   DrawImage asteroid, enemy_x(i), enemy_y(i)
   
   If ImagesOverlap (asteroid,enemy_x(i),enemy_y(i), player,player_x,player_y) Then
      frame = frame +1
      enemy_x(i) = 800
      enemy_y(i) = Rand(1,450)
      enemy_speed(i) = Rand(3,4)
   EndIf
   
   enemy_x(i) = enemy_x(i) - enemy_speed(i)
   
   If enemy_x(i) <= -10 Then
      enemy_x(i) = 800
      enemy_y(i) = Rand(1,450)
      enemy_speed(i) = Rand(3,4)
   EndIf
   
Next
End Function

------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"
 

Lador

BeitragSa, Jun 16, 2007 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Code: [AUSKLAPPEN]
For bullet.shoot = Each shoot
   DrawImage munition, bullet\x+33, bullet\y+15
   If ImagesOverlap (munition, bullet\x+33,bullet\y+15,asteroid,enemy_x(i),enemy_y(i)) Then ;hier ist die abfrage
      Delete bullet.shoot ;kugel löschen
      enemy_x(i) = 800 ;x auf anfang usw....
      enemy_y(i) = Rand(1,450)
      enemy_speed(i) = Rand(3,5)
   EndIf

   bullet\x = bullet\x + 5
   If bullet\x >= 800  Then
      Delete bullet.shoot
   EndIf
Next
End Function


Ich gehe mal davon aus, dass der Fehler hier an dem "i" liegt. Du benutzt es offensichtlich als Zählvariable für die For-Schleife. Allerdings bleibt i = 0, weil du diesen Code nicht in die Zählschleife reingetan hast.

Ich hoffe, dass dies das Problem ist, und dass ich dir weiterhelfen konnte.

MFG Lador

Pingu_Killer

BeitragSa, Jun 16, 2007 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
erst mal vielen dank für die schnelle antwort Very Happy
naja, hab ich auch zuerst versucht, hab aber nur "enemy_x(i) =.... usw." dann ist mir aufgefallen, das (i) auch in der abfrage steht und hab das alles in die For schleife gesetzt. nun kommt aber die meldung "object does not exsist" ind der zeile der abfrage. hier ist der code.


Code: [AUSKLAPPEN]


Function schuss()
If KeyHit(57) Then
   bullet.shoot = New shoot
   bullet\x = player_x
   bullet\y = player_y
EndIf

For bullet.shoot = Each shoot
   DrawImage munition, bullet\x+33, bullet\y+15

   For i = 1 To anz ;beginn der schleife
      If ImagesOverlap (munition, bullet\x,bullet\y,asteroid,enemy_x(i),enemy_y(i)) Then
         Delete bullet.shoot
         enemy_x(i) = 800
         enemy_y(i) = Rand(1,450)
         enemy_speed(i) = Rand(3,5)
      EndIf
   Next

   bullet\x = bullet\x + 5
   If bullet\x >= 800  Then
      Delete bullet.shoot
   EndIf
Next
End Function

------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"

Tankbuster

BeitragSa, Jun 16, 2007 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal ne dumme Frage am rand...
Warum machst du die Asteroiden nicht auch als Types ??
Wäre viel sinnvoller ^^ Wink
Twitter
Download Jewel Snake!
Windows|Android

Pingu_Killer

BeitragSa, Jun 16, 2007 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wusste das das kommt^^ die asteroiden hab ich in meinem ersten spiel als dim gemacht und. kp warum ich das wieder gemacht habe Very Happy aber wollt e ich auch ändern und ich werde die auch als type machen^^
------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"
 

Lador

BeitragSa, Jun 16, 2007 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, vllt liegt das "object does not exist" daran, dass du z.B.

Dim enemy_x(9)
Dim enemy_y(9)

machst, "anz" aber den Wert 10 hat.

MFG Lador

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jun 16, 2007 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
"object does not exist" bezieht sich immer auf ein Type das nicht existiert!

Problem bei dem Code ist das bei der Colli abfrage der Type gelöscht wird und dann die Position des Types geändert werden soll, das geht natürlich nicht!
Lösung:
Code: [AUSKLAPPEN]
If Colli then
delete Type
else
versetzen
end if


Nicht unbedingt besser aber übersichtlicher wäre eine eigene Schleife zum versetzen!
[BB2D | BB3D | BB+]

Pingu_Killer

BeitragSa, Jun 16, 2007 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
mhm.... meinst du, dass nach der schleife der schuss verschoben wird???

also:

Code: [AUSKLAPPEN]

For i = 1 To anz
      If ImagesOverlap (munition, bullet\x+33,bullet\y+15,asteroid,enemy_x(i),enemy_y(i)) Then
         Delete bullet.shoot
         enemy_x(i) = 800
         enemy_y(i) = Rand(1,450)
         enemy_speed(i) = Rand(3,5)
      EndIf
   Next
   
   bullet\x = bullet\x + 5
------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jun 16, 2007 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn eine colli stattfindet wird der Schuss gelöscht, danach kannst du den nicht mehr versetzten da Bullet = null ist
Code: [AUSKLAPPEN]
For bullet.shoot = Each shoot
   For i = 1 To anz ;beginn der schleife
      If ImagesOverlap (munition, bullet\x,bullet\y,asteroid,enemy_x(i),enemy_y(i)) Then
         Delete bullet.shoot
         enemy_x(i) = 800
         enemy_y(i) = Rand(1,450)
         enemy_speed(i) = Rand(3,5)
      EndIf
   Next
Next

For bullet.shoot = Each shoot
   DrawImage munition, bullet\x+33, bullet\y+15

   bullet\x = bullet\x + 5
   If bullet\x >= 800  Then
      Delete bullet.shoot
   EndIf
Next
[BB2D | BB3D | BB+]

Pingu_Killer

BeitragSo, Jun 17, 2007 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
soweit hab ich es verstanden: mit der colli wird bullet.shoot gelöscht wir daber in der for nextschleife verschoben. was natürlich nicht geht.
was ich nicht verstehe: warum wir object does not exsist in der colli angezeigt und nicht unten bei der verschiebeung?

irgendwie geht das nicht. Ich versteh ja, dass nichts verschoben werden kann, was ein paar zeilen zuvor gelöscht wurde. aber wenn ich den verschiebungsbehl vor die for next schleife mit der abfrage einfüge, funzt es auch nicht.

Tut mir leid, ich versuche ja das prob selbst zu lösen, damit ich es selbst verstehe, aber ich krieg das nicht hin.....
------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Jun 17, 2007 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt habe ich es gesehen, der Schuss wird gelöscht und mit dem nächsten enemy abgefragt in der ersten schleife.
Endweder die Schleifen tauschen
Code: [AUSKLAPPEN]
For i = 1 To anz ;beginn der schleife ;<<<<<<<<<
   For bullet.shoot = Each shoot;<<<<<<<<<<

      If ImagesOverlap (munition, bullet\x,bullet\y,asteroid,enemy_x(i),enemy_y(i)) Then
         Delete bullet.shoot
         enemy_x(i) = 800
         enemy_y(i) = Rand(1,450)
         enemy_speed(i) = Rand(3,5)
      EndIf
   Next
Next

oder mit exit die innere Schleife verlassen
Code: [AUSKLAPPEN]
For bullet.shoot = Each shoot
   For i = 1 To anz ;beginn der schleife
      If ImagesOverlap (munition, bullet\x,bullet\y,asteroid,enemy_x(i),enemy_y(i)) Then
         Delete bullet.shoot
         enemy_x(i) = 800
         enemy_y(i) = Rand(1,450)
         enemy_speed(i) = Rand(3,5)
         Exit ;Schleife verlassen und mit nächsten bullet.shoot weiter machen
      EndIf
   Next
Next
[BB2D | BB3D | BB+]

Pingu_Killer

BeitragSo, Jun 17, 2007 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ey, klasse, vielen dank Very Happy
das wars....
danke das du die zeit geopfert hast.... klasse!!!
------------------------------------------------------

Gründer und einziges Mitglied von
"NoobTec Games"

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group