Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    2

    Creare omino che cammina

    Premetto che sono ignorantissimo, è il primo anno che studiamo java a scuola ma si va molto lentamente e ho fatto veramente poco per il momento. Da qualche settimana abbiamo iniziato la "grafica" in java, ovvero la creazione di qualche disegnino tipo una macchina o una palla, con l'ausilio del java.awt
    Abbiamo iniziato ad utilizzare anche i thread, così vorrei creare in java un omino che si muove con il loro ausilio, ma riesco a farne partire solo uno.
    Il mio progetto è composto da un file main, una classe contenente l'omino intero e la possibilità di farlo muovere, e altri quattro file rispettivamente per il braccio destro, quello sinistro, la gamba destra e la rispettiva sinistra.
    Ho creato, inizialmente, un file main con questo codice:
    import java.awt.*;
    public class Main
    {
    public static void main(String[] args)
    {
    Frame f = new Frame("Omino che cammina");
    f.setSize(800,500);
    f.setLocation(200,200);
    Uomo u = new Uomo();
    f.add(u);
    f.setVisible(true);
    Thread t = new Thread(u);
    t.start();
    }

    }
    Ed ecco la classe Uomo che contiene il disegno:
    import java.awt.*;
    public class Uomo extends Canvas implements Runnable
    {
    int i = 0;
    int y=0;
    public void paint(Graphics g)
    {
    // Colora la finestra di dimensioni 800*500 di bianco
    g.setColor(Color.white);
    g.fillRect(0,0,800,500);

    // Creazione dell'omino:

    g.setColor(Color.BLACK);
    g.drawOval(100+i,100,50,50); // Testa
    g.drawLine(125+i,150,125+i,170); // Collo
    g.drawRect(105+i,170,40,80); // Busto
    g.drawLine(105+i,170,80+i,250); // Braccio visuale sinistra
    g.drawLine(145+i,170,170+i,250); // Braccio visuale destra
    g.drawLine(110+i,250,100+i,330); // Gamba visuale sinistra
    g.drawLine(100+i,330,110+i,330); // Piede visuale sinistra
    g.drawLine(140+i,250,140+i,330); // Gamba visuale destra
    g.drawLine(140+i,330,150+i,330); // Piede visuale destra
    }

    public void run()
    {
    for(i=0;i<=715;i+=15)
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }


    }
    }
    Gli altri quattro file sono molto simili tra loro, ho preso solo la parte del corpo interessata per farla muovere:
    import java.awt.*;
    public class BraccioSinistro extends Canvas implements Runnable
    {
    int i = 0;

    public void paint(Graphics g)
    {
    // Colora la finestra di dimensioni 800*500 di bianco
    g.setColor(Color.white);
    g.fillRect(0,0,800,500);

    // Mobilità del braccio di sinistra:


    g.drawLine(1005,170,80+i,250); // Braccio visuale sinistra

    }

    public void run()
    {
    for(i=0;i<=100;i+=15)
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }
    }
    }
    Non avendo mai avuto davanti più thread a scuola ho provato con l'aggiungere al file main la seguente stringa ad esempio per far muovere il braccio sinistro:
    BraccioSinistro bs = new BraccioSinistro();
    f.add(bs);
    f.setVisible(true);
    Thread t1 = new Thread(bs);
    t1.start();
    Facendo partire il main funge solo il thread t e del t1 non v'è traccia, quasi sicuramente non era questo il procedimento corretto per avere più thread, dunque vi chiedo gentilmente di illuminarmi (rimanendo sempre ad un livello bassissimo perchè altrimenti non capirei ) e spiegarmi cosa devo fare per far muovere contemporaneamente l'omino orizzontalmente e le sue braccia/gambe.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Creare omino che cammina

    Originariamente inviato da mtt19
    spiegarmi cosa devo fare per far muovere contemporaneamente l'omino orizzontalmente e le sue braccia/gambe.
    Innanzitutto perché dovresti avere più canvas??
    Dovresti invece avere 1 solo canvas e dentro disegnarci l'omino tale per cui il movimento dell'omino in sé e i movimenti delle singole parti del corpo siano "coordinati" e fatti in "passi" man mano che la animazione viene eseguita.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    2

    Re: Re: Creare omino che cammina

    Originariamente inviato da andbin
    Innanzitutto perché dovresti avere più canvas??
    Dovresti invece avere 1 solo canvas e dentro disegnarci l'omino tale per cui il movimento dell'omino in sé e i movimenti delle singole parti del corpo siano "coordinati" e fatti in "passi" man mano che la animazione viene eseguita.
    Utilizzando un solo canvas e disegnandoci dentro l'omino sono riuscito a fare questo:
    import java.awt.*;
    public class Uomo extends Canvas implements Runnable
    {
    int i = 0;
    int ys=0; // Variabile per braccio sinistro
    int yd=0; // Variabile per braccio destro
    int zs=0; // Variabile per gamba sinistra
    int zd=0; // Variabile per gamba destra
    @Override
    public void paint(Graphics g)
    {
    // Colora la finestra di dimensioni 800*500 di bianco
    g.setColor(Color.white);
    g.fillRect(0,0,800,500);

    // Creazione dell'omino:

    g.setColor(Color.BLACK);
    g.drawOval(100+i,100,50,50); // Testa
    g.drawLine(125+i,150,125+i,170); // Collo
    g.drawRect(105+i,170,40,80); // Busto
    g.drawLine(105+i,170,80+i+ys,250); // Braccio visuale sinistra
    g.drawLine(145+i,170,170+i-yd,250); // Braccio visuale destra
    g.drawLine(110+i,250,100+i+zs,330); // Gamba visuale sinistra
    g.drawLine(100+i+zs,330,110+i+zs,330); // Piede visuale sinistra
    g.drawLine(140+i,250,140+i+zd,330); // Gamba visuale destra
    g.drawLine(140+i+zd,330,150+i+zd,330); // Piede visuale destra
    }

    public void run()
    {
    for(i=0;i<=715;i+=15) // Movimento generale di omino

    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }

    for(ys=0;ys<=20;ys+=5) // Movimento braccio sinistro
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }
    for(yd=20;yd>=0;yd-=5) // Movimento braccio sinistro
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }
    for(zs=0;zs<=10;zs+=3) // Movimento gamba sinistra
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }
    for(zd=0;zd<=10;zd+=3) // Movimento gamba destra
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }catch(Exception e)
    {
    System.out.println("Cattura Eccezione");
    }
    }
    }


    }
    }
    Il problema sta nei cicli for, effettua giustamente prima il movimento dell'omino intero, poi braccio sinistro, destro, gamba sinistra e gamba destra e così via, dando un bruttissimo senso di meccanico.
    Quello che invece intendevo realizzare era ben più "umano", mentre l'omino scivola dolcemente verso la destra muoveva i suoi arti, dunque contemporaneamente, ma non so come realizzarlo (o meglio, sono sicuro che debba usare i thread, ma come? )

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Creare omino che cammina

    Originariamente inviato da mtt19
    effettua giustamente prima il movimento dell'omino intero, poi braccio sinistro, destro, gamba sinistra e gamba destra e così via, dando un bruttissimo senso di meccanico.
    Quello che invece intendevo realizzare era ben più "umano", mentre l'omino scivola dolcemente verso la destra muoveva i suoi arti, dunque contemporaneamente, ma non so come realizzarlo (o meglio, sono sicuro che debba usare i thread, ma come? )
    Un thread a sé stante ovviamente sì, devi usarlo. La questione è nella logica di gestione dei movimenti. Ed è chiaro che non devi fare prima tutti i movimenti A, poi tutti i movimenti B, ecc... Perché non avrebbe senso.

    Ignoriamo per un momento la traslazione dell'omino in sé. Tra tutti i possibili movimenti delle parti del corpo quante "combinazioni" ci sono? Insomma ... puoi focalizzare bene quanti "frame" distinti ci sono dell'omino?
    Bene, stabilito questo, ad ogni ciclo "temporizzato" tu devi stabilire ogni quanto far avanzare il "frame" dell'omino (ogni ciclo, ogni 2 cicli, ecc...) e ogni quanto spostare l'omino (idem) e di quanti pixel.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.