Diskuze: GUI-graficke prostredie pre jednoduchu tahovu hru
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
zdravíčko. Proč trošku nerozepíšeš, co máš přesně na myslí? Jakou tahovou hru? co je: "na tom programe"?
Je to len boj medzi dvomi bojovnikmi , ktorý maju naprogromovane utoky a obranu a ovlada ichcisto PC a zapisuje jednotlive utoky do terminalu.Jedine o co mi ide je graficka podoba tejto hry , kedze zatial ju mam len v terminali. GUI je pre mna upla novinka a neviem ako to tam velmi preniest
značka ideál by byla, kdybys sem postnul sources, ale jestli chceš, můžu ti dát takový malý cvičný toturiálek. napiš mi PMku a domluvíme se;)
vložíš sem zdrojový kód:D co teď máš, abychom měli představu, co vlastně chceš z výpisů převést do GUI. Sice typuju, že jde o tu hru bojovníků, co je tady v tutoriálu, ale nikdy si nemůžeš být jistý:)
Nicméně, abys měl třeba představu, jak se s graickými objekty pracuje, tak ti můžu tady vypsat takové základní componenty. Ale předem říkám, že to jsou swingovské třídy a že s Javou FX nemám experienci. Možná by to sem mohl někdo hodit, ať se zaučím i já:D
JComponent
Snad již víš, že všechny třídy v Javě jsou odvozené od jedné hlavní
třídy, jménem Object. To je praotec všech tříd. Proto taky každá třída
například zná metodu toString(). Grafické komponenty mají taky jednoho
společného předka (ale i komponenty i JComponent jsou taktéž potomci
Objectu;) ) - JComponent.
Zvykni si, že když pracuješ s jakýmkoliv grafickým nástrojem, tak tomu
říkej komponenta (pak se specializují dále např.: JButton, JSpinner,
JPanel, JFrame, JComboBox, JScrollBar, JTable, JWindow atd. atd.)
javax.swing.*;
Tak předně věz, že grafické komponenty jsou v balíku javax.swing. Tento
balík obsahuje kolečka, čtverečky, panely, scroll bary, tabulky, spinnery,
tlačítka a spoustu dalších. V podstatě to funguje tak, že skoro všechny
(říkám schválně skoro všechny, protože třeba JDialog nebo JWindow jsou
právě vyjímky) komponenty vytovířiš velmi podobně.
Základní metody
Většina komponent má pár stejných metod, sloužících k tomu, abys je
vůbec vyděl nebo abys na ně mohl něco přidávat. Novou instancí (new
Object() ), potom jim musíš nastavit nějakou velikost (setSize(int width, int
height) a na konec, aby šly vidět, tak jim musíš zavolat metodu
setVisibe(true); doufám, že anglicky umíš a nemusím překládat. Nakonec
mají všechny komponenty ještě takové 4 základní specifické metody
(repain() , add(JComponent), remove(JComponnet), getComponentAt(int x, int y) ).
No a potom spoustu přístupových metod, na které není proč upozorňovat,
jsou naprosto základní (getName(), setName(String name), getX(), getY(),
getWidth(), getHeight(), setLocation(int x, int y) a spoutu dalších).
JFrame
naprosto nejzákladnější komponenta, která simuluje windowsovské okno se
nazývá JFrame. Je to speciální komponenta, pro kterou mají operační
systémy slabost a vytvoří ji na ploše jako novou aplikaci. Podobná ale
trošku těžší třída JFramu je JWindow nebo JDialog. Tyto třídy můžeš
samostatně pouštět a vykreslují se v oknech.
Aby sis udělal naprosté základní okýnko, tak na to slouží tento kód:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
public class Frame extends JFrame{ //díky dědění třídy JFrame můžeme používat její metody a tvářit se jako okno
public Frame(){
setSize(300,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //tato netida slouží k tomu, abys resetoval VMJ. Pokud toto nenastavíš, tak i když zmáčkneš křížek, tak se sice zavře okno, ale program běží dál.
JPanel panel = new JPanel(); //nový pomocný panel, který představuje výplň okna. Na tento panel můžeme přidávat další komponenty. Na hlavní okno to nejde. (nebo spíš jde, ale velmi těžce a hnusně)
panel.setSize(300,300);
panel.setBackground(Color.pink);
add(panel); //přidání panelu na hlavní okno
JButton button = new JButton(); //nové tlačítko
button.setText("Push me");
button.setSize(85,25);
panel.add(button); //přidání tlačítka na JPanel (kdybys dal jen add(button), tak to přidáš zase na hlavní panel a tak se to bude překrývat a pochopitelně... větší vítězí:)
button.setLocation(100,100);
}
public static void main(String[] args){
Frame frame = new Frame();
}
}
Ide mi vlastne o to , ze som zacal GUI , mamtam vlozeny JPanel a taktiez pozadie ,ktore mi tvori obrazok cele je to o tom , ze by som chcel nejako vypis z areny vlozit do grafiky , kde by boli nejake bary , ktorym by si ubarel zivot , pridavala mana na zaklade utoku , respektive obnovi
package tahovyboj;
public class Arena {
/** Prvý bojovník v aréne */
private Bojovnik bojovnik1;
/** Druhý bojovník v aréne */
private Bojovnik bojovnik2;
/** Hracia kocka */
private Kocka kocka;
/** Urcuje kolo*/
private int kolo = 0;
/*
* Vytvorí novou instanciu arény
* @param bojovnik1 Prvý bojovník v aréne
* @param bojovnik2 Druhý bojovník v aréne
* @param kocka Hrací kocka
*/
public Arena(Bojovnik bojovnik1, Bojovnik bojovnik2, Kocka kocka) {
this.bojovnik1 = bojovnik1;
this.bojovnik2 = bojovnik2;
this.kocka = kocka;
}
public int getKolo() {
return kolo;
}
/** Simuluje zápas bojovníkov */
public void zapas() {
// pôvodné poradie
Bojovnik b1 = bojovnik1;
Bojovnik b2 = bojovnik2;
System.out.println("Vitajte v aréne!");
System.out.printf("Dnes se spolu stretnú %s s %s! \n\n", bojovnik1, bojovnik2);
// prehodenie bojovnikov
boolean zacinaBojovnik2 = (kocka.hod() <= kocka.vratPocetStien() / 2);
if (zacinaBojovnik2) {
b1 = bojovnik2;
b2 = bojovnik1;
}
System.out.printf("Začínat bude bojovník %s! \nZápas môže začať...\n", b1);
// cyklus s bojom
while (b1.nazivu() && b2.nazivu()) {
kolo++;
b1.utoc(b2);
vykresli();
vypisSpravu(b1.vratPoslednuSpravu()); // správa o útoku
vypisSpravu(b2.vratPoslednuSpravu()); // správa o obrane
if (b2.nazivu()) {
b2.utoc(b1);
vykresli();
vypisSpravu(b2.vratPoslednuSpravu()); // správa o útoku
vypisSpravu(b1.vratPoslednuSpravu()); // správa o obrane
}
System.out.println();
}
}
private void vypisBojovnika(Bojovnik b) {
System.out.println(b);
System.out.print("Zivot: ");
System.out.println(b.grafickyZivot());
if (b instanceof Mag) {
System.out.print("Mana: ");
System.out.println(((Mag) b).grafickaMana());
}
}
/** Vykreslí informačnú obrazovku */
private void vykresli() {
System.out.println(""
+ " __ ____ ____ _ _ __ \n"
+ " /__\\ ( _ \\( ___)( \\( ) /__\\ \n"
+ " /(__)\\ ) / )__) ) ( /(__)\\ \n"
+ "(__)(__)(_)\\_)(____)(_)\\_)(__)(__)\n");
System.out.println("Bojovníci: Witch King vs Gandalf\n" + this.kolo + ".kolo\n");
vypisBojovnika(bojovnik1);
System.out.println();
vypisBojovnika(bojovnik2);
System.out.println();
}
/**
* Vypíše správu do konzoly s dramatickou pauzou
* @param sprava Správa
*/
private void vypisSpravu(String sprava) {
System.out.println(sprava);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
System.out.println("Chyba, nepodarilo sa uspat vlákno!");
}
}
}
v podstate zatiaľ mám toto spravené
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class JFrameBackground extends JFrame {
private BufferedImage image;
public JFrameBackground(){
try {
image = ImageIO.read(new File("obrazok2.jpg"));
this.setContentPane(new JLabel(new ImageIcon(image)));
} catch (IOException e) {
// Auto-generacia catch block
e.printStackTrace();
}
this.setSize(1366,768);
this.setLayout(new FlowLayout());
this.setResizable(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("JFrame Tutorial Update");
this.setVisible(true);
}
public static void main(String[] args) {
new JFrameBackground();
}
}
ok, mrknu na to, ale až večer;)
Zobrazeno 10 zpráv z 10.