2016-04-25 2 views
1

Ich versuche mein erstes Spiel in JavaFX zu machen, wo sich ein Spielerobjekt (kein Knoten) innerhalb eines Levels bewegen wird. Der volle Level sollte jedoch nicht innerhalb des Fensters sichtbar sein, nur ein Teil davon sollte den Spieler umgeben. Ich habe ziemlich viel nach einer Lösung gesucht, die mit der Art funktioniert, wie ich mein Projekt gemacht habe, aber nicht erfolgreich war. Der folgende Code beschreibt, wie ich meine GUI eingerichtet habe:Wie erstelle ich eine Ansicht, die dem Player in einem JavaFX-Spiel folgt?

private VBox appRoot; 
private Pane gameRoot; 
private Canvas canvas; 
private GraphicsContext gc; 
private HBox uiRoot; 

Dies ist die verschiedenen Scheiben, die ich benutze. Der appRoot enthält sowohl den GameRoot als auch den uiRoot in dieser Reihenfolge. Der GameRoot enthält die Leinwand. Alles innerhalb der Ebene, einschließlich der Ebene selbst wird auf die Leinwand gezeichnet, wie folgt aus:

canvas = new Canvas(ROOM_WIDTH, ROOM_HEIGHT); 
gc = canvas.getGraphicsContext2D(); 
createLevel(ROOM_WIDTH, ROOM_HEIGHT, CELL_WIDTH, CELL_HEIGHT); 
gc.scale(2, 2); 
drawLevel(gc, ROOM_WIDTH, ROOM_HEIGHT, CELL_WIDTH, CELL_HEIGHT); 
player.render(gc); 

createLevel und drawLevel schafft nur eine Ebene und zieht Plätze, auf denen verschiedene Blöcke sein sollte. Die Rendermethode des Player-Objekts zeichnet den Player an seinen X- und Y-Koordinaten. Wie Sie sehen können, habe ich die Leinwand skaliert, so dass jetzt die gesamte Ebene nicht angezeigt wird, wenn das Spiel gestartet wird.

Das Problem ist, dass ich es nicht so machen, dass, was in dem Fenster angezeigt wird die Dinge rund um das Spielerobjekt ist. Ich habe Code mit den Methoden setLayoutX und setLayoutY gesehen, aber ich konnte das nicht reproduzieren, so dass es funktioniert.

Ich wäre sehr dankbar, wenn jemand mir dabei helfen könnte, und hoffentlich ohne allzu viel zu ändern, wie die Zeichnung erfolgt.

Danke! :)

Auch sind hier zwei Bilder zeigen, wie es aussieht; Der erste ist, wenn der Spieler nicht in der aktuellen Ansicht ist, und der zweite ist mit dem Spieler in der Ansicht.

Image without player in view

Image with player in view

+0

Wenn gc wie g2d funktioniert, würden Sie einfach gc.translate (xCoord, yCoord) verwenden –

+0

@MitchWeaver Das hat etwas getan, aber der Bildschirm wurde nur weiß. Ich habe dabei die x und y des Spielerobjekts benutzt. Ich gehe davon aus, dass das Level in eine komische Position geraten ist, aber ich weiß nicht, was wirklich vor sich geht. – Xaril

+0

Für mich sieht es so aus, als ob Sie mit der Skalierung ein Ansichtsfenster auf der Ebene haben möchten, anstatt die ganze Ebene anzuzeigen. Ist das korrekt? – hotzst

Antwort

0

Sie nicht, uns die Canvas direkt auf die Ebene angezeigt werden soll. Stattdessen können Sie ein Bild verwenden, das Ihr Level darstellt und dann das Bild in einem ImageView haben. Auf dieser ImageView können Sie ein Bildfenster des Bereichs des Bildes definieren, der sichtbar ist.

Um das Bild zu erhalten, können Sie entweder Ihren Canvas Knoten verwenden und einen Schnappschuss machen (Siehe hierzu question). Dies ist wahrscheinlich der einfachste Weg mit dem, was Sie haben. Oder Sie können ganz auf das Canvas verzichten und das Bild zeichnen. Wenn die Ebenen vordefiniert sind (und nicht zur Laufzeit generiert werden), scheint dies der beste Ansatz zu sein. Dann können Sie die Bilder als Ressourcen zusammen mit dem Code bereitstellen.

+0

Ok, ich habe damit eine funktionierende Ansicht erstellt! Vielen Dank! : D Allerdings wurde die Qualität der Grafik stark reduziert, sieht aus wie ein Anti-Aliasing. Weißt du, wie das zu beheben ist? – Xaril

+0

Schwer zu sagen ohne konkretes Codebeispiel. Meine Vermutung ist, dass es etwas mit Skalierung oder einem Schnappschuss sein könnte. Ich schlage vor, Sie stellen eine separate Frage für dieses Problem zusammen mit etwas Code. – hotzst

Verwandte Themen