2017-05-30 1 views
0

Ich mache ein Platformer-Spiel mit Java. Ich habe ein Zeichen in Form eines JLable mit einem Bildsymbol, das mit den Pfeiltasten verschoben werden kann. Ich verwende die setBounds() -Methode, um die Position von JLabel zu setzen, aber diese Methode verwendet nur int-Werte als x- und y-Argumente, und ich möchte eine genauere Kontrolle. Ist es mit einem Null-Layout möglich, präzisere Werte wie "double" zu verwenden, um ein JLabel zu positionieren?Ist es möglich, ein JLabel mit einer Dezimalzahl zu positionieren, z. B. doppelt?

Vielen Dank für Ihre Zeit und einen schönen Tag.

+0

Denken Sie darüber nach. Können Sie einen halben oder einen dreiviertel Pixel haben? (Die Antwort ist nein) – CodingNinja

Antwort

4

Nun, wenn Sie JLabels verwenden, dann verwenden Sie Swing, und Swing hat nicht-Gleitkomma-Koordinatensystem, also nicht können Sie nicht.

1

JavaFX kann. In Swing sind die Koordinaten jedoch ganzzahlige Pixel.

Sie könnten skaliert 2x2 im Speicher zeichnen (Image getGraphics) und dann neu skalieren, um die Hälfte int Schritte von 0,5 zu erreichen; aber das würde verwischen (interpolierte Pixel) oder flackern (beste nahegelegene Übereinstimmung).

Für Zoomen skalierbare Vektorgrafiken, .vg, mit der Batik Bibliothek wäre machbar sein.

Für Text Unterpixelhinweis kann auf einigen LED-Bildschirmen schwarzen Text auf Drittel eines Pixels positionieren, abhängig vom Layout der roten, grünen und blauen Subpixel.

Im Allgemeinen ist es nicht der Mühe wert, das oben Gesagte zu versuchen. Außer dass JavaFX hat schöne Animation Unterstützung, CSS-Styling und Animationseffekte.

1

Wie andere sagen, werden UI-Komponenten nur mit exakten Pixelkoordinaten positioniert.

Sie könnten einen Ort in double speichern und ihn dann auf int runden, wenn Sie den Standort tatsächlich festlegen. Etwas wie dieses:

double velX = ..., velY = ...; 
double x = ..., y = ...; 

void example() { 
    int t = 1000/30; 
    new Timer(t, (ActionEvent e) -> { 
     x += t * velX; 
     y += t * velY; 
     label.setLocation((int) Math.round(x), 
          (int) Math.round(y)); 
    }).start(); 
} 

So können Sie in kleineren Schritten bewegen. Es wird einfach nicht sichtbar sein.

There is a really great example of animating an image here in einer Weise sehr ähnlich zu dem, was Sie beschreiben, was Sie sich ansehen sollten. Der Versuch, Komponenten zu positionieren, ist meiner Meinung nach mehr Ärger als es wert ist, besonders wenn man versucht, so etwas wie ein Spiel zu machen. Das Ausführen von benutzerdefinierten Bildern ist flexibler. (Das Tutorial ist here.)

Verwandte Themen