2016-03-20 9 views
0

Der Titel könnte ein wenig verwirrend sein, aber ich versuche, eine gehende Animation von einem Sprite Sheet zu bekommen. Es hat 8 verschiedene Laufpositionen und jedes Mal, wenn es sich ändert, muss ich das Sprite-Blatt wieder laden, um das Original zu schneiden, wenn man das bekommt, was ich meine, sonst wird es nicht angezeigt.Verarbeiten, Bild laden und jedes Mal anzeigen, wenn es geändert wird

PImage Body; 

int WidthSpacing = 64; 
int HeightSpacing = 64; 
int XCharacter = 1; 
int YCharacter = 10; 

int WalkingCounter = 0; 
int WalkingSpeed = 2; 

void setup() 
{ 
background(200); 
size (350, 240); 
Body = loadImage("\\Sprites\\Player\\Male\\Default\\Light.png"); 
} 

void draw() 
{ 
WalkAnimation(); 
} 

void WalkAnimation() 
{ 
WalkingCounter++; 

if (WalkingCounter == 1 * WalkingSpeed) { XCharacter = 1; LoadBody(); } 
if (WalkingCounter == 2 * WalkingSpeed) { XCharacter = 2; LoadBody(); } 
if (WalkingCounter == 3 * WalkingSpeed) { XCharacter = 3; LoadBody(); } 
if (WalkingCounter == 4 * WalkingSpeed) { XCharacter = 4; LoadBody(); } 
if (WalkingCounter == 5 * WalkingSpeed) { XCharacter = 5; LoadBody(); } 
if (WalkingCounter == 6 * WalkingSpeed) { XCharacter = 6; LoadBody(); } 
if (WalkingCounter == 7 * WalkingSpeed) { XCharacter = 7; LoadBody(); } 
if (WalkingCounter == 8 * WalkingSpeed) { XCharacter = 8; LoadBody(); WalkingCounter = 0; }  
} 

void LoadBody() 
{ 
background(200); 
Body = loadImage("\\Sprites\\Player\\Male\\Default\\Light.png"); 
int X = XCharacter * WidthSpacing; 
int Y = YCharacter * HeightSpacing; 
Body = Body.get(X, Y, WidthSpacing, HeightSpacing); 
Body.resize(200, 200); 
image(Body, 150, 5); 
} 

wäre diese in Ordnung, wenn es für die Verarbeitung dauert etwa 20 Frames ist nicht so sein unmöglichen in einem Bild zu laden für mich eine glatte Gehgeschwindigkeit zu bekommen. Alle Ideen sind

appriciated

Antwort

0

Ok ich war das ursprüngliche Bild beschneiden und in sich als appose in ein temporäres PImage zu speichern, ein Idiot im,

0

Ich sehe, dass Sie bereits Ihr Problem behoben haben, aber ich werde um mit etwas zu antworten, das Ihr Leben ein wenig einfacher machen könnte: rufen Sie nicht die loadImage() Funktion von der draw() Funktion auf! Rufen Sie stattdessen die Funktion setup() auf.

Wenn Sie die loadImage()-Funktion von draw() aufrufen, werden Ihre Bilder 60 Mal pro Sekunde immer wieder geladen, so dass es wirklich verschwenderisch ist. Laden Sie sie stattdessen nur beim Start.

Sie möchten vielleicht einen array oder einen ArrayList von PImages erstellen, die jeweils mit einem einzelnen Sprite geladen sind. Laden Sie alle von der Funktion setup(), und ändern Sie dann einfach den Index der ArrayList, die Sie zeichnen, um das Sprite zu ändern. Hier

ist ein Beispiel dafür, was Ihr Code aussehen könnte, wenn Sie nehmen diesen Ansatz:

//use an array to hold your sprites 
PImage[] bodies = new PImage[8]; 

//keep track of current index 
int spriteIndex = 0; 

//switch sprite every X frames 
int walkingSpeed = 2; 

void setup() { 
    size (350, 240); 

    int widthSpacing = 64; 
    int heightSpacing = 64; 
    int YCharacter = 10; 

    //loop through every sprite 
    for (int i = 0; i < 8; i ++) { 

    //you could probably cut down on the loads further, 
    //but 8 at the beginning is much better than X per second 
    bodies[i] = loadImage("\\Sprites\\Player\\Male\\Default\\Light.png"); 

    //use the loop variable to figure out where the sprite is in the main image 
    int x = (i+1) * widthSpacing; 
    int y = YCharacter * heightSpacing; 

    //get the sprite 
    bodies[i] = bodies[i].get(x, y, widthSpacing, heightSpacing); 

    //resize the sprite 
    bodies[i].resize(200, 200); 
    } 
} 

void draw() { 
    //draw the background first 
    background(200); 

    //use existing frameCount variable and modulus to switch sprites every X frames 
    if (frameCount % walkingSpeed == 0) { 

    //increment the sprite index 
    spriteIndex++; 

    //if it goes too high, reset it to zero 
    if (spriteIndex == 8) { 
     spriteIndex = 0; 
    } 
    } 

    //just draw the image, you don't have to keep loading it! 
    image(bodies[spriteIndex], 150, 5); 
} 

Ich habe nicht wirklich diesen Code getestet, aber dies zeigt den grundlegenden Ansatz.

Sie können auch das Beispiel in this Processing example, die Sie aus dem Processing-Editor unter File ->Examples anzeigen können.

Animation animation1, animation2; 

float xpos; 
float ypos; 
float drag = 30.0; 

void setup() { 
    size(640, 360); 
    background(255, 204, 0); 
    frameRate(24); 
    animation1 = new Animation("PT_Shifty_", 38); 
    animation2 = new Animation("PT_Teddy_", 60); 
    ypos = height * 0.25; 
} 

void draw() { 
    float dx = mouseX - xpos; 
    xpos = xpos + dx/drag; 

    // Display the sprite at the position xpos, ypos 
    if (mousePressed) { 
    background(153, 153, 0); 
    animation1.display(xpos-animation1.getWidth()/2, ypos); 
    } else { 
    background(255, 204, 0); 
    animation2.display(xpos-animation1.getWidth()/2, ypos); 
    } 
} 



// Class for animating a sequence of GIFs 

class Animation { 
    PImage[] images; 
    int imageCount; 
    int frame; 

    Animation(String imagePrefix, int count) { 
    imageCount = count; 
    images = new PImage[imageCount]; 

    for (int i = 0; i < imageCount; i++) { 
     // Use nf() to number format 'i' into four digits 
     String filename = imagePrefix + nf(i, 4) + ".gif"; 
     images[i] = loadImage(filename); 
    } 
    } 

    void display(float xpos, float ypos) { 
    frame = (frame+1) % imageCount; 
    image(images[frame], xpos, ypos); 
    } 

    int getWidth() { 
    return images[0].width; 
    } 
} 
+0

Danke, werde ich sie in der Array-Liste setzen, aber die Last Bild nur dann aufgerufen wird, wenn das Sprit alle 5 Frames ändert, so dass es das gleiche Bild mehr laden tut als einmal, wenn u sehen, was ich – Will

+0

bedeuten @ Will Ja, es wird das gleiche Bild mehr als einmal laden. Sie sollten 'loadImage()' nur einmal für jedes Bild aufrufen. Hier laden Sie es jedes Mal, wenn Sie es ändern, was wirklich ineffizient ist. Bewahren Sie die Bilder einfach im Speicher auf und tauschen Sie sie aus, wenn Sie sie brauchen. Selbst wenn Sie nur alle 5 Frames wechseln, sind das noch 12 unnötige Ladungen pro Sekunde. –

+0

oh ich sehe, was du meinst, yeh ich lade es einmal im Setup jetzt und nur crop es jedes Mal, wenn es sich ändert statt der Code ich oben gepostet, danke :) – Will

Verwandte Themen