Type "Gesteuertes" wird immer langsamer[3D]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Type "Gesteuertes" wird immer langsamer[3D]

BeitragFr, Feb 02, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi alle zusammen !

Hmm ist garnicht so leicht zu erklären, da es schon a wengle komplexer(also in meinen Augen) ist. Aber ich weis echt nicht wie ich das lösen bzw. überhaupt anpacken soll.

O.K. wie es der Titel schon verrät, hab ich ein Problem mit der Geschwindigkeit von Type gesteuerten Objekten. In meinem Progi bekämpfen sich "Ameisen" und "irgendwas anderes...Böses". Doch jedes mal wenn ein gegner Deletet wurde nimmt die Geschwindigkeit ab.

Ich hab zumindest schoneinmal begriffen wo das "Problem" liegt. Es ist die Funktion in der das "Angriffs - Verteidiguns -und Verfolgungsverhalten" der jeweiligen Ameisen berechnet wird. Ich hab da ne "verschachtelte for next Schleife" drin welche die Berechnungen für jeden Gegener und jede Ameise macht. Und genau da ist da das Problem.... Keiner oder weniger Gegenr = Keine oder weniger Geschwindigkeit...

Es könnte aber auch hier der Fehler liegen : wenn man genau hinsieht kann man in meinem code entdecken das ich die geschwindigkeit extrem drosseln musste (0.09). Damit des Ding nicht die Schallmauer durchbricht ^^

Ich bin mir sicher, das es an der For next verschachtelung liegt. Wüsste aber nicht wie ich das sonst lösen könnte.

Vielleicht erkennt man ja gleich auf den ersten blick einen "Groben" fehler. Darum setzte ich hier mal die Funktion rein wo das verhalten der Ameise berechnet wird. Sollte dies nicht reichen nehme ich mir die Freiheit den gesamten quellcode im Code pasting zu Posten. Link : https://www.blitzforum.de/upload/code.php

Wäre echt nett wenn Ihr mir da weiterhelfen könntet !Und ich danke euch auch schonmal im Vorraus für eure Bemühungen !!

Also wie gesagt hier die Funktion wo das verhalten der Ameise berechnet wird.
Code: [AUSKLAPPEN]

Function update_ant()

EntityParent select_Mak,player ;Select Markierung bei player

   ;Select Radius
 If KeyDown(57) And Radius <15 Then
      Radius = Radius +1
      ScaleEntity select_Mak,radius,0.1,radius  ;markierung zeigen

    ElseIf KeyDown(57) And Radius = 15 Then     
        radius = 15

    Else
     radius = 0
     ScaleEntity select_Mak,-radius,-0.1,-radius;markierung löschen

 End If

    If KeyHit(29) Then wert = wert +1
    If wert >2 Then wert = 1

;schleife ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
For info2.enemy = Each enemy
   For info.ant = Each ant

       ;nur die Ant wo selctet darf den ATK_mode = true bekommen
       If wert = 2 And info\ant_select = True Then info\ant_ATK = True  info\ant_select = False
       If wert = 1 Then info\ant_ATK = False

      ;Select radius definieren
      If EntityDistance(player,info\ant_entity) <= Radius Then
         info\ant_select = True
         wert = 1
      End If

          ;spieler selectet
          If info\ant_select = True And EntityDistance(player,info\ant_entity) >3 Then
             PointEntity info\ant_entity,player,0
             MoveEntity info\ant_entity,0,0,0.09
           End If

            ;Angriff
            If info\ant_ATK = True And EntityDistance(info\ant_entity,info2\eny_entity) >3 Then
             
               PointEntity info\ant_entity,info2\eny_entity,0
               MoveEntity  info\ant_entity,0,0,0.09
            End If

    ;Kampfverhalten;;
    If EntityCollided(info2\eny_entity,TYPE_ANT) Then
       antATK_counter = antATK_counter +1
    End If
     
       If antATK_counter >= 40 Then
          antATK_counter = 0                ;zähler auf 0
          info\ant_hp = info\ant_hp -50    ;Schaden ENEMY
           
       End If

   
    If info\ant_hp <= 0 Then              ;0 HP / löschen
       
      FreeEntity info\ant_entity
      Delete info.ant
    End If

   
  Next
Next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

End Function


Puh (schweis abwisch) mal wieder ein Wuchtiger Eintrag...

P.S. Wer sich das progi per STR+c und STRG +v in bb einfügt bekommt kurz noch ne kleine Spieleanleitung:

Steuerung mit w a s d
Um Ameisen zu erstellen gegen Rote box fahren
mit Leer kann man sie dan Rufen
und mit der Strg Taste auf die gegener hetzten

~Edit~ Bin auch im chat erreichbar: Guckst du unten im meinem Persönlichen Text den Link #Blitznoob.

~Edit2~ Kann des sein das meine Signatur nicht angezeigt wird ?

mfg Dottakopf
  • Zuletzt bearbeitet von Dottakopf am Fr, Feb 02, 2007 18:06, insgesamt einmal bearbeitet
 

Dreamora

BeitragFr, Feb 02, 2007 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, das Hauptproblem ist die doppelte Type Schleife.
Sofern du dir da nix gescheiteres einfallen lässt, wird das sehr schnell zu einem gigantischen Problem.

Die einfachste Variante ist temporäre Listen zu haben für "sichtbare Gegner" oder "bekannte Gegner" oder einfach nur "Gegner im gleichen Sektor"


Ein zweites Problem ist deine mehrfache Berechnung von EntityDistance.
Rechne das am Anfang nach dem zweiten For aus und speicher es in eine Variable und überprüf es damit. Der Befehl ist nämlich recht rechenintensiv und bereits bei 10 gegner und 10 Ameisen hast du 300 EntityDistance und 100 EntityCollided aufrufe bei jedem Aufruf dieser Funktion.

Wenn du jetzt allerdings dann wirklich Ameisenniveau willst ... nun ich denke du siehst worauf ich hinaus will.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Dottakopf

BeitragFr, Feb 02, 2007 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Des mit der Doppel Schleife habe ich geahnt... Doch wie soll ich denn sonst für jede Einzelne Ameise überprüfen? Gibts da nen Trick oder einfach ne bessere Technik ? Einfach weglassen is ja nich... Smile

Was genau ist eine temporäre Liste ? Embarassed bzw. wie wende ich sie an.

Zitat:

Rechne das am Anfang nach dem zweiten For aus und speicher es in eine Variable und überprüf es damit.

In eine Varriable verschiedene Entfernungen für verschiedene Objekte Shocked ? Geht das denn, oder hab ich das nur falsch interpretiert ?

Du sprachst auch von Hauptproblem. Habe ich sonst noch einen Fehler ?

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Dottakopf

Betreff: ist das des Rätsels lösung ?

BeitragFr, Feb 02, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab mir noch mal ne Packung Kornflakes geschnappt und bisschen dran rum getrüftelt. Ka ob das gut oder einfach nur Müll ist aber so wie ich es gesehen hab klappt des jetzt fast so wie ich des wollte. Ich hab zwar jetzt noch ne doppel schleife aber die arbeitet jetzt weniger ab. Und er behält jetzt die Geschwindigkeit bei...

möchte aber lieber nochmal ne Meinung von experten einholen daher :

Code: [AUSKLAPPEN]

Function update_ant()

EntityParent select_Mak,player ;Select Markierung bei player

   ;Select Radius
 If KeyDown(57) And Radius <15 Then
      Radius = Radius +1
      ScaleEntity select_Mak,radius,0.1,radius  ;markierung zeigen

    ElseIf KeyDown(57) And Radius = 15 Then     
        radius = 15

    Else
     radius = 0
     ScaleEntity select_Mak,-radius,-0.1,-radius;markierung löschen

 End If

    If KeyHit(29) Then wert = wert +1
    If wert >2 Then wert = 1

             
       


;schleife ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   For info.ant = Each ant

       ;nur die Ant wo selctet darf den ATK_mode = true bekommen
       If wert = 2 And info\ant_select = True Then info\ant_ATK = True  info\ant_select = False
       If wert = 1 Then info\ant_ATK = False

      ;Select radius definieren
      If EntityDistance(player,info\ant_entity) <= Radius Then
         info\ant_select = True
         wert = 1
      End If


          ;spieler selectet
          If info\ant_select = True And EntityDistance(player,info\ant_entity) >3 Then
             PointEntity info\ant_entity,player,0
             MoveEntity info\ant_entity,0,0,0.5
 
          End If

  Next
 
  For info2.enemy = Each enemy
    For info.ant = Each ant

            ;Angriff
            If info\ant_ATK = True And EntityDistance(info\ant_entity,info2\eny_entity) >3 Then
             
               PointEntity info\ant_entity,info2\eny_entity,0
               MoveEntity  info\ant_entity,0,0,0.5
            End If


    ;Kampfverhalten;;
    If EntityCollided(info2\eny_entity,TYPE_ANT) Then
       antATK_counter = antATK_counter +1
    End If
     
       If antATK_counter >= 40 Then
          antATK_counter = 0                ;zähler auf 0
          info\ant_hp = info\ant_hp -50    ;Schaden ENEMY
           
       End If

   
    If info\ant_hp <= 0 Then              ;0 HP / löschen
       
      FreeEntity info\ant_entity
      Delete info.ant
    End If

   Next 
Next
end function


Das kann man 100% noch raffinierter und bestimmt auch rechenfreundlicher machen, oder ?

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Dreamora

BeitragFr, Feb 02, 2007 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also du hast das 2x den gleichen Distanzcheck, insofern geht das schon Smile

Was die Listen sonst betrifft: Du musst dir eine eigene linked list Struktur aufbauen (nicht sehr schwer, gibt sogar im Forum Beispiele dafür). Was diese Liste genau drin hat hängt davon ab wie du deine Spielwelt aufgebaut hast. Normalerweise würde man wohl Sektoren machen.
Dann musst du nur die Gegner im Sektor der Ameise und gegebenenfalls in den umliegenden Sektoren prüfen anstatt die ganze Welt. (dazu müsste Sektor auch ein Type sein, wobei jeder Sektor eine Liste hat mit den Enemies in dem Sektor)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Dottakopf

BeitragFr, Feb 02, 2007 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weis etz ned ganz genau auf welchen Post du anwortest. Aber ich danke dir trotzdem, den das Problem scheint sich fürs erste gelöst zu haben. Also noch mal Danke für deine Hilfe ! Very Happy

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group