Spielfeld erstellen

Status
Nicht offen für weitere Antworten.

TX

Mitglied
Hallo,

ich wollte eine Art Spieloberfläche programmieren.
Es geht, darum das ein Spielfeld erstellt wird. Dieses besteht aus vielen Sechsecken, die aneinander gepacket werden.
Ein paar Felder sind mit Spielsteinen belegt. Diese Spielsteine kann man anklicken und wenn ein anderes Spielfeld anklickt wird, liegt der Spielstein dort.


Hättet ihr Ansätze wie man das Sinnvoll aufbaut?
 

diggaa1984

Top Contributor
für jedes Substantiv ne Klasse bauen .. 2 Felder erzeugen, eins belegt das andere per Klick belegen .. wenn das geht, kannst dir was ausdenken bezüglich automatischer Layoutberechnung fürs Speilfeld und das ganze auf 100 Felder erhöhen ;)
 

TX

Mitglied
Löst man das Erstellen des Spielfeldes eigentlich am besten mit dieser paint-methode?
 

diggaa1984

Top Contributor
naja du kannst auch, was ich persönlich in dem Fall weniger schön finde, pro Feld ein Label nutzen, und dem nen Bilder verpassen ^^ .. dann brauchst das nicht selbst in paintComponent regeln, aber das finde ich eher unpassend .. so hast du einerseits ne Liste von Feldobjekten, welche dein Spielfeld repräsentieren, und dazu ne Liste von Labels, welche nur als Wrapper dienen um es zu zeichnen.

Lieber selbst pinseln ^^
 

TX

Mitglied
Ok,
sollte man das irgendwie mit Schichten arbeiten(wenn das überhaupt geht), also untere Schicht Hintergrundbild, dann die einzelnen Spielfelder zeichnen lassen, darüber dann die Spielsteine und dann noch eine Schicht für den bewegenen Spielstein?
 

hdi

Top Contributor
Die Schichten werden halt durch die Reihenfolge der Befehle in der paintComponent geregelt. Die n+1-te Malanweisung darin malt über dem, was die n-te Anweisung gemalt hat. Insofern musst du das dann schon berücksichtigen.
 

diggaa1984

Top Contributor
die komponente die ganz oben auf der form liegt wird als letztes gemalt .. so einfach ^^

oder wie hdi sagte die reihenfolge wie du was malst

Code:
maleWas() {
    maleHintergrund();
    maleFelder();
    maleSteine();
    maleIrgendwas();
}
 

TX

Mitglied
Ok , gut!

Wollte jetzt noch wissen ob ich diese ganzen Sechsecke oder Achtecke auch mit einen Tool zusammenklicken kann und dieses gibt mir die Koordinaten aus.
Ansonsten muss ich die alle selber festlegen...
 

hdi

Top Contributor
Also wie ein Sechseck oder Achteck aussieht, das musst du selber implementieren. Aber wenn du dir sinnige Konstruktoren schreibst, hast du die Arbeit ja nur einmal. Ich würde jetzt zB kein Sechseck machen dessen Konstruktor 6 Punkte will, sondern zB nur den oberen linken, und den Rest errechnet er sich selber. Dann ist es recht easy neue Sechsecke zu erstellen.
 

Quaxli

Top Contributor
Löst man das Erstellen des Spielfeldes eigentlich am besten mit dieser paint-methode?

Nein, nicht so ganz. Je nachdem was Du vorhast empfiehlt es sich das Spielfeld als eigene Klasse zu implementieren, welche die notwendig Logik kapselt. Dieser Klasse würde ich eine Methode (z. B. drawGameBoard(Graphics g) verpassen, die ein Graphics-Object übergeben bekommt und aus einer paint- bzw. paintComponnent-Methode aufgerufen werden kann.

Vom Verlauf des Threads her würde ich mal vermuten, daß dies Dein erster Versuch in die Richtung ist und das Du mehr oder weniger versuchst die ganze Logik in eine Klasse zu packen, was nicht besonders sinnvoll ist. (Korrigiere mich, wenn ich mich irre). Beschreibe doch erst mal welches Spiel Du mit welchen Logiken implementieren willst, dann kann man Dir konkrete Lösungsansätze aufzeigen. Mit dem Spielfeld anzufangen ist nicht unbedingt die beste Herangehensweise.
 
G

Gast2

Gast
Schau dir doch mal in der FAQ das Malbeispiel an...
Ich würde für Zeichenobjekte Klassen erstellen die eventuell Shape implementieren dann kannst sie ganz easy zeichnen...
 

TX

Mitglied
So hatte das Thema etwas verdrängt! Habe jetzt aber nach etwas Informierung zur Grafikprogrammierung unter Java etwas zusammengebastelt.

Werde demnächst wohl noch ein paar Fragen dazu stellen.
Könnt euch das ja mal anschauen und eventuell Verbesserungsvorschläge geben.

Ein kleine Frage nebenbei, versuche bei der Methode stoneRun() eine Animation zu erstellen.
Also, dass jede Sekunde das nächste Feld ausgewählt wird. Geht so aber nicht !?!
Liegt es am RepaintManager oder so?

Java:
package Test1;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//import java.awt.geom.GeneralPath;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

// XXXXXXXXXXXXX GUI XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
public class WabantiGUI extends JFrame{
    
    private static final long serialVersionUID = 1L;
    
    GamePaint gamePaint = new GamePaint();
    JTextField jtsetStone;
    JTextField jtstoneRun;
    
    public WabantiGUI() {
        super("Wabanti");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        getContentPane().setLayout(new BorderLayout());
        
        JPanel jpSouth = new JPanel(new FlowLayout());
        JButton jbSetStone = new JButton("Set Stone");
        jbSetStone.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setStone(); 
            }
               
            });
        jtsetStone = new JTextField(3);
        
        JButton jbStoneRun = new JButton("Stone Run");
        jbStoneRun.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                stoneRun(); 
            }
               
            });
        
        jtstoneRun = new JTextField(3);
        jtstoneRun.setEditable(false);
        
        jpSouth.add(jtsetStone);
        jpSouth.add(jbSetStone);
        
        jpSouth.add(jtstoneRun);
        jpSouth.add(jbStoneRun);
        
        getContentPane().add(gamePaint, BorderLayout.CENTER);
        getContentPane().add(jpSouth, BorderLayout.SOUTH);
        
        setSize(700, 700);
        setResizable(false);
        setVisible(true);
    }
    
    
    
    private void setStone(){
        int stoneNR = 1;
        
        try{
            stoneNR = Integer.parseInt(jtsetStone.getText());
        }catch(NumberFormatException e){
            
        }
        
        
        if(stoneNR >= 1 && stoneNR <= 169){
            gamePaint.stoneField = stoneNR;
            gamePaint.repaint();
        }
    }
    
    private void stoneRun(){
        for(int i = 1; i <= 169; i++){
            gamePaint.stoneField = i;
            jtstoneRun.setText(String.format("%d", i));
            gamePaint.repaint();
            /*
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
        }
    }
    
    //XXXXXXXXXX MAIN XXXXXXXXXXXXXXXXXXX
    public static void main(String[] args) {
        new WabantiGUI();
         
     }

}


//XXXXXXXXXXXXXX Zeichnen des Spiels XXXXXXXXXXXXXXXXXXXXXXX
class GamePaint extends JComponent{

   
    private static final long serialVersionUID = 1L;
    
    public int stoneField = 1;
    
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        
        //Hintergrund zeichenen
        g2.setColor(Color.ORANGE);
        drawBackground(g2);
        
        //Spielfeld zeichnen
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(2.5f));
        g2.setColor(Color.BLACK);
        drawField(g2);
        
        //Spielsteine zeichen
        drawStones(g2);
    }
    
    //Methode zum Zeichnen der Speilsteine
    private void drawBackground(Graphics2D g2){
        g2.fillRect(0, 0, 700, 700);
    }
    
    //Methode zum Zeichnen des Spielfeldes
    private void drawField(Graphics2D g2){
        //GeneralPath polyline;
        
        int xPoints[] = new int[6];
        int yPoints[] = new int[6];
        
        
        
        for(int i = 0; i < Hexagons.hexagons.length; i++){
            xPoints = Hexagons.hexagons[i].getXPoints();
            yPoints = Hexagons.hexagons[i].getYPoints();
            
            /*polyline = new GeneralPath(GeneralPath.WIND_EVEN_ODD, 6);
            polyline.moveTo (xPoints[0], yPoints[0]);
            
            
            for ( int index = 1; index < 6; index++ ) {
                polyline.lineTo(xPoints[index], yPoints[index]);
            };
            
            polyline.lineTo(xPoints[0], yPoints[0]);
            g2.draw(polyline);
            */
            g2.drawPolygon(xPoints, yPoints, 6);
        } 
        
    }
    
    //Methode zum Zeichnen der Speilsteine
    private void drawStones(Graphics2D g2){
        int xPoints[] = new int[6];
        int yPoints[] = new int[6];
        
        xPoints = Hexagons.hexagons[stoneField - 1].getXPoints();
        yPoints = Hexagons.hexagons[stoneField - 1].getYPoints();
        
        g2.fillPolygon(xPoints, yPoints, 6);
    }
}

Java:
package Test1;



public class Hexagons {
    
    static Hexagon hexagons[];
    
    private static final int QUANTITY = 169;
    
    private static final int XSTART = 350;
    private static final int YSTART = 50;
    
    private static final int XPLUS = 30;
    private static final int YPLUS = 18;
    
    private static final int RADIUS = 20;
    private static final int hexagonCount[] = {1, 2, 3, 4, 5, 6, 7, 8, 7, 8, 7, 8, 7, 
      8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 6, 5, 4, 3, 2, 1};
    
    
    static{
        int x = XSTART;
        int y = YSTART;
        
        hexagons = new Hexagon[QUANTITY];
        
        int hexagonPos = 0;
        
        for(int i = 0; i < hexagonCount.length; i++){
            
            x = XSTART;
            
            for(int j = 1; j < hexagonCount[i]; j++){
                x -= XPLUS;
                
            }
            
            for(int j = 0; j < hexagonCount[i]; j++){
                hexagons[hexagonPos] = new Hexagon(x, y, RADIUS);
                hexagonPos++;
                x += XPLUS*2;
            }
            
            y += YPLUS;
            
        }
        
    }
    
}

class Hexagon{
    int xmiddle;
    int ymiddle;
    int radius;
    int xPoints[];
    int yPoints[];
    //int koorSE[];
    
    Hexagon(int x, int y, int radius){
        xPoints = new int [6];
        yPoints = new int [6];
        //koorSE = new int[4];
        
        xmiddle = x;
        ymiddle = y;
        this.radius = radius;
        
        calcPoints();
    }
    
    private  void calcPoints(){
        for (int i = 0; i < 6; i++) {
            xPoints[i] = (int)(xmiddle + radius * Math.cos(i * 2 * Math.PI / 6));
            yPoints[i] = (int)(ymiddle + radius * Math.sin(i * 2 * Math.PI / 6));   
        }  
    }
    
    
    public int[] getXPoints(){
        return xPoints;
    }
    
    public int[] getYPoints(){
        return yPoints;
    }
    
}
 

TX

Mitglied
Macht es Sinn mit diesem statischen Koordinaten? Oder sollte man die jedesmal neuberechnen lassen in der Zeichenmethode selber?

Habe schon einen kleinen Vergleichstest gemacht und irgendwie Verbrauch die Neuberechnung weniger Leistung als das statische, warum auch immer !?!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Spielfeld für ein Spiel erstellen, wie am besten? AWT, Swing, JavaFX & SWT 4
H LayoutManager RPG Programmieren, eigenes Spielfeld grafisch generieren aus Tileset AWT, Swing, JavaFX & SWT 18
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Viktim Array Spielfeld wird in GUI gedreht AWT, Swing, JavaFX & SWT 5
D Swing Spielfeld drehen von Pentago endet in einer Katastrophe AWT, Swing, JavaFX & SWT 2
P Spielfeld AWT, Swing, JavaFX & SWT 2
C Swing Info-Ebene überdeckt Spielfeld-Ebene komplett AWT, Swing, JavaFX & SWT 5
S Spielfeld mit unförmigen Objekten anklickbar machen? AWT, Swing, JavaFX & SWT 4
C Spielfeld Gitter - Einzelne Zellen verändern AWT, Swing, JavaFX & SWT 18
J Ansicht wechseln zw. Spielfeld und Optionen AWT, Swing, JavaFX & SWT 3
C Spielfeld Editor AWT, Swing, JavaFX & SWT 4
B Ein Spielfeld zeichnen AWT, Swing, JavaFX & SWT 7
Y Spielfeld mit paintComponent oder doch lieber anders? AWT, Swing, JavaFX & SWT 8
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
T src ordner erstellen AWT, Swing, JavaFX & SWT 6
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
E Putzplan erstellen AWT, Swing, JavaFX & SWT 15
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L JavaFX PropertyView mit dynamischer EditCell erstellen? AWT, Swing, JavaFX & SWT 8
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
B JavaFX RadioButtons erstellen AWT, Swing, JavaFX & SWT 7
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
dereki2000 LookAndFeel Individuelles LAF erstellen AWT, Swing, JavaFX & SWT 9
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
L Chat erstellen AWT, Swing, JavaFX & SWT 13
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
K Aus 2 Arrays xy - Graph erstellen AWT, Swing, JavaFX & SWT 9
K Swing outerPanel und innerPanel erstellen AWT, Swing, JavaFX & SWT 4
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
Timo_neu_in_java Buttons Erstellen AWT, Swing, JavaFX & SWT 6
P JList erstellen AWT, Swing, JavaFX & SWT 4
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
J Statistik erstellen AWT, Swing, JavaFX & SWT 3
H GUI erstellen um JUnit Tests auszuführen AWT, Swing, JavaFX & SWT 29
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
J JavaFX JavaFX exe erstellen AWT, Swing, JavaFX & SWT 5
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
M "(Buch-)Seiten" erstellen AWT, Swing, JavaFX & SWT 2
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
A Swing Frames richtig erstellen AWT, Swing, JavaFX & SWT 3
T Wizard mit NEXT Button erstellen AWT, Swing, JavaFX & SWT 11
D gerichteten Graph erstellen AWT, Swing, JavaFX & SWT 2
D Swing Ansichtstranformationsmatrix erstellen AWT, Swing, JavaFX & SWT 0
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
R Kästchen mit Zufallsfarben erstellen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
G Label erstellen AWT, Swing, JavaFX & SWT 6
G Blöcke erstellen AWT, Swing, JavaFX & SWT 4
K Swing Terminplaner erstellen AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
T An/aus Button erstellen AWT, Swing, JavaFX & SWT 5
A Swing Transparenten JPanel erstellen AWT, Swing, JavaFX & SWT 5
D Jahreskalender erstellen AWT, Swing, JavaFX & SWT 2
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
K Swing SwingGUI - Erstellen für Anfänger AWT, Swing, JavaFX & SWT 15
B Eigenen Look&Feel erstellen?! AWT, Swing, JavaFX & SWT 2
S Swing Kopie eines JPanels inkl. aller objekte darin erstellen AWT, Swing, JavaFX & SWT 5
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben