Spawn Algorythmus vereinfachen
Übersicht

![]() |
worschtbrotBetreff: Spawn Algorythmus vereinfachen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hört sich im simpelsten Fall für einen Fall für mod![]() BlitzBasic: [AUSKLAPPEN] Global Level% |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay da ich mit den bisherigen Vorschlägen leider noch nicht so viel anfangen kann, versuche ich einfach mal meinen Algorithmus ( ![]() 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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nunja, mein Code umfasst derzeit so um die 15000 Zeilen. Aber wenn es euch hilft sind die die relevanten Codeabschnitte, viel Spass ![]() 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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na also, so kann man doch... gleich... hey! Ist das nicht BlitzMax?
Junge, das ändert doch den ganzen Ansatz! ![]() ~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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh stimmt! hab ganz vergessen, dass das getrennte Foren sind... ![]() Aber mit meinem Gegnertype bin ich so eigentlich ganz zufrieden. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ThenDas 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
worschtbrot |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, habe mich vertan. ![]() ![]() Danke an alle. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group