在处理中将精灵更改为图像

时间:2016-04-14 15:07:37

标签: java image sprite processing

我正在使用二进制数字来创建敌人,现在我希望用图像替换它但是当我尝试将精灵数据替换为图像数据时,我不断收到错误,因为他们的代码行太多而无法使用更改数据时要考虑。我已经包含了如何创建我的精灵以及我想要做什么来将其更改为图像,以及我一直在犯的错误:

这就是我绘制精灵的方式:

class Enemy extends SpaceShip {  
  Enemy(int xpos, int ypos) {
    x = xpos;
    y = ypos;
    sprite    = new String[5];
    sprite[0] = "1011101";
    sprite[1] = "0101010";
    sprite[2] = "1111111";
    sprite[3] = "0101010";
    sprite[4] = "1000001";
  }                         

  PImage img;  

  img = loadImage("image.png");
  }

  void draw() {
    image(img, x, y);
  }

我得到的错误是,尽管精灵确实被替换了,但它并没有移动精灵的方式,也不是正确的大小。

1 个答案:

答案 0 :(得分:0)

您发布的代码段有点令人困惑。 首先,语法不是很正确,也许你的意思是这样的:

class Enemy extends SpaceShip {  
  PImage img;

  Enemy(int xpos, int ypos) {
    x = xpos;
    y = ypos;
    //assuming sprite is inherited from SpaceShip ?
    sprite    = new String[5];
    sprite[0] = "1011101";
    sprite[1] = "0101010";
    sprite[2] = "1111111";
    sprite[3] = "0101010";
    sprite[4] = "1000001";
    //you are loading an image, but I see no use of the sprite
    img = loadImage("image.png");
  }

  void draw() {
    image(img, x, y);
  }

}

当您想要将二进制字符串模式显示为图像时,不清楚为什么要加载单独的图像。如果我理解正确,您希望将二进制字符串表示转换为PImage。

您可以直接访问PImage的pixels,这样您就可以直接写下这样的图像:

PImage sprite = new PImage(7,5,RGB);
sprite.pixels = new int[]{color(255),color( 0 ),color(255),color(255),color(255),color( 0 ),color(255),
                          color( 0 ),color(255),color( 0 ),color(255),color( 0 ),color(255),color( 0 ),
                          color(255),color(255),color(255),color(255),color(255),color(255),color(255),
                          color( 0 ),color(255),color( 0 ),color(255),color( 0 ),color(255),color( 0 ),
                          color(255),color( 0 ),color( 0 ),color( 0 ),color( 0 ),color( 0 ),color(255)};

sprite.updatePixels();

noSmooth();
image(sprite,0,0,70,50);

注意color(255)用于您期望1和color(0)您期望0的位置。

或者,您可以遍历String[]和每行的每个字符来设置PImage的像素:

PImage fromBinaryStrings(String[] sprite){

  int h = sprite.length;
  int w = sprite[0].length();

  PImage result = new PImage(w,h,RGB);

  for(int y = 0 ; y < h; y++){
    String row = sprite[y];
    for(int x = 0; x < w; x++){
      if(row.charAt(x) == '1'){
        result.set(x,y,color(255));
      }else{
        result.set(x,y,color(0));
      }
    }
  }

  return result;
}

基本演示:

void setup(){
  noSmooth();
  scale(10);

  Enemy e = new Enemy(0,0);
  e.draw();
}

PImage fromBinaryStrings(String[] sprite){
  //determine height: number of lines
  int h = sprite.length;
  //determine width: length of a line
  int w = sprite[0].length();
  //create an image
  PImage result = new PImage(w,h,RGB);
  //traverse rows
  for(int y = 0 ; y < h; y++){
    //access row string
    String row = sprite[y];
    //traverse cols
    for(int x = 0; x < w; x++){
      //check each char's value and set the color accordingly
      if(row.charAt(x) == '1'){
        result.set(x,y,color(255));
      }else{
        result.set(x,y,color(0));
      }
    }
  }

  return result;
}
class SpaceShip{
  int x,y;
  String[] sprite;
}
class Enemy extends SpaceShip {  
  PImage img;

  Enemy(int xpos, int ypos) {
    x = xpos;
    y = ypos;

    sprite    = new String[5];
    sprite[0] = "1011101";
    sprite[1] = "0101010";
    sprite[2] = "1111111";
    sprite[3] = "0101010";
    sprite[4] = "1000001";

    img = fromBinaryStrings(sprite);
  }

  void draw() {
    image(img, x, y);
  }

}