Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: [Java] Snake

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965

    [Java] Snake

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    
    public class Snake extends JFrame{
    Movim mov;
    
    public Snake(){
    super("Snake Snake - Sucuriju - Powered by Keratox");
    setBounds(200,200,500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pan = new JPanel();
    pan.add(mov);
    
    setContentPane(pan);
    }
    
    public static void main(String[] arg){
    Snake sn = new Snake();
    }
    
    }
    
    class Movim extends JPanel implements Runnable,KeyListener{
    Thread thr;
    Image imm;
    int x,y; 
    
    public Movim(){
    super();
    Movim mv = new Movim();
    mv.addKeyListener(this);
    Toolkit kit = Toolkit.getDefaultToolkit();
    //Ap for
    imm = kit.getImage("part.jpg");
    }
    
    public void keyPressed(KeyEvent ke){
    if(ke == KeyEvent.VK_LEFT){  
    left();
    }
    if(ke == KeyEvent.VK_RIGHT){ 
    right();
    }
    if(ke == KeyEvent.VK_UP){    
    up();
    }
    if(ke == KeyEvent.VK_DOWN){  
    down();
    }
    }
    
    public void keyReleased(KeyEvent ke2){}
    public void keyTyped(KeyEvent ke3){}
    
    
    public void run(){
    if(thr==null){
    thr=new Thread(this);
    thr.start();
    }
    }
    
    public void paintComponent(Graphics g){
    Graphics2D g2D = (Graphics2D)g;
    g2D.drawImage(imm, x, y, this);
    }
    
    public void down(){
    while(true){
    y++;
    repaint();
    if(y > 499){
    y=0;
    continue;
    }
    }
    }
    
    public void up(){
    while(true){
    y--;
    repaint();
    if(y < 1){
    y=500;
    continue;
    }
    }
    }
    
    public void left(){
    while(true){
    x--;
    repaint();
    if(x < 1){
    x=500;
    continue;
    }
    }
    }
    
    
    public void right(){
    while(true){
    x++;
    repaint();
    if(x > 499){
    x=0;
    continue;
    }
    }
    }
    
    }
    L'errore me lo da' in queste righe:
    if(ke == KeyEvent.VK_DOWN){ <--

    Operator == cannot be amplied to java.awt.event.KeyEvent,int

    come risolvo?


    grazie
    ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    92
    Credo tu debba usare il getKeyCode()

    ......
    if(ke.getKeyCode() == KeyEvent.VK_LEFT){
    left();
    ........

    Ciao.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    
    public class Snake extends JFrame{
    Movim mov;
    
    public Snake(){
    super("Snake Snake - Sucuriju - Powered by Keratox");
    setBounds(200,200,500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pan = new JPanel();
    mov = new Movim();
    pan.add(mov);
    setContentPane(pan);
    }
    
    
    public static void main(String[] arg){
    Snake sn = new Snake();
    }
    
    }
    
    //KeyListener
    
    class Movim extends JPanel implements Runnable,KeyListener{
    Thread thr;
    Image imm;
    int x,y; 
    
    public Movim(){
    super();
    Movim mv = new Movim();
    Snake snk = new Snake();
    snk.addKeyListener(this);
    Toolkit kit = Toolkit.getDefaultToolkit();
    imm = kit.getImage("part.jpg");
    }
    
    public void keyPressed(KeyEvent ke){
    Object tasto = ke.getSource();
    if(tasto == KeyEvent.VK_LEFT){  
    left();
    }
    if(tasto == KeyEvent.VK_RIGHT){ 
    right();
    }
    if(tasto == KeyEvent.VK_UP){    
    up();
    }
    if(tasto == KeyEvent.VK_DOWN){  
    down();
    }
    }
    
    public void keyReleased(KeyEvent ke2){}
    public void keyTyped(KeyEvent ke3){}
    
    public void run(){
    if(thr==null){
    thr=new Thread(this);
    thr.start();
    }
    }
    
    public void paintComponent(Graphics g){
    Graphics2D g2D = (Graphics2D)g;
    g2D.drawImage(imm, x, y, this);
    }
    
    public void down(){
    while(true){
    y++;
    repaint();
    if(y > 499){
    y=0;
    continue;
    }
    }
    }
    
    public void up(){
    while(true){
    y--;
    repaint();
    if(y < 1){
    y=500;
    continue;
    }
    }
    }
    
    public void left(){
    while(true){
    x--;
    repaint();
    if(x < 1){
    x=500;
    continue;
    }
    }
    }
    
    
    public void right(){
    while(true){
    x++;
    repaint();
    if(x > 499){
    x=0;
    continue;
    }
    }
    }
    
    }
    L'ho leggermente modificato così
    ma non va
    errore sempre qui:


    D:\Roby\Java>javac Snake.java
    Snake.java:44: operator == cannot be applied to java.lang.Object,int
    if(tasto == KeyEvent.VK_LEFT){
    ^
    Snake.java:47: operator == cannot be applied to java.lang.Object,int
    if(tasto == KeyEvent.VK_RIGHT){
    ^
    Snake.java:50: operator == cannot be applied to java.lang.Object,int
    if(tasto == KeyEvent.VK_UP){
    ^
    Snake.java:53: operator == cannot be applied to java.lang.Object,int
    if(tasto == KeyEvent.VK_DOWN){
    ^
    4 errors

  4. #4
    codice:
    Object tasto = ke.getSource();
    if(tasto == KeyEvent.VK_LEFT)
    KeyEvent.VK_LEFT è un final int , non puoi applicare l'operatore == a due tipi diversi , in questo caso Object e int .
    Ma puoi fare come ti è stato già detto

    if(ke.getKeyCode() == KeyEvent.VK_LEFT){
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Oppure aggiungere:
    codice:
    Integer tas = (Integer)ke.getSource();
    int tasto = tas.intValue();
    Più brutto, però...
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Grazie a tutti e 2!
    Ora pero' ho un altro quesima.

    Non mi parte il programma


    D:\Documenti\Roby\Programmi\Java>java Snake
    Exception in thread "main" java.lang.StackOverflowError



    Come risolvo?

    e aggiungo anche una domanda, come faccio a far si' che se si richiama il metodo down(), e poi successivamente up() il metodo down() smetta di continuare a scorrere?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Un errore di overflow capita di solito quando una funzione viene richiamata ricorsivamente fino ad esaurire lo stack. Controlla di non avere, per esempio, all'interno del costruttore, un'istruzione che crea un oggetto della stessa classe, oppure una funzione che esegue ricorsivamente molti calcoli su un array molto grande.

    Per la seconda domanda, dipende da come hai implementato i metodi up() e down(). Per esempio puoi utilizzare una variabile booleana che identifica il verso e fare una cosa del genere:
    codice:
    ...
    boolean verso = true; //TRUE = SU, FALSE = GIU
    ...
    public void up() {
       while (verso) {
          // fai quello che devi fare
       }
    }
    
    public void down() {
       while (!verso) {
          // fai quello che devi fare
       }
    }
    In questo modo i due metodi vengono eseguiti in modo mutuamente esclusivo (una variabile non può assumere più di un valore istantaneamente).

    Per quello che devi fare tu (stai parlando di Snake), credo che la soluzione migliore consista nell'usare un thread per gestire il moto del serpente.


    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Grazie per la risposta.

    Comunque ora non mi parte il programma.
    Noto che non avevo messo "show()" o "setVisible(true)". Li metto, pero' non mi visualizza l'applicazione.
    Why?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Potresti postare il codice? Ho visto che nel codice precedente c'erano 2 punti di errore di StackOverflow:

    1) Nel costruttore della classe Movim cercavi di creare un oggetto Movim

    2) Dopo aver cercato di costruire l'oggetto Movim cercavi di costruire un'oggetto di tipo Snake (che è colui che crea il primo oggetto Movim --> A cerca di creare B che per essere creato cerca di creare un oggetto A --> StackOverflow!)

    Ora non capisco se l'applicazione viene creata e non visualizzata o se va in errore. Se tu potessi postare il codice allo stato attuale, potrei cercare di capire cos'è che manca per la visualizzazione.


    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Alla fine di tutto, ora risulta così:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.*;
    
    public class Snake extends JFrame{
    Movim mov;
    
    public Snake(){
    super("Snake Snake - Sucuriju - Powered by Keratox");
    setBounds(200,200,500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pan = new JPanel();
    mov = new Movim();
    pan.add(mov);
    setContentPane(pan);
    show();
    }
    
    public static void main(String[] arg){
    try{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch(Exception exc){
    System.err.println("Exception error:" + exc.toString());
    }
    
    }
    
    }
    
    //KeyListener
    
    class Movim extends JPanel implements Runnable,KeyListener{
    Thread thr;
    Image imm;
    int x,y; 
    
    public Movim(){
    super();
    setBackground(Color.black);
    Movim mv = new Movim();
    Toolkit kit = Toolkit.getDefaultToolkit();
    imm = kit.getImage("part.jpg");
    }
    
    public void keyPressed(KeyEvent ke){
    Object tasto = ke.getSource();
    if(ke.getKeyCode() == KeyEvent.VK_LEFT){  
    left();
    }
    if(ke.getKeyCode() == KeyEvent.VK_RIGHT){ 
    right();
    }
    if(ke.getKeyCode() == KeyEvent.VK_UP){    
    up();
    }
    if(ke.getKeyCode() == KeyEvent.VK_DOWN){  
    down();
    }
    }
    
    public void keyReleased(KeyEvent ke2){}
    public void keyTyped(KeyEvent ke3){}
    
    public void run(){
    if(thr==null){
    thr=new Thread(this);
    thr.start();
    }
    }
    
    public void paintComponent(Graphics g){
    Graphics2D g2D = (Graphics2D)g;
    g2D.drawImage(imm, x, y, this);
    }
    
    public void down(){
    while(true){
    y++;
    repaint();
    if(y > 499){
    y=0;
    continue;
    }
    }
    }
    
    public void up(){
    while(true){
    y--;
    repaint();
    if(y < 1){
    y=500;
    continue;
    }
    }
    }
    
    public void left(){
    while(true){
    x--;
    repaint();
    if(x < 1){
    x=500;
    continue;
    }
    }
    }
    
    
    public void right(){
    while(true){
    x++;
    repaint();
    if(x > 499){
    x=0;
    continue;
    }
    }
    }
    
    }
    Per risolvere il progrema dell'Overflow semplicemente ho tolto l'istanziazione del main() che tanto non serviva.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.