Turrets für ein Space shooter
Übersicht

DebbieDangerBetreff: Turrets für ein Space shooter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo, lange nicht geschrieben, wie geht es dir?!
OK spaß beiseite ich habe ein Problemchen mit meinem Code: Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() ;TYPE Type Armyman Field x_Pos Field y_Pos Field sx_Pos Field sy_Pos ;Field Px_pos ;Field py_Pos Field winkel# Field shot_winkel# End Type Global a.Armyman ;x=100 ;y=100 mx = 200 my = 300 SeedRnd MilliSecs() ArmyBaby = 1 Repeat ;TurCount = Rand(0,120) ;ArmyMov = Rand(0,50) ;ArmyDir = Rand(0,3) ;ArmyHom = Rand(0,30) ArmyBaby = Rand(0,100) ;ArmyShoFre = Rand(0,20) If KeyDown(200) Then my = my - 5 If KeyDown(208) Then my = my + 5 If KeyDown(203) Then mx = mx - 5 If KeyDown(205) Then mx = mx + 5 ;If ArmyHom = 1 Then ; If x>mx Then x=x-4 ; If y>my Then y=y-4 ; EndIf ; If ArmyMov = 1 Then ; If ArmyDir = 0 Then y=y-3 ; If ArmyDir = 1 Then x=x+3 ; If ArmyDir = 2 Then y=y+3 ;If ArmyDir = 3 Then x=x-3 ;EndIf If ArmyBaby = 1 Then a = New Armyman a\x_Pos = Rand(1,200) a\y_Pos = Rand(1,200) a\sx_Pos = a\x_pos a\sy_Pos = a\y_pos ;armycount = armycount+1 a\shot_winkel#= ATan2((mx+10)-a\sx_Pos,(my+10)-a\sy_Pos) EndIf For a.Armyman = Each Armyman Oval (a\x_Pos-10),a\y_Pos-10,20,20,0 a\winkel# = ATan2((mx+10)-a\x_Pos,(my+10)-a\y_Pos) Line a\x_Pos,a\y_Pos,a\x_Pos+Sin(a\winkel#)*50,a\y_Pos+Cos(a\winkel#)*50;kanone a\sx_Pos = a\sx_Pos + Sin(a\shot_winkel#) * 5 a\sy_Pos = a\sy_Pos + Cos(a\shot_winkel#) * 5 ;Zum eigentlichen Problem: Hier hattest du Sin statt Cos stehen If a\sx_Pos >300 Then a\sx_Pos = a\x_Pos If a\sy_Pos >300 Then a\sy_Pos = a\y_Pos Line a\sx_Pos, a\sy_Pos, a\sx_Pos + Sin(a\shot_winkel#) * 50, a\sy_Pos + Cos(a\shot_winkel#) * 50 ;schuss hier stimmt was nciht glaube ich Next ; If ArmyShoFre = 1 Then ; i=0 ; For a.Armyman = Each Armyman ; i=i+10 ; Text 100,100+i,"Bla" ;Next ;EndIf ;Text 300,300,TurCount ;Text 350,300,ArmyDir ;Text 300,400,armycount Color 255,255,255 Oval mx,my,20,20,1 Flip Cls Until KeyHit(1) End Führt ihn mal aus, nach kurzer Zeit fangen Kanonen an zu Spawnen und auf den Player, der mit dem <- ^ v -> (cursortasten oder so) gesteuert wird. Das ist ja ganz nett aber alle folgenden schüsse nach dem ersten aus dem jeweiligen turret kommen von sonstwo, also naja ihr seht ja selbst wenn ihr es ausführt. Ich denke mal es ist ein fehler in deisen doofen Sinus und Cosinus formeln. Also wie ihr euch vielleicht schon denken könnt will ich das die Turrets immermal schiessen. Überseht bitte die vielen unoptimalen Randoms, das ist erstmal nicht so wichtig hoffe ich. So long; -Debbie |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir gehts gut, Danke^^
Nun zum Geschäftlichen: Dein problem war: 1. der shootwinkel wurde nur beim erstellen des turrets eingestellt er war also beim ersten schuss richtig und danach evtl falsch (weil sich der turret bis dahin vllt gedreht hatte) 2. flog ein schuss nach rechts aus dem bildschirm hast du nur die x variable zurückgesetzt nicht die y-variable 3. (kein wirkliches problem) vor der repeat schleife steht ArmyBaby=1 damit wolltest du wahrscheinlich bewirken das ein turret direkt am anfang kommt. damit das funzt müssen die rnd's am ende der Repeat schleife gesetzt weden ![]() achja der Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() ;TYPE Type Armyman Field x_Pos Field y_Pos Field sx_Pos Field sy_Pos ;Field Px_pos ;Field py_Pos Field winkel# Field shot_winkel# End Type Global a.Armyman ;x=100 ;y=100 mx = 200 my = 300 SeedRnd MilliSecs() ArmyBaby = 1 Repeat If KeyDown(200) Then my = my - 5 If KeyDown(208) Then my = my + 5 If KeyDown(203) Then mx = mx - 5 If KeyDown(205) Then mx = mx + 5 ;If ArmyHom = 1 Then ; If x>mx Then x=x-4 ; If y>my Then y=y-4 ; EndIf ; If ArmyMov = 1 Then ; If ArmyDir = 0 Then y=y-3 ; If ArmyDir = 1 Then x=x+3 ; If ArmyDir = 2 Then y=y+3 ;If ArmyDir = 3 Then x=x-3 ;EndIf If ArmyBaby = 1 Then a = New Armyman a\x_Pos = Rand(1,800) a\y_Pos = Rand(1,600) a\sx_Pos = a\x_pos a\sy_Pos = a\y_pos ;armycount = armycount+1 a\shot_winkel#= ATan2((mx+10)-a\sx_Pos,(my+10)-a\sy_Pos) EndIf For a.Armyman = Each Armyman Oval (a\x_Pos-10),a\y_Pos-10,20,20,0 a\winkel# = ATan2((mx+10)-a\x_Pos,(my+10)-a\y_Pos) Line a\x_Pos,a\y_Pos,a\x_Pos+Sin(a\winkel#)*50,a\y_Pos+Cos(a\winkel#)*50;kanone a\sx_Pos = a\sx_Pos + Sin(a\shot_winkel#) * 5 a\sy_Pos = a\sy_Pos + Cos(a\shot_winkel#) * 5 ;Zum eigentlichen Problem: Hier hattest du Sin statt Cos stehen If a\sx_Pos >800 Or a\sy_Pos >600 a\sx_Pos = a\x_Pos a\sy_Pos = a\y_Pos a\shot_winkel#= ATan2((mx+10)-a\sx_Pos,(my+10)-a\sy_Pos) EndIf Line a\sx_Pos, a\sy_Pos, a\sx_Pos + Sin(a\shot_winkel#) * 50, a\sy_Pos + Cos(a\shot_winkel#) * 50 ;schuss hier stimmt was nciht glaube ich Next ; If ArmyShoFre = 1 Then ; i=0 ; For a.Armyman = Each Armyman ; i=i+10 ; Text 100,100+i,"Bla" ;Next ;EndIf ;Text 300,300,TurCount ;Text 350,300,ArmyDir ;Text 300,400,armycount Color 255,255,255 Oval mx,my,20,20,1 Flip Cls ;TurCount = Rand(0,120) ;ArmyMov = Rand(0,50) ;ArmyDir = Rand(0,3) ;ArmyHom = Rand(0,30) ArmyBaby = Rand(0,100) ;ArmyShoFre = Rand(0,20) Until KeyHit(1) End ach und nochwas der winkel scheint irgendwie ungenau .... siehste dann und noch was: wenn du Code: [AUSKLAPPEN] a\shot_winkel#= ATan2((mx+10)-a\sx_Pos,(my+10)-a\sy_Pos)
nach dem endif schreibst werden die schüsse verfolgungsraketen^^ EDIT Ach ja bevor ichs vergesse^^ wenn du nach oval "lockbuffer" und vor next "unlockbuffer" in der for-next schleife schreibst gibst du dem ganzen einen speed-schub da line auf men gelockten buffer schneller ist |
||
DebbieDanger |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() Klappt ja prima, nur wenn es ein paar mehr werden wirds halt langsam, aber dafür ja deine bemerkung mit lockbuffer. Diese Homing - also ziel-such- Raketen fetzen ja. Gut das du das erwähnt hast, andere einheiten werden wahrscheinlich auch homing missles abschiessen sollen (feiner deutsch, ich weiß). Ok das prob ist erstmal ziemlich gegessen, nun habe ich noch ne andere Frage: Ich habe ja diese vielen Randoms da drin die bei jedem durchlauf der schleife gemacht werden, nun habe ich gehört das die ziemlich rescourcenintensiv sind. Was wäre denn eine Bessere Lösung? Ich schätze eine art Timer, liege ich da richtig? Nun will ich aber nicht das alle Turrets immer zur gleich schiessen, also wäre es da sinvoll jedem einzelnen turret per random einmal eine gewisse schussfrequenz, bzw eine schusszeit, ein abstand zwischen den Schüssen zu geben? |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn ein turret mehrere schüsse gleichzeitig abgeben soll musst du für die schüsse ertmal einen eigenen type aufmachten und dann kannst du ja einen timer mit random-schussfrequenz bei dem erstellen des turrets machen. immer wenn der timer tickt erstellst du einen neuen schuss-type und übergibst ihm den winkel des turrets.
achso die grund-struktur für nen tickenden timer ist Code: [AUSKLAPPEN] If timervariable<Millisecs()
;CODE DER BEIM TICKEN AUSGEFÜHRT WIRD timervariable=Millisecs()+millisekunden_bis_zum_nächsten_tick Endif Für jeden timer brauchst du eine andere timervariable (zb ein field eines schuss types) und die andere varable die ich verwendet habe ist hoffentlich klar ![]() |
||
DebbieDanger |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok danke, ich meinte zwar nciht das ein turret gleichzeitig mehrere schüsse abgibt, sondern das alle turrets in verschiedenen frequenzen schiessen, aber das ist mit dem ansatz ja genau so möglich.
mfg -Debbie Danger |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group