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

Changing sprite to image in processing

我正在使用二进制数字来创建一个敌人,现在我想用图像替换它,但是当我尝试将精灵数据替换为图像数据时,我总是遇到错误,因为它们的代码行太多,无法执行更改数据时要考虑到。我已经包括了我如何创建我的 sprite 以及我试图将其更改为图像的方法,以及我不断收到的错误:

我是这样画精灵的:

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

我得到的错误是,虽然精灵确实被替换了,但它没有移动精灵原来的样子,而且大小也不正确。

您发布的代码片段有点混乱。 首先,语法不太正确,也许你的意思是这样的:

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

}