IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: SNAKE-pohyb těla a tělo

Aktivity
Avatar
petr
Člen
Avatar
petr:20.2.2020 19:22

Ahoj, :D potřeboval bych ještě poradit s tímto kódem. Nejde mi vytvořit nějaká metoda, která by vykreslovala několikrát tělo hada a zároveň aby se za ním hýbal(kopíroval souřadnice).

package hra11;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferStrategy;

public class MainClass2 extends Canvas implements Runnable {

    private boolean isRunning;
    private boolean isGameOver;
    private float score;
    private hrac hrac01;
    private Bonus bonus;
    private int i;
    private int bodysc;

    public MainClass2() {
        super();
        this.bodysc = 0;
        this.i = 26;
        this.bonus = new Bonus();
        this.hrac01 = new hrac();
        //this.addMouseMotionListener(this.hrac01);
        this.addKeyListener(this.hrac01);
        this.isGameOver = false;
        this.isRunning = false;
        this.score = 0;
        this.setSize(new Dimension(800, 600));

    }

    public void run() {

        long lastTimeCycle = System.nanoTime();
        long lastTimeOutput = System.currentTimeMillis();
        double unprocesedTicks = 0;
        double Nspertick = Math.pow(10, 9) / 60;
        int FPS = 0;
        int Ticks = 0;

        while (this.isRunning) {
            long nowTimeCycle = System.nanoTime();
            unprocesedTicks += (nowTimeCycle - lastTimeCycle) / Nspertick;
            lastTimeCycle = nowTimeCycle;

            while (unprocesedTicks >= 1) {
                Ticks++;
                unprocesedTicks--;
                this.update();

            }

            FPS++;

            this.render();

            if (System.currentTimeMillis() - lastTimeOutput > 1000) {
                lastTimeOutput += 1000;
                System.out.println("Ticks: " + Ticks + "," + "Fps: " + FPS);
                this.score += 0.5;
                FPS = 0;
                Ticks = 0;
                switch (hrac01.getWay()) {
                    case "right":
                        hrac01.moveRight();
                        break;
                    case "left":
                        hrac01.moveLeft();
                        break;
                    case "up":
                        hrac01.moveUp();
                        break;
                    case "down":
                        hrac01.moveDown();
                        break;
                }

            }
        }

    }

    public void update() {
        hrac01.update();

        Rectangle hracokraje = hrac01.getBounds();
        Rectangle bonusokraje = bonus.getBounds();
        if (hracokraje.intersects(bonusokraje)) {
            bonus.bonusplace();
            this.bodysc += 1;

        }
    }

    public void start() {
        this.isRunning = true;
        Thread t = new Thread(this);
        t.start();

    }

    private void render() {
        BufferStrategy buffer = this.getBufferStrategy();
        if (buffer == null) {
            this.createBufferStrategy(3);
            return;
        }
        Graphics g = buffer.getDrawGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());

        hrac01.render(g);
        bonus.render(g);

        g.setColor(Color.BLUE);
        g.drawString("Tvoje score: " + (int) this.score, 15, 15);

        g.drawString("Tvoje body: " + this.bodysc, 15, 25);

        g.dispose();
        buffer.show();
    }

}
package hra11;


import java.awt.event.KeyEvent;
import java.awt.Graphics;
import java.util.Random;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;


public class hrac implements KeyListener{


Random random = new Random();
   private int xpozice;
   private int ypozice;
   private int vyska;
   private int sirka;
   private Color color;


public hrac() {
        this.sirka = 20;
        this.vyska = 20;
        this.xpozice = 800/2 - this.sirka/2;
        this.ypozice = 600/2 - this.vyska/2;
        this.color = Color.BLUE;

    }

        public void update() {
        if (this.xpozice + this.sirka > 800){
          this.xpozice = 800 - this.sirka;

      }
       else if (this.xpozice < 0){
          this.xpozice = 0;

      }
       if (this.ypozice + this.vyska > 600){
           this.ypozice = 600 - this.vyska;

       }
       else if (this.ypozice < 0){
          this.ypozice = 0;

       }}



        /**
    public void mouseDragged(MouseEvent e) {
    this.mouseMoved(e);
    }


    public void mouseMoved(MouseEvent e) {
       this.xpozice = e.getX() - this.sirka / 2;
       this.ypozice = e.getY() - this.vyska/ 2;
    }

    */




    @Override
    public void keyTyped(KeyEvent e) {


    }

    @Override
    public void keyPressed(KeyEvent e) {
        int klavesa = e.getKeyCode();
        if (KeyEvent.VK_LEFT == klavesa){
                   this.xpozice -= 2;
        }
        if (KeyEvent.VK_RIGHT == klavesa){
                   this.xpozice += 2;
        }
        if (KeyEvent.VK_UP == klavesa){
                   this.ypozice -= 2;
        }
        if (KeyEvent.VK_DOWN == klavesa){
                   this.ypozice += 2;
        }



    }








            @Override
    public void keyReleased(KeyEvent e) {


    }

    public void render(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(this.xpozice, this.ypozice, this.sirka, this.vyska);
    }


    public Rectangle getBounds() {
        return new Rectangle (xpozice,ypozice,20,20);

          }


    }
package hra11;

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

public class Bonus{

    private Random rd;
    private int xb;
    private int yb;
    private int x;
    private int y;
    private final int sirka;
    private final int vyska;
    hrac hrac = new hrac();

    public Bonus(){
        this.sirka = this.vyska = 10;
        this.rd = new Random();
        this.xb = 800 - 5;
        this.yb = 600 - 5;
        this.bonusplace();
    }

    public void bonusplace(){
        this.x = rd.nextInt(xb);
        this.y = rd.nextInt(yb);

    }

    public void render(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(this.x, this.y, this.sirka, this.vyska);
    }

        public Rectangle getBounds() {
        return new Rectangle(this.x, this.y, this.sirka, this.vyska);
    }


}
public class Hra1 extends JFrame {

    private static final long serialVersionUID = 1L;

    public static final String Game_Title = "1. Hra";

    public static void main(String[] args) {
        Hra1 hra = new Hra1();

        hra.init();
    }

    private void init() {

        RenderLayer layer = new RenderLayer();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        this.add(layer);
        this.pack();
        this.setTitle(Hra1.Game_Title);
        this.setResizable(false);
        this.setVisible(true);

        layer.start();

    }
}

Zkusil jsem: Zkoušel jsem, vymýšlet metodu, pak i třídu která by to dělala, ale bugovalo se to.

Chci docílit: Zajímalo by mě, jak vymýšlíte programy/aplikace vy, jak postupujete ?

 
Odpovědět
20.2.2020 19:22
Avatar
Ziki
Tvůrce
Avatar
Ziki:22.2.2020 0:16

Nejspíš bych kreslení a pohyb (=simulaci v game dev slangu) necpal do jedný metody, tyhle věci by měly být oddělené. Ohledně psaní her tady pár článků je, tak bych zkusil zabrouzdat tady na stránkách

Nahoru Odpovědět
22.2.2020 0:16
Ve vědění je síla.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:5.3.2020 13:10

Koukám, že tady na tebe tentokrát všichni serem, co?:)
Dneska jak dojdu z práce, tak se ti na to podívám (pokud je to stále aktuální problém).

Nahoru Odpovědět
5.3.2020 13:10
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
Lubor Pešek
Člen
Avatar
Lubor Pešek:6.3.2020 7:40

Tak jsem se na to včera díval a přiznám se, že i přes úporné googlení jsem nezjistil, co je ta třída RenderLayer layer = new RenderLayer();
Odkazovalo mě to na renderování v grafických programech, ale pro Javu to moc nenašlo.

Kdes k tomu přišel? Můžeš mi o tom víc povědět?

Nahoru Odpovědět
6.3.2020 7:40
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
Lubor Pešek
Člen
Avatar
Odpovídá na Peter Mlich
Lubor Pešek:6.3.2020 15:31

Ano, přesně tohle jsem našel, ale odpověď, k čemu je to dobré nikde.
Jediná definice, která v podstatě říká, že je to prostředí pro 2D obrazce, které si v nějaké seqenci uchovává, tak je na dvou řádcích v tom třetím odkazu.

Ale zajímalo by mě, co to přináší víc, než obyčejný JPanel? Když se i dívám na poskytnuté metody, tak netuším, v čem by to mělo být jiné (právě naopak - vypadá to, jako osekaný swing).

Zkopírovat si syntaxi, aby to nějak fungovalo, tak to dokáže i člověk, který nikdy neprogramoval (viz profesoři na školách). Ale v čem je podstata tohoto renderování?

Nahoru Odpovědět
6.3.2020 15:31
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
petr
Člen
Avatar
petr:7.3.2020 21:20

Já se omlouvám, ta hlavní třída byla od jiného projektu :D, ve směs je to podobný, akorát to neodkazuje na RenderLayer (mnou vytvořenou třídu k jinému projektu) ale na mainClass2.

package hra11;

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

public class hra11 {

    private static final long serialVersionUID = 1L;
    private static String gametitle = "-Snake-";

    public static void main(String[] args) {

        hra11 hra = new hra11();

        hra.init();

    }

    private void init() {

        MainClass2 mc2 = new MainClass2();
        JFrame jframe = new JFrame();
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setLayout(new BorderLayout());
        jframe.add(mc2);
        jframe.setSize(800, 600);
        jframe.pack();
        jframe.setTitle(hra11.gametitle);
        jframe.setResizable(false);
        jframe.setVisible(true);
        // jframe.setFocusable(true);

        mc2.start();

    }
}
 
Nahoru Odpovědět
7.3.2020 21:20
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 7 zpráv z 7.