# Vektorgrafik in JPanel



## frostbyte (15. Dez 2010)

Hallo,

ich arbeite gerade an einem Spiel (momentan 2D), in dem ich gerne Vektorgrafik benutzen würde, da man wild hinein und heraus zoomen kann, wahrscheinlich gut um den Faktor 1000 bis 10.000, da sind Pixelgrafiken nicht wirklich hilfreich.

SVG würde sich anbieten, da man dann alle Models mit Inkscape erstellen kann.

Die Welt selbst würde ich auch gerne als SVG erstellen, falls das möglich ist.

Bis jetzt habe ich alles in einem JPanel mit überschriebener paintComponent(Graphics g) Methode angezeigt. Vorher wird noch alles durch eine AffineTransform gejagt. Wie bekomme ich jetzt dort die SVG rein?

Batik habe ich gefunden, das sieht allerdings nach etwas zu viel aus für meinen Zweck.

Kann man auch irgendwie abfragen, ob die SVG-Figuren und die SVG-Karte gegeneinander stoßen würden?


Grüße,

frostbyte


----------



## SlaterB (15. Dez 2010)

Anmerkung: SVG ist kein Zauberkasten, wenn man dort zoom, wird schlicht aktuell neugezeichnet,

ob du nun in SVG-Format "linie von 3,4 nach 7,6" schreibst und irgendein Tool das passend malt
oder du selber ein Koordinatensystem verwaltest und dort drawLine(3,4,7,6) malst, macht fast keinen Unterschied,
man kann den Bildschirm nur Pixel für Pixel malen, anders gehts gar nicht, höchstens noch Spielereien wie Antialiasing,

du hättest in deinen eigenen System allein noch die Arbeit, den Zoom bei dir einzubauen, 
also auszurechnen, dass Welt-Koordinate 3,4 bei aktuellen Zoom und aktuellen Bildausschnitt Pixelkoordinate 520, 419 bedeutet
fast zu schade so ein schickes eigenes Mal-System an externe Tools auszulagern

> Kann man auch irgendwie abfragen, ob die SVG-Figuren und die SVG-Karte gegeneinander stoßen würden?

schon der erste Grund, lieber zu Hause zu bleiben  , für mich jedenfalls, im eigenen System kannst du alles rechnen,
natürlich gibts vielleicht schöne Tools, die vieles bieten,

aber auch eine Mischform ist gewiss möglich, alle Daten in der eigenen Welt modellieren, dort Kollisition usw. ausrechnen,
und nur vor dem Malen nach SVG transformieren so wie man vor dem Malen Pixelkooridinaten ausrechnen müsste

--------

wenn du Grafiken abspeicherst, für externe Bildprogramme oder PDF, die Zoomen, ja dann ist SVG ganz stark,
denn externe Programme können diese gut zoomen, ein Jpeg dagegen verpixelt, aber bei paintComponent()..


----------



## frostbyte (15. Dez 2010)

Gut, dann werde ich die Models in SVG designen, diese dann rastern (inkscape, imagemagick, irgendwas derartiges) und dann im Spiel benutzen. Ist dann noch ein brauchbarer Kompromiss.

Das Übersetzen zwischen Spiel und Bildschirmkoordinaten macht die AffineTransform super, das ist also schon gedeckt.

Für die Welt lasse ich mir noch etwas einfallen, vielleicht erzeuge ich die einfach als Line2D[], so kann ich Kollisionen einfach machen.


----------



## Guybrush Threepwood (16. Dez 2010)

Vielleicht ist das folgende etwas für Dich, wenn Du keine Batik-Abhängigkeiten möchtest. Die Bibliothek svg2java - Project Hosting on Google Code übersetzt SVG in Java-Code, ähnlich wie es beispielsweise auch bei Flash gemacht wird. Die Grafiken werden dann nicht als Bitmap, sondern mit Java2D gezeichnet. Hierdurch müssen Grafiken nicht skaliert werden und es gibt keine Qualitätsverluste.

Ich habe allerdings noch nicht damit gearbeitet und nur mal einige SVG-Icons testhalber übersetzt. Das funktionierte meistens, aber nicht immer.

P.S.: In diesem Zusammenhang recht spannend: http://idisk.mac.com/han.solo-Public/Presentations/ForgottenPowerOfSwing/ForgottenPowerOfSwing.pdf


----------



## frostbyte (16. Dez 2010)

Joa, das sieht gut aus. Allerdings bekomme ich es nicht geöffnet. Vielleicht legt sich das noch. Mit den Pixelgrafiken sieht es einfach nur gruselig aus, es wäre also schon wirklich gut, wenn ich doch Vektorgrafik in das Spiel packe.

Kann ich mit Batik denn einfach in meine Graphics2D unter Anwendung der AffineTransform malen, oder ist das schwerer?


----------



## frostbyte (16. Dez 2010)

Jetzt bin ich gerade über JavaFX gestolpert, das klingt doch nicht verkehrt. Vor allem da Inkscape nach JavaFX exportieren kann. Nur muss ich wohl JavaFX noch nachinstallieren, da es unter Mac OS X 10.5 wohl nicht dabei ist. Wird natürlich auch im Deployment etwas aufwändiger ...


```
import javafx.scene.*;
import javafx.scene.shape.*;
import javafx.scene.transform.*;
import javafx.scene.paint.*;

public class Fly extends CustomNode {
    /* create LinearGradient for linearGradient3030 */
    function linearGradient3030(): LinearGradient {
        LinearGradient {
            stops:
                [
                Stop {
                    offset: 0.00000000
                    color: Color.rgb(0x00, 0x00, 0x00, 1.00000000)
                },
                Stop {
                    offset: 1.00000000
                    color: Color.rgb(0x00, 0x00, 0x00, 0.00000000)
                },
...
```


----------

