Abstand halten!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

AcidRain

Betreff: Abstand halten!

BeitragMo, Jul 23, 2007 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Jul 23, 2007 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 23, 2007 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 23, 2007 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 23, 2007 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
wird das bei sehr vielen (bsp 100) objekten nicht zu rechenintensiv?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 23, 2007 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 23, 2007 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 23, 2007 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 24, 2007 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group