![]() |
|
| #1 (permalink) | ||||||||||||||||
|
Stammbenutzer
Megabyte
Registriert seit: 02.11.2003
Fachbeiträge: 1.284
Abgegebene Danke: 12
Erhielt 4 Danke für 4 Beiträge
|
Hi,
schade, dass mein Grips manchmal nicht dazu ausreicht... Seit einigen Tage komme ich einfach nicht weiter, weil ich ein Beispiel-Code nicht vollständig kapiere: Code:
import java.awt.*;
import javax.swing.*;
public class AnimationTest {
public static void main(String[] args) {
DisplayMode displayMode;
if(args.length == 3){
displayMode = new DisplayMode(Integer.parseInt(args[0]),
Integer.parseInt(args[1]),
Integer.parseInt(args[2]),
DisplayMode.REFRESH_RATE_UNKNOWN);
}
else
displayMode = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
AnimationTest test = new AnimationTest();
test.run(displayMode);
}
private static final long DEMO_TIME = 5000;
private SimpleScreenManager screen;
private Image bgImage;
private Animation anim;
public void run(DisplayMode displayMode){
screen = new SimpleScreenManager();
try{
screen.setFullScreen(displayMode, new JFrame());
loadImages();
animationLoop();
}
finally{
screen.restoreScreen();
}
}
public void loadImages(){
bgImage = loadImage("images/background.jpg");
Image player1 = loadImage("images/player1.png");
Image player2 = loadImage("images/player.png");
Image player3 = loadImage("images/player3.png");
//create Animation
anim = new Animation();
anim.addFrames(player1, 250);
anim.addFrames(player2, 150);
anim.addFrames(player1, 150);
anim.addFrames(player2, 150);
anim.addFrames(player3, 200);
anim.addFrames(player2, 150);
}
private Image loadImage(String fileName){
return new ImageIcon(fileName).getImage();
}
public void animationLoop(){
long startTime = System.currentTimeMillis();
long currTime = startTime;
while(currTime - startTime < DEMO_TIME){
long elapsedTime =
System.currentTimeMillis() - currTime;
currTime += elapsedTime;
//update animation
anim.update(elapsedTime);
//draw to screen
Graphics g = screen.getFullScreenWindow().getGraphics();
draw(g);
g.dispose();
//take a nap
try{
Thread.sleep(20);
}catch(InterruptedException ex){}
}
}
public void draw(Graphics g){
//drawbackground
g.drawImage(bgImage, 0, 0, null);
//draw Image
g.drawImage(anim.getImage(), 0, 0, null);
}
}
Code:
import java.awt.*;
import java.util.ArrayList;
public class Animation {
private ArrayList frames;
private int currFrameIndex;
private long animTime;
private long totalDuration;
//Creates a new empty Animation
public Animation(){
frames = new ArrayList();
totalDuration = 0;
start();
}
//Adds an image to the animation with the specified duration
public synchronized void addFrames(Image image, long duration){
totalDuration += duration;
frames.add(new AnimFrame(image, totalDuration));
}
//Starts this animation over from the beginning
public synchronized void start(){
animTime = 0;
currFrameIndex = 0;
}
//Updates this animation´s current image (frame), if necessary
public synchronized void update(long elapsedTime){
if(frames.size() > 1){
animTime += elapsedTime; //elapsed = abgelaufen
if(animTime >= totalDuration){
animTime = animTime % totalDuration;
currFrameIndex = 0;
}
while(animTime > getFrame(currFrameIndex).endTime){
currFrameIndex++;
}
}
}
public synchronized Image getImage(){
if(frames.size() == 0)
return null;
else
return getFrame(currFrameIndex).image;
}
private AnimFrame getFrame(int i){
return (AnimFrame)frames.get(i);
}
private class AnimFrame{
Image image;
long endTime;
public AnimFrame(Image image, long endTime){
this.image = image;
this.endTime = endTime;
}
}
}
Code:
public synchronized void update(long elapsedTime){
if(frames.size() > 1){
animTime += elapsedTime; //elapsed = abgelaufen
if(animTime >= totalDuration){
animTime = animTime % totalDuration;
currFrameIndex = 0;
}
[code]
while(animTime > getFrame(currFrameIndex).endTime){
currFrameIndex++;
}
}[/code] Das Buch schreibt zu Code:
animTime = animTime % totalDuration;
Code:
while(animTime > getFrame(currFrameIndex).endTime){
currFrameIndex++;
}
Liebe Grüße Reality |
|||||||||||||||
|
|
||||||||||||||||
| #2 (permalink) | |
|
Premium-Benutzer
Registriert seit: 23.02.2004
Fachbeiträge: 4.725
Abgegebene Danke: 0
Erhielt 91 Danke für 78 Beiträge
|
Zur Erklärung voraus:
Code:
int x = ...; //irgendwas x %= 376; //entspricht x = x % 376 if (x < 376) //immer true ; else ; //unreachable statement Code:
private long totalDuration;
private long animTime;
public synchronized void addFrames(Image image, long duration){
totalDuration += duration;
frames.add(new AnimFrame(image, totalDuration));
}
public synchronized void update(long elapsedTime){
animTime += elapsedTime; //elapsed = abgelaufen
animTime = animTime % totalDuration;
}
Die zweite Frage erübrigt sich dann.
__________________
Sorry I don't know what you just said because I was thinking about Batman. |
|
|
| #3 (permalink) | |
|
Stammbenutzer
Megabyte
Themenstarter
Registriert seit: 02.11.2003
Fachbeiträge: 1.284
Abgegebene Danke: 12
Erhielt 4 Danke für 4 Beiträge
|
Oh man! Die Methoden und Klassen sind vielleicht interdependent geschrieben!
Danke, aber wieso schreibt man nicht Code:
animTime = 0; Code:
animTime = animTime % totalDuration; Liebe Grüße Reality |
|
|
| #4 (permalink) | |
|
Premium-Benutzer
Registriert seit: 23.02.2004
Fachbeiträge: 4.725
Abgegebene Danke: 0
Erhielt 91 Danke für 78 Beiträge
|
% heißt modulo heißt "Rest der Teilung durch".
13 % 10 = 13 % 5 = 3 D.h. wenn animTime == totalDuration ist würde das auch stimmen, wenn animTime größer ist, ist das Ergebnis nachher soviel, wie animTime größer war.
__________________
Sorry I don't know what you just said because I was thinking about Batman. |
|
|
| #8 (permalink) | |
|
Premium-Benutzer
Registriert seit: 23.02.2004
Fachbeiträge: 4.725
Abgegebene Danke: 0
Erhielt 91 Danke für 78 Beiträge
|
Aber es könnte dann an der Stelle etwas stocken, weil es ja schon weiter als 0 sein müssen könnte.
__________________
Sorry I don't know what you just said because I was thinking about Batman. |
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Verstehe Code-Teil nicht. | coree | Java Basics - Anfänger-Themen | 2 | 08.02.2009 12:38 |
| Sun-Beispiel - Farbiger Code | Java Basics - Anfänger-Themen | 1 | 08.09.2008 13:58 | |
| Thread startet nicht, verstehe nicht warum | richardkrieger | Java Basics - Anfänger-Themen | 2 | 25.06.2008 17:33 |
| Verstehe die Ausgabe von folgendem Code nicht | Ron-da-Don | Java Basics - Anfänger-Themen | 4 | 26.08.2007 17:17 |
| Ich verstehe den Code nicht? | franks | Für Verirrte - Fragen zu JavaScript | 6 | 13.09.2004 12:50 |
| Lesezeichen |
|
|