BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Tvorba Snake 2D - krok za krokem v Javě

Tento turiál bude pojednávat jak si počínat při tvorbě hry jako je tato: http://www.itnetwork.cz/…ad-snake-2d/ V podstatě se bude jednat o stejnou funkčnost, akorát s tím rozdílem, že to napíšu znova s přehlednějším kódem.

Vytvoření základu

Nejdříve si nachystáme třídy/objekty které se budou vyskytovat ve hře.

Jako první si vytvoříme základní objekt od kterýho dále budeme dědit.

package org.fugiczek.snake2d.game;

import java.awt.Color;
import java.awt.Graphics2D;

/**
 * Univerzální herní objekt
 * @author Fugiczek
 * @version 1.1
 */
public class GObject {

    /**
     * x-ová souřadnice
     */
    private int x;
    /**
     * y-ová souřadnice
     */
    private int y;
    /**
     * velikost v pixelech při vykreslení
     */
    private int sizeInPX;
    /**
     * barva objektu (na vykreslení)
     */
    private Color color;

    /**
     * Konstruktor na vytvoření
     * @param x x-ová souřadnice
     * @param y y-ová souřadnice
     * @param sizeInPX velikost v pixelech při vykreslení
     * @param color barva objektu (na vykreslení)
     */
    public GObject(int x, int y, int sizeInPX, Color color){
        setX(x);
        setY(y);
        setSizeInPX(sizeInPX);
        setColor(color);
    }

    /**
     * Vykreslení objektu
     * @param g2 instance třídy Graphics2D na vykreslení
     */
    public void draw(Graphics2D g2){
        g2.setColor(color);
        g2.fillRect(x, y, sizeInPX, sizeInPX);
    }

    /**
     * @return x-ová souřadnice
     */
    public int getX() {
        return x;
    }

    /**
     * @param x nová x-ová souřadnice
     */
    public void setX(int x) {
        this.x = x;
    }

    /**
     * @return y-ová souřadnice
     */
    public int getY() {
        return y;
    }

    /**
     * @param y nová y-ová souřadnice
     */
    public void setY(int y) {
        this.y = y;
    }

    /**
     * @return velikost v PX
     */
    public int getSizeInPX() {
        return sizeInPX;
    }

    /**
     * @param sizeInPX nová velikost v PX
     */
    public void setSizeInPX(int sizeInPX) {
        this.sizeInPX = sizeInPX;
    }

    /**
     * @return barva pro vykreslení
     */
    public Color getColor(){
        return color;
    }

    /**
     * @param color nová barva pro vykreslní
     */
    public void setColor(Color color){
        this.color = color;
    }

}

Tento objekt má vše co bude potřeba, jako souřadnice x/y a pro vykreslování barvu, velikost a samotnou metodu na vykreslení, ostatní objekty budou chtít jen malé úpravy.

Dále si napíšeme třídu s objektem, který se bude náhodně umísťovat na herní ploše a za který budeme získávat body.

package org.fugiczek.snake2d.game;

import java.awt.Color;
import java.util.Random;

/**
 * Bonus za kterým se budeme honit ;)
 * @author Fugiczek
 * @version 1.1
 */
public class Bonus extends GObject{

    /**
     * Šířka herního pole v PX
     */
    private final int maxX;
    /**
     * Výška herního pole v PX
     */
    private final int maxY;

    /**
     * Instance třídy Random pro náhodné rozmisťování
     */
    private Random rand;

    /**
     * Konstruktor na vytvoření
     * @param sizeInPX velikost v pixelech při vykreslení
     * @param color barva objektu (na vykreslení)
     * @param maxX Šířka herního pole v PX
     * @param maxY Výška herního pole v PX
     */
    public Bonus(int sizeInPX, Color color, int maxX, int maxY){
        super(0, 0, sizeInPX, color);
        this.maxX = maxX;
        this.maxY = maxY;
        rand = new Random();
    }

    /**
     * Umístí bonus na náhodnou pozici
     */
    public void locateBonus(){
        int tmp;
        tmp=rand.nextInt(maxX/getSizeInPX());
        setX(tmp*getSizeInPX());
        tmp=rand.nextInt(maxY/getSizeInPX());
        setY(tmp*getSizeInPX());
    }

}

Zde jsme přidali navíc jen proměnné maxX a maxY pro generování nové pozice aby se ponus nevygeneroval mimo hrací pole, díle instance třídy Random rand pro náhodné umístění a metoda locateBonus pro náhodné umístění.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Dále budeme potřebovat samotného hada, nejdříve si uděláme výčtový typ směru abychom věděli jakým směrem se had bude pohybovat.

package org.fugiczek.snake2d.game;

public enum Direction {
    UP, DOWN, LEFT, RIGHT
}

A teď samotná třída s hadem.

package org.fugiczek.snake2d.game;

import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;

/**
 * Had se všemi jeho vlastnostmi
 * @author Fugiczek
 * @version 1.1
 */
public class Snake extends GObject{

    /**
     * List s hadovými částmi těla
     */
    private List<GObject> body;
    /**
     * Barva těla hada
     */
    private Color colorBody;
    /**
     * Směr kudy had jde
     */
    private Direction direct;

    /**
     * Konstruktor na vytvoření
     * @param x x-ová souřadnice
     * @param y y-ová souřadnice
     * @param sizeInPX velikost v pixelech při vykreslení
     * @param color barva hlavy (na vykreslení)
     * @param colorBody barva těla (na vykreslení)
     */
    public Snake(int x, int y, int sizeInPX, Color color, Color colorBody) {
        super(x, y, sizeInPX, color);
        body = new ArrayList<>();
        setColorBody(colorBody);
        setDirect(Direction.DOWN);
    }

    /**
     * Přepsaná třída na vykreslení, vykresluje hlavu a tělo dohromady
     */
    @Override
    public void draw(Graphics2D g2){
        g2.setColor(getColor());
        g2.fillRect(getX(), getY(), getSizeInPX(), getSizeInPX());

        for(GObject ob : body){
            ob.draw(g2);
        }
    }

    /**
     * @return barva těla
     */
    public Color getColorBody() {
        return colorBody;
    }

    /**
     * @param colorBody nová barva těla
     */
    public void setColorBody(Color colorBody) {
        this.colorBody = colorBody;
    }

    /**
     * @return směr hada
     */
    public Direction getDirect() {
        return direct;
    }

    /**
     * @param direct nový směr hada
     */
    public void setDirect(Direction direct) {
        this.direct = direct;
    }

    /**
     * Rozšíří tělo hada o jednu novou část, dá ji na místo hlavy a hlavu posune
     */
    public void expandBody(){
        body.add(0, new GObject(getX(), getY(), getSizeInPX(), getColorBody()));
        moveHead();
    }

    /**
     * @return list s tělem
     */
    public List<GObject> getBody(){
        return body;
    }

    /**
     * Pohne s celým tělem včetně hlavy
     */
    public void move(){
        moveBody(); // první musí být pohyb těla protože vychází ze souřadnic hlavy
        moveHead();
    }

    /**
     * Pohyb hlavy v závislosti na směru
     */
    private void moveHead(){
        switch(getDirect()){
        case LEFT:
            setX(getX()-getSizeInPX());
            break;
        case RIGHT:
            setX(getX()+getSizeInPX());
            break;
        case UP:
            setY(getY()-getSizeInPX());
            break;
        case DOWN:
            setY(getY()+getSizeInPX());
            break;
        }
    }

    /**
     * Posouvá tělem na základě souřadnic minulé části
     */
    private void moveBody(){
        int tmpX=getX(), tmpY=getY(), tmp; // pomocné proměnné

        for(GObject obj : body){
            tmp = obj.getX();
            obj.setX(tmpX);
            tmpX = tmp;
            tmp = obj.getY();
            obj.setY(tmpY);
            tmpY = tmp;
        }

    }
}

Tak tady nám toho přibylo o něco více. Potřebujeme list body s částmi těla, barvu těla colorBody abychom odlišili barvu hlavy od těla a směr direct abychom věděli kterým směrem had půjde. Museli jsme přepsat metodu na vykreslení aby se nám vykreslila hlava i s tělem. Kdybychom ji nepřepsali, vykreslila by se jen hlava. Přibyli metody na získávání proměnných, metoda na rozšíření těla, která se bude volat když seberem bonus (nová část se dá na pozici hlavy a hlava se posune) a samozřejmě přibyly metody na pohyb.

No herní objekty by jsme měli mít, teď si napíšeme nějakou třídu statickou která nám bude kontrolovat kolize.

package org.fugiczek.snake2d.utilities;

import org.fugiczek.snake2d.game.Bonus;
import org.fugiczek.snake2d.game.GObject;
import org.fugiczek.snake2d.game.Snake;

/**
 * Třída obsahuje metody na kontroly různých kolizí.
 * @author Fugiczek
 * @version 1.1
 */
public class Collisions {

    private Collisions(){} //nepotřebujeme aby se vytvářeli instance, proto privátní konstruktor

    /**
     * Metoda zjišťuje jestli had nezajel mimo hrací pole, nebo nenarazil sám do sebe.
     * @param snake instance třídy Snake
     * @param maxX Maximální šířka hracího pole
     * @param maxY Maximální výška hracího pole
     * @return Vrací true jestli se souřadnice jeho hlavy rovnají nějakým souřadnicím jeho těla.
     * Dále vrací true jestli souřadnice jeho hlavy jsou mimo herní pole. Pokud se žádná z těchto
     * podmínek nepotvrdí, vrací false.
     */
    public static boolean checkCollision(Snake snake, int maxX, int maxY){
        for(GObject obj : snake.getBody()){
            if((snake.getX()==obj.getX()) && (snake.getY()==obj.getY())){
                return true;
            }
        }

        if(snake.getX()<0){
            return true;
        }
        if(snake.getX()>=maxX){
            return true;
        }
        if(snake.getY()<0){
            return true;
        }
        if(snake.getY()>=maxY){
            return true;
        }

        return false;
    }

    /**
     * Kontroluje zda had najel na bonus
     * @param snake Objekt hada
     * @param bonus Objekt bonusu
     * @return Vrací true, když se souřadnice hlavy hada a bonusu rovnají. Vrací false, když ne.
     */
    public static boolean checkBonus(Snake snake, Bonus bonus){
        if(snake.getX()==bonus.getX() && snake.getY()==bonus.getY()){
            return true;
        }
        else{
            return false;
        }
    }

}

Na tom není snad co komentovat, jedna metoda kontroluje zda jsme neprohrali, tedy jestli jsme nezajeli mimo herní pole nebo nenajeli sami na sebe a druhá kontroluje zda jsme sebrali bonus.

Tohle by bylo z přípravy snad vše. Teď se vrhneme na grafické zpracování.

Grafické zpracování

Nejdříve si uděláme třídu s hlavním oknem, na který se poté dá herní plocha.

package org.fugiczek.snake2d.gui;

import java.awt.Dimension;
import javax.swing.JFrame;

/**
 * Třída, která přidává JPanel s hlavní části této hry a nastavuje základní vlastnosti okna.
 * @author Fugiczek
 * @version 1.1
 */
public class MainBoard extends JFrame{

    private static final long serialVersionUID = 7959263521913348215L;

    public MainBoard(String title, int width, int height){
        setTitle(title);
        setSize(new Dimension(width+3,height+3));
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        createBufferStrategy(2);
        add(new GameBoard(width, height, getBufferStrategy()));
    }

}

A poté si vytvoříme jakoby plátno s herní plochou.

package org.fugiczek.snake2d.gui;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;

import javax.swing.JPanel;

import org.fugiczek.snake2d.game.Bonus;
import org.fugiczek.snake2d.game.Direction;
import org.fugiczek.snake2d.game.Snake;
import org.fugiczek.snake2d.utilities.Collisions;

/**
 *
 * @author Fugiczek
 * @version 1.1
 */
public class GameBoard extends JPanel implements Runnable{

    private static final long serialVersionUID = 7806414151208424260L;

    /**
     * Šířka herního pole
     */
    private final int WIDTH;
    /**
     * Výška herního pole
     */
    private final int HEIGHT;
    /**
     * Instance třídy Snake
     */
    private Snake snake;
    /**
     * Instance třídy Bonus
     */
    private Bonus bonus;
    /**
     * Informace zda jsme ještě ve hře, nebo jsme prohráli
     */
    private boolean inGame;

    /**
     * instance třídy BufferStrategy na vykreslování s metodou double-buffer
     */
    private BufferStrategy bs;

    /**
     * FPS (1000/FRAME_DELAY), ovlivňuje rychlost hry
     */
    private final int FRAME_DELAY = 100;
    /**
     * Jak dlouho běžel jeden cyklus, pomocná proměnná při synchronizaci FPS
     */
    private long cycleTime;

    /**
     *
     * @param width šířka herního pole
     * @param height výška herního pole
     * @param bs instance třídy bufferstrategy na vykreslování
     */
    public GameBoard(int width, int height, BufferStrategy bs){
        addKeyListener(new TAdapter());
        setFocusable(true);
        setIgnoreRepaint(true);
        WIDTH = width;
        HEIGHT = height;
        this.bs = bs;

        gameInit();
    }

    /**
     * Nastavení hry a její zapnutí
     */
    private void gameInit(){
        inGame = true;
        snake = new Snake(50, 50, 10, Color.GREEN, Color.GRAY);
        bonus = new Bonus(10, Color.YELLOW, WIDTH, HEIGHT);
        bonus.locateBonus();

        Thread animace = new Thread(this, "Game");
        animace.start();
    }


    /**
     * Hlavní smyčka, kde probíhá furt dokola aktualizace herní logiky, překreslování a synchronizace FPS
     */
    @Override
    public void run() {

        cycleTime = System.currentTimeMillis();

        while(inGame){

            updateLogic();

            updateGui();

            synchFrameRate();

        }

        gameOver();

    }

    /**
     * Synchronizace FPS
     */
    private void synchFrameRate() {
        cycleTime += FRAME_DELAY;
        long difference = cycleTime-System.currentTimeMillis();
        try {
            Thread.sleep(Math.max(0, difference));
        }
        catch(InterruptedException e) {
            e.printStackTrace();
        }
        cycleTime = System.currentTimeMillis();
    }

    /**
     * Vykreslení herní plochy
     */
    private void updateGui() {
        Graphics2D g2 = (Graphics2D)bs.getDrawGraphics();

        g2.setColor(Color.BLACK); //vyčištění
        g2.fillRect(0, 0, WIDTH, HEIGHT);

        snake.draw(g2);
        bonus.draw(g2);

        g2.dispose();

        bs.show();

        Toolkit.getDefaultToolkit().sync();
    }

    /**
     * Kontrola kolizí a posun hada
     */
    private void updateLogic() {
        if(Collisions.checkCollision(snake, WIDTH, HEIGHT)){
            inGame=false;
        }else if(Collisions.checkBonus(snake, bonus)){
            snake.expandBody();
            bonus.locateBonus();
        }else{
            snake.move();
        }
    }

    /**
     * Zobrazení obrazovky s nápisem prohry a se skórem
     */
    private void gameOver(){
        Graphics2D g2 = (Graphics2D)bs.getDrawGraphics();

        String zprava="Prohrál jsi!";
        String skore="Dosáhl jsi skóre: " + snake.getBody().size();
        Font font = new Font("Helvetica", Font.BOLD, 20);
        FontMetrics metr = this.getFontMetrics(font);

        g2.setColor(Color.BLACK); //vyčištění
        g2.fillRect(0, 0, WIDTH, HEIGHT);

        g2.setColor(Color.WHITE);
        g2.setFont(font);
        g2.drawString(zprava, (WIDTH - metr.stringWidth(zprava))/2, (HEIGHT/2)+25);
        g2.drawString(skore, (WIDTH - metr.stringWidth(skore))/2, (HEIGHT/2)-25);

        g2.dispose();

        bs.show();

        Toolkit.getDefaultToolkit().sync();

        try {
            Thread.sleep(2000);
        }
        catch(InterruptedException e) {
            e.printStackTrace();
        }

        System.exit(0);
    }

    /**
     * Soukromá třída která zpracovává zmáčknuté klávesy
     * @author Fugiczek
     * @version 1.1
     */
    private class TAdapter extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            //int hodnota zmáčknuté klávesy
            int key=e.getKeyCode();
            if ((key == KeyEvent.VK_UP || key==KeyEvent.VK_W) && (snake.getDirect()!=Direction.DOWN)) {
                snake.setDirect(Direction.UP);
            }
            if ((key == KeyEvent.VK_RIGHT || key==KeyEvent.VK_D) && (snake.getDirect()!=Direction.LEFT)) {
                snake.setDirect(Direction.RIGHT);
            }
            if ((key == KeyEvent.VK_DOWN || key==KeyEvent.VK_S) && (snake.getDirect()!=Direction.UP)) {
                snake.setDirect(Direction.DOWN);
            }
            if ((key == KeyEvent.VK_LEFT || key==KeyEvent.VK_A) && (snake.getDirect()!=Direction.RIGHT)) {
                snake.setDirect(Direction.LEFT);
            }
        }
    }

}

Při tvorbě takové třídy je vhodné nejdříve si inicializovat všechny možné proměnné/ herní objekty. Dále si napsat herní smyčku, něco jako tato:

public void run() {

        cycleTime = System.currentTimeMillis();

        while(inGame){

            updateLogic();

            updateGui();

            synchFrameRate();

        }

        gameOver();

    }

A jednotlivě si napsat dané metody. Když se u nějaké zasekneme, tak se vrhneme na další a později se k ní vrátíme. Poté si můžeme napsat adaptér na zpracování výstupu z klávesnice/myši.

Spouštěcí třída

Na dokončení nám již chybí jen spouštěcí třída.

package org.fugiczek.snake2d;

import javax.swing.SwingUtilities;

import org.fugiczek.snake2d.gui.MainBoard;

/**
 * Hlavní spouštěcí třída
 * @author Fugiczek
 * @version 1.1
 */
public class Snake2D {

    public static void main(String[]args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new MainBoard("Snake2D v1.1 by Fugizcek", 300, 250);
            }
        });
    }
}

Snad není potřeba vysvětlovat :D

Závěr

Než začnete psát nějakou hru je dobrý si promyslet jak ta hra bude fungovat, protože přepisování kódu když máte již půlku hotovou není moc milá věc. Když Vám něco nejde, dejte si pár hodin pauzu, poté půjde všechno líp, proleží se Vám to hlavou. Až budete mít hru hotovou je dobrý si projít části kódu kde je hodně logiky/výpočtů, třeba vás napadně způsob lepšího a úspornějšího napsání.

To je ode mě vše. Pokud Vám něco nebude jasné napište do komentářů. (nevím jestli Vám to bude dělat taky ale pokud se Vám neukáže bonus tak je schovanej nahoře o jedno políčko víš :D mám upravený vzhled windowsů tak nevím jestli je to chyba, pokud Vám to bude vadit tak si to zpravte :D, v MainBoard, 17. řádek -> setSize(new Dimension(wid­th+3,height+3));, je možný že Vám ty rozměry prostě nějak nebudou sedět a bonus třeba nepujde vidět, jak jsem říkal je to způsobeno tím že mám jiný vzhled, pokud nepomůže úprava velikosti tak si posuňte jpanel pomocí metody setBounds ale při tom musíte mít nastavený layout na null).


 

Stáhnout

Staženo 1331x (17.99 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Všechny články v sekci
Tvorba her v Java Swing
Článek pro vás napsal Fugiczek
Avatar
Jak se ti líbí článek?
9 hlasů
Aktivity (2)

 

 

Komentáře

Avatar
matesax
Redaktor
Avatar
matesax:22.10.2012 17:29

To mi přijde jednodušší řešení to mé - mám ho jako seznam pozic - když se pohybuje, smaže se zadek, a přidá nová hlava (podle směru). (První položka se vždy vykresluje jako hlava.) Když zrovna jí, tak se akorát nesmaže zadek... Dále had má zmiňovanou vlastnost směr a podle té se pohybuje - v enum je i stop - takže popř. stojí - i když se volá move - tím mi stačí pořád volat move. No a při stisknutí klávesy se akorát nastaví nový směr... (Bonus se generuje podle délky hada a náhodného čísla.)

 
Odpovědět
22.10.2012 17:29
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:22.10.2012 18:14

Ještě jeden rozdíl tady je: Tento had mi (po drobných úpravách) funguje. Jenom když se někde zakousne, hra se zastaví, nereaguje na nic a musím zavřít okno. Ještě se podívám, čím to je.

Odpovědět
22.10.2012 18:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:22.10.2012 18:39

Na tvé řešení se tu nikdo neptal ;-) Já to kdysi psal podle verze ze starých nokií a tam se nezastavovalo. Toto neměla být žádná převratná hra, jen jsem na požádání albertpatera popsal jak při tvoření postupuju a rovnou udělal úpravy ve starém kódu.

To Kit: to zakousnutí je tím že kolize se kontroluje v určité době, takže pokud nastane kolize po kontrole tak chvíli trvá než se to zase zkontroluje, ale to by nemělo trvat nějak moc dlouho

O všech chybách jsem si vědom, jen se mi nechtějí opravovat, jak už jsem psal, šlo jen o postup na žádost albertpatera...

 
Odpovědět
22.10.2012 18:39
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:22.10.2012 18:51

Děkuji, že jsi mě slušně poslal někam - chtěl jsem ti poradit - ale tak si klidně smol kilometrové kódy a neuč se jednodušším řešením... A efektivitou abych si utíral zadek - že? Viz. test kolizí v časových intervalech...

Editováno 22.10.2012 18:51
 
Odpovědět
22.10.2012 18:51
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:22.10.2012 18:53

Může to být klidně zaviněno přenosem mezi platformami a různými verzemi Javy (mám 1.6.0_22). V Javě normálně nedělám, může to být i z jiných důvodů. Budu zkoumat.

Odpovědět
22.10.2012 18:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:22.10.2012 19:00

To matesax: Já tě nikam neposílál, jen jsem naznačil že mi tvuj názor celkem u pr*ele :-) Zadek si utírej čím chceš, do toho se ti vtírat nebudu. Ono by stačilo pohyb napsat před kontrolu kolizí a bylo by to vyřešený. Já o těch chybách vím :-) Ale proč bych si měl nechat radit od někoho kdo ani pomalu neumí upravit svoje vlastní kódy?

To Kit: Nejspíš to bude rozdílnými verzemi Javy a nejspíš to bude dělat řádek:

body = new ArrayList<>();

Toto lze od javy 7.
V javě 6 se to musí vypisovat takhle:

body = new ArrayList<GObject>();
 
Odpovědět
22.10.2012 19:00
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:22.10.2012 19:07

Sorry, ale vytahovat staré věci - není to trochu dětinské? :) Aktuálně se mě tedy chaos v kódech rozhodně netýká... Nebo ti přijde jeden list, 2 proměnné a struktura jako chaos - anebo jako lepší a jednodušší řešení? :) (Upravenou verzi jsem již nepublikoval.)

 
Odpovědět
22.10.2012 19:07
Avatar
Kit
Redaktor
Avatar
Kit:22.10.2012 19:12

Ten řádek jsem měl jen

body = new ArrayList();

protože mi to nešlo zkompilovat. Po úpravě se nic nezměnilo.

Možná budu brzy dělat celkový upgrade OS, sveze se s tím i Java. Tak to neřeš. Chtěl jsem si jen vyzkoušet nějaký program v Javě s GUI. Nějaká funkčnost tam je, pro dnešek jsem spokojen.

Odpovědět
22.10.2012 19:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:22.10.2012 19:15

Možná je, možná není. Není jak posoudit. Názor ostatních na mě je mi lhostejný. V chaosu má každý svůj pořádek a tvrdit že v kódu nemáš chaos zní celkem nafoukaně. Každý má svůj vlastní styl psaní. Navíc o Javě nevíš skoro nic, tak mi do toho nekecej ;-) já ti taky nekecám do kopírky (pokud jsi nepochopil myslel jsem tím C#).

No a stejně tahle diskuze nikam nevede, takže pokud ještě máš něco na srdci tak mi pošli SZ...

 
Odpovědět
22.10.2012 19:15
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:22.10.2012 19:19

Jak ty víš, že o Javě nic nevím? :) Zaprvé, má hodně společného s C#, za druhé v ní dělám... Vzhledem k tomu, že dodržuji OOP se přehlednosti ani vyhnout nedá... (Vše má stejný nárys - stejné názvy, stejné metody,...)

Editováno 22.10.2012 19:21
 
Odpovědět
22.10.2012 19:19
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:22.10.2012 19:32

S tebou je to těžký, prostě můj kód neřeš a tečka :-D
Nesnáším Microsoft, všechno co z něho vzešlo je zlo, programovacího jazyku včetně. (tato má odpověď povedene nejspíš k dalšímu flamu, protože programátoři C# a Javy se nemají rádi, takže ju prosím nerozebírej)
Mě OOP nebere, částečně ho nějak dodržuju, ale mám svůj vlastní styl.
Taky zastávám názoru, že by se programátor měl věnovat primárně jednomu jazyku, když dělá ve více tak neumí pořádně ani jeden.

 
Odpovědět
22.10.2012 19:32
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:22.10.2012 19:37

Já nesnáším sám sebe - to je dobrý... :) A proč bych měl nesnášet tebe? :) Pěkná ukázka demagogie...

 
Odpovědět
22.10.2012 19:37
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:22.10.2012 19:40

Nepoužívej slova který jsou mi cizí, takový sprostý slova tady píšeš... :-D

 
Odpovědět
22.10.2012 19:40
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:22.10.2012 19:40

Pokud chcete takto diskutovat, můžete si psát PMka. Toto nemá s článkem nic společného.

Odpovědět
22.10.2012 19:40
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:22.10.2012 19:51

Na čem to ladíš, když ne na OS od Microsoftu? Musel jsem si ty zdrojáky překódovat z cp1250 do UTF-8, abych to měl správně česky.

Odpovědět
22.10.2012 19:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Fugiczek
Lukáš Hruda (Luckin):22.10.2012 19:53

Nemam ten pocit že programátoři C# a Javy se nemají rádi. Vždyť ty jazyky sou si dost podobný a spousta lidí programuje v obou.
Na druhou stranu souhlasim s tim že je lepší umět pořádně jeden jazyk, než jich umět víc "jenom" dobře. Kdysi sem taky zkoušel C# a Javu sem se dokonce nějakou dobu učil, pak sem ale začal zjišťovat že čim víc toho vim o Javě tim víc zakrňuje moje schopnost programovat v jazyce kterej sem už uměl a tak sem radši honem rychle všechno z Javy zapomněl :D

 
Odpovědět
22.10.2012 19:53
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:22.10.2012 20:10

Pro mne je toto dilema vyřešeno. Programy v C# na mém PC zpravidla nefungují, zbývá Java. A tu moc rád nemám, protože je na můj vkus ukecaná a také mi víc vyhovuje dynamické typování.

Odpovědět
22.10.2012 20:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):22.10.2012 20:18

Já mam bohužel ten problém že až budu na VŠ tak se tu Javu budu muset naučit, jelikož tam se nic jinýho neprobíra. Až ve třetim ročníku údajně C, ale jenom okrajově a navíc ho už celkem umim.

 
Odpovědět
22.10.2012 20:18
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:22.10.2012 20:28

Evidentně je to proto, že je s C# nejžádanější v praxi, proto se tyhle 2 jazyky všude učí a proto je učíme i my tady.

Odpovědět
22.10.2012 20:28
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):22.10.2012 20:46

Proti tomu nic nenamítam. Ale mam pocit že každej by se měl učit co mu vyhovuje a školství tohle moc nepodporuje, jelikož krom Javy a C# a možná někde ještě C nebo Pascalu se na školách nic jinýho neučí. Ne že by to zásadně vadilo, protože nejlíp se člověk stejně naučí programovat asi sám, ale ta podpora tam neni prostě :D

 
Odpovědět
22.10.2012 20:46
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:22.10.2012 20:52

Ono časem zjistíš, že je důležité se hlavně uplatnit/uživit. Člověk se učí sám úplně nejhůř, jen se naučí špatné postupy, měl by dostat ucelenou sadu znalostí od někoho, kdo tomu rozumí.

Odpovědět
22.10.2012 20:52
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):22.10.2012 21:07

Jistě je lepší když tě to někdo naučí nebo aspoň pomůže, problém je že na většině škol jsou neschopní učitelé, což je logický, protože někdo kdo vážně umí programovat nepude do školství. Jsou výjimky ale narazit na ni je o náhodě takže prostě nemůžeš počítat s tím že pudeš na školu zaměřenou na IT a tam se naučíš všechno a už vůbec ne že se to naučíš správně.
Uplatnit/uživit... někdo programuje jenom pro zábavu a živí se něčím jiným, znam člověka kterej je vystudovanej programátor ale živí se správou sítí a dělá cisco. Java a C# jsou sice hodně používaný a poptávka po lidech co v nich umí je velká, ale nejsou to jediný dva jazyky. C/C++,PHP,Del­phi,Python, to všechno sou jazyky kterýma se taky dá uživit. Spousta lidí více zasvěcených do tohohle problému tvrdí že za pár let bude programátorů C# a především Javy přebytek a nebudou mít kde pracovat, právě proto že se to učí všude. Osobně nemam dostatek informací abych na tohle měl názor...

 
Odpovědět
22.10.2012 21:07
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:22.10.2012 21:12

Ano ladím na OS od mikrosoftu, jsou to ale muka, všechno jede pomalu, už dávno bych měl daný Linux, jenže když jsem ho naposledy zkoušel dávat na ntb, zjistil jsem že nejdou přepínat grafiky, mám dvě jednu od intelu (hd 3000) a druhou od nvidie (gt555m).

 
Odpovědět
22.10.2012 21:12
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:22.10.2012 21:18

Mám jen jednu grafiku, tak to řešit nemusím. Pro nejméně bolestivý přechod je dobré Ubuntu. Doporučuji verzi 12.04 LTS.

Odpovědět
22.10.2012 21:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:22.10.2012 21:22

Spíše bych doporučil Kubuntu - mám s ním lepší zkušenosti. Nejvíc se mi ale líbí Solaris...

 
Odpovědět
22.10.2012 21:22
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:22.10.2012 21:26

Mně je to vcelku jedno, protože KDE, Gnome ani Unity nepoužívám. Zbytek je jednotný.

Odpovědět
22.10.2012 21:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Redaktor
Avatar
albertpatera:23.10.2012 17:05

to první se píše do třídy GObjekt?

 
Odpovědět
23.10.2012 17:05
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na albertpatera
Fugiczek:23.10.2012 19:28

ano, máš tam i napsané

public void GObject

verejne tridy maji stejny nazev jako soubor, vyjimka je jen u soukromych trid

 
Odpovědět
23.10.2012 19:28
Avatar
albertpatera
Redaktor
Avatar
albertpatera:23.10.2012 20:18

ok mohlo me to napadnout...vlastne me to napadlo hned, ale chtel sem se ujistit. :D

 
Odpovědět
23.10.2012 20:18
Avatar
minecraftgiesi:6.11.2012 18:03

Ahoj Fugiczek děkuji za tento tutorial díky tobě jsem se začal učit Javu a chtěl bych se zeptat jestli budeš ještě dělat tutorialy na různí hry,budu moc rád jestli ano.... :D

Odpovědět
6.11.2012 18:03
Milujte c#/xna :)
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na minecraftgiesi
Fugiczek:6.11.2012 18:20

No já moc nesdílím moje znalosti, většinou jsem k tomu donucen David Jančíkem :-D ale když vím že je o tom zájem tak klidně něco dalšího napíšu, tento článek taky vznikl na základě žádosti jednoho člena , jehož jméno si nepamatuji :-D Pokud by jsi měl nějakou představu na jakou hru by jsi chtěl mít návod tak napiš (ale něco reálného a ve 2D :-D), budu jen rád a bude to mít napsané dřív (do konce týdne určitě :-D).

 
Odpovědět
6.11.2012 18:20
Avatar
minecraftgiesi:6.11.2012 18:47

No máš pravdu něco reálného ale píšu zrovna tobě protože od málo koho pochopím jak něco v Javě dělat, přemíšlel jsem o hře pacman protože nemám předctavu jak by měl vypadat kód nějaké základní umělé inteligence nepřátel aby za hráčem chodili nebo apoň aby zmateně pobíhaly po hracím poly,vždiť víš.(ďekuji za odpověď). :D

Odpovědět
6.11.2012 18:47
Milujte c#/xna :)
Avatar
Drahomír Hanák
Redaktor
Avatar
Odpovídá na minecraftgiesi
Drahomír Hanák:6.11.2012 18:53

Na to se dá použít algoritmus Vlna http://www.itnetwork.cz/…y-v-bludisti Není to těžké udělat a myslím, že s tím článkem to celkem snadno zvládneš ;)

 
Odpovědět
6.11.2012 18:53
Avatar
minecraftgiesi:6.11.2012 18:59

Dekuju Drahoš8-)

Odpovědět
6.11.2012 18:59
Milujte c#/xna :)
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na minecraftgiesi
Fugiczek:6.11.2012 19:04

No zrovna o Pacmanovi jsem nedávno přemýšlel, chtěl jsem ho dělat se svým frameworkem a tak jak byl v originálu. Ale ok, napíšu nějakou zjednodušenou verzi pro tebe, aby to nebylo nějak extra složitý. :-)

 
Odpovědět
6.11.2012 19:04
Avatar
minecraftgiesi:6.11.2012 19:16

Děkuji Fugiczek jsi dobrý redaktor...(už mi neodpovídej). :O

Odpovědět
6.11.2012 19:16
Milujte c#/xna :)
Avatar
Tomas
Člen
Avatar
Tomas:11.2.2018 15:13

Nevíte někdo jak opravit chybu při nezobrazeném bonusu ? Jak celý horní řádek za titulkem smazat ?

 
Odpovědět
11.2.2018 15:13
Avatar
MICHAL ZAJAC
Člen
Avatar
MICHAL ZAJAC:3.4.2019 13:33

No vidim že tú píšu samí profíci. Ja mám otázku, metoda draw mi nejde, resp jej volanie z vnútra a aj @Override mi podčiarkuje ako chybu. Viete niekto prečo? importy mám. Dakujem

 
Odpovědět
3.4.2019 13:33
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 38 zpráv z 38.