Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    CIAO A TUTTI!!

    Ho un problema non da poco... Sto cercando di mettere in funzione un gioco mongolo per ora ma che poi devo far diventare Snake. sono riuscito a far andare il controllo del movimento dei tasti, mi crea quella che poi sarà la parte del corpo che guida tutto il serpente ecc... ec...
    L'unico problema è che mi va in errore durante l'esecuzione, probabilmente dentro il metodo run() c'è della gran roba che lo rende troppo pesante... Infatti come errore dice che è stackoverflow poi una marea di altri errori che non finisco mai.

    Vi scrivo il codice il quale per il momento crea solo un quadrato e, se non desse errori, dovrebbe farlo muovere in continuazione nel senso del tasto che premo.

    Mi sono posto anche un altro problema: non è che devo fare due thread diversi che fanno cose diverse (non so se si possa fare quindi non ho nemmeno cominciato a distruggere tutti il codice) , uno che controlla il tasto premuto e basta e uno che fa muovere nel senso del tasto e basta?? mi sembra che però la cos non si possa dividere...

    vabbè! metto il codice e spero che voi sappiate + di me in questo campo

    grazie

    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;

    public class Snake2 {
    Movim mov;
    JPanel pan;
    JFrame F;

    public Snake2(){
    F=new JFrame("Snake");
    F.setBounds(200,200,500,500);
    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Movim mov = new Movim();
    F.setBackground(Color.white);
    mov.setFocusable(true);
    F.add(mov);
    F.setVisible(true);
    Thread Runner=new Thread(mov);
    Runner.start();
    F.setVisible(true);
    F.show();

    }

    public static void main(String[] arg){
    Snake2 sn = new Snake2();

    }

    }


    class Movim extends JPanel implements Runnable{
    int x=100;
    int y=100;



    public void run(){
    while(true){//pausa();
    addKeyListener
    (
    new KeyAdapter()
    {
    public void keyTyped(KeyEvent ke){
    while(ke.getKeyCode() == KeyEvent.VK_LEFT){

    x--;
    repaint();

    }
    while(ke.getKeyCode() == KeyEvent.VK_RIGHT){

    x++;
    repaint();

    }
    while(ke.getKeyCode() == KeyEvent.VK_UP){

    y++;
    repaint();

    }
    while(ke.getKeyCode() == KeyEvent.VK_DOWN){

    y--;
    repaint();

    }
    repaint();
    }
    }
    );
    }
    }
    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);

    g.fillRect(x,y,60,60);
    }
    public void pausa(){
    try{Thread.sleep(50);}
    catch(InterruptedException ite){System.out.println("Eccezione: " + ite.toString());}
    }


    }


    Se copiando il codice nel compilatore vedere errori ditemelo, come lo ho io salvato non ce ne sono, magari ho fatto male il copia e incolla.

    sono molto graditi suggerimenti su come farlo in modo + snello e dinamico

    ciao ciao e ancora grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lade92
    sono molto graditi suggerimenti su come farlo in modo + snello e dinamico
    Il tuo codice non ha granché senso .....

    Fai un ciclo tecnicamente "infinito" (while(true)) in cui registri il KeyListener. Ne consegue che registri il listener una .... infinità di volte!!! E siccome la lista dei listener si allunga continuamente, dopo un po', beh il programma andrà in OutOfMemoryError.

    I listener si registrano 1 volta sola!
    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
    Jun 2009
    Messaggi
    6
    me lo immaginavo... il problema è che se faccio con if ed else if va male anche in quel modo... una volta sono riuscito a farlo andare in un modo + o - decente, molto lontano da come volevo ma dava buona speranza
    era con pausa() all'inizio del metodo run()...
    cmq secondo me se io mettessi con if e else if non avrebbe motivo per non funzionare... voglio dire! ho fatto un programma che legge i tasti e lo muove ma non di continuo, ne ho fatto uno che lo muove di continuo senza leggere dove voglio farlo andare e non riesco a mettere insieme le due cose??

    se vuoi ti passo il codice degli altri 2

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    La registrazione del listener falla 1 volta sola ... l'ho detto prima. Falla ad esempio nella fase di inizializzazione che hai nel costruttore.
    E ora che ho guardato con più attenzione il tuo codice, quei:

    while(ke.getKeyCode() == KeyEvent.xxxxx){

    non vanno bene!!!

    P.S. Guarda tra i miei Java Examples, sezione Graphics l'esempio ArrowMove.java
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Potresti modificarmi il codice perchè sto facendo una marea di prove ma non riesco a fare niente!
    Il tuo esempio è diversissimo da quello che ho impostato io e non mi riesco a trovare per fare una cosa nel mio.
    da quanto ho capito devo mettere

    addKeyListener
    (
    new KeyAdapter()
    {
    public void keyTyped(KeyEvent ke){
    if(ke.getKeyCode() == KeyEvent.VK_LEFT){

    x--;

    }
    else if(ke.getKeyCode() == KeyEvent.VK_RIGHT){

    x++;

    }
    else if(ke.getKeyCode() == KeyEvent.VK_UP){

    y++;

    }
    else if(ke.getKeyCode() == KeyEvent.VK_DOWN){

    y--;

    }
    repaint();
    }
    }
    );

    nel costruttore Snake2, solo che se lo faccio non mi modifica più niente e non mi servirebbe neanche avere l'altra classe...

    boh no nci capisco niente! spero nel tuo aiuto ciao ciao

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lade92
    Il tuo esempio è diversissimo da quello che ho impostato io
    Concettualmente non è molto diverso .... ma se non hai compreso la cosa a livello generale/concettuale, non comprendi né il mio esempio né cosa dovresti fare tu ....

    Originariamente inviato da lade92
    public void keyTyped(KeyEvent ke){
    if(ke.getKeyCode() == KeyEvent.VK_LEFT){
    Probabilmente ti è sfuggita una cosa: il keyTyped() non fornisce un "key code" (VK_xxxx). Viene invocato solo se il tasto premuto è "traslabile" in un carattere (char). Quindi in questo contesto getKeyCode() è sempre 0 (VK_UNDEFINED).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Sono a un passo dal riuscire nel mio intento!!! devo solo farli sentire i tasti... per il resto, se metto true in una variabile come ad esempio "sinistra" funziona!

    non so come fare i richiami in modo che funzioni tutto, le cose da modificare sono dentro creaFinestra(), mi chiama bene i metodi secondo me ma non funziona quello della lettura tasti. metti tutto il codice, deve esserci un problema sicuramente in quella parte

    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;

    public class Snake3{
    public Movim mov;
    public Ascolta ascoltato;
    public JPanel pan;
    public JFrame F;
    public int x=100;
    public int y=100;

    public boolean sinistra=false;
    public boolean destra=false;
    public boolean su=false;
    public boolean giu=false;

    public Snake3()
    {
    super();
    creaFinestra();

    }

    private void creaFinestra()
    {
    F=new JFrame("Snake");
    F.setBounds(200,200,500,500);
    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    F.setBackground(Color.white);
    Movim mov = new Movim();
    mov.setFocusable(true);
    F.add(mov);
    Ascolta ascoltato=new Ascolta();
    F.addKeyListener(ascoltato);
    F.setVisible(true);
    Thread Runner=new Thread(mov);
    Runner.start();
    F.setVisible(true);
    F.show();

    }

    /*public boolean keyDown(Event e, int key)
    {
    if ((key == Event.LEFT) &&(!destra)){sinistra = true; su = false; giu = false;}
    if ((key == Event.RIGHT) && (!sinistra)){destra = true; su = false; giu = false;}
    if ((key == Event.UP) && (!su)){ su = true; destra = false; sinistra = false;}
    if ((key == Event.DOWN) && (!giu)){giu = true; destra = false; sinistra = false;}
    return true;
    }*/

    private class Ascolta implements KeyListener
    {
    public void keyPressed(KeyEvent ke)
    {
    if(ke.getKeyCode() == KeyEvent.VK_LEFT){
    sinistra=true;
    destra=false;
    su=false;
    giu=false;
    }
    if(ke.getKeyCode() == KeyEvent.VK_RIGHT){
    sinistra=false;
    destra=true;
    su=false;
    giu=false;
    }
    if(ke.getKeyCode() == KeyEvent.VK_UP){
    sinistra=false;
    destra=false;
    su=true;
    giu=false;
    }
    if(ke.getKeyCode() == KeyEvent.VK_DOWN){
    sinistra=false;
    destra=false;
    su=false;
    giu=true;
    }
    }
    public void keyReleased(KeyEvent ke2){}
    public void keyTyped(KeyEvent ke3){}
    }


    private class Movim extends JPanel implements Runnable{


    public void run(){
    while(true){

    if(sinistra){x-=10;}
    if(destra){x+=10;}
    if(su){y+=10;}
    if(giu){y-=10;}
    repaint();
    pausa();
    }
    }

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

    g.fillRect(x,y,60,60);
    }

    public void pausa(){
    try{Thread.sleep(50);}
    catch(InterruptedException ite){System.out.println("Eccezione: " + ite.toString());}
    }

    }

    public static void main(String[] arg)
    {
    new Snake3();
    }
    }


    non so bene come usare e a cosa serva in particolare addKeyListener ma presumo che come lo ho usato non vada bene altrimenti leggerebbe i tasti..
    ciao ciao

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lade92
    non so bene come usare e a cosa serva in particolare addKeyListener ma presumo che come lo ho usato non vada bene altrimenti leggerebbe i tasti..
    Innanzitutto lo vedo abbastanza superfluo usare ben 4 variabili booleane per indicare le 4 direzioni. Basterebbe un semplice int con 4 valori (hai visto il mio esempio??).

    Comunque il problema è che il KeyListener lo devi registrare sul tuo pannello Movim ... non sul JFrame!!!

    E inoltre hai invertito il su/giù. Nota che le coordinate (0,0) di un componente sono nell'angolo in alto a sinistra e la Y si incrementa andando in giù, non in su.

    E infine, il metodo show() è deprecato ovvero non dovrebbe più essere usato. Usa setVisible(true).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Grazie mille ora va! cmq avevo appena messo sul pannello mov perchè ho guardato degli esempi e la cosa mi pareva fatta diersa dalla mia... bene bene .... ora devo fare tutto l'altra parte per farlo apparire un po' di + Snake e non un quadrato che si muove e basta... ci sentiamo di nuovo perchè tanto dei problemi li avrò ancora... Grazie 10000

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Cosa numero 1: perchè ti sei attaccato ad una discussione (del 2008!) che non ha nulla a che vedere con il tuo problema? La prossima volta apri una tua discussione.

    Cosa numero 2: il codice va obbligatoriamente postato all'interno degli appositi tag CODE, per mantenerne indentazione e leggibilità.


    Ho diviso la discussione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.