Avatar
GunSpawn
Redaktor
Avatar
GunSpawn:

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:

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
Redaktor
Avatar
Odpovídá na GunSpawn
Hartrik:
RenderLayer layer = new RenderLayer();
layer.start();
 
Nahoru Odpovědět 28.1.2014 19:29
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Hartrik
GunSpawn:

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
Redaktor
Avatar
Odpovídá na MrPabloz
Hartrik:

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:

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:

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
Redaktor
Avatar
Odpovídá na MrPabloz
Hartrik:

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  +1 28.1.2014 19:55
Avatar
GunSpawn
Redaktor
Avatar
GunSpawn:

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
Redaktor
Avatar
GunSpawn:

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:

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
Redaktor
Avatar
Odpovídá na MrPabloz
GunSpawn:

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:

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
Redaktor
Avatar
Odpovídá na MrPabloz
GunSpawn:

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
Redaktor
Avatar
Odpovídá na GunSpawn
tomisoka:

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
Redaktor
Avatar
GunSpawn:

Ani omylem:(

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

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
Redaktor
Avatar
GunSpawn:

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
Redaktor
Avatar
Odpovídá na GunSpawn
tomisoka:

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:

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
Redaktor
Avatar
Odpovídá na MrPabloz
GunSpawn:

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.