4 Stimmen

Java-Fallmatrix-Code (wie der Film, Fortsetzung)

Ok, so gestern ich eine Frage in Bezug auf die Erstellung einer Java-Jframe, die die Matrix regen aus den Filmen, die ich genau wie dieses PHP-Beispiel sein wollen simuliert gebucht

http://mgccl.com/2007/03/30/simple-version-matrix-like-animated-dropping-character-effect-in-php

aber ich hätte gerne Hilfe bei zwei Dingen,

1. mehr als eine Säule auf einmal fällt und 2. dass die Zeichen hintereinander fallen

Dies ist mein bisheriger Code

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

@SuppressWarnings("serial")
public class MainFrame extends JFrame { 

private static final int FONT_SIZE = 20;
private static final int NUMBER_OF_REPEATS = 5;
private static final String TEXT = new String("0123456789/*-+/<>?;:[]~!@#$%^&*()+=abcdefghijklmnopqrstuvwxyz");
private static JPanel panel = new JPanel(null);
private static Random random = new Random();
private static JLabel label[] = new JLabel[NUMBER_OF_REPEATS];

public MainFrame() {        
    this.add(panel);
    panel.setBackground(Color.BLACK);
}

public void scroll() {
    for (int i = 0; i < NUMBER_OF_REPEATS; i++) {
        int character_initial = random.nextInt(TEXT.length());
        int random_x = random.nextInt(panel.getWidth() / FONT_SIZE) - 1;
        int colour = 255;
        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());
            label[i].setBounds(random_x*FONT_SIZE, j*(FONT_SIZE / 2), FONT_SIZE, FONT_SIZE);
            label[i].setText(""+TEXT.charAt(character));

            //if foreground colour < 255 catch exception
            try {
                //when text reaches a certain colour remove it
                label[i].setForeground(new Color(0, 255-(j*5), 0));
                colour = 255-(j*5);
                if (colour <= 80) {
                    panel.remove(label[i]);
                    repaint();
                    colour = 255;
                    j = (panel.getHeight() / FONT_SIZE)*2;
                }
            } catch (Exception e) {}

            //pause between each character
            try {
                Thread.sleep(75);
            } catch (Exception e) {}
        }

        //create an infinite loop
        if (i == NUMBER_OF_REPEATS - 1) {
            i = 0;
        }
    }
}

public static void main(String[] args) {
    MainFrame frame = new MainFrame();
    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();
}
}

0 Stimmen

.. Sehr geehrte....Wo ist Ihre Fragen .. ? Ich habe nicht verstanden, was Sie wollen...?

0 Stimmen

Sie kennen den "Matrix-Regen" aus den Filmen, das ist, was ich versuche, neu zu erstellen, aber wenn Sie den Code ausführen, den ich bisher geschrieben habe, fällt nur ein Zeichen auf einmal anstelle von vielen, und sie haben nicht die nachlaufende hinter Effekt vor dem Verschwinden. aber ich bin nicht sicher, wie man das tun, das ist, was ich etwas Hilfe benötigen.

0 Stimmen

Übrigens: Die Zeichen in der Matrix sind rückwärts gerichtete japanische Hirigana und Katakana.

5voto

javaDude Punkte 51
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();
  }
}

2voto

ran632 Punkte 1009

Main.java

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Main extends JPanel{
     public static void main(String[] args)
     {
         JFrame jf = new JFrame("Matrix raining code - by Ran Galili");
         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         jf.setSize(700,700);
         jf.setResizable(false);
         jf.add(new Drawing());
         jf.setVisible(true);
      }
}

Zeichnung.java:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Drawing extends JPanel{

    int FONTSIZE = 32, SCREENSIZE = 700;
    thread1[] thArr = new thread1[SCREENSIZE/FONTSIZE];
    Drawing(){
        for (int i = 0; i < thArr.length; i++) {
            thArr[i] = new thread1(i*FONTSIZE);
        }
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        g.fillRect(0, 0, SCREENSIZE, SCREENSIZE);
        g.setColor(Color.BLACK);
        Font font = new Font("Monospaced", Font.BOLD, FONTSIZE);
        g2.setFont(font);
        for (int i = 0; i < thArr.length; i++) {
            if(thArr[i].y > 700){
                thArr[i] = new thread1(i*FONTSIZE);
            }
            drawThread(g2,thArr[i]);
        }

        try{Thread.sleep(30);}catch(Exception ex){}

        repaint();
    }
    public void drawThread(Graphics2D g2, thread1 th){
        int fontsize = g2.getFont().getSize();
        for (int i = 0; i < th.len; i++) {
            if(th.randInt(0, th.len) == i)
                th.chArr[i][0] = th.randChar();
            if(i == th.len-1)
                g2.setColor(Color.WHITE);
            else
                g2.setColor(Color.GREEN);
            g2.drawChars(th.chArr[i] ,0 ,1 ,th.x , th.y + (i*fontsize));
        }
        th.y+=th.vel;
    }

    public class thread1{
        int vel, len, x, y, yBottom;
        char[][] chArr;

        thread1(int x){

            this.x = x;
            len = randInt(5,30);
            chArr = new char[len][1];
            chArr = populateArrWithChars(chArr);
            vel = randInt(1,5);
            this.y = (-1)*len*FONTSIZE;
        }
        public char[][] populateArrWithChars(char[][] arr){
            for (int i = 0; i < arr.length; i++) {
                arr[i][0] = randChar();
            }
            return arr;
        }
        public char randChar(){
            final String alphabet = "0123456789QWERTYUIOPASDFGHJKLZXCVBNM";
            final int N = alphabet.length();
            Random r = new Random();
            return alphabet.charAt(r.nextInt(N));
        }
        public int randInt(int min, int max) {
            Random rand = new Random();
            int randomNum = rand.nextInt((max - min) + 1) + min;
            return randomNum;
        }
    }
}

0 Stimmen

Bitte fügen Sie eine Erklärung hinzu. Die Vermittlung der zugrundeliegenden Logik ist wichtiger als die bloße Angabe des Codes, denn sie hilft dem Auftraggeber und anderen Lesern, dieses und ähnliche Probleme selbst zu lösen.

0voto

Landei Punkte 53286

Ich denke, Sie sollten einen eigenen Thread für jede Spalte Drop-Animation (natürlich müssen Sie darauf achten, invokeLater verwenden, um mit dem EDT zu synchronisieren) zu erstellen. Starten Sie einfach diese Threads in zufälligen Abständen (aber achten Sie darauf, dass Sie nicht zwei aktive Threads für eine Spalte haben)

0voto

dogbane Punkte 253146

Der Grund dafür, dass nicht alle Zeichen gleichzeitig auf dem Bildschirm zu sehen waren, lag darin, dass Sie ein Zeichen nach dem anderen erstellten, es ganz nach unten schoben und dann das nächste Zeichen erstellten. Stattdessen müssen Sie zuerst alle Zeichen initialisieren und dann gemeinsam nach unten verschieben. Ich habe Ihren Code entsprechend angepasst:

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));
                Color colour = label[i].getForeground();
                if (colour.getGreen() <= 80) {
                    panel.remove(label[i]);
                    j = (panel.getHeight() / FONT_SIZE) * 2;
                }
            }
            // pause between each character
            try {
                Thread.sleep(75);
            } catch (Exception e) {
            }
        }
    }
}

0voto

John F Punkte 1

Ich habe Processing importiert, was das Leben einfacher macht, lol.

import processing.core.*; 

public class Enter extends PApplet {

matrix[] red_pill = new matrix[300];
boolean exit = false;
boolean next = false;
int countDwn = 0;
int wait = 0;

public void setup() {
  //fullScreen(P3D);
  for (int index = 0; index < red_pill.length; index++)
  {
    red_pill[index] = new matrix();
  }
  wait = 500;
}
public void draw() {
  background(25, 25, 25);
  if (!exit) {
    startScreen();
    decision();
  } else{

  }
}
public void startScreen() {
  if (!next) {
    if (countDwn < wait) {
      for (int i = 0; i < red_pill.length; i++) {
        red_pill[i].show();
        red_pill[i].update();
        red_pill[i].tail();
      }
      countDwn++;
    } else {
      countDwn = 0;
      next = true;
    }
  }
}
public void decision() {
    if (next) {
    background(0, 0, 0);
    if (countDwn < wait) {
      for (int i = 0; i < red_pill.length; i++) {
        red_pill[i].show();
        red_pill[i].update();
        red_pill[i].tail();
      }
      countDwn++;
    } else {
      countDwn = 0;
      exit = true;
      next = false;
    }
  }
}
public class matrix {
   float x = 0;
   float y = 0;
   float s = 0;
   float speed = 1;
   char chr1 = '0';
   char chr2 = '0';
   char chr3 = '0';
   char chr4 = '0';
   char chr5 = '0';
   char chr6 = '0';
   int txtSize = 30;
   int count = 0;
   int frameR = 15;
   matrix() {
    x = random(-width, width);
    y = y + txtSize;
    s = random(2, 20);
    speed = s;
    chr1 = (char)random(33, 126);
    chr2 = (char)random(33, 126);
    chr3 = (char)random(33, 126);
    chr4 = (char)random(33, 126);
    chr5 = (char)random(33, 126);
    chr6 = (char)random(33, 126);
}
public void show() {
    fill(255,255,255,255);
    textSize(txtSize);
    text(chr1, x, y);
}
public void update() {

    if(y > displayHeight) {
      y = 0;
    } else {
      y = y + speed;
    }
  }
public void tail() {
    if(count >= frameR) {
      chr1 = (char)random(33, 126);
      chr2 = (char)random(33, 126);
      chr3 = (char)random(33, 126);
      chr4 = (char)random(33, 126);
      chr5 = (char)random(33, 126);
      chr6 = (char)random(33, 126);
      count = 0;
    } else {
      count++;
    }
    fill(0,255,0,150);
    text(chr2, x, y - txtSize);
    text(chr3, x, y - txtSize*2);
    fill(0,255,0,75);
    text(chr4, x, y - txtSize*3);
    text(chr5, x, y - txtSize*4);
    fill(0,255,0,25);
    text(chr6, x, y - txtSize*5);
  }
}
public void settings() {
    size(400, 600, P3D); 
  }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "Enter" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X