Turrets für ein Space shooter

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

DebbieDanger

Betreff: Turrets für ein Space shooter

BeitragMo, Jul 16, 2007 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 16, 2007 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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

BeitragMo, Jul 16, 2007 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy Vielen Dank Francesco!
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

BeitragMo, Jul 16, 2007 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
 

DebbieDanger

BeitragDi, Jul 17, 2007 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group