Animation in Java

Yetkin

Grünschnabel
Hallo!

Wie man sicher aus dem Betreff entnehmen kann, vesuche ich in JAVA eine AnimationProgramm zu schreiben . Ich habe in Jbuilder9 eine Benutzeroberfläche designed .Aus einem gewählten Button möchte ich in einem neu Fenster diese Animationen anzeigen lassen und die Animation durch eine Steuerungsfenster oder durch eine Menü-Leiste steuern,die Animation muss entweder Schrittweise( betätigung eine Button )oder Automatisch laufen können.Ich habe für die Animation ca. 200Bilder (.gif) auf meine festplatte
die muss ich in nacheinander rufen können

Ich habe ganz wenige Progammierung erfahrung in Java ,vondaher würde ich Sie gerne um Rat fragen

Ich werde sehr Dankbar für jeden Antwort

gruss
 
Hallo!

Hier nochmal ein kleines Beispiel dazu:
Code:
/*
 * Created on 06.02.2005@14:00:31
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 * @author Administrator
 * 
 * TODO Explain me
 */
public class TilesTest extends JFrame {

    int screenWidth, screenHeight;

    final int TILE_WIDTH = 52;

    final int TILE_HEIGHT = TILE_WIDTH;

    int tilePosX;

    int tilePosY;

    final int TILE_COLUMN_CNT = 4;

    final int TILE_ROW_CNT = 5;

    int[] frames = { 0, 4, 8, 12, 16, 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7,
            11, 15, 19 };

    VolatileImage[] tiles;

    BufferStrategy strategy;

    private Thread renderer = new Thread() {
        public void run() {

            System.out.println(tiles.length);
            int i = 0;
            while (true) {
                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.clipRect(0, 0, screenWidth, screenHeight);
                g.drawImage(tiles[frames[i]], tilePosX, tilePosY,
                        TilesTest.this);
                i++;
                i %= frames.length;
                g.dispose();
                strategy.show();
                try {
                    Thread.sleep(100L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    public TilesTest() {
        super("TilesTest");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        screenWidth = 160;
        screenHeight = 120;

        tilePosX = (screenWidth - TILE_WIDTH) / 2;
        tilePosY = (screenHeight - TILE_HEIGHT) / 2;
        setSize(screenWidth, screenHeight);
        setResizable(false);
        setVisible(true);
        initGFX();
        createBufferStrategy(2);
        strategy = getBufferStrategy();
    }

    /**
     *  
     */
    private void initGFX() {
        try {
            BufferedImage tilesMap = ImageIO.read(new File("c:/panda.png"));
            int width = tilesMap.getWidth();
            int height = tilesMap.getHeight();

            tiles = new VolatileImage[TILE_ROW_CNT * TILE_COLUMN_CNT];

            for (int i = 0, y = 0; i < TILE_ROW_CNT; i++) {
                for (int j = 0, x = 0; j < TILE_COLUMN_CNT; j++) {
                    VolatileImage vImg = this.createVolatileImage(TILE_WIDTH,
                            TILE_HEIGHT);
                    vImg.getGraphics()
                            .drawImage(
                                    tilesMap.getSubimage(x, y, TILE_WIDTH,
                                            TILE_HEIGHT), 0, 0, this);
                    tiles[i * TILE_COLUMN_CNT + j] = vImg;
                    x += TILE_WIDTH;
                }
                y += TILE_HEIGHT;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new TilesTest().start();
    }

    /**
     *  
     */
    private void start() {
        renderer.start();
    }
}



Gruß Tom
 

Anhänge

  • panda.png
    panda.png
    24,3 KB · Aufrufe: 185
Hallo!

zuerts möchte ich tausendmal bedanken für die Antworten, das war sehr nett
aber leider es hat mir nicht so viel geholfen

wie du gesagt hast, hab ich auch überlegt meine bilder nacheinader in der for schleife anrufe und anzeigen lasse aber klappt es nicht


>>200 Bildern scon recht viel ist

in meinem Animation gibt es zu viele aktionen, und ich muss jesde aktion zeichnen und grob gesehen die sind fast 200 bilder, die habe ich nocht nicht gezeichnet aber , schätze ich das es so viel sein werde

die fast gleiche animation gibts unter diesen link
http://rvs.die.informatik.uni-siegen.de/Wilus/ProtokolleDienste/ContentContainer/sl_tc_jar_cong

in diesen applet gibt s vertikale und horizonatle bewegung, bei mir muss noch in der mitte eine fenster sein noch eine andere animation durchführt, und eine Text fenster,ich habe ein beispiel angehängt wie es aussehen soll

was kannst du mir vorschlagen? ob ich diese bilder erstmal in einem grafik editor zeichne und dann nach einander anrufe oder

jedes bewegung in java zeichne

ich bedanke mich nochmal
 

Anhänge

  • beispiel.doc
    44 KB · Aufrufe: 57
Hallo!

Okay, dachte du meintest mit Animation die Bewegung eins Sprites ;-).
was kannst du mir vorschlagen? ob ich diese bilder erstmal in einem grafik editor zeichne und dann nach einander anrufe oder jedes bewegung in java zeichne

Kommt auf die Komplexität der Animation an. So eine Animation wie in deinem Beispiel würde ich selber Zeichnen.

Gruß Tom
 
Kommt auf die Komplexität der Animation an. So eine Animation wie in deinem Beispiel würde ich selber Zeichnen.
Kommt auf die Komplexität der Animation an. So eine Animation wie in deinem Beispiel würde ich selber Zeichnen.

wie du beim beispiel gesehen hast, muss ich die kommunikation zwischen zwei rechner in der TCP/IP verbindung grafisch darstellen

ist es nicht leichter jeder aktion in einem bild zeichnen und anrufen
ist es nicht jeder aktion selber zeichnen zu viel komplex
weil es muss eine bestimmte oberfläche sein und über diesen oberfläche bewegen kleine kästchen vertikal und horizontal und dazu synchron muss inder mitte noch eine animation z.B eine Ethernet oder eine Token ring animation

und wenn ich selber zeichnen werde wie kann ich es machen?ich erstelle erst eine oberfläche und dann kleine rechteck und gebe den path wie er laufen sollen, und in anderen fenster tokenring animation das komm mir richtig komplex
oder übertreibe ich die sachen? :(
 
Hallo!

Hier nochmal ein kleines Beispiel dazu:
Code:
/*
 * Created on 06.02.2005@14:00:31
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 * @author Administrator
 * 
 * TODO Explain me
 */
public class TilesTest extends JFrame {

    int screenWidth, screenHeight;

    final int TILE_WIDTH = 52;

    final int TILE_HEIGHT = TILE_WIDTH;

    int tilePosX;

    int tilePosY;

    final int TILE_COLUMN_CNT = 4;

    final int TILE_ROW_CNT = 5;

    int[] frames = { 0, 4, 8, 12, 16, 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7,
            11, 15, 19 };

    VolatileImage[] tiles;

    BufferStrategy strategy;

    private Thread renderer = new Thread() {
        public void run() {

            System.out.println(tiles.length);
            int i = 0;
            while (true) {
                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.clipRect(0, 0, screenWidth, screenHeight);
                g.drawImage(tiles[frames[i]], tilePosX, tilePosY,
                        TilesTest.this);
                i++;
                i %= frames.length;
                g.dispose();
                strategy.show();
                try {
                    Thread.sleep(100L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    public TilesTest() {
        super("TilesTest");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        screenWidth = 160;
        screenHeight = 120;

        tilePosX = (screenWidth - TILE_WIDTH) / 2;
        tilePosY = (screenHeight - TILE_HEIGHT) / 2;
        setSize(screenWidth, screenHeight);
        setResizable(false);
        setVisible(true);
        initGFX();
        createBufferStrategy(2);
        strategy = getBufferStrategy();
    }

    /**
     *  
     */
    private void initGFX() {
        try {
            BufferedImage tilesMap = ImageIO.read(new File("c:/panda.png"));
            int width = tilesMap.getWidth();
            int height = tilesMap.getHeight();

            tiles = new VolatileImage[TILE_ROW_CNT * TILE_COLUMN_CNT];

            for (int i = 0, y = 0; i < TILE_ROW_CNT; i++) {
                for (int j = 0, x = 0; j < TILE_COLUMN_CNT; j++) {
                    VolatileImage vImg = this.createVolatileImage(TILE_WIDTH,
                            TILE_HEIGHT);
                    vImg.getGraphics()
                            .drawImage(
                                    tilesMap.getSubimage(x, y, TILE_WIDTH,
                                            TILE_HEIGHT), 0, 0, this);
                    tiles[i * TILE_COLUMN_CNT + j] = vImg;
                    x += TILE_WIDTH;
                }
                y += TILE_HEIGHT;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new TilesTest().start();
    }

    /**
     *  
     */
    private void start() {
        renderer.start();
    }
}



Gruß Tom

Hallo Leute,

Beim Ausführen des Codes bekomme ich folgende Fehlermeldung:

Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1230)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1156)
at TilesTest.initGFX(TilesTest.java:96)
at TilesTest.<init>(TilesTest.java:74)
at TilesTest.main(TilesTest.java:109)


Getestet habe ich unter

  • jdk1.5.0_16
  • jdk1.6.0_06
  • jdk1.6.0_11

Habe daraufhin mal "gegoogled" und folgendes gefunden:

http://bugs.sun.com/bugdatabase/vie...d1d04f9ffffffffe134ec5a2699669?bug_id=6775390

...ich wohl ein known Bug :(

Frage: hat das Programm schonmal einer zum Laufen gebracht? Wenn ja, wie?
 

Neue Beiträge

Zurück