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