Salve. E' possibile, dato un JPanel grafico (con paintComponent), sapere di che colore sia un determinato pixel? Se sì, come?
Salve. E' possibile, dato un JPanel grafico (con paintComponent), sapere di che colore sia un determinato pixel? Se sì, come?
Direttamente dal componente (o dal Graphics) non puoi ... non mi risulta. Potresti indirettamente sfruttando la classe Robot. Se hai le coordinate di un punto nel componente, relative al suo origin, puoi sicuramente ottenere le coordinate assolute nello schermo. E a quel punto potresti usare Robot.Originariamente inviato da Dreamer89
Salve. E' possibile, dato un JPanel grafico (con paintComponent), sapere di che colore sia un determinato pixel? Se sì, come?
Ma non mi sembra una soluzione "pulita". Secondo me fai prima a spiegare cosa devi fare di preciso e il perché di una tale necessità.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Vorrei ricreare il gioco di Pacman, e quindi sto cercando un sistema che mi consente di far fermare la pallina se incontra dei muri. Se il prossimo pixel su cui si sta muovendo la pallina, ha colore diverso dallo sfondo, vuol dire che c'è un muro e quindi stoppo l'avanzamento. Se potessi utilizzare quel sistema sarebbe tutto molto semplice, altrimenti sono costretto a salvarmi dei valori booleani in una matrice che indicano dove ci sono muri e dove no... ma questo richiederebbe troppo tempo. Ora do un'occhiata alla classe Robot![]()
Personalmente non mi sembra una buona soluzione. Perlomeno non andando a vedere i pixel tramite Robot.Originariamente inviato da Dreamer89
Vorrei ricreare il gioco di Pacman, e quindi sto cercando un sistema che mi consente di far fermare la pallina se incontra dei muri. Se il prossimo pixel su cui si sta muovendo la pallina, ha colore diverso dallo sfondo, vuol dire che c'è un muro e quindi stoppo l'avanzamento.
Però concettualmente potrebbe andare bene se ad esempio tu avessi fatto una immagine unica che rappresenta tutto il "campo" di gioco. In quel caso, avendo una immagine, andare a leggere un pixel è sicuramente più semplice e più "pulito".
Si potrebbe anche pensare di realizzare una immagine apposita con 2 soli colori (es. bianco/nero) che traccia le sole parti dove ci si può muovere. Così non avrebbe importanza come fai i bordi con che colori, forma ecc...
La soluzione migliore sarebbe proprio di quella di avere in memoria un "modello" che rappresenta il layout di gioco. Possibilmente gestito nel modo più efficiente e compatto possibile. Tu dici dei boolean ma ... la dimensione di un boolean dipende dalla JVM. Meglio sarebbe una matrice di bit gestita attraverso dei tipi 'int'.Originariamente inviato da Dreamer89
Se potessi utilizzare quel sistema sarebbe tutto molto semplice, altrimenti sono costretto a salvarmi dei valori booleani in una matrice che indicano dove ci sono muri e dove no... ma questo richiederebbe troppo tempo.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho provato la classe Robot in questo modo, ma quando lancio il programma, viene lanciata una NullPointerException... presumo che color sia null... ma allora perchè è sbagliato?
codice:import java.awt.Robot; import java.awt.Graphics; import java.awt.Color; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JOptionPane; public class TestRobot extends JPanel { private static Color color; private Robot robot; public void paintComponent (Graphics g) { super.paintComponent (g); try { robot = new Robot(); } catch (Exception e) { System.exit (1); } color = robot.getPixelColor (50, 50); } public static void main (String[] args) { TestRobot panel = new TestRobot(); JFrame frame = new JFrame ("Test Robot"); frame.setSize (640, 480); frame.setLocationRelativeTo (null); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.add (panel); frame.setVisible (true); JOptionPane.showMessageDialog (null, color.toString()); } }
Per questioni di tempistiche e comunque non sarebbe nemmeno il modo appropriato dal punto di vista del threading.Originariamente inviato da Dreamer89
Ho provato la classe Robot in questo modo, ma quando lancio il programma, viene lanciata una NullPointerException... presumo che color sia null... ma allora perchè è sbagliato?
Il fatto che hai messo il setVisible(true) prima di usare 'color' non vuol affatto dire che è certo che il paintComponent() sia già stato invocato!!
Insomma, è sbagliato l'uso di un campo static, è sbagliato il fatto che la impostazione di color avviene nel contesto del EDT (event dispatch thread) mentre l'uso è nel "main" thread (e non c'è alcuna sincronizzazione) e non è appropriato un System.exit() in un metodo come paintComponent.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Non credo di aver capito bene... cosa dovrei modificare? :master:Originariamente inviato da andbin
Per questioni di tempistiche e comunque non sarebbe nemmeno il modo appropriato dal punto di vista del threading.
Il fatto che hai messo il setVisible(true) prima di usare 'color' non vuol affatto dire che è certo che il paintComponent() sia già stato invocato!!
Insomma, è sbagliato l'uso di un campo static, è sbagliato il fatto che la impostazione di color avviene nel contesto del EDT (event dispatch thread) mentre l'uso è nel "main" thread (e non c'è alcuna sincronizzazione) e non è appropriato un System.exit() in un metodo come paintComponent.
Sono riuscito ad impostare bene il programma, ma il colore che mi ritorna, è diverso da quello che dovrebbe essere, e non riesco a capire il motivo... o_O
Giusto per chiarire: quelle che passi a getPixelColor sono coordinate sullo schermo, non relative al tuo componente o alla finestra che lo contiene. Se passi 50,50, esso è il pixel che sta all'offset 50,50 dall'angolo in alto a sinistra dello schermo.Originariamente inviato da Dreamer89
il colore che mi ritorna, è diverso da quello che dovrebbe essere, e non riesco a capire il motivo... o_O
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Originariamente inviato da andbin
Giusto per chiarire: quelle che passi a getPixelColor sono coordinate sullo schermo, non relative al tuo componente o alla finestra che lo contiene. Se passi 50,50, esso è il pixel che sta all'offset 50,50 dall'angolo in alto a sinistra dello schermo.
Grazie mille, ecco perchè i colori non coincidevano! Ma in che modo posso orientarmi bene sulla finestra del mio programma?