Abstand halten!
Übersicht

![]() |
AcidRainBetreff: Abstand halten! |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
ich habe vor ein kleines Ballerspiel zu erstellen,in dem man gegen sehr viele Gegner kämpfen muss (ähnlich wie Serious Sam,aber wesentlich einfacher).Die Gegner sind alle gleich und werden mit Types verwaltet.Das Problem: Wenn jetzt viele Gegner auf einem Haufen stehen,dann überschneiden sie sich.Würde man die Objekte einzeln programmieren,könnte man irgendwie durch EntityDistance erreichen,dass sie genügend Abstand vom "Nachbar" halten,aber wie soll das in Types funktionieren? AcidRain |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Pythagoras?
Code: [AUSKLAPPEN] DistanceX# = X1 - X2
DistanceY# = Y1 - Y2 Distance# = Sqr(DistanceX * DistanceX + DistanceY * DistanceY) Für 3D: Code: [AUSKLAPPEN] DistanceX# = X1 - X2
DistanceY# = Y1 - Y2 DistanceZ# = Z1 - Z2 Distance# = Sqr(DistanceX * DistanceX + DistanceY * DistanceY + DistanceZ * DistanceZ) |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
EntityName = handle(typeinstanz)
und dann mit den entities arbeiten aber wird kein "kinderspiel" die distanzen etc zu handhaben ... ist eines der grössten probleme die es gibt, soferns mehr als nur ein paar sind. vornoi diagramme etc sind die einzige möglichkeit sowas sinnvoll zu lösen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil mich das selber interessiert, habe ich mal ein kleines Beispielprogramm erstellt.
Code: [AUSKLAPPEN] Graphics3D 800,600,0,2
SetBuffer BackBuffer() timer=CreateTimer(120) MoveEntity CreateCamera(),0,0,-20 TurnEntity CreateLight(),40,-40,0 Dim h(2) For q=0 To 2 h(q)=CreateSphere() MoveEntity h(q),Sin(q*120)*2,Cos(q*120)*2,0 EntityType h(q),2 Next Collisions 2,2,1,2 While Not KeyHit(1) If KeyHit(2) s=0 If KeyHit(3) s=1 If KeyHit(4) s=2 If KeyDown(203) MoveEntity h(s),-.1,0,0 If KeyDown(205) MoveEntity h(s),+.1,0,0 If KeyDown(200) MoveEntity h(s),0,+.1,0 If KeyDown(208) MoveEntity h(s),0,-.1,0 w#=w+.1 MoveEntity h(2),Sin(w)/100,Cos(w)/100,0 WaitTimer timer UpdateWorld RenderWorld Flip 0 Wend End Kollisionstype wird auf eingenem Typ angewandt. Dadurch stossen alle Kugeln voneinander ab. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
AcidRain |
![]() Antworten mit Zitat ![]() |
---|---|---|
wird das bei sehr vielen (bsp 100) objekten nicht zu rechenintensiv? | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
edit1: Code nochmal schneller gemacht mit CopyEntity Prozessorauslastung dadurch getrittelt.
Bei vielen Objekten wird es Rechenintensiv, ja. Das liegt aber nicht an Collisions. Teste mal selbst. Einmal mit und einmal ohne EntityType und Collisions. Das was lange dauert, ist das rendern einzelner Entitys, also auch Surfaces. Hier ein Beispiel mit 400 Objekten: Code: [AUSKLAPPEN] Graphics3D 800,600,0,2
SetBuffer BackBuffer() timer=CreateTimer(120) MoveEntity CreateCamera(),0,0,-40 TurnEntity CreateLight(),40,-40,0 Dim h(399) master=CreateSphere(3) For y=0 To 19 For x=0 To 19 ; h(z)=CreateSphere(3) h(z)=CopyEntity(master) MoveEntity h(z),(x-10)*2.5,(y-10)*2.5,0 EntityType h(z),2 z=z+1 Next Next Collisions 2,2,1,2 While Not KeyHit(1) If KeyHit(2) s=0 If KeyHit(3) s=1 If KeyHit(4) s=2 If KeyDown(203) MoveEntity h(s),-.1,0,0 If KeyDown(205) MoveEntity h(s),+.1,0,0 If KeyDown(200) MoveEntity h(s),0,+.1,0 If KeyDown(208) MoveEntity h(s),0,-.1,0 w#=w+.1 MoveEntity h(2),Sin(w)/100,Cos(w)/100,0 WaitTimer timer UpdateWorld RenderWorld Flip 0 Wend End Entityradius ist da eben sehr schnell. Bei mir liegt die Prozessorauslastung bei 35 % ohne Kolisionen und 37 % mit... Also unerheblich. Optimieren muss man dann halt auf anderer Ebene. 0 % Auslastung bei Pivots ohne Kollision und 0 % Auslastung bei Pivots mit Kollision. Naja, der Taskmanager soll ja auch nicht die richtigsten Werte liefern. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
37% ist nicht erheblich ... jo wenn du nen 1Ghz prozessor hast ... sonst ist das totaler overkill für etwas was nix macht
wie willst du bei 40% für nen bruchteil eines AI verhaltens danach noch ne AI mit weniger als 200% auslastung reinbekommen und vielleicht noch den einen oder anderen userinput ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe ja auch geschrieben, dass Pivots alleine etwa 0 % Prozessorauslastung haben. Der ''Overkill'' kommt nicht aus der Kollisionsberechnung, sondern 400 Einzelobjekte an die Grafikkarte zu senden. Mit CopyEntity habe ich allerdings das ganze auf 12 % Prozessorauslastung bringen können. Das Optimieren muss also auf einer anderen Ebene geschehen, als der Kollisionsberechnung. Zum Beispiel bei der Anzahl der Surfaces.
Allerdings - gebe ich dir Recht - ich es mit der Kollisionsberechnung nicht komplett. Man müsste entsprechend noch weiteres an der KI basteln, dass diese sich daran hällt, was die Kollision mit anderen so an Informationen liefert. Ich habe mich allerdings im letzten Post auch schlecht ausgedrückt. Zur Info: Ich habe ein P4 2.8 Ghz HT mit Radeon 9600se |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
AcidRain |
![]() Antworten mit Zitat ![]() |
---|---|---|
k-Danke für die Antworten!
Ich denke,ich werde hectics Lösung anwenden-erscheint mir einfach am simpelsten.Wenn's dann zu einem "Overkill" kommen sollte,dann muss ich mir wohl was anderes einfallen lassen^^. Thx. AcidRain |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group