2017-02-16 35 views
0

Привет всем, поэтому я создаю простую 2D-игру, и до сих пор у меня было немного кошмара, пытаясь заставить вещи общаться друг с другом. Пока у меня есть «главное меню», «игровая сетка» и изображение, отображаемое на сетке. Теперь я занимаюсь этим движением, но я не могу заставить его работать.JavaFx moving images

package application; 



import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.RowConstraints; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.scene.layout.HBox; 
import javafx.scene.Group; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.image.Image; 


public class Level { 

// private static Array[] level1; 
// private WarehouseKeeper warehouse; 
private static ImageView image1 = ImageLoader.showWareHouseImage(); 
private static final int KEYBOARD_MOVEMENT_DELTA = 2; 

public static void runLevel1(Stage theStage) { 

    // ImageView image = new ImageView((Element) 
    // ImageLoader.wareHouseImage); 

    // WarehouseKeeper warehouse = new 
    // WarehouseKeeper(ImageLoader.wareHouseImage); 

    Group root = new Group(); 

    int columnAmount = 12; 
    int rowAmount = 12; 

    GridPane gameGrid = new GridPane(); 

    for (int i = 0; i < columnAmount; i++) { 
     ColumnConstraints columnn = new ColumnConstraints(45); 
     gameGrid.getColumnConstraints().add(columnn); 

    } 

    for (int i = 0; i < rowAmount; i++) { 

     RowConstraints row = new RowConstraints(45); 
     gameGrid.getRowConstraints().add(row); 
    } 

    gameGrid.setStyle("-fx-background-color: white; -fx-grid-lines-visible:true"); 
    Scene scene = new Scene(root, (columnAmount * 40) + 66, (rowAmount * 40) + 66, Color.WHITE); 

    image(root, gameGrid); 

    moveWareHouse(scene, createKeeper()); 

    theStage.setScene(scene); 

    theStage.show(); 

} 

private static void image(Group root, GridPane gameGrid) { 

    // ImageLoader.wareHouseImage; 

    /* 
    * ImageView wareHouse = new ImageView(); wareHouse.setFitHeight(45); 
    * wareHouse.setFitWidth(45); 
    * 
    * Image image1 = ImageLoader.showWareHouseImage(); 
    * wareHouse.setImage(image1); 
    */ 

    ImageView image1 = ImageLoader.showWareHouseImage(); 

    final HBox picture = new HBox(); 
    picture.getChildren().add(image1); 

    gameGrid.setAlignment(Pos.CENTER); 

    // gameGrid.getChildren().add(wareHouse); 
    gameGrid.add(picture, 7, 9); 

    root.getChildren().add(gameGrid); 

} 

private static WarehouseKeeper createKeeper() { 

    final WarehouseKeeper keeper = new WarehouseKeeper(image1); 

    return keeper; 
} 

private static void moveWareHouse(Scene scene, final WarehouseKeeper keeper) { 

    scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent event) { 

      switch (event.getCode()) { 

      case W: 
       keeper.setyPosition(keeper.getyPosition() - KEYBOARD_MOVEMENT_DELTA); 
       break; 
      case D: 
       keeper.setxPosition(keeper.getxPosition() + KEYBOARD_MOVEMENT_DELTA); 
       break; 
      case A: 
       keeper.setyPosition(keeper.getyPosition() + KEYBOARD_MOVEMENT_DELTA); 
       break; 
      case S: 
       keeper.setxPosition(keeper.getxPosition() - KEYBOARD_MOVEMENT_DELTA); 
       break; 
      } 
     } 
    }); 

} 

}

package application; 

import javafx.scene.image.ImageView; 

import javafx.scene.image.Image; 
import javafx.scene.input.KeyEvent; 

public class WarehouseKeeper extends ImageLoader { 

private Image playerImage; 
private ImageView image; 
private int speed; 
private double xPosition; 
private double yPosition; 

public WarehouseKeeper(ImageView wareHouseImage) { 

    super(wareHouseImage); 

    this.speed = speed; 
    this.xPosition = xPosition; 
    this.yPosition = yPosition; 
    this.wareHouseImage.relocate(xPosition, yPosition); 

} 

public void updateUI() { 

    wareHouseImage.relocate(xPosition, yPosition); 

} 

public double getCenterX() { 

    return xPosition * 0.5; 

} 

public double getCenterY() { 

    return yPosition * 0.5; 

} 

public int getSpeed() { 
    return speed; 
} 

public void setSpeed(int speed) { 
    this.speed = speed; 
} 

public double getxPosition() { 
    return xPosition; 
} 

// one of the ideas i had 
public void setxPosition(double xPosition) { 
    this.xPosition = xPosition.setTranslateX(1.0); 
} 

public double getyPosition() { 
    return yPosition; 
} 

public void setyPosition(double d) { 
    this.yPosition = d + 1.0; 
} 

public void setTranslateY(double yPosition) { 
    // TODO Auto-generated method stub 

    yPosition = yPosition + 2.0; 

} 

}

package application; 

import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 

public class ImageLoader { 

protected ImageView wareHouseImage; 
private Object diamondImage; 
private Object wallImage; 
private Object mapImage; 
private Object crateImage; 

public ImageLoader(ImageView wareHouseImage) { 

    this.wareHouseImage = showWareHouseImage(); 

} 

public ImageView getWareHouseImage() { 
    return wareHouseImage; 
} 

public void setWareHouseImage(Image wareHouseImage) { 
    this.wareHouseImage = showWareHouseImage(); 
} 

public static ImageView showWareHouseImage() { 

    ImageView wareHouse = new ImageView(); 
    wareHouse.setFitHeight(45); 
    wareHouse.setFitWidth(45); 

    Image wareHouseImage = new Image("application/warehouse.png"); 
    wareHouse.setImage(wareHouseImage); 

    return wareHouse; 

} 

public Object getDiamondImage() { 

    return diamondImage; 

} 

public void setDiamondImage(Object diamondImage) { 

    this.diamondImage = diamondImage; 

} 

public Object getWallImage() { 

    return wallImage; 

} 

public void setWallImage(Object wallImage) { 

    this.wallImage = wallImage; 

} 

public Object getMapImage() { 

    return mapImage; 

} 

public void setMapImage(Object mapImage) { 

    this.mapImage = mapImage; 

} 

public Object getCrateImage() { 

    return crateImage; 

} 

public void setCrateImage(Object crateImage) { 

    this.crateImage = crateImage; 

} 

}

+0

при вызове команды клавиатуры вы используете 'object.xPosition' вы пытались с помощью' object.setLayoutX = value', также просто обратите внимание, что вы используете функции, чтобы попытаться вернуть значение, которое вы могли бы получить, не вводя его в функцию, например 'case W: keeper.setyPosition (keeper.getyPosition() - KEYBOARD_MOVEMENT_DELTA); break; ' может быть просто' case W: keeper.setyPosition (keeper.getLayoutY() - KEYBOARD_MOVEMENT_DELTA); break; 'не требуется функция. – TravisF

+0

Спасибо большое за оба ответа, кстати, очень тебя. Где бы вы порекомендовали я поместить объект object.setLayoutX = value? – SteveMunroe

+0

, вам нужно будет поместить их в свой класс уровня, так как именно здесь создается объект WarehouseKeeper (когда ему дано место для перехода и какой узел он должен быть одним), можно отправить команду в другой класс, но чтобы поддерживать его в чистоте, просто делайте это в том же классе, в котором он создан, если вы читаете мой ответ ниже, вы в основном исправляете, вам просто нужно изменить своих клавишников, чтобы использовать созданный объект в своем классе уровня. – TravisF

ответ

0

Проблема может быть связана с пониманием того, как объект ориентирован JavaFX работает, объект может быть создан WareHouseKeeper и ImageLoader, но объект был создан в классе уровня, что означает, что если вы мгновенно ized объекта класса уровня, который он должен перемещать в классе уровня. Например, что у вас есть

private static void moveWareHouse(Scene scene, final WarehouseKeeper keeper) { 

scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 

    @Override 
    public void handle(KeyEvent event) { 

     switch (event.getCode()) { 

     case W: 
      keeper.setyPosition(keeper.getyPosition() - KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case D: 
      keeper.setxPosition(keeper.getxPosition() + KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case A: 
      keeper.setyPosition(keeper.getyPosition() + KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case S: 
      keeper.setxPosition(keeper.getxPosition() - KEYBOARD_MOVEMENT_DELTA); 
      break; 
     } 
    } 
}); 
} 

Как объект был передан в функцию вам потребуется всего лишь переместить его непосредственно в классе уровня, а не из других классов, так что это будет изменено на

private static void moveWareHouse(Stage theStage, Group wHK) { 

     theStage.addEventFilter(KeyEvent.KEY_RELEASED, e -> { 
     e.consume(); 

     switch (e.getCharacter()) { 

     case W: 
      keeper.setLayoutY(keeper.getLayoutY() - KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case D: 
      keeper.setLayoutX(keeper.getLayoutX() + KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case A: 
      keeper.setLayoutY(keeper.getLayoutY() + KEYBOARD_MOVEMENT_DELTA); 
      break; 
     case S: 
      keeper.setLayoutX(keeper.getLayoutX() - KEYBOARD_MOVEMENT_DELTA); 
      break; 
     } 
    }); 
} 

EDIT Я также заметил, у вас есть сцена анализируется в качестве ключевого слушателя это потребует вас нажать на сцене (чтобы дать ему фокус), прежде чем он будет слушать ключи, если вы установите на сцену в качестве ключевой слушатель независимо от того, где вы нажмете его, всегда будет основным фокусом и всегда слушая ключи.

EDITED ДАЛЕЕ Как я уже упоминал в разговоре до верхней части, ваш лучше создавать полноту склада в классе склада и instantizing его в свой основной класс (level1) Таким образом, управление объектом является в пределах уровня1, но level1 не имеет всего кода для его создания (поэтому, если вам нужно изменить его создание позже или использовать его снова, вы можете вызвать их больше, просто создав новый экземпляр и добавив его в сцену) например.

public final Group warehouseKeeper(ImageView image) { 
    Group tempGroup; 
    /* insert necessary code here to add image to group and anything else you want in the group */ 
    return tempGroup; 
} 

Тогда вы можете instantize его ровном1 просто вызывая

final Group wHK = new WarehouseKeeper.warehouseKeeper(); 
wHK.setLayoutX(/*some init val */); 
wHK.setLayoutY(/*some init val */); 
root.getChildren().add(wHK);