Efeito matrix em um rodapé de um jframe

bom dia Gurjeiros Programadores!
trago uma dúvida do netbeans. para os que me criticam, saibam que não dou ouvidos.
muito bem mais minha dúvida esta no seguinte. ganhei um código do senhor tunai o código tem o que preciso, mais quando levo ele para o projeto ele fica todo cinza, só tenho 5 meses de netbeans é parco pra mim, por isso preciso de socorro urgente. desejo que o mesmo seja analizado e testado e me enviado de volta corrigido, caso Programadores de verdade desejem me ajudar enviem logo uma mensagem dizendo que sim. não sei o lugar exato onde inseri-lo inicialmente, aparece isto.

[code]/*

  • matrixadministracao.java
  • Created on 2 de Agosto de 2013, 06:29
    */

/**
*

  • @author Junior
    */
    public class matrixadministracao extends javax.swing.JFrame {

    /** Creates new form matrixadministracao */
    public matrixadministracao() {
    initComponents();
    }

    /** This method is called from within the constructor to

    • initialize the form.

    • WARNING: Do NOT modify this code. The content of this method is

    • always regenerated by the Form Editor.
      */
      @SuppressWarnings(“unchecked”)
      //
      private void initComponents() {

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGap(0, 400, Short.MAX_VALUE)
      );
      layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGap(0, 300, Short.MAX_VALUE)
      );

      pack();
      }//

    /**

    • @param args the command line arguments
      */
      public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
      new matrixadministracao().setVisible(true);
      }
      });
      }

    // Variables declaration - do not modify
    // End of variables declaration

}

Código

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

@SuppressWarnings(“serial”)
public class matrixRain extends JFrame {
private static final int FONT_SIZE = 20;
private static final int NUMBER_OF_REPEATS = 5;
private static final String TEXT = new String(“あ た
ア カ サ ザ ジ
ズ ゼ ゾ シ ス セ ソ キ ク ケ コ イ ウ エ オ ジャ な”);
private static JPanel panel = new JPanel(null);
private static Random random = new Random();
private static JLabel label[] = new JLabel[NUMBER_OF_REPEATS];

public matrixRain() {
this.add(panel);
panel.setBackground(Color.BLACK);
}
public void scroll() {
//array to hold x coordinates for the labels
int[] random_x = new int[NUMBER_OF_REPEATS];
//create an infinite loop
while (true) {
//initialise all the labels to random characters
for (int i = 0; i < NUMBER_OF_REPEATS; i++) {
int character_initial = random.nextInt(TEXT.length());
random_x[i] = random.nextInt(panel.getWidth() / FONT_SIZE) - 1;
label[i] = new JLabel("" + TEXT.charAt(character_initial));
panel.add(label[i]);
label[i].setFont(new Font(“monospaced”, Font.PLAIN, FONT_SIZE));
label[i].setForeground(new Color(0, 255, 0));
}
// change the text of the labels and their position
for (int j = 0; j < (panel.getHeight() / FONT_SIZE) * 2; j++) {
int character = random.nextInt(TEXT.length());
//move each character
for (int i = 0; i < NUMBER_OF_REPEATS; i++) {
label[i].setBounds(random_x[i] * FONT_SIZE, j * (FONT_SIZE / 2), FONT_SIZE, FONT_SIZE);
label[i].setText("" + TEXT.charAt(character));
label[i].setForeground(new Color(0, 255 - (j * 5), 0));
for (int k = 0; k < NUMBER_OF_REPEATS; k++) {
int character_initial = random.nextInt(TEXT.length());
random_x[k] = random.nextInt(panel.getWidth() / FONT_SIZE) - 1;
label[k] = new JLabel("" + TEXT.charAt(character_initial));
panel.add(label[k]);
label[k].setFont(new Font(“monospaced”, Font.PLAIN, FONT_SIZE));
label[k].setForeground(new Color(0, 255, 0));
Color colour = label[k].getForeground();
if (colour.getGreen() <= 80) {
panel.remove(label[k]);
k = (panel.getHeight() / FONT_SIZE) * 2;
}
}
}
// pause between each character
try {
Thread.sleep(15);
} catch (Exception e) {
}
}
}
}
public static void main(String[] args) {
matrixRain frame = new matrixRain();
frame.setVisible(true);
frame.setSize(600, 400);
frame.setResizable(false);
frame.setMinimumSize(new Dimension(300, 200));
frame.setLocationRelativeTo(null);
frame.setTitle(“Matrix Code Emulator by Ricco”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.scroll();
}
}[/code]

[i]Amigo oque vc queria fazer era bem simples não precisava de ajuda

Seu projeto esta muito legal, boa sorte.
[/i]

No ultimo tópico que vc criou já enviaram o jar, com o programa funcionando.

Eu até queria saber se as letras que aparecem na Matrix mesmo (no filme) são caracteres japoneses (katakana, que é um silabário) ou chineses (bopomofo, que é um alfabeto mas usado apenas para aprendizado em Taiwan). Isso porque bopomofo parece katakana à primeira vista.

Na verdade estou conferindo aqui em uma imagem e vi que são:

  • Digitos (0 - 9) espelhados;
  • Alguns caracteres katakana (metade está espelhada);
  • Alguns dígitos e katakanas sublinhados;
  • Alguns caracteres que só parecem japoneses e chineses mas não o são.

Preciso aprender como é que se desenha um caracter embaçado :slight_smile:

Acho q essas letras do matrix são tipo “licença poética”

Eu faria assim… pegaria cara caractere e faria 2 de cada separadamente. Um embaçado e outro não. No gimp mesmo.
Depois, eu jogaria pilhas deses caracteres escolhidos randomicamente pela tela.

Em codigo, acho que ficaria muito lento.
teria que pegar pixel por pixel, dentro da região máxima de um caractere, e mediria se é preto ou verde. Se for verde não faço nada, mas se for preto, mediria a distância desse pixel ao pixel verde (original) mais próximo. Conforme a distância for maior ou menor. pego o canal do verde e incremento conforme a aproximação e decremento conforme o afastamento.

Isse algoritimo exigiria o uso de traços de referencia originados a partir do ponto preto escolhido. Como o tamanho dos caracteres é pequeno, eu utilizaria uns 8 raios saindo desse ponto (como uma rosa dos ventos). esse número deve ser suficiente para dar uma qualidade boa ao efeito.

Bom, essas são minhas soluções. Com certeza deve existir algum algorítmo onde essa propriedade pode ser escolhida na seleção da fonte.

Olhando com mais atenção, só o fundo dele é embaçado - ou seja, pode-se desenhar um caracter, usar algum daqueles filtros para embaçar bastante e criar o fundo, e então desenhá-lo novamente. Não posso esquecer que algumas das letras ficam mudando de luminosidade à medida que vão caindo (preciso ver um vídeo para ver exatamente como é que é).

Eu acabei de pegar a tal imagem que postei e a “flipei” 180 graus (ou seja, inverti o espelhamento). De fato, há dígitos normais, invertidos e de ponta-cabeça, e os caracteres são só em katakana (alguns deles sublinhados - em japonês não se sublinha um caracter, mas sim põe-se uma linha ondulada ou então marca-se cada caracter individual com um ponto, ou dependendo do contexto, inscreve-se o caracter em um círculo. O motivo de não se sublinhar um caracter individualmente é que ele pode mudar de significado :slight_smile: - por exemplo, sublinhar o número 1 (que é um traço horizontal) vai produzir o número 2 (que são 2 traços horizontais).

Só uma curiosidade, o nome desse efeito é bloom. E ele é obtido através do seguinte algoritmo:

  1. Separa-se os pixels da imagem original com luminância superior a t (onde t geralmente é um valor entre 0.6 ou 0.9, dependendo do quão iluminada seja a cena);
  2. Aplica-se sobre a imagem de resultado o filtro de blur com kernels de tamanho 5, 7, 11, e 23. Caso a cena seja muito clara, pode-se optar por deixar só os dois últimos kernels.
  3. Soma-se todas as imagens obtidas em #2 com a imagem original.

Esse filtro é bem comum nos jogos. Há formas de faze-lo usando shaders, mas essas demora mais a explicar. Caso alguém tenha interesse, pode se matricular na pós de jogos onde dou aula. :slight_smile:

Nesse tópico tem um exemplo de um programa em Java que faço com os alunos com esse filtro: