NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
Paťo Lenard
Člen
Avatar
Paťo Lenard:17.5.2016 19:11

Zdravím,chcem sa opytat ci by niekto nevedel poradit ako vykreslit jednoduchu tahovu hru do grafickeho prostredia, popripade keby mal niekto cas , ukazat alebo povedat co bysi dalo na tom programe zlepsit kedze somlen zaciatocnik

 
Odpovědět
17.5.2016 19:11
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:17.5.2016 20:53

zdravíčko. Proč trošku nerozepíšeš, co máš přesně na myslí? Jakou tahovou hru? co je: "na tom programe"?

Nahoru Odpovědět
17.5.2016 20:53
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Paťo Lenard
Člen
Avatar
Odpovídá na Lubor Pešek
Paťo Lenard:18.5.2016 8:24

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 :)

Editováno 18.5.2016 8:24
 
Nahoru Odpovědět
18.5.2016 8:24
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:18.5.2016 9:24

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;)

Nahoru Odpovědět
18.5.2016 9:24
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Paťo Lenard
Člen
Avatar
Paťo Lenard:18.5.2016 12:38

čo ti to mám napísať? :)

 
Nahoru Odpovědět
18.5.2016 12:38
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Paťo Lenard
Lubor Pešek:18.5.2016 13:17

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();
        }
}
Nahoru Odpovědět
18.5.2016 13:17
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Paťo Lenard
Člen
Avatar
Paťo Lenard:18.5.2016 15:06

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!");
        }
    }
}
 
Nahoru Odpovědět
18.5.2016 15:06
Avatar
Paťo Lenard
Člen
Avatar
Paťo Lenard:18.5.2016 15:06

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();
        }

}
 
Nahoru Odpovědět
18.5.2016 15:06
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:18.5.2016 15:18

ok, mrknu na to, ale až večer;)

Nahoru Odpovědět
18.5.2016 15:18
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Paťo Lenard
Člen
Avatar
Paťo Lenard:18.5.2016 15:36

dikes :)

 
Nahoru Odpovědět
18.5.2016 15:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.