Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java-animaatio

Sivun loppuun

Atomic [13.07.2017 11:27:43]

#

Aloitin itse java opiskelun kesäopintona ja kaikki muut tehtävät on mennyt hyvin ja tässä tehtävässä mulla meni ihan aivot solmuun. Pitäisi tehdä tälläinen tehtävä;

Tehtävä 1: Kuvat ja animaatio

Tee Java-ukosta animaatio käyttäen säiettä sekä MediaTracker-luokkaa. Aseta kuvat MediaTracker-olion seurantaan addImage-metodilla. Määrittele animaation nopeus säikeen keskeytysajalla.

Lataa kuvatiedosto zip -pakettina (10 gif-kuvaa).

Kuvat sijaitsevat tässä kansiossa eli samassa missä projektikin sijaitsee...C:\Users\Krista\Desktop\Java-programming\Jakso 7\JavaApplication55\build\classes\javaapplication55


En tiedä mikä mättää koodissani, yiritin tehdä sen oppimani mukaan ja ei ole ketään, joka auttaisi (opekaan ei vastaa kysymyksiin, koska heinäkuu on lomakuukausi). Luulen ehkä että getCodeBase kohdassa on joku vika tai kuvat sijaitsevat väärässä paikassa? Jos joku voisi auttaa niin olen todella kiitollinen 😁.

import java.applet.Applet;
import java.awt.*;

public class Animaatio extends Applet implements Runnable
{
    Image[]      imgArray = null;
    MediaTracker tracker  = null;
    int	current  = 0;
    Thread animThread=null;

    // Check for a mouse click, to start the images downloading
    @Override
    public void init()
    {
        if (tracker == null)
        {
            // Creating a new media tracker, to track loading images
            tracker = new MediaTracker(this);

            // Creating an array of ten images
            imgArray = new Image[10];

            // Downloading the images
            for (int i=0; i < 10; i++)
            {
                // Loading the images
          imgArray[0] = getImage( getCodeBase(),
                     (i+1) + "T1.gif");
                tracker.addImage(imgArray[0], 0);
          imgArray[1] = getImage( getCodeBase(),
                     (i+1) + "T2.gif");
                tracker.addImage(imgArray[1], 0);
          imgArray[2] = getImage( getCodeBase(),
                     (i+1) + "T3.gif");
                tracker.addImage(imgArray[2], 0);
          imgArray[3] = getImage( getCodeBase(),
                     (i+1) + "T4.gif");
                tracker.addImage(imgArray[3], 0);
          imgArray[4] = getImage( getCodeBase(),
                     (i+1) + "T5.gif");
                tracker.addImage(imgArray[4], 0);
          imgArray[5] = getImage( getCodeBase(),
                     (i+1) + "T6.gif");
                tracker.addImage(imgArray[5], 0);
          imgArray[6] = getImage( getCodeBase(),
                     (i+1) + "T7.gif");
                tracker.addImage(imgArray[6], 0);
          imgArray[7] = getImage( getCodeBase(),
                     (i+1) + "T8.gif");
                tracker.addImage(imgArray[7], 0);
          imgArray[8] = getImage( getCodeBase(),
                     (i+1) + "T9.gif");
                tracker.addImage(imgArray[8], 0);
          imgArray[9] = getImage( getCodeBase(),
                     (i+1) + "T10.gif");
                tracker.addImage(imgArray[9], 0);
            }

            // Start animation thread
            animThread = new Thread(this);
            animThread.start();
        }

try{

    animThread.join();

}catch (InterruptedException e){}
    }

    @Override
    public void update(Graphics g) {

        paint(g);
    }

    @Override
    public void paint (Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0,0, 200, 200);
        g.setColor(Color.black);

        // Check to see if images have started loading
        if (tracker == null)
        {
            g.drawString ("Click to start loading",20,20);
        }
        else
        // Check to see if images have loaded
        if (tracker.checkAll())
        {
            g.drawImage(imgArray[current++], 0, 0, this);

            if (current >= imgArray.length) current=0;
        }
        else
        // Still loading
        {
            g.drawString ("Images are loading...", 20,20);
        }
    }

    @Override
    public void run()
    {
        try
        {
            tracker.waitForAll();

            for (;;)
            {
                // Repainting the images
                repaint();

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

Grez [13.07.2017 11:58:40]

#

Ensimmäinen asia mikä ihmetytti on, että lataat kaikki kuvat 10 kertaan (yhteensä 100 latausta) ja koitat ladata kuvatiedostot 1T1.gif, 1T2.gif, 2T1.gif, 2T2.gif jne.

Atomic [13.07.2017 13:14:21]

#

Aijaa...okey, en oo tainnut sitten ihan ymmärtää miten tuo kohta sitten oikeasti tehdään:s. Viittitkö näyttää ihan korjaamalla tuota kohtaa...Olen nimittäin sellainen joka oppii esimerkin avulla ja sen jälkeen pystyn soveltamaan.=)
Onko mitään muuta vikaa siinä...

Grez [13.07.2017 14:27:00]

#

No minkä nimiset niitten tiedostojen pitäisi olla? Toisaalta jos olet tuon osannut itse kirjoittaa, niin luulisi että osaisit korjauksenkin tehdä itse... :o

Eli periaatteessa joko poista for-looppi latausten ympäriltä ja kultakin riviltä

(i+1) +

Tai sitten for-loopin sisälle laitat vain yhden latauksen tyyliin

imgArray[i] = getImage( getCodeBase(), "T" + (i+1) +".gif");

En sitten tiedä toimiiko tuo noinkaan, kun en jaksa alkaa javaympäristöä asentaa testatakseni, mutta ainakin yksi selkeä vika poistuisi.

Atomic [13.07.2017 14:59:36]

#

Tein tämän mukaan

imgArray[i] = getImage( getCodeBase(), "T" + (i+1) +".gif");

ja saan edelleen vastauksen "BUILD SUCCESSFUL (total time: 0 seconds)"? Eikä mitään ikkunaakaan avaud...?

Tiedostot ovat nimeltään T1,T2...T10 eli 10 gif kuvaa yhteensä ja latasin kuvat samaan kansioon kuin kyseisen projektinkin.

Mod. lisäsi kooditagit!

Metabolix [13.07.2017 17:49:11]

#

BUILD SUCCESSFUL on mielestäni ihan toivottava tulos: koodi on käännetty.

Ikkunan avautuminen ei selvästikään ole tuosta koodista kiinni. Mistä päättelit, että käännöksen jälkeen pitäisi avautua ikkuna? Oletko saanut mitään applettia (vaikka ihan tyhjää applettia) näkyville?

Atomic [13.07.2017 17:59:26]

#

En ole saanut...
Käytän myös Netbeans ohjelmaa.

Metabolix [13.07.2017 19:02:07]

#

Kannattanee lukea siinä tapauksessa NetBeansin ohje appletin tekemisestä ja testata ensin ohjeessa olevalla koodilla, että kaikki toimii.

Atomic [13.07.2017 19:26:46]

#

Tein ohjeiden mukaisesti ja se toimi, tein saman omalleni sain tyhjän applet viewer:in, joka jatkoi vain suorittamista...?En oikee ymmärrä onko kuvat jossain väärässä kansiossa vai....?

The Alchemist [13.07.2017 19:36:44]

#

Senhän saat selville, kun tulostat absoluuttisen polun, josta yrität kuvia lukea, ja tutkit että onko se oikein.

groovyb [14.07.2017 03:42:30]

#

Kääntäminen on eri asia kuin softasi käynnistäminen. oletko ajanut kääntämäsi paketin?

Atomic [14.07.2017 09:14:26]

#

En ole tainnut kääntää...(täytyy kattoo miten se tehdään sitten).Olin laittanut saman koodin yhteen toiseen paikkaan ja ne sano et mun run () metodi oli täysin hyödytön sekä join-metodi?

groovyb [14.07.2017 09:34:25]

#

Build tarkoittaa kääntämistä. lyhyesti, javan tapauksessa käännät koodeistasi jar paketin, joka käynnistetään kuin mikä tahansa sovellus koneellasi. Jotkut IDE:t (kuten NetBeans) sisältää myös ominaisuuden, jossa saman toiminnallisuuden takaa sekä käännetään että käynnistetään (Monessa on tätä varten erillinen play tai run painike)

Metabolix [14.07.2017 17:29:11]

#

Jos tulee esiin applet viewer, ilmeisesti koodi on käännetty ja ajettu. Suosittelen toimivan esimerkin muokkaamista pala kerrallaan, siis ensin vain tekstin näyttö, sitten vaikka yhden kuvan lataus ja piirto ja lopuksi vasta animaation yritys.

Atomic [15.07.2017 12:12:36]

#

Okei yritän tehdä uudelleen tuon, pieni kysymys vielä mikä on oikea paikka niille kuville, yritin kattoo netistä mikä kansio mut puhuttiin bin kansiosta ja sitä ei kyl löydy multa!onkoo tehny vahongos jotain et se on häippässyt vai se kyseinen kansio on eri nimellä?

Metabolix [15.07.2017 12:50:13]

#

Kuvien pitäisi olla luultavasti samassa paikassa kuin käännetyn koodin (eli tiedoston Animaatio.class). Asiahan selviää helpoiten, kun tulostat käyttämäsi polun (eli käytännössä getCodeBase()), kuten The Alchemist jo ehdotti.

Atomic [15.07.2017 20:27:06]

#

Kiitos neuvoista,yritän uudelleen ja katsotaan mitä tapahtuu

Atomic [16.07.2017 21:42:44]

#

Okey, kokeilin luoda yhden kuvan appletviewer:iin ja se toimi.
Ongelma kuitenkin syntyy animaatiossa. Appletviewer antaa lauseen applet started mutta mitään ei näy???Tartten apuu..nyyh...

import java.applet.Applet;
import java.awt.*;

public class Animaatio extends Applet implements Runnable
{
    Image images[] = null;
    MediaTracker tracker  = null;
    Thread animaatio;
    Graphics g;

    @Override
    public void init()
    {
            tracker = new MediaTracker(this);
            images = new Image[10];
            for (int i=0; i < 10; i++)
            {
          images[i] = getImage( getCodeBase(),"T" + (i+1) + ".gif");
                tracker.addImage(images[i],0);
            }
            try{

    tracker.waitForAll();

}catch (InterruptedException e){}
    }
    @Override
public void start() {
        if (animaatio == null) {
            animaatio = new Thread(this);
            animaatio.start();
      }
}

    public void paintComponent (Graphics g)
    {
       super.paintComponents(g);
       g.drawImage(images[10], 0, 0, this);
    }

    @Override
    public void run(){
        while(true){
            repaint();
            try{
                Thread.sleep(1000);
            }
            catch (InterruptedException e)	{}
        }
    }
}

TapaniS [17.07.2017 12:28:10]

#

En nyt kaikkea ymmärrä tuosta koodistasi (esim. mikä tuo @override on ja mitä se tekee), mutta pääohjelmassa voisi olla for-luuppi i=0-9 ja sieltä piirto kuva kerrallaan.

ja varmaan jotenkin tällain:

public void run(){
    for (int i=0; i < 10; i++){
        g.drawImage(images[i], 0, 0, this);
        repaint();
        try{
            Thread.sleep(1000);
        }
        catch (InterruptedException e)	{}
    }
}

Metabolix [17.07.2017 17:29:54]

#

Kuvat ovat taulukon kohdissa 0–9, joten selvästikään ei ole mahdollista piirtää kuvaa kohdasta 10. Kyseinen säie siis kaatuu siihen, ja sen jälkeen ohjelmassasi ei enää tapahdu mitään. Alkuperäisessä koodissasi olit jo ratkaissut tämän laskurimuuttujalla, eli kokeilepa sitä uudestaan.

TapaniS: Javassa ei piirretä noin silmukassa, vaan kysyjän repaint-tekniikka on sinänsä toimiva. @Override ilmoittaa, että metodin on tarkoitus korvata yliluokassa olevan metodin, ja kääntäjä varoittaa, jos näin ei olekaan (eli on vaikka kirjoitusvirhe metodin nimessä).

Atomic [17.07.2017 17:44:47]

#

Ongelma ratkesi, tein koodista tälläisen kiitos Metabolix:in. Nyt tuli uusi ongelma eli vanhat kuvat eivät lähde alta pois? Ne jää siihen...muistan että siihen taisi olla jonkinlainen keino millä ne sai pois mutta en nyt löydä sitä (ihakiva)...jos joku viittis neuvoo viel.

import java.applet.Applet;
import java.awt.*;

public class Animaatio extends Applet implements Runnable
{
    Image images[] = null;

    int currentImage = 0;
    Image imageCurrent;
    MediaTracker tracker  = null;
    Thread animaatio;
    Graphics g;

@Override
public void init()
    {
            images = new Image[10];
            for (int i=0; i < images.length; i++)
            {
          images[i] = getImage( getCodeBase(),"T" + (i+1) + ".gif");
          tracker = new MediaTracker(this);
          tracker.addImage(images[i],i);
            }
            try{

    tracker.waitForAll();

}catch (InterruptedException e){}
    }
    @Override
public void start() {
        if (animaatio == null) {
            animaatio = new Thread(this);
            animaatio.start();
      }
}

public void start(Graphics g)
      {
     g.drawImage(images[0],0,0, this );
     currentImage = 0;
      }

@Override
public void update(Graphics g) {
    g.drawImage( imageCurrent,0,0, this );
    }


@Override
public void run(){
int iPictureNumber[] = {0, 1, 2, 3,4,5,6,7,8,9,10};
       while( true )
    {
          for( int i = 0; i < iPictureNumber.length; i++ )
           {
         imageCurrent = images[iPictureNumber[i]];
         repaint();
       try
        {
         Thread.sleep( 400 );
            }
            catch (InterruptedException e){}
        }
    }
}}

Metabolix [17.07.2017 18:01:10]

#

Jälleen voit palata alkuperäiseen koodiisi, jossa aina piirtämisen aluksi piirretään pohjalle yksivärinen laatikko (fillRect).

Kannattanee myös lisätä run-metodin catch-lohkoon break-lause, jotta ohjelmasi on mahdollista keskeyttää.

Atomic [17.07.2017 19:24:09]

#

NO NYT TOIMII HYVIN! KIITOKSIA OIKEIN PALJON, todella arvostavaa tälläinen neuvominen.


Sivun alkuun

Vastaus

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

Tietoa sivustosta