Einheiten erstellen/positionieren[gelöst]
Übersicht

![]() |
skey-zBetreff: Einheiten erstellen/positionieren[gelöst] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
nach langer Zeit habe ich auch einmal wieder eine Frage und falle auch mal direkt mit der Tür ins Haus. Das nachfolgende Problem tritt bei einem Code auf, der für den aktuellen BCC#36 gedacht ist, deshalb habe ich auch Verständnis, wenn ihr aus Wettbewerbsgründen nicht helfen möchtet. Zum Thema, ich erstellen Gebäude und Einheiten, zu allererst mal der Code für die Gebäude, was auch funktioniert. Code: [AUSKLAPPEN] Function CreateBuild(menuID, x#, y#, z#) For m.TMenu = Each TMenu If (menuID = m\id) Then b.TBuild = New TBuild b\id = CountBuilds() b\name$ = m\name$ b\obj = CopyEntity(m\obj) EntityColor b\obj, 192, 192, 192 b\px# = x# b\py# = y# b\pz# = z# PositionEntity b\obj, b\px#, b\py#, b\pz# b\sell = (m\cost * .5) b\off = m\off b\def = m\def b\out = m\out b\time = m\time b\diff = MilliSecs() b\nrg_in = m\nrg_in b\nrg_out = m\nrg_out EndIf Next End Function Die Gebäude werden an der angegebenen px#, py#, pz# Position erstellt. Nun soll nach einer bestimmten Zeit (Millisecs()+b\diff) eine Einheit erstellt werden, wenn auch eine bestimmte Menge Rohstoff im Lager(hier Öl) vorhanden ist. Code: [AUSKLAPPEN] Function BuildUnit(id%, oil) Local match$ Local res% b.TBuild = Object.TBuild(id%) Local px# = b\px Local py# = b\py Local pz# = b\pz Select b\name Case "garage" match$ = "car" Case "armory" match$ = "tank" Case "airfield" match$ = "air" End Select For p.TPreview = Each TPreview If (p\typ = match$) And (oil >= p\oil) Then u.TUnit = New TUnit u\id = CountUnits() u\parent = b\parent u\name = p\name u\typ = p\typ u\obj = CopyEntity(p\obj) EntityType u\obj, COLL_SPH u\px# = px u\py# = py u\pz# = pz PositionEntity u\obj, u\px, u\py, u\pz u\rx# = 0 : u\ry# = 0 : u\rz# = 0 u\off = p\off u\def = p\def u\speed# = p\speed# u\range = p\range For i = 0 To 3 u\child[i] = p\child[i] u\child_rot[i] = p\child_rot[i] Next res = p\oil EndIf Next Return res End Function Die Einheiten werden auch erstellt, aber nicht immer an der Position des erstellenden Gebäudes, sondern zumeist irgendwo auf der Map, zum Teil auch an Positionen, wo schon eine andere Einheit steht, wodurch man nicht wirklich sieht, dass eine neue Einheit erstellt wurde. Ich schätze jetzt einfach mal, dass es mal wieder an dem Wald vor lauter Bäumen liegt, den ich nicht sehe, da ich mittlerweile 1 Woche nicht mehr in diesen Code geschaut habe und en Fehler trotzdem nicht finden kann. Ich habe es zuvor auch schon versucht per u\px# = entityx(b\obj) etc. zu erstellen, mit dem gleichen Ergebnis, weshalb ich mal schauen wollte, ob es so wie oben zu sehen vielleicht funktioniert. Nachfolgend noch mal die Update-Funktion der Einheiten, vielleicht sieht jemand auch dort einen Fehler. Code: [AUSKLAPPEN] Function UpdateUnits(pivot, d3dFont, d3dSX, d3dSY) Local yaw# Local dist# For u.TUnit = Each TUnit If u\target = 0 Then yaw# = DeltaYaw(u\obj, pivot) dist# = EntityDistance(u\obj, pivot) If dist# > 2 Then Text3D(d3dFont, d3dSX+10, d3dSY-(150+index*20), "Y:"+yaw#+"|D:"+dist#) If yaw# <> 0 Then If Abs(yaw#) < 1 Then yaw# = 0 MoveEntity u\obj, 0, 0, u\speed# EndIf If (yaw < 0) Then TurnEntity u\obj, 0, -1, 0 ElseIf (yaw > 0) Then TurnEntity u\obj, 0, +1, 0 EndIf EndIf EndIf EndIf index = index + 1 Next End Function Mir geht es eigentlich nur darum, dass alle Einheiten an der Position des Gebäudes erstellt werden. Zu Guter letzt noch die Types für Gebäude und Einheiten. Code: [AUSKLAPPEN] Type TUnit Field id% Field parent% Field name$ Field typ$ Field obj% Field child%[3] Field child_rot$[3] Field px#, py#, pz#, rx#, ry#, rz# Field def% Field off% Field speed# Field range% Field target% End Type Type TBuild Field id% Field name$ Field parent% Field obj% Field sell% Field px#, py#, pz# Field off%, def% Field out%, time%, diff% Field nrg_in%, nrg_out% End Type Ich hoffe es ist jemand da draußen, der mir helfen kann, ansonsten hake ich diesen BCC ab, da es ja nicht mehr wirklich viel Zeit ist, um mir eine Neue Idee und Umsetzung einfallen zu lassen. Danach ist Blitz 3D für mich auch abgenutzt, ich bin schon dabei mich in BMax einzuarbeiten, sry für diese Nebeninformation. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
- Zuletzt bearbeitet von skey-z am Di, Apr 13, 2010 20:28, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kollisionsinterferenzen?
HideEntity ![]() ![]() ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube weniger, dass es mit Kollisionen zu tun hat, die Einheiten sollten ja eigentlich am Gebäude der Herstellung starten, welches keinen Kollisionstypen hat, das ca 50 Units vom Nullpunkt entfernt ist, die ersten 1-2 Einheiten kommen ja auch noch daher, die anderen Spawnen irgendwo in der Mitte der Map.
Zwischen den einzelnen Einheiten funktioniert die Kollision einwandfrei |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du platzierst die Einheiten alle an der Stelle, an der das Gebäude steht. Und die Einheiten kollidieren miteinander. Klingt nach vorprogrammiertem Ärger, wenn du nicht sicher gehst, dass es genug Platz gibt.
Anders herum: Wenn du Kollision abstellst, erscheinen die Einheiten immer noch willkürlich? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi !
Erstmal muß ich sagen, daß ich keine Lust habe mir den Code genau anzuschauen und mich hineinzudenken. Dennoch möchte ich paar allgemeine Tips geben, vielleicht hilft das auch. Es kommt immer wieder mal vor, daß es Probleme gibt, weil sich Float- und Integer-Variablen innerhalb einer Berechnung schlecht vertragen. Da wird mal schnell aus einer 0.3 eine 0 wenn man nicht aufpaßt und das kann untern Umständen schon große Auswirkungen haben. Da muß man dezimale Werte mit Float forcieren, etc. Minus udn Plus (180 Grad) bei EntitYaw, Y, ist auch verwirrend. dann noch True oder False was die Position angeht. Mit Absolut() kann auch einiges schiefgehen. Was Debugging angeht. Wenn der Fehler schwer zu finden ist, dann lohnt es sich die Mühe zu machen (sofern das Projekt wichtig ist) den Fehler durch vorläufige Auskommentierung, Löschung von Code-Teilen immer mehr einzugrenzen. Das führt fast immer zu einer Lösung des Problems. Ich habe ja vor einigen Jahren Vulpec Mutations programmiert und da sind auch Fabriken drin aus denen neue Einheiten rauskommen. (Alles in 2D, aber die Logik ist fast das Gleiche). Ich habe da ein Spielfelder System drin, was in 3D weniger praktisch ist, aber von Logik her ist das bei der Fabrik auch so ähnlich in 3D machbar. Ich habe für jede Fabrik eine bestimmte Anzahl (ich glaube 6) mögliche Ausgangsfelder für die neuen Einheiten, an den Seiten die man von Perspektive her gut sehen kann. Wenn eine neue Einheit hergestellt worden ist, wird geschaut, ob das Ausgangsfeld Nr. 1 gerade nicht durch irgendwas blockiert ist. Wenn nicht, dann wird die neue Einheit dort erstellt. Wenn der Platz Nr. 1 blockiert ist, dann wird Platz Nr2. gechecked. Die neuen Einheiten sammeln sich also um die Fabrik herum und warten daruf abgeholt zu werden. (sollte gar kein Feld merh frei sein, was sehr selten vorkommen könnte, dann wird die Produktion gestoppt). Der Spieler kann aber der Fabrik einen Ssammelpunkt zuweisen, eine Flagge setzen. Wohin die neuen Einheiten nach Fertigstellung automatisch hinfahren sollten. Wenn das der Fall ist, dann wird nach der Platzierung an einem der möglichen Ausgangsfeldern der Einheit eine normale Bewegungsbefehl (KI) mit dem Zielfeld gegeben. Sollte das Zielfeld besetzt sein, dann versucht die Einheit ein benachbartes freies und begehbares Feld zu finden oder sie macht sich auf den Weg und fährt so weit an das Ziel heran wie nur geht und stoppt dann. (Mit A* im Rücken geht alles einfach.) Du könntest zum Beispiel die Ausgangsfelder durch Ausgangs-Pivots ersetzen, Du definierst zu jeder Fabrik (relativ zu Position) ein paar Ausgangspivots und wenn deine Einheit fertig ist, checkst du, ob sagen wir von Fabrik aus zu diesem Bereich Line of Sight vorhanden ist (und zwar mit einer dicken Sichtlinie). Vergiß nicht für die Zeit der Line of Sight Checks (falls nötig) die Fabrik zu hiden, damit das nicht stört.) Oder, stat LOF Check gehst du alle existierenden EInheiten durch und chekst, ob eine davon nicht diesem Ausgangspivot zu nahe liegt (EntityDistance und zwar zusätzlich noch die Ausdehnung der EInheit mitberechnen). In meinem jetztigen Projekt, das in 3D ist, habe ich und werde ich nicht soviel KI drin haben, aber ich habe schon da auch lange die Bewegung fertig. Bei Bewegungbedarf checkt die Einheit, ob das Zielfeld in Line of Sight liegt oder nicht. Wenn ja, aber die Enternung noch zu groß ist, dann wird die aller einfachste Bewegungsrutine, die die EInheit lediglich geradeaus nach vorne schiebt initiiert. Sollte etwas im Weg sein, dann wird die mittelere Bewegungsrutine initiiert, die dazu in der Lage ist ein einfaches Hindernis zu umfliegen (KI). Richtige Pathfinding habe ich in meinem 3D Projekt nicht drin, aber für komplexe Hindernisse (wie das Innere einer Weltraumstation oder eine Höhle) habe ich ein Wegpunktesystem. Ich schaue also, wenn so einfach kein Weg gefunden werden kann, ob es in der Nähe des Ausgangspunktes der Einheit und in der Nähe des Zieles Wegpunkte befinden, die dem selben Wegpunktesystem angehören. Dann wird eine fortgeschrittene Bewegungsrutine initiiert, die Anhand der Wegpunkten einen Weg sucht. Ich muß also bei allen komplexen Hindernissen (davon gibt es nicht so viele) ein Wegpunktesystem setzen. Dafür habe ich schon einen komfortablen Editor fertig (zu 98%). |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auch, wenn die Beschreibung etwas so klingt, als gäbe es ein weiteres Problem, ein Teil des Problems scheint ein absoluter Klassiker zu sein: Damit Einheiten bei einer Positionierung nicht durch das Kollisionssystem sonstwohin gepackt werden, gibt es ResetEntity![]() Noch ne zweite Sache: Wenn du planst, daraus nach dem Wettbewerb noch nen fetteres Spiel zu machen: Strategiespiele funktionieren am besten ohne das Blitz-Kollisionssystem ![]() |
||
MrKeks.net |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke euch allen, es hat, aus welchem Grund auch immer an der Kollision gelegen, obwohl die Einheiten ja genug zeit haben (minimum 2,5 sek, bzw bis die Ressourcen wieder verfügbar sing), bis eine neue Gebaut werden kann.
Mit Xeres Lösung, die Kollison abzuschalten hatte ich zuerst erfolg, und von Reset Entity habe ich noch nie gehört, weshalb ich es vorher nicht probiert habe, aber es Hilf, danke Mr. Keks. [Edit] Und nein, es soll kein großes Strategiespiel werden, nur 2-3 Einheiten produzierenden Gebäude, die sich dann mit der KI-Seite battlen, welche Basis eingenommen wird hat verloren. Schüsse wollte ich sowieso auf Distanz prüfen, da ich auch nicht zu viele Kollisionen prüfen wollte. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group