Spawn Algorythmus vereinfachen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

worschtbrot

Betreff: Spawn Algorythmus vereinfachen

BeitragDo, Okt 11, 2012 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebes Forum,
ich habe ein Funktionierendes System für das Spawnen meiner Gegner, aber ich bin damit nicht zufrieden.
Das ganze Funktioniert so:
Ich habe eine Varriable, die die Status des Levels angibt. Nach einem bestimmten Intervall wird dann eine Funktion aufgerufen die auf Grundlage dieser Variable einen bestimmten Gegner spawnen soll. Danach wird sie um eins erhöht.
Wenn ich das ganze über "Switch Case" laufen lasse wird es mir schnell zu unübersichtlich, aber mit "If" produziere ich einfach nur Massen an Code.
Habe noch keine Lösung dafür gefunden hat vielleicht jemand anders eine Idee?

Danke schon mal im Vorraus.
 

BBPro2

BeitragDo, Okt 11, 2012 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
zunächst:

Bitte:
Algorithmus, Algorithmus, Algorithmus !
Das Ding hat nichts mit dem Rhythmus zu tun.


zu deinem Problem:

wenn ich dich richtig verstehe geht es darum, dass nach x Sekunden Gegner A spawnen soll,
nach y Sekunden Gegner B, etc. ?
Ohne direkt Wiederholungen des Schemas.
In dem Fall wäre es z.B. sinnvoll ein Level in eine Datei auszulagern mit dem Schema

sec
#enemy
sec
#enemy
sec
#enemy
.
.
.

Nun liest du nach und nach immer 2 Werte ein (1x sec, 1x #enemy) und wenn "sec" Sekunden rum
sind spawnst du den Gegner "#enemy" - und liest die nächsten 2 Werte ein.

Das wäre ein möglicher Ansatz.

Ansonsten wäre etwas von deinem Code sicher hilfreich

Midimaster

BeitragDo, Okt 11, 2012 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder so:

Jeder Gegner bekommt eine zweite Variable mit, in der bereits zu Beginn seines Lebens sein "Fälligskeitsdatum" festgelegt wird. Nun wird mit einem Timer ein Intervall festgelegt und dann werden jedesmal alle Gegner durchgegaqngen und wer "fällig" ist darf sich ... was auch immer....

Da ist dann nur eine IF-Abfrage für alle Gegner nötig

Die Gegner sind ein Array oder noch besser Typen
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDo, Okt 11, 2012 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hört sich im simpelsten Fall für einen Fall für mod an.

BlitzBasic: [AUSKLAPPEN]
Global Level%
Const Enemy_count=3
Global g$[Enemy_count]
g[0]="zombie"
g[1]="monster"
g[2]="alien"

For Level=0 To 10
Print("Level ("+Level+"): "+GetEnemy())
Next

WaitKey()
End

Function GetEnemy$()
Local enemy = Level Mod Enemy_count
Return g[enemy]
End Function
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)

worschtbrot

BeitragDi, Okt 16, 2012 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay da ich mit den bisherigen Vorschlägen leider noch nicht so viel anfangen kann, versuche ich einfach mal meinen Algorithmus ( Wink ) für das Spawnen in Pseudocode zu verdeutlichen:
Code: [AUSKLAPPEN]
funktion spawnen(levelstatus)
    if levelstatus = 1 then
        SpawneGegner(gegnertyp 1, oben links)
    elseif levelstatus = 2 then
        SpawneGegner(gegnertyp 3, unten links)
...
funktion ende


Meine Gegner sind Objekte/Types und die Funktion "SpawneGegner" wertet noch einige zusätzliche Variablen aus und erzeugt im Endeffekt ein neues Gegnerobjekt an einer bestimmten Position, von einem bestimmten Typ usw.
Nebenbei sei bemerkt, dass ich meine 13 verschiedenen Gegner alle über nur dieses eine Gegnerobjekt laufen lasse.

Xeres

Moderator

BeitragDi, Okt 16, 2012 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte poste doch richtigen Code und am liebsten auch den Type. Damit fühle ich mich so schlau wie zu vor.
Wenn du alles vom Levelstatus abhängig machst, nimm einen switch case und packe die Anweisungen in eine Liste/Datei/Data/Array.
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)

Eingeproggt

BeitragDi, Okt 16, 2012 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfach die Ifs umschreiben und als Select-Case schreiben is keine Lösung find ich.
Wie wärs mit Arrays?
Also sowas in der Art:
Code: [AUSKLAPPEN]
Dim level_gegner(10)
level_gegner(0)=1 ;entspricht "Gegnertyp 1"
;...
Dim level_gegner_x(10)
level_gegner_x(0)=0 ;entspricht "links"
;...
Dim level_gegner_y(10)
level_gegner_y(0)=0 ;entspricht "oben"
;...

usw.
Natürlich nur am Anfang festlegen und dann später beim Gegner spawnen "benutzen" diese Daten.
Wie du diese Daten genau organisierst, verarbeitest und ob du sie eventuell wie BBPro2 vorgeschlagen hat in ne Datei auslagerst sei dir überlassen.

Also als letzten Denkanstoß, die Verwendung wäre dann:
Code: [AUSKLAPPEN]
SpawneGegner(level_gegner(levelstatus), level_gegner_x(levelstatus), level_gegner_y(levelstatus))


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Xeres

Moderator

BeitragDi, Okt 16, 2012 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Multiple Arrays? Uäh... Wenn nicht alles aus einem String Array kommt, dann doch lieber ein Type-Array.
Oder alles andere.
Nur genau nicht so.
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)

worschtbrot

BeitragDi, Okt 16, 2012 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, mein Code umfasst derzeit so um die 15000 Zeilen. Aber wenn es euch hilft sind die die relevanten Codeabschnitte, viel Spass Razz :

Die Spawnfunktion:
Code: [AUSKLAPPEN]
Global levelstate:Int
Global spawntimer:Int
Global spawnspeed:Int = 60
Global zfall:Int
Function Spawning()
   spawntimer = spawntimer + 1
   If spawntimer = spawnspeed Then
      spawntimer = 0
      Select GAMEMODE
         Case 0
            If levelstate = 0 And nr_eny < 5 Then
               Spawn_Enemys(1,10,10,255,0)
               If score >= 500 Then levelstate = levelstate + 1
            ElseIf levelstate = 1 And nr_eny < 5 Then
               zfall = Rand(0,20)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               Else
                  Spawn_Enemys(2,255,255,10,0)
               EndIf
               If score >= 1500 Then levelstate = levelstate + 1
            ElseIf levelstate = 2 Then
               If nr_eny = 0 Then
                  levelstate = levelstate + 1
                  spawnspeed = 30
                  zfall = 0
               EndIf
            ElseIf levelstate = 3 Then
               zfall = zfall + 1
               Spawn_Enemys(3,Bg.r,Bg.g,Bg.b,0)
               If zfall = 10 Then
                  levelstate = levelstate + 1
                  spawnspeed = 60
               EndIf
            ElseIf levelstate = 4 And nr_eny < 10 Then
               zfall = Rand(0,25)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               Else
                  Spawn_Enemys(3,10,255,10,0)
               EndIf
               If score >= 3000 Then levelstate = levelstate + 1
            ElseIf levelstate = 5 And nr_eny < 14 Then
               zfall = Rand(0,30)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               Else
                  Spawn_Enemys(3,10,255,10,0)
               EndIf
               If score >= 5000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 1
                  menue_alpha = 0.99
                  If menue_p < 0 Then menue_p = menue_p*-1
               EndIf
            ElseIf levelstate = 6 Then 'Warnung Anzeigen
               SetImageFont(font3)
               menue_alpha = menue_alpha + menue_p
               If menue_alpha >= 1 Or menue_alpha <= 0.4 Then menue_p = menue_p*-1
               SetColor 255,0,0
               SetAlpha menue_alpha
               DrawText "WARNING",320*res_scale_x,268*res_scale_y
               If menue_alpha >= 1 Then Sound(sound_alarm)
               SetColor 255,255,255
               SetAlpha 1
               SetImageFont(font1)
               If nr_eny = 0 Then levelstate = levelstate + 1
            ElseIf levelstate = 7 Then
               levelstate = levelstate + 1
               Spawn_Enemys(1,10,10,255,1)
            ElseIf levelstate = 8 And nr_eny = 0 Then
               levelstate = levelstate + 1
               spawnspeed = 60
            ElseIf levelstate = 9 And nr_eny < 14 Then
               zfall = Rand(0,30)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               Else
                  Spawn_Enemys(3,10,255,10,0)
               EndIf
               If score >= 7500 Then levelstate = levelstate + 1
            ElseIf levelstate = 10 And nr_eny < 14 Then
               zfall = Rand(0,40)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               Else
                  Spawn_Enemys(5,10,255,255,0)
               EndIf
               If score >= 12500 Then
                  levelstate = levelstate + 1
               EndIf
            ElseIf levelstate = 11 And nr_eny = 0 Then
               If nr_eny = 0 Then
                  levelstate = levelstate + 1
                  spawnspeed = 30
                  zfall = 0
               EndIf
            ElseIf levelstate = 12 Then
               zfall = zfall + 1
               Spawn_Enemys(10,Bg.r,Bg.g,Bg.b,0)
               If zfall = 10 Then
                  levelstate = levelstate + 1
                  spawnspeed = 60
               EndIf
            ElseIf levelstate = 13 And nr_eny < 20 Then
               zfall = Rand(0,45)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               ElseIf zfall <= 40
                  Spawn_Enemys(10,127,10,255,0)
               Else
                  Spawn_Enemys(5,10,255,255,0)
               EndIf
               If score >= 20000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 30
                  zfall = 0
               EndIf
            ElseIf levelstate = 14 And nr_eny <= 0 Then
               levelstate = levelstate + 1
            ElseIf levelstate = 15 Then
               zfall = zfall + 1
               Spawn_Enemys(1,Bg.r,Bg.g,Bg.b,2)
               If zfall = 10 Then
                  Spawn_Enemys(6,Bg.r,Bg.g,Bg.b,2)
                  levelstate = levelstate + 1
                  spawnspeed = 40
               EndIf
            ElseIf levelstate = 16 And nr_eny <= 20 Then
               zfall = Rand(0,50)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               ElseIf zfall <= 40
                  Spawn_Enemys(10,127,10,255,0)
               ElseIf zfall <= 45
                  Spawn_Enemys(6,255,127,10,0)
               Else
                  Spawn_Enemys(5,10,255,255,0)
               EndIf
               If score >= 25000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 1
                  zfall = 0
               EndIf
            ElseIf levelstate = 17 Then
               SetImageFont(font3)
               menue_alpha = menue_alpha + menue_p
               If menue_alpha >= 1 Or menue_alpha <= 0.4 Then menue_p = menue_p*-1
               SetColor 255,0,0
               SetAlpha menue_alpha
               DrawText "WARNING",320*res_scale_x,268*res_scale_y
               If menue_alpha >= 1 Then Sound(sound_alarm)
               SetColor 255,255,255
               SetAlpha 1
               SetImageFont(font1)
               If nr_eny = 0 Then levelstate = levelstate + 1
            ElseIf levelstate = 18 Then
               levelstate = levelstate + 1
               spawnspeed = 45
               Spawn_Enemys(2,255,255,10,1)
               Spawn_Enemys(5,10,255,255,2)
            ElseIf levelstate = 19 And nr_eny <= 20 Then
               zfall = Rand(0,35)
               If zfall <= 10 Then
                  Spawn_Enemys(10,127,10,255,0)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(6,255,127,10,0)
               Else
                  Spawn_Enemys(3,10,255,10,0)
               EndIf
               If score >= 32000 And nr_eny = 0 Then
                  levelstate = levelstate + 1
                  zfall = 0
               EndIf
            ElseIf levelstate = 20 Then
               zfall = zfall + 1
               Spawn_Enemys(13,Bg.r,Bg.g,Bg.b,0)
               If zfall = 10 Then
                  levelstate = levelstate + 1
                  spawnspeed = 50
               EndIf
            ElseIf levelstate = 21 And nr_eny <= 20 Then
               zfall = Rand(0,60)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,2)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               ElseIf zfall <= 40
                  Spawn_Enemys(10,127,10,255,0)
               ElseIf zfall <= 50
                  Spawn_Enemys(6,255,127,10,0)
               ElseIf zfall <= 55
                  Spawn_Enemys(5,10,255,255,2)
               Else
                  Spawn_Enemys(13,255,10,10,0)
               EndIf
               If score >= 38000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 45
               EndIf
            ElseIf levelstate = 22 And nr_eny <= 20 Then
               zfall = Rand(0,80)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,2)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               ElseIf zfall <= 40
                  Spawn_Enemys(10,127,10,255,0)
               ElseIf zfall <= 50
                  Spawn_Enemys(6,127,10,255,0)
               ElseIf zfall <= 60
                  Spawn_Enemys(5,10,255,255,2)
               ElseIf zfall <= 60
                  Spawn_Enemys(13,10,255,255,0)
               Else
                  Spawn_Enemys(8,10,255,255,0)
               EndIf
               If score >= 45000 Then
                  levelstate = levelstate + 1
               EndIf
            ElseIf levelstate = 23 And nr_eny <= 25 Then
               zfall = Rand(0,50)
               If zfall <= 20 Then
                  Spawn_Enemys(1,10,10,255,2)
               ElseIf zfall <= 40
                  Spawn_Enemys(2,255,255,10,2)
               Else
                  Spawn_Enemys(8,10,255,255,2)
               EndIf
               If score >= 50000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 1
                  zfall = 0
               EndIf
            ElseIf levelstate = 24
               SetImageFont(font3)
               menue_alpha = menue_alpha + menue_p
               If menue_alpha >= 1 Or menue_alpha <= 0.4 Then menue_p = menue_p*-1
               SetColor 255,0,0
               SetAlpha menue_alpha
               DrawText "WARNING",320*res_scale_x,268*res_scale_y
               If menue_alpha >= 1 Then Sound(sound_alarm)
               SetColor 255,255,255
               SetAlpha 1
               SetImageFont(font1)
               If nr_eny = 0 Then
                  levelstate = levelstate + 1
                  zfall = 0
                  spawnspeed = 50
               EndIf
            ElseIf levelstate = 25
               zfall = zfall + 1
               If zfall = 2 Then
                  Spawn_Enemys(2,255,255,10,1)
                  levelstate = levelstate + 1
                  spawnspeed = 45
               Else
                  Spawn_Enemys(1,10,10,255,1)
               EndIf
            ElseIf levelstate = 26 And nr_eny <= 20 Then
               zfall = Rand(0,80)
               If zfall <= 10 Then
                  Spawn_Enemys(1,10,10,255,2)
               ElseIf zfall <= 20
                  Spawn_Enemys(2,255,255,10,0)
               ElseIf zfall <= 30
                  Spawn_Enemys(3,10,255,10,0)
               ElseIf zfall <= 40
                  Spawn_Enemys(10,127,10,255,0)
               ElseIf zfall <= 50
                  Spawn_Enemys(6,127,10,255,0)
               ElseIf zfall <= 60
                  Spawn_Enemys(5,10,255,255,2)
               ElseIf zfall <= 60
                  Spawn_Enemys(13,10,255,255,0)
               Else
                  Spawn_Enemys(8,10,255,255,0)
               EndIf
               If score >= 70000 Then
                  levelstate = levelstate + 1
                  spawnspeed = 1
                  zfall = 0
               EndIf
            ElseIf levelstate = 27
               SetImageFont(font3)
               menue_alpha = menue_alpha + menue_p
               If menue_alpha >= 1 Or menue_alpha <= 0.4 Then menue_p = menue_p*-1
               SetAlpha menue_alpha
               DrawText "End of Demo Version",150*res_scale_x,268*res_scale_y
               SetImageFont(font1)
            EndIf
         Case 1
            'Relevant für 2ten Spielmodus
      End Select
   EndIf
End Function


Die Gegnererstellungsfunktion:
Code: [AUSKLAPPEN]
Function Spawn_Enemys(styp,sred,sgreen,sblue,art)
   Local spd#
   Local spx
   Local spy
   If art = 0
      Local spawnedge
      Local disedge
      'Disedge Optionen
      '  0  |  1
      '  2  |  3
      'Disedge ist die Ecke welcher der Spieler am nächsten ist, an dieser sollen keine Gegner gespawnt werden.
      If MainPlayer.x >= 400*res_scale_x Then
         If MainPlayer.y >= 300*res_scale_y Then   
            disedge = 3
         Else
            disedge = 1
         EndIf
      Else
         If MainPlayer.y >= 300*res_scale_y Then
            disedge = 2
         Else
            disedge = 0
         EndIf
      EndIf
      Select styp
         Case 1
            spd = Rnd(1,3)
         Case 2
            spd = 1.5
         Case 3
            spd = Rnd(1.25,1.75)
         Case 4
            spd = Rnd(1.5,2.25)
         Case 5
            spd = 0
         Case 6
            spd = 5
         Case 7
            spd = 0
         Case 8
            spd = 1
         Case 9
            spd = 0
         Case 10
            spd = 1.5
         Case 13
            spd = 1.5
      End Select
      Repeat
         spawnedge = Rand(0,3)
      Until spawnedge <> disedge
      Select spawnedge
         Case 0
            Enemy.Create(styp,50*res_scale_x,50*res_scale_y,sred,sgreen,sblue,135,135,spd)
         Case 1
            Enemy.Create(styp,WIDTH-(50*res_scale_x),50*res_scale_y,sred,sgreen,sblue,225,225,spd)
         Case 2
            Enemy.Create(styp,50*res_scale_x,HEIGHT-(50*res_scale_y),sred,sgreen,sblue,45,45,spd)
         Case 3
            Enemy.Create(styp,WIDTH-(50*res_scale_x),HEIGHT-(50*res_scale_y),sred,sgreen,sblue,315,315,spd)
      End Select
   ElseIf art = 1
      Select styp
         Case 1
            spd = 1
         Case 2
            spd = 1
         Case 3
            spd = 1.25
         Case 4
            spd = 1.5
         Case 5
            spd = 0
         Case 6
            spd = 5
         Case 7
            spd = 0
         Case 8
            spd = 1
         Case 9
            spd = 0
         Case 10
            spd = 1
      End Select
      For i = 0 To 342 Step 18
         spx = MainPlayer.x*res_scale_x-(Cos(i+90)*270*res_scale_x)
         spy = MainPlayer.y*res_scale_y-(Sin(i+90)*270*res_scale_y)
         If spx < (16*res_scale_x) Then spx = (16*res_scale_x)
         If spx > WIDTH-(16*res_scale_x) Then spx = WIDTH-(16*res_scale_x)
         If spy < (16*res_scale_y) Then spy = (16*res_scale_y)
         If spy > HEIGHT-(16*res_scale_y) Then spy = HEIGHT-(16*res_scale_y)
         Enemy.Create(styp,spx,spy,sred,sgreen,sblue,-1,-1,spd)
      Next
   ElseIf art = 2
      Select styp
         Case 1
            spd = 1
         Case 2
            spd = 1.5
         Case 3
            spd = 1.25
         Case 4
            spd = 1.5
         Case 5
            spd = 0
         Case 6
            spd = 5
         Case 7
            spd = 0
         Case 8
            spd = 1
         Case 9
            spd = 0
         Case 10
            spd = 1
      End Select
      Enemy.Create(styp,50*res_scale_x,50*res_scale_y,sred,sgreen,sblue,135,135,spd)
      Enemy.Create(styp,WIDTH-(50*res_scale_x),50*res_scale_y,sred,sgreen,sblue,225,225,spd)
      Enemy.Create(styp,50*res_scale_x,HEIGHT-(50*res_scale_y),sred,sgreen,sblue,45,45,spd)
      Enemy.Create(styp,WIDTH-(50*res_scale_x),HEIGHT-(50*res_scale_y),sred,sgreen,sblue,315,315,spd)
   EndIf
End Function


Der Typ Enemy
Code: [AUSKLAPPEN]
Type Enemy
   Field x#
   Field y#
   Field rot#
   Field dir#
   Field speed#
   Field typ
   Field r,g,b
   Field v1#,v2#,v3#,v4#,v5#,v6#,v7#

   Method Move()
      If typ <> 2 And typ <> 7 And typ <> 15 Then
         rot = rot + 2
         If typ <> 9 Then
            If rot = 90 Then rot = 0
         Else
            If rot >= 360 Then rot = (rot+360)Mod 360
         EndIf
      EndIf
      If typ <> 4 And typ <> 6 And typ <> 7 And typ <> 15 Then
         temp_dir# = (ATan2(y-MainPlayer.y,x-MainPlayer.x)+270)Mod 360
      EndIf
      Local p:Enemy
      Select typ
         Case 1,10,14
            w# = winkeldiff(dir,temp_dir)
            If w# < 0 Then
               dir = dir - 2
            ElseIf w# > 0 Then
               dir = dir + 2
            EndIf
         Case 2
            w# = winkeldiff(dir,temp_dir)
            If w# < 0 Then
               dir = dir - 1.5
            ElseIf w# > 0 Then
               dir = dir + 1.5
            EndIf
            v1 = v1 + v2
            If v1 <= -0.37 Then
               v2 = 0.01
               v1 = 0
            ElseIf v1 >= 1 Then
               v2 = -0.01
               v1 = 1
            EndIf
         Case 3
            w# = winkeldiff(dir,temp_dir)
            If w# < 0 Then
               dir = dir - 0.2
            ElseIf w# > 0 Then
               dir = dir + 0.2
            EndIf
         Case 5
            v1 = v1 + v2
            If v1 <= 1 Then
               v1 = 1
               v2 = 1.5
               speed = 10
            ElseIf v1 >= 60 Then
               v1 = 60
               v2 = -0.5
               speed = 0
            EndIf
            If speed = 0 Then dir = temp_dir
         Case 6
            v5 = v3
            v6 = v4
            v3 = x
            v4 = y
            If x < (48*res_scale_x) Then
               w# = winkeldiff(dir,90)
               If w# < 0 Then
                  dir = dir - 3
               ElseIf w# > 0 Then
                  dir = dir + 3
               EndIf
               v7 = 0
            ElseIf x > WIDTH-(48*res_scale_x) Then
               w# = winkeldiff(dir,270)
               If w# < 0 Then
                  dir = dir - 3
               ElseIf w# > 0 Then
                  dir = dir + 3
               EndIf
               v7 = 0
            ElseIf y < (48*res_scale_y) Then
               w# = winkeldiff(dir,180)
               If w# < 0 Then
                  dir = dir - 3
               ElseIf w# > 0 Then
                  dir = dir + 3
               EndIf
               v7 = 0
            ElseIf y > HEIGHT-(48*res_scale_y) Then
               w# = winkeldiff(dir,0)
               If w# < 0 Then
                  dir = dir - 3
               ElseIf w# > 0 Then
                  dir = dir + 3
               EndIf
               v7 = 0
            Else
               Local rr = Rand(0,25)
               If rr = 11 Then
                  If v7 = 0 Then
                     rr = Rand(0,50)
                     If rr <= 25 Then
                        v7 = -1
                     Else
                        v7 = 1
                     EndIf
                  Else
                     v7 = 0
                  EndIf
               EndIf
               dir = dir + (3*v7)
            EndIf
         Case 7
            v5 = v3
            v6 = v4
            self.v3 = self.x
            self.v4 = self.y
            If self.v2 = 0 Then
               For p=EachIn ENEMY_LIST
                  If p.typ = 6 And p.v1 = self.v1 Then
                     self.x = p.v5
                     self.y = p.v6
                  EndIf
               Next
            Else
               For p=EachIn ENEMY_LIST
                  If p.typ = 7 And p.v1 = self.v1 And p.v2 = self.v2 - 1 Then
                     self.x = p.v5
                     self.y = p.v6
                  EndIf
               Next
            EndIf
         Case 8
            dir = temp_dir
            speed = 2.8
            For p=EachIn ENEMY_LIST
               If p.typ = 9 And p.v1 = self.v1 Then
                  speed = speed - 0.3
               EndIf
            Next
         Case 9
            For p=EachIn ENEMY_LIST
               If p.typ = 8 And p.v1 = self.v1 Then
                  x = p.x - Cos(rot-90)*16*res_scale_x
                  y = p.y - Sin(rot-90)*16*res_scale_y
               EndIf
            Next
         Case 11
            w# = winkeldiff(dir,temp_dir)
            If w# < 0 Then
               dir = dir - 1
            ElseIf w# > 0 Then
               dir = dir + 1
            EndIf
         Case 13
            temp_dir = (temp_dir+180+360)Mod 360
            w# = winkeldiff(temp_dir,MainPlayer.dir)
            temp_dir = (temp_dir-180+360)Mod 360
            If w# < 0 And w# > -20 Then
               dir = dir - 2
            ElseIf w# >= 0 And w# < 20 Then
               dir = dir + 2
            Else
               w# = winkeldiff(dir,temp_dir)
               If w# < 0 Then
                  dir = dir - 1
               ElseIf w# > 0 Then
                  dir = dir + 1
               EndIf
            EndIf
            v1 = v1 - 1
            If v1 = 0 Then
               For i = 1 To Rand(9,14)
                  Partikel.Create(x,y,r,g,b,0,359)
               Next
               spnspeed# = 4
               For i = 0 To 5
                  spawnwinkel# = ((i*60)+360)Mod 360
                  Enemy.Create(14,x-(Cos(spawnwinkel)*12),y-(Sin(spawnwinkel)*12),r,g,b,rot,spawnwinkel,spnspeed#)
               Next
               ENEMY_LIST.Remove(Self)
            ElseIf v1 < 60 Then
               v2 = 5
            ElseIf v1 < 120 Then
               v2 = 4
            ElseIf v1 < 180 Then
               v2 = 3
            ElseIf v1 < 240 Then
               v2 = 2
            ElseIf v1 < 300 Then
               v2 = 1
            Else
               v2 = 0
            EndIf
      End Select
      If typ <> 4 And typ <> 7 And typ <> 9 And typ <> 15 And typ <> 16 Then dir = (dir+360)Mod 360
      'dir = temp_dir
      If typ <> 7 And typ <> 9 And typ <> 15 Then
         x = x - Cos(dir+90)*speed*res_scale_x
         y = y - Sin(dir+90)*speed*res_scale_y
      EndIf
      Local ang#
      If typ <> 3 And typ <> 4 And typ <> 9 And typ <> 12 And typ <> 15 And typ <> 16 And typ <> 17 Then
         If x < (16*res_scale_x) Then x = (16*res_scale_x)
         If x > WIDTH-(16*res_scale_x) Then x = WIDTH-(16*res_scale_x)
         If y < (16*res_scale_y) Then y = (16*res_scale_y)
         If y > HEIGHT-(16*res_scale_y) Then y = HEIGHT-(16*res_scale_y)
      ElseIf typ = 3 Then
         If x < (24*res_scale_x) Or x > WIDTH-(24*res_scale_x) Then
            ang = -dir
            ang = ang+360 Mod 360
            dir = ang
         EndIf
         If y < (24*res_scale_y) Or y > HEIGHT-(24*res_scale_y) Then
            ang = -dir+180
            ang = ang+360 Mod 360
            dir = ang
         EndIf
      ElseIf typ = 4 Then
         If x < (12*res_scale_x) Or x > WIDTH-(12*res_scale_x) Then
            ang = -dir
            ang = ang+360 Mod 360
            dir = ang
         EndIf
         If y < (12*res_scale_y) Or y > HEIGHT-(12*res_scale_y) Then
            ang = -dir+180
            ang = ang+360 Mod 360
            dir = ang
         EndIf
      ElseIf typ = 12 Or typ = 17 Then
         If x < (-12*res_scale_x) Or x > WIDTH+(11*res_scale_x) Or y < (-12*res_scale_y) Or y > HEIGHT+(11*res_scale_y) Then
            ENEMY_LIST.Remove(Self)
         EndIf
      EndIf
   End Method
   
   Method Draw()
      Select typ
         Case 1
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy01_img,self.x,self.y)
         Case 2
            SetColor(r,g,b)
            If v1 < 0 Then
               SetAlpha 0
            Else
               SetAlpha v1
            EndIf
            DrawImage(enemy02_img,self.x,self.y)
         Case 3
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy03_img,self.x,self.y)
         Case 4
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy04_img,self.x,self.y)
         Case 5
            SetColor(r/(v1/25),g/(v1/25),b/(v1/25))
            SetRotation dir
            SetAlpha 1
            DrawImage(enemy05_img,self.x,self.y)
         Case 6
            SetColor(r,g,b)
            SetRotation dir
            SetAlpha 1
            DrawImage(enemy06_img,self.x,self.y)
         Case 7
            SetColor(r,g,b)
            SetAlpha 1
            DrawImage(enemy07_img,self.x,self.y)
         Case 8
            SetColor(r,g,b)
            SetAlpha 1
            DrawImage(enemy08_img,self.x,self.y)
         Case 9
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy05_img,self.x,self.y)
         Case 10
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy01_img,self.x,self.y)
         Case 11
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy09_img,self.x,self.y)
         Case 12
            SetColor(r,g,b)
            SetRotation rot
            SetAlpha 1
            DrawImage(enemy10_img,self.x,self.y)
         Case 13
            SetColor(r,g,b)
            SetRotation 0
            SetAlpha 1
            DrawImage(enemy11_img,self.x,self.y,v2)
         Case 14
            SetColor(r,g,b)
            SetRotation dir
            SetAlpha 1
            DrawImage(enemy12_img,self.x,self.y)
      End Select
      SetRotation 0
      SetColor(255,255,255)
   End Method
   
   Function Create:Enemy(typi,nx#,ny#,red,green,blue,startrot#,startdir#,speed#)
      Local e:Enemy = New Enemy
      Local test = False
      Local p:Enemy
      e.typ = typi
      e.x = nx
      e.y = ny
      e.r = red
      e.g = green
      e.b = blue
      e.rot = startrot
      e.dir = startdir
      If e.dir = -1 Then e.dir = (ATan2(e.y-MainPlayer.y,e.x-MainPlayer.x)+270)Mod 360
      e.speed = speed
      Select e.typ
         Case 2
            e.v1 = 1
            e.v2 = -0.01
         Case 3
            e.dir = Rand(0,359)
         Case 5
            e.v1 = 100
            e.v2 = -0.25
         Case 6
            While test = False
               test = True
               e.v1 = e.v1 + 1
               For p=EachIn ENEMY_LIST
                  If p.typ = 6 And p.v1 = e.v1 Then
                     test = False
                  EndIf
               Next
            Wend
            For i = 0 To 9
               Create:Enemy(7,e.x,e.y,e.r,e.g,e.b,e.v1,i,0)
            Next
            v3 = x
            v4 = y
            v5 = x
            v6 = y
         Case 7
            e.v1 = startrot
            e.v2 = startdir
         Case 8
            While test = False
               test = True
               e.v1 = e.v1 + 1
               For p=EachIn ENEMY_LIST
                  If p.typ = 8 And p.v1 = e.v1 Then
                     test = False
                  EndIf
               Next
            Wend
            For i = 0 To 5
               Create:Enemy(9,e.x,e.y,e.r,e.g,e.b,i*60,e.v1,0)
            Next
         Case 9
            e.v1 = startdir
            e.x = e.x - Cos(e.rot-90)*16
            e.y = e.y - Sin(e.rot-90)*16
         Case 13
            e.v1 = 360
            While test = False
               test = True
               e.v3 = e.v3 + 1
               For p=EachIn ENEMY_LIST
                  If p.typ = 13 And p.v3 = e.v3 Then
                     test = False
                  EndIf
               Next
            Wend
      End Select
      e.speed =e.speed
      ENEMY_LIST.AddLast(e)
      Return e
   End Function
End Type


Das im Code noch einiges an Müll drin sein kann ist mir bewusst aber aufräumen will ich später.

Xeres

Moderator

BeitragDi, Okt 16, 2012 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Na also, so kann man doch... gleich... hey! Ist das nicht BlitzMax?
Junge, das ändert doch den ganzen Ansatz! Idea

~VERSCHOBEN~


So:
Als erstes sollte dein Code Strict/Superstrict sein und dann kannst du deine Gegner von einem Grundtypen ableiten.
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)

worschtbrot

BeitragDi, Okt 16, 2012 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh stimmt! hab ganz vergessen, dass das getrennte Foren sind... Embarassed War schon nen Weilchen nicht mehr hier.
Aber mit meinem Gegnertype bin ich so eigentlich ganz zufrieden. Wink

Xeres

Moderator

BeitragDi, Okt 16, 2012 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mag ja sein, das es so funktioniert, aber der Code sieht halt sehr gewachsen aus...
BlitzMax: [AUSKLAPPEN]
If typ <> 2 And typ <> 7 And typ <> 15 Then
Das hat mit einer Ausnahme angefangen und jetzt ist alles eine Ausnahme. Du musst jede dritte Zeile den typ überprüfen und immer und immer wieder Sonderfälle abfangen.
So kannst du das nicht weiter machen - da sieht Niemand mehr durch und es ist eine Hölle das zu erweitern oder zu verändern.
Leite verschiedene Gegner von einer Basisklasse ab. Lege die vielen Zahlenwerte in Konstanten oder Globalen des Types ab. Ansonsten musst du deine Riesenportion Spagetticode alleine auslöffeln...
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)

worschtbrot

BeitragMi, Okt 17, 2012 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay ich verstehe deinen Einwand, und ich werde mir das Ganze nochmal überlegen. Aber wie gesagt, ich kann das Ganze bestimmt auch noch ein wenig aufräumen. Mein eigentliches Problem aber hat sich damit noch nicht gelöst. Sad

Xeres

Moderator

BeitragMi, Okt 17, 2012 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim spawnen gibt es das selbe alles-ist-hardcoded-Problem. Das könntest du lösen, indem du Level-Objekte erzeugst, die sich selbst verwalten können; z.B. levelstate weiterschalten, wenn ein bestimmter Score erreicht wurde und wann welche Gegenertypen gespawnt werden sollen.
Die nötigen Daten für jedes Level solltest du aus einer Datei laden. Die einzige Spezialbedingung sollte das "Es gibt keine weiteren Level mehr" Problem lösen.

Dann bekommst du eine Maschine, die du nur mit Infos füttern musst und den Rest macht sie allein.
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)

worschtbrot

BeitragDo, Okt 18, 2012 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay ich seh ein, dass ich das ganze so nicht lassen kann. Ich setzt mich mal dran das ganze umzuschreiben. Doch als ich vorhin ein wenig gestöbert habe bin ich auf die Datenbanken von BlitzMax gestoßen und habe mich gefragt ob es nicht eventuell sinnvoll ist meine Levels in Datenbanken abzuspeichern. Ist es das oder soll ich lieber einfach Leveldateien machen?

Xeres

Moderator

BeitragDo, Okt 18, 2012 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Von was für einer Datenbank sprichst du denn? ^^
Im Prinzip ist es egal ob die Daten aus einer txt, ini, xml oder deinem eigenen Format stammen. Hauptsache ist, du kannst die Daten bequem bearbeiten und einlesen.
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)

worschtbrot

BeitragFr, Okt 19, 2012 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, habe mich vertan. Laughing Habe die "Bank"-Funktion auf den ersten Blick für eine Art Datenbank gehalten(Was sie ja im Prinzip auch ist), aber sie ist für meine Zwecke leider nicht zu gebrauchen. Naja, ich habe dann erstmal wieder was zu tun. Vielleicht poste ich hier dann nochmal meine Lösung. Wink

Danke an alle.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group