DX "Konturen" um bestimmte Objekte

Crysis nerd

Freizeitschrauber(in)
Ich programmiere mit einen paar Freunden an einem kleinen Spiel. Wir bzw ich bin gerade dabei den Map Editor "anzufangen". Unser Spiel ist 2d und von der Seite aus betrachtet.
Die map ist im moment noch sehr einfach aufgebaut, nämlich aus festen tiles, die sozusagen in einem raster angeordnet sind und immer gleich groß sind.

Und als erstes möchte ich jetzt einfach mit der Maus bestimmte Tiles auswählen. Damit das schön aussieht ( ^.^ ) und für andere Sachen später, möchte ich jetzt, dass der tile, den ich mit der Maus hover, mit eine linie umzogen wird.
Ein recht gutes Beispiel dafür is Minecraft, was ja recht viele kennen. Dort wird der Block, auf den man guckt dünn umrandet.

Wie geht das?
Bzw. geht das einfach, kann man die Rahmenbreite auswählen oder sowas alles.


Ich hoffe einer von euch weiß etwas, was mir weiterhilft.

mfg
Lukas
 
Wenns nur in 2D ist, ist das Mousepicking ja schon mal relativ einfach.
Wie habt ihr denn eure Tiles gespeichert? Array, Vector ?
Im Falle eines Array müsst ihr einfach die MousePosition durch die größe eines Tiles teilen und ihr habt die Position des Tiles im Array.
Bsp:

MousePos: (400|500)
Tilegröße: (20|20) (Pixel)
ArrayPos = (400/20|500|20) = (20|25)

Natürlich solltet ihr dann noch prüfen, ob diese Position überhaupt im Array liegt, also einfach:
Code:
if (BerechneteArrayPosX > 0 && BerechneteArrayPosX < ArrayWidth && BerechneteArrayPosY > 0 && BerechneteArrayPosY < ArrayHeight)
// bla bla

Wenn ihr sie in einem Vector habt, dann müsst ihr entweder jeden Eintrag durchgehen und prüfen ob die MousePos im Bereich des Tiles liegt oder nicht oder, falls ihr einen 2D Vector habt, einfach genau gleich wie oben beim 2D Array.

Die Konturen an einem Tile sind auch nicht weiter schwierig.
Zeichnet einfach 4 Linien an den Tile Rändern, mehr ist das nicht.
Die Punkte der Linien lassen sich ja relativ einfach bestimmen, ihr habt ja die TilePosition und die Breite und Höhe eines Tiles, mehr braucht es nicht.

lg chaia
 
Hi KingofKingzZ,

das mit dem richtigen tile auswählen war auch nich so das Problem, sondern das schön zu umranden.
Aber ich denke das mit den Linien zeichnen war nen sinnvoller tipp, vorallem der "einfachste", jedenfalls für unser Anwendungsgebiet..

Trotzdem würde es mich nochmal interessieren, wie das "richtig" geht. Mein Freund meinte schon, mitn 2. Renderdurchgang im Wireframe modus oder so. Also was ich meine, ist auch in Crysis zu sehen. Gegner werden mit einer roten Kontur umzogen auf Einfach. Also dass man jedes Objekt, so komplex auch seien mag, einfach mit einer Kontur umziehen kann.

Trotzdem danke für die Antwort

mfg
Lukas
 
In Crysis wird das sicherlich mit Shadern gemacht. Ich denke du meinst einen ähnlichen Effekt wie er auch in Assassins Creed vorkommt, wenn man Gegner anvisiert?
In MineCraft oder in 2D lässt sich das allerdings relativ einfach machen, wie gesagt mit Linien oder wenn du das ganze Objekt/Sprite was auch immer irgendwie markieren willst, dann könntest du auch einfach eine halb-transparente Textur der selben Größe drüber hauen. So hatte ich es zumindest gemacht, als ich meinen letzten 2D Editor geschrieben hatte.
Damit du weißt wie ich das meine hab ich mal noch ein Bild angehängt.

lg
 

Anhänge

  • Editor 2011-04-18 21-42-22-42.jpg
    Editor 2011-04-18 21-42-22-42.jpg
    108 KB · Aufrufe: 108
Assassins Creed hab ich nie drauf geachtet wird gleich nachgeholt...(EDIT: ja ein wenig. Bei AC wird ja das ganze Ziel irgendwie so komisch erhellt. Nicht nur die Kanten. Das ist wahrscheinlich auch schon wieder fortgeschrittener..)
Also Shader hatten wir jez nich so wirklich vor, denn das sind ja, wie jeder weiß, Werkzeuge des Bösen, besonders für Hobby Programmierer :D. Ne echt für 2D bringts ja wohl kaum was..

Das in deinem Editor sieht so aus, wie ich mir das vorgestellt habe, nur das wir bei weitem nich so weit sind -.-
Verdammt wird das ne Arbeit...

EDIT:
Achja gerade hab ich in einem anderen Forum 2 Stichwörter an den Kopf geschmissen bekommen:
"'silhouette rendering' für 3D oder 'edge detection' wird mehr in 2D verwendet."
Hab mal ein bischen gegoogelt und zumindest das 1. ist etwas was mir weiterhilft, mich allerdings auch abschreckt. Einer der Ersten google Treffer besagte, dass die Technik zu "Hardcore Game Programming" gehört... :/

Wo wir gerade dabei sind, hast du vllt. ein paar Tipps oder Probleme(+Lösungen) auf die man auf jeden Fall stoßen wird, wenn man einen map editor fertigt?
Und hast du Lust hier im Thread weiterzu diskutieren? :P
Wenn ja, poste ich hier gleich mal die aktuelle Beschaffenheit der Map Daten.

mfg Lukas
 
Zuletzt bearbeitet:
Von mir aus können wir gerne weiter diskutieren :)
Falls ihr eure Objekte richtig umranden wollt, also wie jetzt z.B. eine Spielfigur, die viele Details besitzt, werdet ihr wohl nicht drum herum kommen Edge Detection o.ä. einzusetzen oder eine Grafik anzufertigen für jedes Objekt und diese dann eben auch noch zu rendern.
Mit Shadern kann man übrigens sehr schöne Dinge hinbekommen, auch im 2D Bereich ist da einiges drin.
Beispiele wären:
- Schatten/Beleuchtung (sind aber auch per CPU möglich und sogar relativ schnell)
- Bloom/Glow Effekte
- Unschärfe (Gaussian Blurring, Radial Blurring (bei ner Explosion oder so ganz brauchbar) etc.)
- Bei regnerischem Wetter könnte man z.B. die Sättigung dynamisch per Shader runterdrehen usw..

Und so viel kann man mit Shadern auch nicht falsch machen, nur Endlosschleifen sind teils bisschen nervig, wenn man den PC neustarten muss, weil der scheiß Treiber sich manchmal nicht resettet -.-

Was ihr beim Editor unbedingt beachten solltet:
- PLANUNG -> Also nicht einfach drauf los, sondern erst mal alles durchdenken und den Editor evtl. in Module etc. einteilen .Auf meinem Screen sind es Objects (bewegbar, physik Objekte etc.), Graphics (Lichter, Partikel Effekte wie Feuer, Rauch etc. und einfach Hintergrundgrafiken, mit denen der Spieler nicht interagieren kann), GamePlay (Hier platziert man die Startposition des Spielers, Gegner Spawn Punkte, PowerUps usw.). Zum Schluss noch Settings, wo ich einfach den Rest reinpacke wie Speicher/Laden der Map etc.
- Benutzt kein Array für die Tiles/Objekte -> Lieber nen Vector/List, bei meinem alten Editor hatte ich ein 2D Array und während der Entwicklung hunderte von Zugriffsfehlern, die ich alle erst mal beheben musste, weswegen der Code nacher wegen den vielen ifs ziemlich beschissen war und schlecht strukturiert. Mit nem Vector ist das ganze schön dynamisch und man braucht sich um kaum was sorgen.

Ansonsten... naja codet ihr das alles mit DX ohne Framework etc.? Könnte bisschen extrem viel Arbeit werden, je nach dem wie eure Ansprüche so sind..
Wenn ihr noch nicht so viel habt, wäre es evtl. gut, wenn ihr euch mal die SFML anschaut. Wirklich sehr simple und einfach zu benutzen und sehr schnell (bei richtiger Verwendung xD), basiert auf OGL.

lg
 
So erstmal super dass du deine Zeit "opferst", obwohl ich sagen muss , dass ich in den nächsten Tagen für geschätzt 20 Stunden nicht erreichbar bin ( portal portal portal )...

Also dass ich mit den Shadern ein wenig Müll geredet habe, is mir auch gerade eingefallen, weil ich mal eine Doku über ein Hobby-Spiel gesehen habe, in der auch erwähnt wurde, dass der Programmierer viele aktuelle Techniken verwendet hat und auch Shader.
Also was du da so erwähnst hört sich echt toll an, wenn auch nur als Schönheitsoperation am ende. Erstmal nen Editor machen, dann weitersehen^^. Aber wie gesagt: recht interessant...

So erstmal poste ich hier mal wie unsere Map bis jetzt aufgebaut ist. Das Konzept orientiert sich noch stark an dem von "Teeworlds". Falls du das mal angucken willst, ist kostenlos und 5 MB groß...
Da Level ist in mehrere Layer aufgeteilt, die hintereinander angeordnet sind (dazu kommt noch eine unterschiedliche Verschiebung bei Bewegung um einen 3D Eindruck zu erwecken, aber den erstmal weg lassen..). Die Layer können TileLayer oder Quads sein. Auf Quads kann man sehr genau Bilder platzieren und ihre Eckpunkte einzeln festlegen. Die Tile Layer sind praktisch 2dimensionale Arrays, die tiles in einer bestimmten Größe enthalten.
Außerdem gibts ein Spezielles Layer, das GameLayer. Das ist angeordnet wie die Tile Layer nur nicht mit Texturen sondern Spiel elementen, die Collision, Spawnpunkte etc.. (Ja Kollision ist nur in Quadraten)

Soweit zu Teeworlds. Bei uns ham wir einiges übernommen. Bei uns gibt es auch ein GameLayer, und ein MainLayer, welches wie ein TileLayer bei Teeworlds aufgebaut ist.
Die beiden Layer sind logischerweise auf der gleichen Ebene wie der Spieler. Alle Ebenen davor oder dahinter sind Quads. Die enthalten also eine Liste von Texturen mit ihrere Position.
Und ja wir nutzen überall Vectoren, Listen oder Maps, also aus der STL lib.

So für mehr Text hab ich gerade keine Zeit. Ich schreib demnächst mehr, keine Sorge, auch wenn ich ne pause machen ( portal portal portal )..

mfg
Lukas
 
Hab mir Teeworlds eben mal angeschaut. Nettes Spiel, erinnert mich etwas an "Soldat" (ähnliches 2D Game).
So ähnlich (mit den Layern) ist das ganze bei mir auch aufgebaut. Hinten ne ScrollingMap, dann die Grafiken wie Bäume etc. und im Vordergrund schließlich der Spieler mit den statischen (unbeweglichen) und dynamischen (beweglichen) Objekten. Ich bin allerdings nicht an an TileGitter gebunden, sondern berechne alle Objekte mit Box2D, so hab ich auch noch einige nette Physikeffekte drin :)

lg
 
Teeworlds is echt nich schlecht, aber im moment machts mir nichmehr soviel spaß, sind nur noch so viele Pro-Server, Clan server auf die man nich kommt und server wo nur 4 aktive Spieler zulässig sind.. Früher wars besser ;)
Das mit Box2D haben wir uns auch überlegt... Naja ehrlich gesagt war ich die treibende Kraft in unserer Gruppe, die dann gesagt hat, wir machen was eigenes, weil alles andere nur overpowerd wäre für unser anwendungsgebiet... Ich bin mir echt nich sicher ob wir noch umsteigen sollen, da wir 1. schon ne eigene (wenn auch sehr eingeschränkte) collisionsberechnung haben und da wir 2. das map system nochmal ein bischen umbauen müssten.

Ma gucken ob ich heute portal 2 in die hände kriege (ja ich will das als reale box!), sonst kann man ja heute noch weiterüberlegen ;)

mfg
Lukas
 
Naja nur Kollisionserkennung ist ja nicht schwer (ob mit BoundingBox oder PixelPerfect Test), aber wie man dann auf eine Kollision reagiert ist nicht so ganz einfach.
Solange die Map allerdings nur aus Tiles besteht dürfte auch das kaum ein Problem sein. Wenn es allerdings - wie bei mir - einige Physikeffekte geben wird (z.B. umfallende Kisten etc..), wird es erst mal etwas dauern etwas eigenes auf die Beine zu stellen. Ich hab ca. 1 Tag gebraucht um mich mit Box2D einzuarbeiten, ich muss sagen es hat sich gelohnt.
Für den Anfang muss man auch kaum was selbst übernehmen, einfach b2World erstellen, für jedes Objekt einen b2Body dazupacken und dann eben die Position des Sprites und Rotation mit dem des b2Bodys synchronisieren - Fertig.
Für den Spieler nimmt man dann einfach ebenfalls einen solchen b2Body, allerdings habe ich ihn auf eine FixeRotation gestellt, damit er nicht wegen ner kleinen Kiste umkippt oder so :ugly:
Dann setzt man die Velocity des Spielerbodys jedes Frame auf 0 und wenn er eben die entsprechende Taste gedrückt hat, setzt man sie auf den entsprechenden Wert.
Naja wie auch immer, ich kann Box2D jedenfalls nur empfehlen :)

lg
 
So da bin ich wieder...
Also das mit Physik... wie gesagt wir haben schon etwas, was für unserer Zwecke funktioniert. Auch das Reagieren auf Kollision (was ich eig in das Wort "Kollisionsberechnung" eingeschlossen habe).
Im Moment brauchen wir also nichts wie Box2D, ich würd mich wundern wenn wir unsere Spielemechanik noch so umstellen, dass wir darauf angewiesen sind..

Naja mal wieder zurück zu Map Editor. Also mein Plan war es am Anfang ihn recht simple zu gestalten. Man klickt auf ein Tile. Über das Tile werden dann recht in einer Box informationen angezeigt (position und aktuelle Textur). Die Textur kann man dann zb. mit den Pfeiltasten ändern. Wenn ich das schonmal hinkriege wäre das keine schlechte Sache.
Es is halt jez nur recht schwierig ein Einstiegspunkt zu finden, meiner Meinung nach...

mfg
Lukas
 
Zurück