【问题标题】:Changing sprite to image in processing在处理中将精灵更改为图像
【发布时间】:2016-04-14 15:07:37
【问题描述】:

我正在使用二进制数字来创建敌人,现在我希望用图像替换它,但是当我尝试将精灵数据替换为图像数据时,我不断收到错误,因为它们的代码行太多而无法使用更改数据时的考虑。我已经包括了我是如何创建我的 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);
  }

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

【问题讨论】:

  • 请提供一个我们可以运行的minimal reproducible example。请注意,这不应该是你的整个草图,只是一个例子。例如,如果您只是询问显示图像,那么我们不需要任何代码来移动玩家或射击子弹。另外,请发布您遇到的任何错误的确切文本。如有必要,包括屏幕截图。

标签: java image sprite processing


【解决方案1】:

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

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

}

【讨论】:

  • 感谢您的帮助,但我想出了另一种解决问题的方法。我只是删除了精灵数据并编写了新代码,让我可以立即调用图像。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多