2014-11-26 3 views
1

Мне нужно работать в процессе обработки моего школьного проекта. Поэтому я загружаю изображения в массив, а затем в новый класс у меня есть другой массив, и я помещаю изображения в этот массив каждый раз, когда я создаю этот класс. Каждый раз, когда я создаю этот класс, я помещаю изображения в другое место, и это работает нормально, но как только я пытаюсь настроить масштаб этих изображений, он также корректирует масштаб для изображений в других классах. Я предполагаю, что он меняет масштаб всех этих изображений, потому что он меняет масштаб изображений в моем первом массиве, и я не создаю новый. Есть ли способ обойти это? Это мой код. Это где я загрузить мои изображения:Манипулировать масштаб моих изображений

class ItemLoader 
{ 
    PImage[] itemArray; 
    ArrayList itemCollection; 
    String itemType; 
    int amountOfFrames; 
    int amountOfItems = 1; 

    ItemLoader() 
    { 
    itemCollection = new ArrayList(); 
    LoadImage(); 
    } 

    void LoadImage() 
    { 
    for(int ii = 0; ii < amountOfItems; ii++) 
    { 
    AssignItemType(ii); 
    itemArray = new PImage[amountOfFrames]; 

     for(int i = 0; i < amountOfFrames; i ++) 
     { 
     String filenaam = itemType + nf(i, 5) + ".png"; 
     itemArray[i] = loadImage(filenaam); 
     } 
    itemCollection.add(itemArray); 
    } 
    } 

    void AssignItemType(int itemNumber) 
    { 
    switch(itemNumber) 
    { 
     case 0: itemType = "Leaves"; amountOfFrames = 21; 
     break; 

     case 1: itemType = "Apple"; 
     break; 

     case 2: itemType = "Bannana"; 
     break; 

     case 3: itemType = "Pear"; 
     break; 

     case 4: itemType = "Cherry"; 
     break; 

     case 5: itemType = "Owl"; 
     break; 

     case 6: itemType = "Bird"; 
     break; 
    } 
    } 
} 

Тогда это когда я создаю экземпляр класса:

itemList.add(new ItemSpawn(randomX,randomY,0, strokeThickness,itemLoader.itemCollection)); 

И это где я петля корыта массива анимировать изображения:

class ItemSpawn 
{ 
    PImage[] animationFrames; 
    PImage lastFrame; 
    float frameCounter; 

    int x_loc; 
    int y_loc; 
    float ImageScale = 0; 
    int ImageRotation = 0; 

ItemSpawn(int x_loc_par, int y_loc_par, int _itemType, float _strokeSize, ArrayList _tempArray) 
{ 
    animationFrames = (PImage[]) _tempArray.get(_itemType); 
    x_loc = x_loc_par; 
    y_loc = y_loc_par; 
    ApplyScaleRotation(); 
} 

    void ApplyScaleRotation() 
    { 
    ImageScale = 0.5; 
    ImageRotation = int(random(0,360)); 

    for(int i = 0; i < animationFrames.length; i++) 
    { 
     animationFrames[i].resize(int(animationFrames[i].width * ImageScale), int(animationFrames[i].height * ImageScale)); 
    }  
    } 

    void LoopAnimation() 
    { 
    int convertCount = int(round(frameCounter)); 

    if(convertCount < animationFrames.length - 1) 
    { 
    image(animationFrames[convertCount],x_loc - (animationFrames[convertCount].width/2) ,y_loc - (animationFrames[convertCount].height/2)); 
    frameCounter += 0.4; 

    }else 
    { 
     image(animationFrames[animationFrames.length - 1],x_loc - (animationFrames[convertCount].width/2),y_loc - (animationFrames[convertCount].height/2)); 
    } 
    } 
} 

ответ

2

В вашем коде каждый объект класса ItemSpawn использует тот же самыйPImage[] массив. Когда вы меняете изображение в одном из экземпляров ItemSpawn - все остальные экземпляры видят это изменение.

У каждого ItemSpawn объекта shoud есть личная копия изображения - тогда он может безопасно модифицировать изображение.

Рассмотрим такой упрощенный класс:

class X { 
    int[] array; 

    X(int[] array) { 
     this.array = array; 
    } 
    void modify() { 
     array[0] = 99; 
    } 
} 

Мы можем создать 2 различные объекты (x1 и x2) этого класса, используя тот же массив:

int[] values = {1,2,3,4}; 
X x1 = new X(values); 
X x2 = new X(values); 

И следующая x1 модифицирует массив:

x1.modify(); 

println(x1.array[0]); // output: 99 
println(x2.array[0]); // output: 99 

Решение создать глубокую копию PImage[] массива для каждого объекта ItemSpawn класса:

ItemSpawn(int x_loc_par, int y_loc_par, int _itemType, float _strokeSize, ArrayList _tempArray) 
{ 

    // old: 
    // animationFrames = (PImage[]) _tempArray.get(_itemType); 

    // new: 
    PImage[] images = _tempArray.get(_itemType); 
    animationFrames = new PImage[images.length]; // create new array with the same length 

    // copy all images 
    for (int i = 0; i < images.length; i++) { 
     PImage img = images[i]; 
     animationFrames[i] = img.get(); // returns copy of this image 
    } 
    ... 
} 
Смежные вопросы