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í.
Avatar
GunSpawn
Tvůrce
Avatar
GunSpawn:28.1.2014 19:11

Potřebuju poradi jak v metodě main zavolat metodu run. Zkoušel jsem všechno možné, ale furt to nejde. Je to na měření FPS a updatů za sekundu.

*

import java.awt.Canvas;
import java.awt.Dimension;


public class RenderLayer extends Canvas implements Runnable
{
        private static final long serialVersionUID = 1L;
        private boolean isRunning;
        private boolean isGameOver;
        private int score;

        public RenderLayer()
        {
                super();
                this.isGameOver = false;
                this.isRunning = false;
                this.score = 0;
                this.setSize(new Dimension(800, 600));
        }
        public static void main(String[] args)
        {

        }

        @Override
        public void run()
        {
                long lastTimeCycle = System.nanoTime(); // je v ní určeno poslední proběhnutí herní smyčky while (this.isRunning)
                long lastTimeOutput = System.currentTimeMillis();
                double unprocessedTicks = 0; // pomocí lastTimeCycle určuje počet updatů hry za sekundu (60 za sekundu)
                double nsPerTick = Math.pow(10, 9) / 60; //určuje počet "tiků" za nanosekundu
                int FPS = 0;
                int ticks = 0;

                while (this.isRunning)
                {
                        long nowTimeCycle = System.nanoTime();
                        unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
                        lastTimeCycle = nowTimeCycle;
                }

                while (unprocessedTicks >= 1)
                {
                        ticks++;
                        unprocessedTicks--;
                }

                FPS++;

                if (System.currentTimeMillis() - lastTimeOutput > 1000)
                {
                        lastTimeOutput += 1000;
                        System.out.println("Ticks: " + ticks + " ,FPS: " + FPS);
                        FPS = 0;
                        ticks = 0;
                }
        }

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

*

Odpovědět
28.1.2014 19:11
Save early, save often, save everything, everywhere, everytime.
Avatar
MrPabloz
Člen
Avatar
MrPabloz:28.1.2014 19:28

Nemácháš náhodou runnable a thread dohromady ?;) Máš dva druhy vláken thread a runnable. jinak normálně vytvoř v mainu nový objekt a na tom to snad voláš ne? Nebo jak to myslíš že ti to nejde?

Nahoru Odpovědět
28.1.2014 19:28
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na GunSpawn
Hartrik:28.1.2014 19:29
RenderLayer layer = new RenderLayer();
layer.start();
 
Nahoru Odpovědět
28.1.2014 19:29
Avatar
GunSpawn
Tvůrce
Avatar
Odpovídá na Hartrik
GunSpawn:28.1.2014 19:31

ne to taky nejde, navíc je to tady

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


public class TutorialGame extends JFrame
{
        private static final long serialVersionUID = 1L;


        public static final String GAME_TITTLE = "Pohyb jednotky";

        public static void main(String[] args)
        {
                TutorialGame game = new TutorialGame();
                game.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(TutorialGame.GAME_TITTLE);
                this.setResizable(false);
                this.setVisible(true);

                layer.start();
        }

}
Nahoru Odpovědět
28.1.2014 19:31
Save early, save often, save everything, everywhere, everytime.
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na MrPabloz
Hartrik:28.1.2014 19:33

Vlákna máchá správně, viz http://docs.oracle.com/…/Thread.html

Otázkou je ten zbytek.

 
Nahoru Odpovědět
28.1.2014 19:33
Avatar
MrPabloz
Člen
Avatar
Odpovídá na GunSpawn
MrPabloz:28.1.2014 19:35

Objekt typu thread je sám o sobe vlákno, nebude ti volat tvůj run, protože není toho typu, a třída implementující runnable je dalsi druh vlákna, takže to je jako vlákno ve vlákně. Jsem na mobilu tak ti nenapíšu kód, ale skus se první naučit, jak se tvoří vlastní třídy jako vlákna:)

Nahoru Odpovědět
28.1.2014 19:35
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
Odpovídá na Hartrik
MrPabloz:28.1.2014 19:36

Nemacha už jen proto, ze asi těžko objekt typu thread v metodě start zná metodu run třídy renderlayer ;)

Nahoru Odpovědět
28.1.2014 19:36
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na MrPabloz
Hartrik:28.1.2014 19:55

Objekt typu Thread v metodě start zná metodu run třídy RenderLayer, jelikož je mu instance této třídy předána parametrem.

new Thread(this);

Runnable není jiný druh vlákna, je jen prostředkem k vytvoření Thread. Další způsob je z Thread dědit.

 
Nahoru Odpovědět
28.1.2014 19:55
Avatar
GunSpawn
Tvůrce
Avatar
GunSpawn:28.1.2014 20:04

To je pravda, ale jak mám zavolat tu metodu?

Nahoru Odpovědět
28.1.2014 20:04
Save early, save often, save everything, everywhere, everytime.
Avatar
GunSpawn
Tvůrce
Avatar
GunSpawn:28.1.2014 20:46

Poradí mi teda někdo?

Nahoru Odpovědět
28.1.2014 20:46
Save early, save often, save everything, everywhere, everytime.
Avatar
MrPabloz
Člen
Avatar
Odpovídá na Hartrik
MrPabloz:29.1.2014 8:52

Ano, moje chyba, nevšiml sem si toho řádku na mobilu.

Jinak skusil sem si s tím pohrát na pc, a zjistil sem jedno, máš špatně metodu run, proto ti nejede vlákno, ono se ti to jednou projede každý while a konec, takže sem ti to upravil a už z toho vlákno máš :)

public void run()
        {
            while (true) {

                long lastTimeCycle = System.nanoTime(); // je v ní určeno poslední proběhnutí herní smyčky while (this.isRunning)
                long lastTimeOutput = System.currentTimeMillis();
                double unprocessedTicks = 0; // pomocí lastTimeCycle určuje počet updatů hry za sekundu (60 za sekundu)
                double nsPerTick = Math.pow(10, 9) / 60; //určuje počet "tiků" za nanosekundu
                int FPS = 0;
                int ticks = 0;

                while (this.isRunning) {
                    long nowTimeCycle = System.nanoTime();
                    unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
                    lastTimeCycle = nowTimeCycle;
                }

                while (unprocessedTicks >= 1) {
                    ticks++;
                    unprocessedTicks--;
                }

                FPS++;

                if (System.currentTimeMillis() - lastTimeOutput > 1000) {
                    lastTimeOutput += 1000;
                    System.out.println("Ticks: " + ticks + " ,FPS: " + FPS);
                    FPS = 0;
                    ticks = 0;
                }
            }
        }
Nahoru Odpovědět
29.1.2014 8:52
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
GunSpawn
Tvůrce
Avatar
Odpovídá na MrPabloz
GunSpawn:29.1.2014 15:39

Díky, ale pořád nwm jak zavolat tu metodu.

Nahoru Odpovědět
29.1.2014 15:39
Save early, save often, save everything, everywhere, everytime.
Avatar
MrPabloz
Člen
Avatar
Odpovídá na GunSpawn
MrPabloz:29.1.2014 16:15

Když voláš na objekt typu thread metodu start, tak se zavolá jakby metoda run, tedy to jede, jenže tu je problem v tom, že nevím jak ti maj ty while cykly běžet, uprav si to tak, aby si v tom měl nekonečný cyklus, nemusíš to mít to celé, stačí jen ty výpočty, napsal sem to jen jako příklad. tedy tam můžeš mít něco takového např.

public void run()
        {


                long lastTimeCycle = System.nanoTime(); // je v ní určeno poslední proběhnutí herní smyčky while (this.isRunning)
                long lastTimeOutput = System.currentTimeMillis();
                double unprocessedTicks = 0; // pomocí lastTimeCycle určuje počet updatů hry za sekundu (60 za sekundu)
                double nsPerTick = Math.pow(10, 9) / 60; //určuje počet "tiků" za nanosekundu
                int FPS = 0;
                int ticks = 0;
                while (true) {
                while (this.isRunning) {
                    long nowTimeCycle = System.nanoTime();
                    unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
                    lastTimeCycle = nowTimeCycle;
                }

                while (unprocessedTicks >= 1) {
                    ticks++;
                    unprocessedTicks--;
                }

                FPS++;

                if (System.currentTimeMillis() - lastTimeOutput > 1000) {
                    lastTimeOutput += 1000;
                    System.out.println("Ticks: " + ticks + " ,FPS: " + FPS);
                    FPS = 0;
                    ticks = 0;
                }
            }
        }

nebo jinde ten nekonečný cyklus :) ale hlavní je to, že musí aspon jeden být nekonečný, tím se ti jakby vytvoří to vlákno :)

Nahoru Odpovědět
29.1.2014 16:15
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
GunSpawn
Tvůrce
Avatar
Odpovídá na MrPabloz
GunSpawn:29.1.2014 18:52

Už to mám. Ono se to přes tenhle cyklus ani nedostane.

while (this.isRunning)
            {
                long nowTimeCycle = System.nanoTime();
                unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
                lastTimeCycle = nowTimeCycle;
            }

ZAtím nwm, jak to spravit, ale snad mě něco rozumnýho napadne. Když něco vás, tak napište, ať mi to netrvá tak dlouho.

Nahoru Odpovědět
29.1.2014 18:52
Save early, save often, save everything, everywhere, everytime.
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na GunSpawn
tomisoka:29.1.2014 19:48

Melo by stacit toto:

while (this.isRunning) {
long nowTimeCycle = System.nanoTime();
unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
 lastTimeCycle = nowTimeCycle;
while (unprocessedTicks >= 1) { ticks++;
 unprocessedTicks--;
} FPS++;
 if (System.currentTimeMillis() - lastTimeOutput > 1000) { lastTimeOutput += 1000;
 System.out.println("Ticks: " + ticks + " ,FPS: " + FPS);
FPS = 0;
 ticks = 0;
 }
 }

Pokud tam neni dalsi chyba

Editováno 29.1.2014 19:52
 
Nahoru Odpovědět
29.1.2014 19:48
Avatar
GunSpawn
Tvůrce
Avatar
GunSpawn:29.1.2014 19:54

Ani omylem:(

Nahoru Odpovědět
29.1.2014 19:54
Save early, save often, save everything, everywhere, everytime.
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na GunSpawn
tomisoka:29.1.2014 20:00

A jeste toto:

unprocessedTicks += nowTimeCycle - lastTimeCycle;
  lastTimeCycle = nowTimeCycle;
 while (unprocessedTicks / nsPerTick >= 1) { ticks++;
  unprocessedTicks--;
 }

Edit : To ne spatne jsem cetl

Editováno 29.1.2014 20:05
 
Nahoru Odpovědět
29.1.2014 20:00
Avatar
GunSpawn
Tvůrce
Avatar
GunSpawn:29.1.2014 20:05

Spoj to nějak dohromady, to je strašnej guláš.

Nahoru Odpovědět
29.1.2014 20:05
Save early, save often, save everything, everywhere, everytime.
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na GunSpawn
tomisoka:29.1.2014 21:00

Myslis takto?

public void run()
        {
                isRunning = true;
                long lastTimeCycle = System.nanoTime();
                long lastTimeOutput = System.currentTimeMillis();
                double unprocessedTicks = 0;
                double nsPerTick = Math.pow(10, 9) / 60;
                int FPS = 0;
                int ticks = 0;

                while (isRunning)
                {
                        long nowTimeCycle = System.nanoTime();
                        unprocessedTicks += (nowTimeCycle - lastTimeCycle) / nsPerTick;
                        lastTimeCycle = nowTimeCycle;

                        while (unprocessedTicks >= 1)
                                {
                                  ticks++;
                                  unprocessedTicks--;
                                }

                                FPS++;

                if (System.currentTimeMillis() - lastTimeOutput > 1000)
                {
                        lastTimeOutput += 1000;
                        System.out.println("Ticks: " + ticks + " ,FPS: " + FPS);
                        FPS = 0;
                        ticks = 0;
                }
                }
        }
Editováno 29.1.2014 21:03
 
Nahoru Odpovědět
29.1.2014 21:00
Avatar
MrPabloz
Člen
Avatar
Odpovídá na GunSpawn
MrPabloz:29.1.2014 21:01

Co tak dat proměnou isrunning na True ?:D

Nahoru Odpovědět
29.1.2014 21:01
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
GunSpawn
Tvůrce
Avatar
Odpovídá na MrPabloz
GunSpawn:30.1.2014 15:38

Už jsem to opravil, funguje to. Díky všem za snahu.

Nahoru Odpovědět
30.1.2014 15:38
Save early, save often, save everything, everywhere, everytime.
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 21 zpráv z 21.