Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java ja animaatio

jorre [13.03.2014 14:22:13]

#

Eli olen nyt pitkästä aikaa jatkanut javalla ohjelmointia ja päätin alkaa yirttämään opettelemaan graafisen käyttöliittymän tekemistä (erityisesti pelejä varten). Oppaana olen käyttänyt tätä sivua: http://zetcode.com/tutorials/javagamestutorial/

Nyt on kuitenkin sellainen ongelma etten saa animaatiota millään toimimaan, vaikken löydä mitään virhettä verrattuna ohjekoodiin (http://zetcode.com/tutorials/javagamestutorial/animation/ Thread-animaatio). Toivoisin että jos joku osaisi kertoa missä pulma piilee ja miten sen korjaisin.

package animaatioharjoitus;

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

public class Animaatioharjoitus extends JFrame{

    public Animaatioharjoitus(){
        add(new Paneeli());

        setTitle("animaatioharjoitus");

        pack();
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){

            @Override
            public void run(){
                JFrame ex=new Animaatioharjoitus();
                ex.setVisible(true);
            }

        });

    }
}

package animaatioharjoitus;

import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.geom.Line2D;

public class Paneeli extends JPanel implements Runnable{


    private Thread animator;

    private final int delay=25;

    private int nelionKulmax;
    private int nelionKulmay;
    private int vaihe;

    public Paneeli(){
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(300,300));
        setDoubleBuffered(true);

        vaihe=0;
        nelionKulmax=10;
        nelionKulmay=10;
    }

    @Override
    public void addNotify(){
        super.addNotify();

        animator=new Thread(this);
        animator.start();
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        piirraNelio(g);
    }

    public void liiku(){
        if(vaihe==0){
            liikuHaluttuSuunta(nelionKulmax, getSize().width-10, true);
        }else if(vaihe==1){
            liikuHaluttuSuunta(nelionKulmay, getSize().height-10, true);
        }else if(vaihe==2){
            liikuHaluttuSuunta(nelionKulmax, 10, false);
        }else{
            liikuHaluttuSuunta(nelionKulmay, 10, false);
        }
    }

    private void liikuHaluttuSuunta(int kasvava, int maksimi, boolean kasvaako){
        if(kasvaako){
            kasvava+=10;
            if(kasvava+10>maksimi){
                kasvataVaihetta();
            }
        }else{
            kasvava-=10;
            if(kasvava-10<maksimi){
                kasvataVaihetta();
            }
        }
    }

    private void kasvataVaihetta(){
        vaihe++;
        if(vaihe>3){
            vaihe=0;
        }
    }

    public void piirraNelio(Graphics g){
        Graphics2D grafiikka=(Graphics2D) g;

        Line2D janaYla=new Line2D.Double(nelionKulmax, nelionKulmay, getSize().width-10, nelionKulmay);
        Line2D janaAla=new Line2D.Double(nelionKulmax, getSize().height-10, getSize().width-10, getSize().height-10);
        Line2D janaVasen=new Line2D.Double(getSize().width-10, nelionKulmay, getSize().width-10,getSize().height-10);
        Line2D janaOikea=new Line2D.Double(nelionKulmax, nelionKulmay, nelionKulmax, getSize().height-10);

        grafiikka.draw(janaAla);
        grafiikka.draw(janaYla);
        grafiikka.draw(janaVasen);
        grafiikka.draw(janaOikea);

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

    @Override
    public void run() {
        long beforeTime, timeDiff, sleep;

        beforeTime = System.currentTimeMillis();

        while(true){

            liiku();
            repaint();

            timeDiff = System.currentTimeMillis() - beforeTime;
            sleep = delay - timeDiff;

            if (sleep < 0) {
                sleep = 2;
            }

            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                System.out.println("Interrupted: " + e.getMessage());
            }

            beforeTime = System.currentTimeMillis();
        }
    }
}

Tarkoituksena on tehdä neliö, joka ensiksi ohenee leveyssuunnassa oikealle, kunnes se muuttuu yhdeksi janaksi, sitten se kutistuu pisteeksi alakulmaan, sitten taas kasvaa suoraksi alas ja lopuksi palaa alkuperäiseen muotoonsa.

_Pete_ [14.03.2014 12:34:57]

#

Vika on siinä että

private void liikuHaluttuSuunta(int kasvava, int maksimi, boolean kasvaako)

metodiin välitetään luokkamuuttujien arvot, joita sitten muutetaan metodin sisällä. Itse muuttuneita arvoja ei kuitenkaan päivitetä takaisin luokkamuuttujiin eli ne pysyvät vaihe 1:ssä koko ajan samoina (10 ja 10).

Yksi tapa korjata on muuttaa näin:

public void liiku() {
    if (vaihe == 0) {
        nelionKulmax = liikuHaluttuSuunta(nelionKulmax, getSize().width - 10, true);
    } else if (vaihe == 1) {
        nelionKulmay = liikuHaluttuSuunta(nelionKulmay, getSize().height - 10, true);
    } else if (vaihe == 2) {
        nelionKulmax = liikuHaluttuSuunta(nelionKulmax, 10, false);
    } else {
        nelionKulmay = liikuHaluttuSuunta(nelionKulmay, 10, false);
    }
}

private int liikuHaluttuSuunta(int kasvava, int maksimi, boolean kasvaako) {
    if (kasvaako) {
        kasvava += 10;
        if (kasvava + 10 > maksimi) {
            kasvataVaihetta();
        }
    } else {
        kasvava -= 10;
        if (kasvava - 10 < maksimi) {
            kasvataVaihetta();
        }
    }
    return kasvava;
}

jorre [14.03.2014 17:43:58]

#

Kiitos, en tuota osannutkaan huomioida.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta