[Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Antworten
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

[Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Hallo,
hier möchte ich mein Projekt Blocks nochmal vorstellen, nachdem das alte Developiaforum ja nicht mehr so lange verfügbar war ;)
Ich entwickle dies als besondere Lernleistung für mein Abi nächstes Jahr, im Prinzip ein Art 5. Prüfungsfach. Meine Motivation ist meine natürliche Begeisterung für das Thema und die Tatsache, das meine Schule kein Informatikunterricht bietet und ich gerne meine Fähigkeiten dort auch ins Abi bringen will. Das hat man mir immerhin als BLL gestattet ;)

Die Idee
Die Idee für mein Projekt ist es, die Grundlage für verschiedene Arten von 2D-Spielen zu schaffen, also Darstellung der Grafik, Physikberechnung, Soundwiedergabe, Verwaltung von Ressourcen, und die letztendliche Spiellogik mit Skripten zu realisieren. Ein Leveleditor soll es auch nicht-Programmierern ermöglichen vorgefertigte Skripte zu nutzen um sich eigene Level zusammen mit den jeweiligen Skripten zu bauen.
Fertige Level werden hierbei in einer eigenen Datei gespeichert, die alles was der Level benötigt enthält und so leicht weitergegeben werden kann.

Das Hauptspielkonzept, das ich derzeit entwickle, ist ein klassisches Jump'n'Run, welches von der Physikengine jBox2D profitiert und damit ein paar lustige Effekte realisiert.

Der aktuelle Stand der Dinge:
Alle Grundfunktionen sind komplett.
Es gibt bereits über 9 funktionsfähige Jump'n'Run Level, die teilweise auch die Physik von jBox2d schon ganz gut ausnutzen.

Des Weiteren eine simple Tetrisversion und ein Spiel namens
ClickBlocks, bei diesem geht es darum gleichfarbige Blöcke wegzuklicken und dafür Punkte zu kriegen. Der Clou ist, das man mit den Pfeiltasten die Gravitation verändern kann um die Blöcke zu verschieben.

Der Leveleditor ist bereits gut brauchbar und es existieren Tutorials.

Die Technik
Ich verwende Java2D, für die Physik lasse ich jBox2D rechnen und als Soundstandard verwende ich ogg's.

Um das Spiel zu spielen benötigt ihr einen Rechner, der mehr kann als ein Netbook und es muss Java installiert sein, das Spiel wird beim ersten Start versuchen, die Qualitätseinstellungen anhand eurer Grafikkarte zu setzen.

Bilder

Der Leveleditor:
Bild

Ingame:
Bild

ClickBlocks:
Bild

Würde mich über Feedback, Kritik, und Erfahrungsberichte zum Editor/dem Tutorial freuen :)

Tetris:
Bild

EDIT:
Dank Sicaine hab ich jetzt ein bisschen Webspace. :)

Es gibt jetzt eine installierende Version, welche die Mapdateien mit dem Spiel registriert. So ist das Starten einer Mapdatei per Doppelklick möglich.

Version 0.17 vom 17. Februar 2011
Hier gibt es nun immer das aktuelle Changelog
Download des Installers, empfohlener Download
Alternativ der Download als zip-Archiv, ohne Installation

Vorstellung des Projektes nun auch auf meiner kleinen Website: klick
Zuletzt geändert von Cola_Colin am 21.02.2011, 19:54, insgesamt 12-mal geändert.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Chromanoid »

Nettes Spiel, ich hab aber beim Augenlevel aufgegeben. Ich hatte zwölf Schlüssel aaah. Man merkt ein bisschen, dass Box2D im Einsatz ist - die Steuerung ist ja bei Jump-And-Runs immer ein bisschen hakelig und man kann an seltsamen Stellen abspringen usw., aber das tut dem Spielspaß keinen Abbruch. Checkpoints oder so wären nicht schlecht. Bei Knytt Stories finde ich das Speichern ziemlich perfekt gelöst...

Den Leveleditor finde ich auch ziemlich gut. Ich hätte gerne noch eine Vorschau für den Hintergrund.

Achja und wenn du es schaffst wäre ein anderer Hoster echt super. Sonst frag doch mal den Herren, der einen Rootserver angemietet hat (auch hier im Vorstellungsbereich zu finden -> http://zfx.info/viewtopic.php?f=10&t=901), ob er nicht einen kleinen freeware Spiele Hosting Service aufmachen will.
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Du kannst die Level auch unter unter Maps direkt starten, in der Version sind einige sonst gar nicht verfügbar. Gerade in den neueren Level gibts auch mehr dynamische Blöcke :)

Checkpoints sind so eine Sache, derzeit wird beim sterben die Map praktisch komplett neugeladen.
Derzeit ist mein Plan, die Level eher kürzer zu machen. So ist praktisch jeder Level selber ein Checkpoint an sich.
Das Problem ist mir erst recht spät aufgefallen, weswegen es jetzt ein oder zwei recht lange Level gibt.

Es gibt eine Vorschau für den Hintergrund, sobald man einen für den Level erstellt hat. Der wird direkt im Leveleditor angezeigt ;)
Oder wie meinst du das ?

Ein anderer Hoster, ja. Das wäre toll, schon alleine wegen der Möglichkeit das der Link immer auf die aktuellste Version zeigt. Werd mal freundlich nachfragen, bzw selber nach was, danke für den Tipp.
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Ich hab das Problem mit den Checkpoints weitgehend gelöst :)

Neue Version 0.12:

Code: Alles auswählen

v0.12 Release Donnerstag, 14. Oktober 2010
	- jBox2D modifiziert: Es ist nun möglich einen Faktor für die Gravitationswirkung auf bestimmte Körper zu setzen.
	- Neues Resetsystem hinzugefügt. Dieses ermöglicht das setzen eines temporären Speicherpunktes, an den ein Level 
		zurückgesetzt werden kann. Es gelten folgende Einschränkungen:
			- Alte Maps unterstützen dieses System erst vollständig nach dem Austausch der Skripte simplePlayer.bsh und gameOverSprite.bsh.
				Dies wurde bei allen mitgelieferten Maps durchgeführt.
			- Wurde ein Spielobjekt zwischen setzen des Punktes und dem reset zerstört, so wird der dem Spielobjejt 
				zugrunde liegende Body ausgetauscht: Vorsicht mit Referenzen auf Body & Shape in Skripten !
				Dies bedeutet auch, dass Joints zu dem Body nicht wiederhergestellt werden.
			- Mouse/Collisionlistener, die zwischenzeitlich hinzugefügt oder entfernt wurden, bleiben bestehen.
			- Die Skripte werden nicht automatisch zurückgesetzt, sie werden nur über neue Methoden der jeweiligen Interfaces 
				über den Reset/das Setzen eines Resetpunktes in Kenntnis gesetzt.
			- Komplexere Sprites, wie die Brücke oder der sich bewegende Block werden nach ihrer Zerstörung nicht wiederhergestellt.
				Die Skripte sind (zumindest derzeit) nicht angepasst um die oben genannten Beschränkungen aufzuheben.
	- Unter Verwendung dieses Resetsystemes gibt es nun einen neuen Spielstein: den Checkpoint. :)
	- Debugfunktionen (bei debugmode=true in der game.ini) nun auf den F-tasten:
		F1: freie Kamera
		F2: debugdrawing
		F3: Resetpunkt setzen
		F4: letzten Reset laden
		F5: letzten Reset löschen
		F6: gameSpeed plus 0.1
		F7: gameSpeed minus 0.1
		F8: gameSpeed auf 1 (Standard)
	- Funktion zum Schnellupdate der Levelskripte in den Leveleditor eingefügt.
	- Der Name eines neuen Templates wird im Leveleditor nun direkt markiert.
	- Ein Doppelklick auf ein Template in der Templateliste öffnet nun das Editierfenster für dieses Template.
	- Eine Reihe kleinerer Bugfixes des Leveleditor UI.
	- Die Preview der Templates im Editor zeigt nun auch die Rotation der Steine an
	- Die Preview der Templates im Editor zeigt nun eine dünne Trennlinie zwischen den einzelnen Templates.
	- Simpler Hintergrund im Hauptmenü hinzugefügt.
	- Part 2 des Editortutorials: Skripting hinzugefügt; derzeit noch nicht komplett, aber schon informativ denke ich.
Download(ca. 30 Mbyte) hier.

Komplettes Changelog hier.
ChsBlue
Beiträge: 4
Registriert: 17.10.2002, 11:57
Alter Benutzername: ChsBlue
Wohnort: Niedersachsen
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von ChsBlue »

Hey nicht schlecht!
Der Mainchar: absolut genial! :D

Das Gameplay ist ein bisschen Box2Disch aber bei einer so frühen Version kein Ding. Der Editor weiß auch sehr zu gefallen - vor allem das man die Welten gleich ausprobieren kann.

Auf meinem Rechner (Windows XP, 32Bit, Java 1.6_20) ists alles ein bisschen Pixelig. Hast Du schon die Rendering-Hints entdeckt?

Code: Alles auswählen

// g2d = Graphics2D Objekt des Backbuffers

g2d.setRenderingHint(RenderingHints.KEY_RENDERING,          RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,       RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,  RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,    RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING,          RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,      RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Vielleicht hilfts ja :)

Gruß und weiter viel Erfolg
Christoph
joggel

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von joggel »

Also bei mir geht es nicht!
Es wird in Vollbildmodus umgeschaltet, ein weißer Bildschirm, Musik ertönt aber es passiert nix. :(
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

@ChsBlue:
ja, wird in den Optionen als "High Quality Rendering" angeboten, schau dir den Unterschied mal an. Des Weiteren bestimmt der Quality-schieber die Auflösung in der das Bild berechnet wird, bevor es auf den Monitor skaliert wird.
Einige der Grundgrafiken sind jedoch an den Ecken so pixelig, dass es wenig hilft.
Sonst zeig mal Screenshots, dann kann ich sagen ob es ungewöhnlich ist.
Bin mir gerade aber nicht sicher, ob ich alle Renderingshints drin habe, die du da jetzt aufzählst. Ich schau mal ob es noch was bringt.
Kantenglättung hatte ich aber auf jedenfall.
EDIT:
Hmm, nein wirklich groß sichtbar ist da kein Unterschied mehr. Was mich erstaunt hat, ist das BICUBIC interpolation meinen Rechner auf so 2 fps drückt :shock:
Welche Auflösung hat dein Monitor ?

Was bedeutet bei dir Box2D-ish ? Mir ist klar, dass sich das Spiel anders anfühlt als es ein Super Mario tut, aber als schlecht empfinde ich es so nicht.

@joggel:
Schau mal unter Data in die dort liegenden Logfiles. Steht da was ?
Was für ein System verwendest du ?
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Neue Version 0.13:

Code: Alles auswählen

v0.13 Release Sonntag, 21. November 2010
	- Namensersetzungsystem fuer Skriptnamen im Skripten hinzugefuegt.
		Dies ermoeglicht die Reaktion eines Skriptes auf eine Gruppe von anderen Skripten ueber einen einzige Identifikation.
		Da eine Gruppe nicht auf andere Gruppen verweisen kann, sind Endlosrekursionen ausgeschlossen.
		
	- Der Pacman-level wurde entfernt, er funktionierte nicht mehr und ist eh nicht fertig gewesen. Selbiges gilt fuer seine Skripte.
	
	- Es ist nun moeglich Importe in die nfo von Levelskripten hinzuschreiben, deswegen muss alles andere in der leve.nfo mit // kommentiert werden.
	
	- Level 8 hinzugefuegt. Es gibt nun insgesamt 10 Level plus Clickblocks und den Level von Eisbrecher.
	
	- javaDoc ist nun komplett.
	
	- eine ganze Reihe von Bugs gefixed, die zu Abstuerzen fuehren konnten.
	
	- Es wurde ein Bug gefixed, der beim Start Swing durcheinanderbrachte und das Programm unsichtbar machte.
	
	- Die Logfiles geben nun in ihrer ersten Zeile stets an, ob sie vom Editor oder dem Spiel erzeugt wurden.
	
	- Die per Bitmapfont gezeichnete Schrift wurde verbessert. 
		Sie wird nun staerker geglaettet und die Quelldatei enthaelt die Schrift in hoeherer Qualität bei gleicher Dateigröße.
	
	- Die Dateipfade sollten jetzt plattformunabhängig sein. 
		Beim Wechsel zwischen Linux und Windows muss jedoch die ini des Spieles gelöscht werden. Das Spiel wurde bis jetzt nicht unter Linux getestet.
		
	- Vorschaubilder zu den Maps hinzugefuegt.
	
	- Es wurde ein Bug gefixed, der in seltenen Fällen dazu fuehrte, dass Sounds mit maximaler Lautstärke ausgefuehrt wurden, trotz anderer Einstellung.

	- Deutliche Memoryleaks gefixed. Dies sollte den Arbeitsspeicherbedarf signifikant reduzieren. 
		Diese Änderung sollte auch die Ladezeit fuer einen Levelneustart deutlich reduzieren.
		
	- Der Spieler fuellt nun endlos ins Nichts, und bleibt nicht mehr in der Luft stehen.

	- Aus dem Spielfeld herausfallende Spielobjekte werden nicht mehr im Sichtfeld des Spielers entfernt.
Download(ca. 32 Mbyte) hier.

Komplettes Changelog hier.

EDIT:
Es gibt jetzt eine installierende Version, welche die Mapdateien mit dem Spiel registriert. So ist das Starten einer Mapdatei per Doppelklick möglich.

Download des Installers, empfohlener Download
ChsBlue
Beiträge: 4
Registriert: 17.10.2002, 11:57
Alter Benutzername: ChsBlue
Wohnort: Niedersachsen
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von ChsBlue »

Moin moin.

Habs nochmal aufm DesktopPC (Win7 64Bit, 1920x1080, neuste JRE) auf High-Quali ausprobiert. Hier der Screenshot.
Bild

Wenn du die RenderingHints auch für die anderen Graphic2D-Objekte die Du zum Zeichnen nimmst sollten auch diese Kanten verschwinden (auch beim Hintergrundbild). Auch wäre dann die Schrift auf dem Schild besser lesbar. Aber ist ja alles nur Detailkrams, das Gameplay funktioniert so ja auch so :)

Vielleicht hilft es die gesamte Spielszene (auch den Hintergrund) zunächst in einen festen Backbuffer zu rendern und dann das Ergebnis auf die Fenstergröße im richtigen Seitenverhältnis zu skalieren. Die Größe des Puffers kannst Du beim Resizen des Fensters ja jedes mal neu anpassen. Die ausbleibenden Stellen lässte einfach schwarz (etwa so wie VLC das mit Videos im Fenstermodus macht).

Bild
(Verhältnis w zu h ist dabei konstant - unabhängig von der Fenstergröße)


Viel Spaß beim Basteln und weiter so :)

Christoph
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Ok, jetzt weiß ich was du meinst.
Zuerstmal zu meiner Technik:
Ich zeichne bereits auf einem backbuffer, dessen Größe ist unabhängig von der Fenstergröße. Der Qualityregler im Menü ist ein Faktor für die Auflösung des Backbuffers. Vor dem Starten des Zeichnens wird der sichtbare Bildbereich berechnet, es werden also jegliche Bildverhältnisse unterstützt. Das Bild wird dann auf den backbuffer gezeichnet und danach passend skaliert auf die sichtbare Fläche gezeichnet.

Die RenderingHints habe ich ursprünglich nur bei diesem letzten Schritt aktiviert, also beim skalieren des fertigen Bildes auf die sichtbare Fläche.
Das glättet die teils extremen Kanten des Hintergrundes(der nunmal teils ziemlich gestrecht wird) in der Tat nur unzureichend.
Ich habe nun testweise das Zeichnen auf die backbuffer schon mit den RenderHints versehen, das Ergebnis sieht so aus:

Bild

Die Kanten des Hintergrundes sehen so in der Tat sehr schön aus. Aber die Kachelung der Spielwelt macht das so nicht mit.
Bisher habe ich deswegen nur bei der Schrift die Glättung schon beim Zeichnen auf den buffer eingeschaltet. Ich denke ich werde es auch noch für den Hintergrund aktivieren. ;)

Ich experimentiere mal ein wenig mit den RenderingHints, eventuell kriege ich eine Kombination hin, die den gezeichneten Inhalt nicht die Kachelung über den Haufen wirft xD

EDIT:
Nein, die Option, die das ganze erst schön werden lässt, ist die gleiche, die auch diese Bildfehler verursacht.
joeydee
Establishment
Beiträge: 1058
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von joeydee »

Es scheint, dass du die Tiles dicht an dicht auf einer Textur hast und so beim Glätten das benachbarte Tile mit einbezogen wird. Das wirst du wohl nur los, indem du die Tiles und Texturkoordinaten neu organisierst, sodass um jedes Tile ein 1-Pixel-Randpuffer wiederholt wird.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4879
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Schrompf »

Oder man clampt die Texturkoordinaten auf einen halben Texel vor dem Rand. Haben wir Splatter so gemacht, funktionierte ganz gut.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Danke für die Ideen.
Halbes Texel ?
Wüsste nicht wie ich halbe Pixel ansprechen soll, aber folgendes sieht recht brauchbar aus:

Code: Alles auswählen

        out[0] = texLeft+1;
        out[1] = texTop+1;
        out[2] = texRight-1;
        out[3] = texBottom-1;
:)
Seraph
Site Admin
Beiträge: 1174
Registriert: 18.04.2002, 21:53
Echter Name: Steffen Engel

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Seraph »

Schrompf hat geschrieben:Oder man clampt die Texturkoordinaten auf einen halben Texel vor dem Rand. Haben wir Splatter so gemacht, funktionierte ganz gut.
Cool, danke, das hat auch glatt meine Probleme geloest. :)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4879
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Schrompf »

Mit "Clamp" meine ich extra Zeilen im Pixelshader. Das kostet Laufzeitperformance, vermeidet aber jegliche Skalierungen. Das Ding beim bilinearen Filter ist ja, dass er benachbarte Pixel ranzieht. Frei nach D3D9-Rasterizer Rules:

Code: Alles auswählen

0    1   2   3   4
+---+---+---+---+
|...|...|...|...|
+---+---+---+---+
Das sollen vier Texel einer 4x1-Textur sein. Wenn ich korrektes Subpixel Rendering haben will, also meine Sprites auch mit Fließkomma-Pixelkoordinaten auf dem Bildschirm platzieren will, muss ich einen exakten Bereich auf der Textur angeben, der gemappt werden soll. Im obigen Fall ist der Bereich zum Beispiel von (0.0, 0.0) bis (4.0, 1.0). Das bedeutet nach D3D9-Rasterregeln die linke obere Ecke des ersten Texels bis zur rechten unteren Ecke des letzten Texels.

Jetzt wird es kurz hässlich: Direct3D9 hat noch eine seltsame alte Regel, wonach Bildschirmkoordinaten nicht so schön sauber adressiert sind wie Texturkoordinaten. Stattdessen ist (0.0, 0.0) die MITTE des linken oberen Bildschirmpixels. Wenn wir genau Texel auf Pixel mappen wollen, müssen wir unser Sprite also von (-0.5, -0.5) bis (3.5, 0.5) legen. Daher kommt auch die Empfehlung, 2D-Zeichenbefehle immer einen halben Pixel nach links oben zu verschieben. Das tun wir jetzt mal. Dann würde der Pixelshader (ohne AA) genau vier mal laufen, jeweils für (0.0 + x, 0.0) - also für die Mitte der Bildschirmpixel. Die interpolierte Texturkoordinate, die im Pixelshader jeweils ankommen würde, wäre auch genau die Mitte des jeweiligen Texels, in Zahlen (0.5 + x, 0.5). Wir können in dieser perfekten Situation also den bilinearen Filter an oder ausschalten, es würde keinen Unterschied beim Ergebnis machen.

Wir wollen aber bilinear filtern! Es sieht nämlich besser aus, sobald man skaliert, rotiert und halt seine Sprites um Subpixel verschoben platzieren möchte. Und da kommt jetzt das Problem des Filters. Wieder am Beispiel: wir platzierung unser Sprite um 0.2 Pixel nach rechts unten verschoben. Nach den albernen D3D9-Regeln für Bildschirmpixel wäre das also (-0.3, -0.3) bis (3.7, 0.7). Wenn die Grafikkarte diese Dreiecke rastert, läuft unser Pixelshader auf Backbuffern ohne AA wieder viermal, nämlich wieder jeweils für die Mitte des jeweiligen Bildschirmpixels. Die interpolierte Texturkoordinate im PixelShader wäre also nach links oben verschoben! Nämlich (0.3 + x, 0.3). Jetzt würde der bilineare Filter zuschlagen, er würde anteilig ein bisschen Farbe der Texel links und drüber reinmischen. Und links bzw. drüber liegen (nach dem Texturkoord-Wrapping) andere Spritegrafiken auf der Textur! Die GPU filtert uns da also Unsinnsfarben rein.

Dafür gibt es jetzt verschiedene Lösungen. Die billigste: setze die Texturkoord-Methode auf CLAMP anstatt WRAP. Damit macht die Grafikkarte das Clampen für uns, der bilineare Filter filtert in der Mitte des Sprites korrekt und am Rand holt er keinen Grafikmüll mit rein. Das Problem an dieser Lösung ist, dass man für jedes einzelne Sprite eine Textur mit der exakten Größe aufmachen muss. Das kostet beim Rendern einen riesigen Haufen Performance, permanent die Texturen wechseln zu müssen.

Eine alternative Lösung ist es, einfach den Texturbereich zu reduzieren. Wir wissen, dass der Texturfilter bei <0.5 beginnt, den linken Nachbar mit reinzusamplen. Also reduzieren wir unseren Texturbereich um jeweils einen halben Texel nach innen! Aus (0.0, 0.0) / (4.0, 1.0) würde dann (0.5, 0.5) / (3.5, 0.5). Clever, oder? Nein, ist es leider nicht. Diese Methode kann man prima machen, wenn man in 3D arbeitet. Z.B. wenn man Pages einer großen Textur auf ein Terrain mappt. In 2D aber wollen wir ja (unskaliert zumindest) auch genau die Texel der Ausgangstextur auf dem Bildschirm sehen! Und bei dieser Reduktion des Texturbereiches schmiert es uns die übrigen Texel breit, weil wir nur noch einen Texturbereich von (3.0, 0.0) auf einen Bildschirmbereich von (4.0, 1.0) strecken. Das sieht matschig aus.

Da kommt nun die dritte Lösung ins Spiel, die wir bei Splatter einsetzen: wir schreiben ein paar zusätzliche Befehle in den Pixelshader, die den Texturzugriff auf den Innenbereich des Texturteils beschränken, ohne die Texturkoordinaten zu verändern. Als Code sieht das so aus:

Code: Alles auswählen

struct PixelEingabe
{
  float4 mFarbe : COLOR0;
  float2 mTexKoords : TEXCOORD0;
  float4 mMinMaxKoords : TEXCOORD1;
};

sampler2D Textur;

float4 main( const PixelEingabe rein) : COLOR0
{
  float2 texk = clamp( rein.mTexKoords.xy, rein.mMinMaxKoords.xy, rein.mMinMaxKoords.zw);
  float4 farbe = tex2D( Textur, texk);
  farbe *= rein.mFarbe;
  farbe.rgb *= farbe.a; // für Premultiplied Alpha
  return farbe;
}
Mit D3D9 müssen wir dazu natürlich den Texturbereich mit reinreichen - wir machen das als zusätzliches Vertex-Attribut, dass der VertexShader einfach durchreicht und der Pixelshader benutzt, um die interpolierte Texturkoordinate zu clampen. Unter D3D10 könnte man wahrscheinlich im GeometrieShader was zaubern, was diesen Clamp-Texturbereich aus den Texturkoordinaten des Sprites extrahiert, so dass man den nicht nochmal separat reinreichen muss. Der Vorteil ist, dass man bei exakter Ausrichtung des Sprites genau Texel auf Pixel abbilden kann. Und sobald man mit Rotation, Skalierung oder AntiAliasing arbeitet, stellt der Pixelshader trotzdem sicher, dass man keinen Grafikmüll aus benachbarten Texturbereichen ansaugt. Der Nachteil ist natürlich, dass es zusätzliche Fillrate kostet, und dass es mindestens Shadermodell 2.0 erfordert.

Da wir bei Splatter und besonders bei den Splitterwelten quasi eh nur CPU-limitiert sind, waren uns diese Nachteile recht. Zumal wir bei Splatter den fillrate-intensiven Teil (die Beleuchtung) nur in Viertel-Bildschirmauflösung gemacht haben. Ob das auch für eure Szenarien auch funktioniert, müsst ihr selber abschätzen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Chromanoid »

mit java2d sollte der ganze kram afaik nicht so möglich sein. evt. geht variante 2...
was benutzt du momentan zum malen, texturepaint oder drawimage?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4879
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Schrompf »

Ahso. Oh. Ähm. Ok, vergiss meine Ausführungen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Oh interessant zu Lesen ist es trotzdem, bei meinem nächsten Projekt werde ich mit OpenGL oder DirektX arbeiten wollen ;)

Java2D bietet mit in der Tat bei weitem nicht die Möglichkeiten, um solche Korrekturen durchzuführen.
Ich habe jetzt einfach bei der Berechnung der Kachelkoordinaten die Kacheln eben um je 1 Pixel oben unten rechts und links verkleinert.
Ergebnis:
Bild
Die Textur des Ladebildschirms zeigt in einem Frame einen gewissen Fehler dadurch, der ist aber vernachlässigerbar klein.
Ingame sind mir nirgendwo Grafikfehler aufgefallen, obwohl ich direkt drauf geachtet habe. Denke das kann ich so machen.

EDIT:
Neue Version 0.15, unter anderem mit der verbesserten Darstellungsqualität.
Changelog
Download des Installers, empfohlener Download
Alternativ der Download als zip-Archiv, ohne Installation
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Triple-Post-Power.

Das wohl letzte Update, v0.17. Mit dieser Version habe ich heute das Kolloquium gehalten und 15 Punkte für meine besondere Lernleistung abgeräumt :)
Bei den Änderungen handelt es sich hauptsächlich um bugfixes und Verbesserungen der Stabilität. Vor allem auf Systemen mit nur einem einzelnen eher langsamen CPU-Kern sollte es merkliche Verbesserungen bei Soundwiedergabe und allgemeiner Stabilität geben.

Changelog
Setup-Download
zip-Download

Damit erkläre ich dieses Projekt für Fertig, mal sehen was ich so als nächstes anstelle xD
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Chromanoid »

Cola_Colin hat geschrieben:Mit dieser Version habe ich heute das Kolloquium gehalten und 15 Punkte für meine besondere Lernleistung abgeräumt :)
Glückwunsch :)
Cola_Colin
Beiträge: 15
Registriert: 31.08.2010, 21:44

Re: [Projekt] Blocks - 2D Jump'N'Run in Java mit Leveleditor

Beitrag von Cola_Colin »

Danke danke :)
Antworten