2016-03-20 2 views
0

название может быть немного запутанным, но я пытаюсь получить ходячую анимацию, идущую со листа спрайтов. Его получили 8 разных ходячих позиций, и кажется, что каждый раз, когда они меняются, мне приходится снова загружать этот лист спрайтов, поскольку вы можете просто обрезать оригинал, если получите то, что я имею в виду, иначе он не покажет.Обработка, загрузка изображения и отображение при каждом его изменении

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); 
} 

Это было бы хорошо, если он не был для обработки занимает около 20 кадров, чтобы загрузить в изображение так его невозможно для меня, чтобы получить гладкую скорость ходьбы. любые идеи appriciated

ответ

0

Ok я был кадрирование исходного изображения и сохранить его в себе, как соединять с темпом PImage, им идиот

0

Я вижу, что вы уже фиксированные вашу проблему, но я собираюсь ответить на что-то, что может сделать вашу жизнь немного легче: не назовите функцию loadImage() от функции draw()! Назовите его вместо функции setup().

Вызов функции loadImage() от draw() заставляет ваши изображения загружаться снова и снова, 60 раз в секунду, поэтому это действительно расточительно. Просто загрузите их все при запуске.

Возможно, вы захотите создать array или ArrayList из PImages, каждый из которых загружен одним спрайтом. Загрузите все из функции setup(), а затем просто измените, какой индекс ArrayList вы рисуете для изменения спрайта.

Вот пример того, что ваш код может выглядеть, если вы берете этот подход:

//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); 
} 

Я на самом деле не проверял этот код, но это показывает основной подход.

Вы также можете ознакомиться с примером в this Processing example, который вы можете просмотреть из редактора обработки, перейдя на страницу File ->Examples.

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

Спасибо, я помещу их в списке массива, но изображение нагрузки только вызывается, когда спрайт меняется каждые 5 кадров поэтому оно не нагрузить то же изображение более чем один раз, если и посмотреть, что я имею в виду – Will

+0

@ Да, он будет загружать одно и то же изображение более одного раза. Вы должны вызывать только 'loadImage()' один раз для каждого изображения. Здесь вы загружаете его каждый раз, когда вы меняете его, что действительно неэффективно. Просто сохраняйте изображения в памяти и заменяйте их, когда они вам понадобятся. Даже если вы меняете только каждые 5 кадров, это все равно 12 лишних нагрузок в секунду. –

+0

О, я понимаю, что вы имеете в виду, yeh загружаю его один раз в настройках сейчас и просто обрезаю его каждый раз, когда он меняется, а не код, который я написал выше, спасибо :) – Will

Смежные вопросы