Я сделал грубую копию SpaceInvaders, чтобы почувствовать JavaFX, и мне было интересно, как я могу заменить прямоугольники, которые я использовал в качестве спрайтов, на графику.
Он отлично работает со спрайтом плеера и сценой фон, но я не могу понять, как заменить красные квадраты противника графикой.
Я попытался поместить объект изображения в метод nextLevel () и заполнить его там спрайтами, но это дает мне только ошибку FileNotFoundException.
nextLevel () метод:
private void nextLevel() {
// Image img2 = Image(newFileInputStream("C:\\Users\\user\\Pictures\\y.jpg"));
for (int i = 0; i < 5; i++) {
Sprite enemy = new Sprite (90 + i*100, 150, 30, 30, "enemy", Color.RED);
// enemy.setFill(new ImagePattern(img2));
root.getChildren().add(enemy);
}
}
Я могу только инициализировать образ в методе start , но тогда я не могу не знаю, как назначить его вражеской площади, так как они еще не были инициализированы Противник еще не может быть решен, даже когда я ставлю его после метода createContent () , который вызывает метод nextLevel () и также Stage.
start Метод:
@Override
public void start(Stage stage) throws Exception {
Image img2 = new Image(new FileInputStream("C:\\Users\\user\\Pictures\\x.jpg"));
Image img = new Image(new FileInputStream("C:\\Users\\user\\Pictures\\y.png"));
player.setFill(new ImagePattern(img));
// enemy.setFill(new ImagePattern(img2));
stage.setTitle("Box");
stage.setResizable(false);
Scene scene = new Scene(createContent());
scene.setFill(new ImagePattern(img2));
scene.setOnKeyPressed(e ->{
switch (e.getCode()) {
case A:
player.moveLeft();
break;
case D:
player.moveRight();
break;
case SPACE:
shoot(player);
break;
}
});
stage.setScene(scene);
stage.show();
}
createContent () Метод:
private Parent createContent() {
root.setPrefSize(600,800);
root.getChildren().add(player);
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
update();
}
};
timer.start();
nextLevel();
return root;
}
Если кому-то это нужно, вот полный код:
import java.io.FileInputStream;
import java.util.List;
import java.util.stream.Collectors;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.ImagePattern;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class SpaceInvaders extends Application {
private double t = 0;
private final Pane root = new Pane();
private final Sprite player = new Sprite (300,700,80,80, "player",Color.BLUE);
private Parent createContent() {
root.setPrefSize(600,800);
root.getChildren().add(player);
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
update();
}
};
timer.start();
nextLevel();
return root;
}
private void nextLevel() {
for (int i = 0; i < 5; i++) {
Sprite enemy = new Sprite (90 + i*100, 150, 30, 30, "enemy", Color.RED);
root.getChildren().add(enemy);
}
}
private List<Sprite> sprites(){
return root.getChildren().stream().map(n -> (Sprite)n).collect(Collectors.toList());
}
private void update() {
t += 0.016;
sprites().forEach(s -> {
switch (s.type) {
case "enemybullet":
s.moveDown();
if (s.getBoundsInParent().intersects(player.getBoundsInParent())) {
player.dead = true;
s.dead = true;
}
break;
case "playerbullet":
s.moveUp();
sprites().stream().filter(e -> e.type.equals("enemy")).forEach(enemy ->{
if (s.getBoundsInParent().intersects(enemy.getBoundsInParent())) {
enemy.dead = true;
s.dead = true;
}
});
break;
case "enemy":
if (t > 2) {
if (Math.random() < 0.3) {
shoot2(s);
}
}
break;
}
});
root.getChildren().removeIf(n -> {
Sprite s = (Sprite) n;
return s.dead;
});
if (t > 2) {
t = 0;
}
}
private void shoot(Sprite who) {
Sprite s = new Sprite((int) who.getTranslateX() + 40, (int) who.getTranslateY(), 5, 20, who.type + "bullet", Color.BLACK);
root.getChildren().add(s);
}
private void shoot2(Sprite who) {
Sprite s = new Sprite((int) who.getTranslateX() + 20, (int) who.getTranslateY() + 5, 5, 20, who.type + "bullet", Color.BLACK);
root.getChildren().add(s);
}
@Override
public void start(Stage stage) throws Exception {
Image img2 = new Image(new FileInputStream("C:\\Users\\Alexxx\\Pictures\\ibama.jpg"));
Image img = new Image(new FileInputStream("C:\\Users\\Alexxx\\Pictures\\pinguin.png"));
player.setFill(new ImagePattern(img));
stage.setTitle("Nordpol-Defender 2");
stage.setResizable(false);
Scene scene = new Scene(createContent());
scene.setFill(new ImagePattern(img2));
scene.setOnKeyPressed(e ->{
switch (e.getCode()) {
case A:
player.moveLeft();
break;
case D:
player.moveRight();
break;
case SPACE:
shoot(player);
break;
}
});
stage.setScene(scene);
stage.show();
}
private static class Sprite extends Rectangle {
boolean dead = false;
final String type;
Sprite(int x, int y, int w, int h, String type, Color colour){
super(w, h, colour);
this.type = type;
setTranslateX(x);
setTranslateY(y);
}
Sprite(int x, int y, int w, int h, String type, Color colour, Image img){
super(w, h, colour);
this.type = type;
setFill(new ImagePattern(img));
setTranslateX(x);
setTranslateY(y);
}
void moveLeft() {
setTranslateX(getTranslateX() - 5);
}
void moveRight() {
setTranslateX(getTranslateX() + 5);
}
void moveUp() {
setTranslateY(getTranslateY() - 5);
}
void moveDown() {
setTranslateY(getTranslateY() + 5);
}
}
public static void main(String[] args) {
launch(args);
}
}