Problem mit dem kompletten Code (wie sich rausstellte)

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen

Midimaster

BeitragMi, Dez 30, 2009 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Chrissa

ich kann dir nur raten Analyse und Spielanzeige strikt voneinander zu trennen. Eine Kollison ist eine Anlyse eines Spielmomentes. Die einzige Reaktion sollte sein, ein "Zeichen" zu setzen. z.b. SpielerGetroffen=1, oder zur Not noch Pl\Health=P\Health-100 oder sowas.

Ein Delay oder ein END gehören da nicht hinein. Lass doch zunächst das Programm einfach die Kollisons-Routine beenden und reagiere dann in der Main-Schleife auf das Ereignis.

Dort könnte man eben so auch "Sterben über mehrere Frames" verwirklichen. Hast Du gelesen, was ich Dir heute Nacht um 0:11 Uhr geschrieben habe?

@Tankbuster

Auch wenn es nur einen Player gibt, lohnt sich ein Typ dafür. Schließlich hat er ja doch einige Eigenschaften und es liest sich schön. (Natürlich nicht, wenn man ihn immer nur "Pl" nennt. Hier denken ja viele ein wenig verkehrt herum. Eigentlich sollte die Namensgebung so ablaufen:

BlitzBasic: [AUSKLAPPEN]
Type TPlayer
Field X%
Field Y%
Field Name$
End Type

Global Spieler.TPlayer

Spieler\X=12
Spieler\Name="Tarzan"

ZeigMalAlle()
WaitKey()
End

Function ZeigMalAlle
Local locPlayer.TPlayer
For locPlayer = Each TPlayer
Print locPlayer.X
Next
End Function



@Chrissa

Ich bin ja immer noch dafür, dass Du die Namern noch einmal vernünftig überarbeitest. Ich bin 100% davon überzeugt, das Du TYPES viel besser verstehst, wenn du nicht alle ForEachNext-Types immer Typ\x.. etc nennen würdest.

Angenommen der Spieler-Type heißt TPlayer und der Schuss-Typ heißt TSchuss:

BlitzBasic: [AUSKLAPPEN]
Type TSchuss
Field x
Field y
Field s_type
Field speed
Field strength
End Type

Type TPlayer
Field x
Field y
Field health
End Type


dann wäre Dein globaler Spieler

BlitzBasic: [AUSKLAPPEN]
Spieler.TSpieler = New TSpieler


und jetzt könntest Du überall z.B. das Spieler-X so ansprechen

BlitzBasic: [AUSKLAPPEN]
Spieler\X=12


dann sieht man doch immer gleich, was gemeint ist. Das ist sehr wohltuend für die Augen und hilft beim Fehler suchen. Die Waffen-Routine würde dann so aussehen:

BlitzBasic: [AUSKLAPPEN]
Function waffe()  
If KeyHit(56) Then
Waffe=Waffe+1
If Waffe=4 Then Waffe=1
EndIf

If KeyHit(57) Then
Local Schuss.TSchuss = New TSchuss
Schuss\X = Player\X-10
Schuss\y = Player\y+20

Select Waffe
Case 1
Schuss\S_type = kugel
Schuss\Speed = 10
Schuss\Strength = 10
Case 2
Schuss\Speed = 20
Schuss\S_type = laser
Schuss\Strength = 50
Case 3
Schuss\S_type = rocket
Schuss\Speed = 6
Schuss\Strength = 100
End Select
EndIf

For Schuss.TSchuss = Each TSchuss
Schuss\Y = Schuss\Y - Schuss\Speed
DrawImage Schuss\S_type, Schuss\X, Schuss\Y-40
Next
End Function

Chrissa

BeitragDo, Dez 31, 2009 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt ist alles so wie du gemeint hast:
Code: [AUSKLAPPEN]
AppTitle "Space Shooter"



Graphics 1280,1024,32,1
SetBuffer BackBuffer()
AutoMidHandle(True)


;Globals


Global count_en=0
Global count_ufo=0

Global waffe = 1

Type schuss
   Field x
   Field y
   Field s_type
   Field strength
   Field speed
End Type

Type alien
   Field x
   Field y
   Field health
End Type

Type ufo
   Field x
   Field y
   Field health
End Type

Type player
   Field x
   Field y
   Field health
End Type

Global TPlayer.player=New player
TPlayer\x=1280/2
TPlayer\y=800
TPlayer\health=1000






;Images

Global space=LoadImage("space.png")
Global alien=LoadImage("alien.png")
Global shuttle=LoadImage("shuttle.png")
Global ufo=LoadImage("ufo.png")
Global kugel=LoadImage("schuss_2.png")
Global laser=LoadImage("schuss_1.png")
Global rocket=LoadImage("schuss_3.png")
Global shuttle_fire=LoadImage("rocket fire.png")
Global e1_death=LoadAnimImage("alien death anim.png",203,118,0,3)
Global e2_death=LoadAnimImage("ufo death anim.png",239,118,0,3)
Global gameover=LoadImage("Game Over.png")








;Game

.main

While Not KeyDown(1)

   Cls

   
   DrawImage space,1280/2,1024/2
   DrawImage shuttle,TPlayer\x,TPlayer\y
   

   move()
   AlienSpawn()
   UfoSpawn()
   waffe()
   e1_dies()
   e2_dies()
   pl_dies()
   
   If TPlayer\health <=0 Then
      DrawImage Gameover,1280/2,1024/2
      WaitKey
      
   EndIf   

   Flip
Wend
End






;Funtkion Spielerbewegung

Function move()
   
      If KeyDown(203)
         TPlayer\x=TPlayer\x-8
      EndIf
   

      If KeyDown(205)   
         TPlayer\x=TPlayer\x+8
      EndIf

      If KeyDown(208)
         TPlayer\y=TPlayer\y+8
      EndIf

      If KeyDown(200)
         TPlayer\y=TPlayer\y-8
         DrawImage shuttle_fire,TPlayer\x-4,TPlayer\y+55
      EndIf

      If TPlayer\x <= 80 Then
         TPlayer\x = 80
      EndIf
   
      If TPlayer\x >= 1220 Then
         TPlayer\x=1220
      EndIf
   
      If TPlayer\y <= 80 Then
         TPlayer\y=80
      EndIf
   
      If TPlayer\y >= 944 Then
         TPlayer\y=944
      EndIf
   
End Function



;Funktion Alienspawn

Function AlienSpawn()
   count_en = count_en +1
   
      If count_en >=100 Then
            count_en=0

         Enemy1.alien=New alien
         Enemy1\x=Rnd(20,1260)
         Enemy1\y=-50
         Enemy1\health=100
      EndIf

      For Enemy1.alien = Each alien
         Enemy1\y=Enemy1\y+5
         DrawImage alien,Enemy1\x,Enemy1\y
      Next

End Function



;Funktion Ufospawn

Function UfoSpawn()
      count_ufo = count_ufo +1
         If count_ufo >=300 Then
         count_ufo=0

         Enemy2.ufo=New ufo
         Enemy2\x=Rnd(20,1260)
         Enemy2\y=-50
         Enemy2\health=300
      EndIf

      For Enemy2.ufo = Each ufo
         Enemy2\y=Enemy2\y+3
         DrawImage ufo,Enemy2\x,Enemy2\y
      Next
End Function


;Funktion Select Weapon und schießen

Function waffe()
   
   
      If KeyHit(56) Then waffe=waffe+1

         If waffe=4 Then waffe=1

            Select waffe

               Case 1
               If KeyHit(57) Then
                  TSchuss.schuss = New schuss
                  TSchuss\x=TPlayer\x-10
                  TSchuss\y=TPlayer\y+20
                  TSchuss\s_type= kugel
                  TSchuss\speed = 10
                  TSchuss\strength = 10
                  DrawImage kugel,TSchuss\x,TSchuss\y-40
               EndIf

               Case 2
               If KeyHit(57) Then
                  TSchuss.schuss = New schuss
                  TSchuss\x=TPlayer\x-10
                  TSchuss\y=TPlayer\y+20
                  TSchuss\speed = 20
                  TSchuss\s_type= laser
                  TSchuss\strength=50
                  DrawImage rocket,TSchuss\x,TSchuss\y-40
               EndIf

   
               Case 3
               If KeyHit(57)
                  TSchuss.schuss = New schuss
                  TSchuss\x=TPlayer\x-10
                  TSchuss\y=TPlayer\y+20
                  TSchuss\s_type= rocket
                  TSchuss\speed=6
                  TSchuss\strength=100
                  DrawImage rocket,TSchuss\x,TSchuss\y-40
               EndIf
         
            End Select
      
      For TSchuss.schuss = Each schuss
         TSchuss\y=TSchuss\y-TSchuss\speed
         DrawImage TSchuss\s_type,TSchuss\x,TSchuss\y-40


      Next

End Function

;Funktion Alien Dies

Function e1_dies()
   For TSchuss.schuss=Each schuss
      For Enemy1.alien=Each alien


         If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,alien,Enemy1\x,Enemy1\y,0) Then
            Enemy1\health=Enemy1\health-TSchuss\strength
            TSchuss\x=-100000
            If Enemy1\health <= 0 Then


               Local Timer=CreateTimer(58)
               Local Frame1Count
               Local Frame1Wait
               Local MS
               MS=MilliSecs()
   
               If MS>Frame1Wait Then
                  Frame1Count=(Frame1Count+1) Mod 4
                  Frame1Wait=MS+500
                  DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
               EndIf

               Enemy1\x=-1000000
               Enemy1\health=0

            EndIf
         EndIf



      Next
   Next

End Function

;Funktion Ufo Dies

Function e2_dies()
   For TSchuss.schuss=Each schuss
      For Enemy2.ufo=Each ufo

         If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,ufo,Enemy2\x,Enemy2\y,0) Then
            Enemy2\health=Enemy2\health-TSchuss\strength
            TSchuss\x=-10000
            If Enemy2\health <=0 Then

               Local timer=CreateTimer(58)
               Local Trame2Count
               Local Frame2Wait
               MS=MilliSecs()
   
               If MS>Frame1Wait Then
                  Frame2Count=(Frame2Count+1) Mod 4
                  Frame2Wait=MS+500
               EndIf
               DrawImage e2_death,Enemy2\x,Enemy2\y,Frame1Count 
               WaitTimer timer
               Enemy2\health=0
               Enemy2\x=-100000

            EndIf
         EndIf

      Next
   Next

End Function



;Funktion Player Dies

Function pl_dies()
   For Enemy1.alien=Each alien
   
   
         If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,alien,Enemy1\x,Enemy1\y,0) Then
            TPlayer\health=TPlayer\health-50
         EndIf

      Next
   

      For Enemy2.ufo=Each ufo
         
            If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,ufo,Enemy2\x,Enemy2\y,0) Then
               TPlayer\health=TPlayer\health-100
            EndIf
   
      Next
      
End Function


 





Nun funktionieren auch die death Animationen einigermaßen nur etwas zu schnell...


Das zweite Problem: Nach einer gewissen Zahl von "getöteten" Gegner zeigt das Spiel keine Rückmeldung... Liegt das vielleicht an den vielen ImagesCollide? Wenn ja wie und wodurch muss ich diese ersetzen?


PS: Wie machst du deine Codes im Forum immer so schön bunt? Das Gäbe euch noch einen besseren Überblick^^
  • Zuletzt bearbeitet von Chrissa am Do, Dez 31, 2009 11:48, insgesamt einmal bearbeitet

Nicdel

BeitragDo, Dez 31, 2009 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir den Code noch nicht so genau angeschaut, aber löschst du die Gegner auch mit Delete, nachdem sie gestorben sind?
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Chrissa

BeitragDo, Dez 31, 2009 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein. Da habe ich dann immer das Problem, dass dann nachdem man einen Gegner "getötet" hat, die Meldung kommt "Object does not exist". Das liegt daran, dass der ganze Type dann gelöscht wird... Deshalb "beame" ich sie aus dem Spielfeld.



Zu Beginn hat das Spiel nur angefangen zu laggen und seit heute "hängt" es sich auf ...

Nicdel

BeitragDo, Dez 31, 2009 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann solltest du dir eine Möglichkeit überlegen die Types etwas später zu löschen...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Lion

BeitragDo, Dez 31, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
eine variable auf 1 setzen.
Am ende der for schleife schauen, ob die auf 1 steht und dann delete machen, sonst versucht er noch was aus dem type zu lesen, jedoch ist es eben gelöscht. Am ende der schleife kann das nicht passieren...
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Midimaster

BeitragDo, Dez 31, 2009 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Tempo des Sterbens änderst Du mit dem Frame1Wait=MS+500. Die 500 sind 500msec, also eine halbe Sekunde. Höhere Werte und deine Figuren "leben " länger.

Das Hervorheben des Textes hier im Forum ist ganz leicht. Du nimmst immer den [Code]-Tag, um Code freizustellen. Wir nehmen immer den [BB]-Tag. Alles andere geht automatsich.

Außerdem mal ein Riesenlob an Chrissa:

Der Code sieht jetzt sowas von professionell aus!!! Behalte Dir diesen Stil bei! Very Happy

Veränderungen und Erweiterungen werde jetzt leichter möglich sein als vorher.

Chrissa

BeitragDo, Dez 31, 2009 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich jetzt mal probiert. Aufhängen tut es sich immer noch... Außerdem werden dann alle anderen aliens, die "gespawnt" sind ebenfalls gelöscht... Das gleich bei den Ufos...

Midimaster

BeitragDo, Dez 31, 2009 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
bitte neuesten code!!!

und ich bleib dabei: bei der Kollision sollten keine Sterbeszenen erfolgen. Das muss, wenn überhaupt dort, nach dem ForNext-Schleifen sein.
Merk Dir bei der Kollision irgendwie, dass eine Kollision stattgefunden hat und greife später auf diese Information zu.

schau mal, was ich dir heute nacht 22:54 noch geschrieben hatte.


ich werfe dann gleich mal einen Blick auf deinen code, hätte aber weiterhin gerne, dass alles "Zeichnen auf den Bildschirm" in eine eigene Routine kommt:

Function MaleScreen
- Hintergrund zeichnen
- alle Alien zeichnen
- Ufos zeichnen
- Spieler zeichnen
End Function

Auf die DRAWIMAGE in den Geburts- und Sterbe-Momenten kannst Du dann 100% verzichten. Probiers!

Chrissa

BeitragFr, Jan 15, 2010 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
sry dass ich so lange nich da war. aber ich hatte einfach nich mehr die Lust gehabt weiter zu machen Laughing

Aber jetzt bin ich ja wieder da und ich kann eure Hilfe iummer noch gut gebrauchen Smile

ich hab jetzt deinen Rat befolgt Midimaster. Es gibt jetzt die Funktion Draw. Nur weiß ich nicht ganz was mir das dann bringen soll. is ja immer noch das selbe...

BlitzBasic: [AUSKLAPPEN]
;Funktion Screen malen

Function draw()
Cls

DrawImage space,1280/2,1024/2

DrawImage shuttle,TPlayer\x,TPlayer\y

For Enemy1.alien = Each alien
Enemy1\y=Enemy1\y+5
DrawImage alien,Enemy1\x,Enemy1\y
Next


For Enemy2.ufo = Each ufo
Enemy2\y=Enemy2\y+3
DrawImage ufo,Enemy2\x,Enemy2\y
Next

End Function



So richtig?

NightPhoenix

BeitragSa, Jan 16, 2010 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest lieber nicht dein Typ "alien" und dem Bild "alien" gleiche Namen geben!
Zeichne die Bilder innerhalb des Types selbst, oder bleibt es für alle Typeinträge bei dem einen Bild eine feste Variable.

Also entweder innerhalb des Types:

BlitzBasic: [AUSKLAPPEN]
Alienbild=LoadImage(...)

For i=1 To 10
Enemy1.alien = New alien
Enemy1\bild=Alienbild
Next

For Enemy1.alien = Each alien
Enemy1\y=Enemy1\y+5
DrawImage Enemy1\bild,Enemy1\x,Enemy1\y
Next


oder eben ohne ein Typ-Field extra für das Bild.

BlitzBasic: [AUSKLAPPEN]
Alienbild=LoadImage(...)

For i=1 To 10
Enemy1.alien = New alien
Next

For Enemy1.alien = Each alien
Enemy1\y=Enemy1\y+5
DrawImage Alienbild,Enemy1\x,Enemy1\y
Next

Midimaster

BeitragSa, Jan 16, 2010 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, was bringt es, wenn ich Malen und Aktionen voneinander trenne?

Zunächst verstehst Du mehr den Ablauf von Computerspielen. Die Dinge, die du da gerade trennst sind nur logisch getrennt, nicht aber zeitlich. Das heißt alles passiert weiterhin in einer 1/60 sec : Geburten - Leben - Veränderungen - Bewegungen - Schüsse -Sterben - alles in der selben 1/60-sec. Alle die beteiligt sind nennen wir mal Akteure.

Und am Ende kommt die große Zeichenroutine Draw(), die die neue Situation auf den Bildschirm bringt. Bis dahin sieht der User den alten Zustand von vor einer 1/60-sec. Von den Veränderungen in den Action-Routinen bekommt er zunächst nichts mit und plötzlich ist der neue Zustand (von allen Akteuren) da.

Aber in diese Zeichenroutine gehört alle hinein. Wo sind die Schüsse? Auch sie wollen gezeichnet werden! Ja, auch Schüsse leben! Filmtechnisch gesehen sind sie Akteure wie die Aliens. Streng genommen shuttle_fire auch! Und DeinGameOver ist auch nur eines der Akteure in dem Spiel.

Es ist wie ein Film. Der läuft und läuft und wenn sich nichts ändert siehtst Du immer das selbe Bild. Aber jede 1/60-sec neu. Wenn Du das verstanden hast, kannst Du nun anfangen, Dinge geschehen zu lassen und Ihnen einen zeitlichen Rahmen vorgeben.

Die Technik ist dabei immer die gleiche: Ein Akteuer kann von der Draw() nicht gezeichnet werden weil seine Zeitvariabe Null ist. Beispiel ShuttleFire:
BlitzBasic: [AUSKLAPPEN]
      If ShuttleFireZeit > MilliSecs() Then
DrawImage shuttle_fire,TPlayer\x-4,TPlayer\y+55
EndIf
kein Zeichnen, weil ja ShuttleFireZeit leider 0 ist.

Eine Aktion setzt nun diese Zeitvariable auf Millisecs() +300. Und schon lebt der Akteuer für 0.3 sec in der Draw()-Routine.
BlitzBasic: [AUSKLAPPEN]
      If KeyDown(200)
TPlayer\y=TPlayer\y-8
ShuttleFireZeit = MilliSecs()+300
EndIf
If ShuttleFireZeit > MilliSecs() Then
DrawImage shuttle_fire,TPlayer\x-4,TPlayer\y+55
EndIf

Drückst Du nun dauerhaft Key200 wird ShuttleFireZeit immer wieder auf Millisecs()+300 erhöht und das Zeichnen hört nicht auf. Lässt du nun Key200 los, brennt das ShuttleFire 300msec nach.

z.B Die Geburt neuer Gegner. Regle sie durch einen Timer.

Du schreibst:
Zitat:
Function AlienSpawn()
count_en = count_en +1
If count_en >=100 Then
count_en=0
Enemy1.alien=New alien
...



besser wäre aber:
BlitzBasic: [AUSKLAPPEN]
Function AlienSpawn()
If MilliSecs() < AlienZeit Then
AlienZeit = MilliSecs() + 4000 ; für "alle 4 sec eine neue Geburt"
Enemy1.alien=New alien
...


Ebenso kannst Du das GameOver zum Leben erwecken:

du schreibst:
Zitat:
If TPlayer\health <=0 Then
DrawImage Gameover,1280/2,1024/2
WaitKey

EndIf



besser so 2-teilig:
in der PlayerDies:
BlitzBasic: [AUSKLAPPEN]
   If TPlayer\health <=0 Then
GameOverZeit=MilliSecs()+5000
EndIf

und in der Zeichenroutine Draw():
BlitzBasic: [AUSKLAPPEN]
      If  GameOverZeit > MilliSecs() Then
DrawImage Gameover,1280/2,1024/2
EndIf



du schreibst:
Zitat:
If ImagesCollide(TSchuss\s_type,TSchuss\x,TSchuss\y,0,alien,Enemy1\x,Enemy1\y,0) Then
....
If Enemy1\health <= 0 Then
Local Timer=CreateTimer(58)
Local Frame1Count
Local Frame1Wait
Local MS
MS=MilliSecs()

If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
EndIf


besser so:
BlitzBasic: [AUSKLAPPEN]
   If Enemy1\health <= 0 Then
Enemy1\SterbeZeit = MilliSecs() + 5000
EndIf

und in der Draw()
BlitzBasic: [AUSKLAPPEN]
For Enemy1.alien = Each alien
If Enemy1\SterbeZeit < MilliSecs() Then
DrawImage alien,Enemy1\x,Enemy1\y
Else
If Frame1Wait < MilliSecs() Then
Frame1Wait=MilliSecs()+500
Frame1Count=(Frame1Count+1) Mod 4
EndIf
DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
EndIf
Next



Jetzt zu den SystemTimern:

Zitat:
Local Timer=CreateTimer(58)

Da hast du was total falsch verstanden. Diesen Timer setzt du ein, damit das Spiel auf jedem Rechner immer gleich schnell läuft und wenig Systemperformance verbraucht. Fürs erste lässt du ihn weg und erreichtst eine Gleichmäßgikeit auch durch ein FLIP 1 wo jetzt in der Hauptschleife ein FLIP steht.



Jetzt noch was zu dem "Object does not exist"

In einer Schleife FOR/EACH/NEXT rufst du alle Enemys auf:
BlitzBasic: [AUSKLAPPEN]
For Enemy1.alien=Each alien
.....
Next


Die Variable Enemy1 steht während dieser Zeit immer für den einen Enemy, der gerade dran ist.
BlitzBasic: [AUSKLAPPEN]
For Enemy1.alien=Each alien
Enemy1\health=Enemy1\health-TSchuss\strength
If Enemy1\health <= 0 Then
....
Next


Wenn Du den mitten in der Schleife mit DELETE entfernst, darfst du ihn natürlich in den Zeilen danach (bis NEXT) nicht mehr verwenden:
BlitzBasic: [AUSKLAPPEN]
For Enemy1.alien=Each alien
Enemy1\health=Enemy1\health-TSchuss\strength
If Enemy1\health <= 0 Then
Delete Enemy1
EndIf
;--------------- böses Foul: ------------------
DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
; ^^^^^^ ^^^^^^
Next
  • Zuletzt bearbeitet von Midimaster am So, Jan 17, 2010 0:02, insgesamt einmal bearbeitet

Jamagin

BeitragSa, Jan 16, 2010 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

For Enemy1.alien = Each alien
   Enemy1\health = Enemy1\health-TSchuss\strength
   If Enemy1\health <= 0 Then
      Delete Enemy1
      EXIT                                 ;<<<< Zauberwort Exit
   else
      DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
   endif
Next


Ein Exit bewirkt Wunder...


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragSa, Jan 16, 2010 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Exit ist da komplett Falsch.
Wenn man 100 aliens hat, und das erste wird gelöscht, wird der gesamte Rest weder bearbeitet noch gezeichnet. Continue - also zum Kopf der Schleife Springen - bräuchte man; Da das in BB nicht geht, benutzt man halt ein paar Bedingungen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragSa, Jan 16, 2010 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres!

Okay, in diesem Fall hast du Recht.

Dann eben zwei Funktionen - eine fürs Deleten inkl. des Exites und eine für das Neuzeichnen...!

Code: [AUSKLAPPEN]

Function SpielerDead()
   For Spieler.TSpieler = Each TSpieler
      If ImagesOverlap oder ImagesCollide...
         Delete Spieler
         Exit
      endif
   next
End Function

Function UpdateSpieler()
   For Spieler.TSpieler = Each TSpieler
      Drawimage blabla...
   Next
End Function


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Midimaster

BeitragSa, Jan 16, 2010 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist doch meine Rede: Genau das habe ich ihm geraten und deshalb dieses schreckliche Beispiel hergenommen. Keine Tricks! Das beste ist, er trennt Aktionen und Zeichnen.

Jamagin

BeitragSa, Jan 16, 2010 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster

Jep! Genau so ist es und nicht anders!!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Nicdel

BeitragSa, Jan 16, 2010 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Exit passt aber immernoch nicht ganz. Wenn jetzt der erste Spieler kollidiert, wird der Rest nicht mehr überprüft...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Jamagin

BeitragSa, Jan 16, 2010 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nicdel

Welcher Rest??

Die Schleife wird permanent aufgerufen und das Exit veranlasst ja nur die Funktion zu verlassen. Was soll denn nach dem Exit noch geprüft werden??
Da es eine Typeliste ist, betrifft es ja immer den Spieler der die Collision auslöst, also wenn 50 Spieler kollidieren, dann wird das eben 50x geprüft...


lg. Jamagin Cool

NB: Soll ich einen Spielcode posten wo ich das so gemacht hab?
Bevor du etwas neues beginnst, erledige das alte

mpmxyz

BeitragSa, Jan 16, 2010 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@Jamagin
Wenn aber dann zwei Spieler gleichzeitig sterben müssten, stirbt nur einer und die anderen überleben bis zum nächsten Frame.
Wenn es dann viele Spieler gibt und entsprechend viele Tote pro Sekunde gibt, kann es im Ernstfall passieren, dass es "unsterbliche" Spieler, die hinten in der Liste sind, gibt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group