Auf Objekte aus anderer Klassen zugreifen

Encera

Aktives Mitglied
Hallo zusammen,
ich glaub ich steh gerade etwas auf dem Schlauch und zwar kann mir jemand sagen wieso ich in meiner Main nicht auf die Methode "createGegner" aus der Klasse Gegner zugreifen kann?
Ziel wäre es mehrere Gegner zu erstellen, welche sich hin und her bewegen.
Java:
package de.encera.gegner;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;

public class Gegner {
    //Variablen
    Pane root;
    private int BLOCK_SIZE = 20;
    public Rectangle enemyBody;
    private enum Direction{
        UP, DOWN, LEFT, RIGHT
    }
    //private Direction direction = Direction.RIGHT;
    private Timeline timelineGegner;
   
    public Gegner(Rectangle enemyBody, Pane root, Timeline timelineGegner) {
        this.enemyBody = enemyBody;
        this.root = root;
        this.timelineGegner = timelineGegner;
    }
   
    private Pane createGegner() {
   
    KeyFrame keyframeGegner = new KeyFrame(Duration.seconds(0.2), new EventHandler<ActionEvent>() {
        public Direction direction = Direction.RIGHT;
        @Override
        public void handle(ActionEvent event) {
            switch (direction) {
            case RIGHT:
                enemyBody.setTranslateX(enemyBody.getTranslateX() + BLOCK_SIZE);
                enemyBody.setTranslateY(enemyBody.getTranslateY());
                break;

            default:
                break;
            }
           
        }
    });
    root.getChildren().add(enemyBody);
    timelineGegner.getKeyFrames().add(keyframeGegner);
    timelineGegner.setCycleCount(Timeline.INDEFINITE);
    timelineGegner.play();
    return root;
    }
}

Java:
package de.encera.gegner;



import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application{
   
    Pane root;
    private final double BLOCK_SIZE = 20;
    private final double GAME_WIDTH = 30 * BLOCK_SIZE;
    private final double GAME_HEIGHT = 20 * BLOCK_SIZE;
    Gegner gegner = new Gegner(new Rectangle(BLOCK_SIZE, BLOCK_SIZE), root, new Timeline());
    @Override
    public void start(Stage primaryStage) throws Exception {
        //Pane root = new Pane();
        Scene scene = new Scene(gegner.createGegner); // <----------- Funktioniert nicht
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();
       
    }


    public static void main(String[] args) {
        launch(args);

    }

   
}
 
du solltest GUI elemente von logik trennen
ansonsten kommst du in probleme die du nicht mehr lösen kannst
 
du solltest GUI elemente von logik trennen
ansonsten kommst du in probleme die du nicht mehr lösen kannst
Was genau meinst du damit?
Hatte nämlich ziemliche Probleme als ich das ganze Programm in einer Datei geschrieben habe... da war ich zwar ich zwar schon deutlich weiter aber letztenendes ist genau das eingetreten was du geschrieben hast... Versuch das ganze dadurch jetzt ordentlicher zu schreiben, also verschiedene Klassen etc... Bin für jeden Tipp offen
 
Java:
public class DudeAnsicht extends BorderPane{

  private DudeLogik logik = new DudeLogik();
  public DudeAnsicht() {
    Button tollerButton = new Button("Mein Button");
    this.setTop(tollerButton);
    tollerButton.setOnMouseClicked(logik::ClickHandling);;
  }
}
public class DudeLogik{
  public void ClickHandling(Event event) {
    System.out.println("Mach fancy logik zeugs");
  }
}
worauf du hinaus willst ist ungefähr das erreichen

du hast deine Ansichts klassen die eine Logik klasse enthält

die logik klasse hat methoden die die ansichts klasse einfach einsetzt in die UI elemente
dadurch trennst du die ganzen probleme auf auf einzelne bereiche und hast somit eine gute strukturierung von dem ganzen
( das mit den methoden referenzen muss dir jemand anderes erklären so wie du es gemacht hast macht es jeder am anfang und das ist auch GUT, man sollte sich jedoch auch fortbilden )

was später noch hinzukommt ist berechnung oder ein klassiker netzwerk und sql, das willst du dann nicht in der logik haben, das verschiebt man in model klassen somit du in der logik nicht zu viel machst

PS: @KonradN kann das gut, mir hat er es auch erklärt und geschafft dass ich durchsteige
 
Ahh meinst du damit das MVC Vorgehen? Damit hab ich schon beim scene viewer gearbeitet, find ich noch etwas ungewohnt aber das wird schon werden
 
Danke soweit für die Tipps, werd das in den nächsten Projekten mal versuchen anzuwenden. Für das hier ist es aber schon zu spät sonst kenn ich mich garnimma aus xD

Aber ich steh grad schon wieder aufn Schlauch und zwar gelingt es mir nicht mit der üblichen .setStyle und CSS das Hintergrundbild zu ändern...
Java:
public class MVP extends Application{
    
    //Pane root = new Pane();
    
    private enum Direction{
        UP, DOWN, LEFT, RIGHT
    }
    private Stage window = new Stage();
    private final double BLOCK_SIZE = 20;
    private final double GAME_HEIGHT = 20 * BLOCK_SIZE;
    Rectangle player = new Rectangle(BLOCK_SIZE, BLOCK_SIZE);
    private Timeline timelinePlayer = new Timeline();
    ObservableList<Gegner> gegnerListe = FXCollections.observableArrayList();
    Gegner gegner;
    Gegner gegner2;
    Gegner gegner3;
    Rectangle finishLine = new Rectangle(BLOCK_SIZE, BLOCK_SIZE);
    
    //Methoden
        private int createRandomSpawnX() {
            Random zufallX = new Random();
            int randX = (int) (zufallX.nextInt(29) * BLOCK_SIZE);
            return randX;
            
        }
        
        private int createRandomSpawnY() {
            Random zufallY = new Random();
            int randY = (int) (zufallY.nextInt(5) * BLOCK_SIZE);
            return randY;
        }
    
    
    
    private Scene createLevel1(Rectangle player) {   
    
        
            Pane root = new Pane();
            gegner = new Gegner(new Rectangle(BLOCK_SIZE, BLOCK_SIZE), root, new Timeline(), player);
            gegner2 = new Gegner(new Rectangle(BLOCK_SIZE, BLOCK_SIZE), root, new Timeline(), player);
            gegnerListe.addAll(gegner, gegner2);
            
            for (Gegner gegner : gegnerListe) {
                gegner.enemyBody.setTranslateX(createRandomSpawnX());
                gegner.enemyBody.setTranslateY(createRandomSpawnY());
            }
            Scene scene = new Scene(root);
            //*****************************************************************************
            root.setStyle(""
                    + "-fx-background-image: url(Hintergrund1.jpg);"  // <-------------------
                    
            
                );
            //*****************************************************************************
            root.setPrefSize(BLOCK_SIZE * 30, GAME_HEIGHT);
            root.getChildren().addAll(gegner.createGegner(0.1, player, root));
            root.getChildren().addAll(gegner2.createGegner(0.1, player, root));
            
            scene.setOnKeyPressed(new EventHandler<KeyEvent>() {

                @Override
                public void handle(KeyEvent event) {
                    
                    switch (event.getCode()) {
                    case SPACE:
                        Rectangle shoot = new Rectangle(BLOCK_SIZE, BLOCK_SIZE);
                        Image shotImage = new Image("images/food.png");
                        ImagePattern shotPattern = new ImagePattern(shotImage);
                        shoot.setFill(shotPattern);
                        shoot.setTranslateX(player.getTranslateX());
                        shoot.setTranslateY(player.getTranslateY() - BLOCK_SIZE);
                        root.getChildren().addAll(shoot);   
                        Direction direction = Direction.UP;
                        System.out.println("Schuss!");
                        KeyFrame keyframe = new KeyFrame(Duration.seconds(0.1), new EventHandler<ActionEvent>() {
                        
                            @Override
                            public void handle(ActionEvent event) {
                                switch (direction) {
                                case UP:
                                    shoot.setTranslateY(shoot.getTranslateY() - BLOCK_SIZE);
                                    shoot.setTranslateX(shoot.getTranslateX());
                                    break;
                                default:
                                    break;
                                }
                                try {
                                    for (Gegner gegner : gegnerListe) {
                                        //Kolission
                                        if(shoot.getTranslateX() == gegner.enemyBody.getTranslateX() &&
                                                shoot.getTranslateY() == gegner.enemyBody.getTranslateY()) {
                                                System.out.println("Getroffen!");
                                                root.getChildren().removeAll(gegner.enemyBody, gegner.shootings);
                                                gegner.timelineGegner.stop();
                                                gegnerListe.remove(gegner);
                                                if(gegnerListe.isEmpty() == true) {
                                                System.out.println("Ende");
                                                //window.setScene(createLevel2(player));
                                                //window.show();
                                                            
                                                }                                       
                                            }
                                    
                                
                                    }
                                    
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                                
                                
                        
                                
                            }
                        });
                        
                        timelinePlayer.getKeyFrames().add(keyframe);
                        timelinePlayer.setCycleCount(timelinePlayer.INDEFINITE);
                        timelinePlayer.play();
                        break;
                    
                    case D:
                        player.setTranslateX(player.getTranslateX() + BLOCK_SIZE);
                        player.setTranslateY(player.getTranslateY());
                        break;
                    
                    case A:
                        player.setTranslateX(player.getTranslateX() - BLOCK_SIZE);
                        player.setTranslateY(player.getTranslateY());
                        break;
                        
                    case W:
                        player.setTranslateX(player.getTranslateX());
                        player.setTranslateY(player.getTranslateY() - BLOCK_SIZE);
                        break;
                    
                    case S:
                        player.setTranslateX(player.getTranslateX());
                        player.setTranslateY(player.getTranslateY() + BLOCK_SIZE);
                        break;

                    default:
                        break;
                    }                   
                }
            });
            
            root.getChildren().add(player);
            return scene;
        
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        
        Scene scene = createLevel1(player);

        window = primaryStage;
        window.setScene(scene);
        window.setResizable(false);
        window.show();
        
        player.setTranslateX(BLOCK_SIZE * 15);
        player.setTranslateY(BLOCK_SIZE * 14);
        
    }


    public static void main(String[] args) {
        launch(args);

    }

    
}

Hab die Stelle im Code markiert damit ihr nicht lange suchen müsst... Hab auch schon verschiedene Varianten ausprobiert das ganze hinzusetzen, auch in der "Gegner-Klasse" ohne Erfolg.
Könnte mir vorstellen das es damit zusammenhängt das die "createLevel1()" eine Szene zurückgibt und kein Root Objekt und das deswegen etwas spackt aber die anderen Elemente und Root-Anpassungen wie Größe, Elemente hinzufügen etc lassen sich auch problemlos durchführen, nur beim Style will er nicht so ganz...
Wäre mega wenn ihr mir hier nochmal kurz auf die Sprünge helfen könntet.

Ahja und PS
 

Anhänge

  • Ordnerstruktur.PNG
    Ordnerstruktur.PNG
    14,9 KB · Aufrufe: 0
css gehört nicht in das programm, nimm hier die erste erklärung und versuch das zum laufen zu bringen
Hab das nach der Anleitung gemacht und es klappt nur so halbwegs... Komischerweise kann ich die Farbe des Hintergrundes ändern. Möchte ich aber als Bild als Background setzen klappt es nicht, der Hintergrund bleibt weiß. Hab zur Probe auch mal das selbe Bild hergenommen, welches ich schonmal in einem anderen Projekt als Hintergrund genommen habe um sicherzustellen das es nicht nur an dem neuen Bild liegt. Auch hier komischerweise keinen Erfolg 🤨
 

Anhänge

  • Bild1.PNG
    Bild1.PNG
    8,5 KB · Aufrufe: 3
  • Bild2.PNG
    Bild2.PNG
    9 KB · Aufrufe: 5
  • Bild3.PNG
    Bild3.PNG
    12,9 KB · Aufrufe: 6
Java:
@Override
    public void start(Stage primaryStage) throws Exception {
        
        Scene scene = createLevel1(player);
        scene.getRoot().setStyle(""
                + "-fx-background-image: url(images/Hintergrund1.jpg);"
                
                
            );
        
        
        window = primaryStage;
        window.setScene(scene);
        window.setResizable(false);
        window.show();
        
        player.setTranslateX(BLOCK_SIZE * 15);
        player.setTranslateY(BLOCK_SIZE * 14);
        
    }

Damit hats geklappt, hab mir das root objekt in der start-Methode rausgeholt und dort bearbeitet. Rätselhaft ist mir trotzdem noch wieso es nicht anders geklappt aber gut^^
 
Mach es nicht relativ sondern absolut: /images/....

Ansonsten ist das package de.encara.gegner oder so ähnlich. Damit wärest du mit .. erst in encara. ../../../images/.... wäre der relative Pfad vermutlich.
 
Mach es nicht relativ sondern absolut: /images/....

Ansonsten ist das package de.encara.gegner oder so ähnlich. Damit wärest du mit .. erst in encara. ../../../images/.... wäre der relative Pfad vermutlich.
Ahh okay, interessant🤔 aber hab das bild testweise ja auch in das gleiche package wie die css gepackt und den Pfad angegeben, halt dann einfach mit url(Hintergrund1.jpg) bzw url (/Hintergrund1.png) hätts dann damit nicht auch direkt klappen müssen? Oxer muss ich das /de/Encera... trotzdem angeben?
 
Also mit url("Hintergrund1.jpg") sollte es im gleichen Verzeichnis wie das css liegen und dann sollte es auch gefunden werden. Mit url("/Hintergrund1.jpg") sollte es bei dir auch gefunden werden, da Du das Bild auch im root der Sourcen hast. Und ein url("/images/Hintergrund1.jpg") sollte auch gehen. (Du hast das Hintergrund1.jpg halt an der vielen Stellen!)

Das hintergrund.jpg ist nur in images, daher wäre da url("/images/hintergrund.jpg") zielführend.

Das wäre zumindest mein Verständnis hier. Wobei ich noch nie mit url(...) in einem Stylesheet gearbeitet habe. Daher übertrage ich hier nur das Wissen, wie es sonst so üblich ist und wie ich es aus der Dokumentation her kenne.
 
Also mit url("Hintergrund1.jpg") sollte es im gleichen Verzeichnis wie das css liegen und dann sollte es auch gefunden werden. Mit url("/Hintergrund1.jpg") sollte es bei dir auch gefunden werden, da Du das Bild auch im root der Sourcen hast. Und ein url("/images/Hintergrund1.jpg") sollte auch gehen. (Du hast das Hintergrund1.jpg halt an der vielen Stellen!)

Das hintergrund.jpg ist nur in images, daher wäre da url("/images/hintergrund.jpg") zielführend.

Das wäre zumindest mein Verständnis hier. Wobei ich noch nie mit url(...) in einem Stylesheet gearbeitet habe. Daher übertrage ich hier nur das Wissen, wie es sonst so üblich ist und wie ich es aus der Dokumentation her kenne.
Ja, hab das Hintergrund1 gefühlt überall hingepackt um alles auszuprobieren😅
Hmm.. das is wirklich komisch wieso es auf dem Wege nicht geklappt hat aber zumindest läuft es jetz
 
Das ist sehr Fehleranfällig. Man muss z.B. sehr genau auf die Gross-/Kleinschreibung achten und so. Selbst wenn das Betriebssystem da nicht unterscheidet, dann achtet Java da doch drauf.
 

Zurück
Oben