Type "Gesteuertes" wird immer langsamer[3D]
Übersicht

![]() |
DottakopfBetreff: Type "Gesteuertes" wird immer langsamer[3D] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() Was genau ist eine temporäre Liste ? ![]() 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 ![]() Du sprachst auch von Hauptproblem. Habe ich sonst noch einen Fehler ? mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
DottakopfBetreff: ist das des Rätsels lösung ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also du hast das 2x den gleichen Distanzcheck, insofern geht das schon ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ! ![]() mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group