2013-06-29 2 views
0

JAVA2D Единственный режим рендеринга в обработке, в котором объекты PGraphics могут быть отображены с прозрачным фоном (в отличие от P2D и P3D)? Я пробовал переписать свой код в двух других режимах (P3D, P2D), но фоны PGraphics оказываются непрозрачными (по умолчанию черные). Может быть, мне не хватает метода, который превратит их в прозрачность? png s Я показываю в PGraphics объекты становятся прозрачными, как ожидалось; это фоны PGraphics, которые непрозрачны. Я работаю над проектом и в настоящий момент выбрал JAVA2D, чтобы сохранить прозрачность, но задаюсь вопросом, могу ли я поочередно использовать P3D и его функции.Является ли JAVA2D единственным режимом рендеринга для отображения прозрачных объектов PGraphics в обработке?

От взгляда по всему миру считают, что JAVA2D был единственным режимом, который мог бы сделать PGraphics прозрачным в более ранних версиях обработки (1. *), и мне интересно, изменилось ли это с версией 2?

Заранее благодарим за разъяснения и помощь!

UPDATE:

Ниже приведен пример моего кода (написанного в Eclipse, в Java с обработкой в ​​качестве компонента). Ответ v.k. отлично работает (с моими png s) в обработке pde, но мне не удалось заставить его работать в моем проекте в Eclipse. Мысли? :

Основной класс:

package tester; 

import java.util.ArrayList; 
import processing.core.*; 

public class GraphicsMain extends PApplet{ 
int screenWidth = 800; 
int screenHeight = 500; 
PGraphicsMaker pgm = new PGraphicsMaker(this); 
ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>(); 


public void setup() { 
    size(screenWidth,screenHeight,P3D); 
    background(0); 

    motifArray = pgm.makeMotifArray(); 

    if (motifArray.get(0) == null) { 
     System.out.println("The motif array is unfilled!"); 
    } 
} 

public void draw() { 
    for (int i = 0; i < motifArray.size(); i ++) { 
     image(motifArray.get(i),200+(10*i),100); 

    } 


} 

static public void main(String[] passedArgs) { 
    String[] appletArgs = new String[] { "GraphicsMain" }; 
    if (passedArgs != null) { 
     PApplet.main(concat(appletArgs, passedArgs)); 
    } else { 
     PApplet.main(appletArgs); 
    } 
} 

Второй класс:

package tester; 

import java.util.ArrayList; 
import processing.core.*; 

public class PGraphicsMaker { 
String filepath = "https://stackoverflow.com/a/filepath/here/"; 
PApplet parent; 
int populationSampleSize = 16; 
int stageWidth = 100; 
int stageHeight = 400; 
ArrayList<PGraphics> motifArray; 
PImage pic; 
PImage pic2; 

public PGraphicsMaker(PApplet pa) { 
    parent = pa; 
    pic = parent.loadImage(filepath + "small_jones6.png"); 
    pic2 = parent.loadImage(filepath + "small_dresser10.png"); 
} 


public ArrayList makeMotifArray() { 
    String filepathTempPngs = "https://stackoverflow.com/a/filepath/here/tempPngs/"; 
    ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>(); 


    for (int i = 0; i < populationSampleSize; i++) { 
       motifArray.add(parent.createGraphics(stageWidth,stageHeight,parent.P3D)); 
     motifArray.get(i).beginDraw(); 
     motifArray.get(i).background(255, 255, 255, 0); 
     motifArray.get(i).image(pic,10,10,100,90); 
     motifArray.get(i).image(pic2,10,50,50,50); 
     motifArray.get(i).endDraw(); 
     motifArray.get(i).save(filepathTempPngs + "motif" + i + ".png"); 
    } 
    return motifArray; 
} 
} 

Примечание: Я не уверен, что последняя save() функция необходима в makeMotifArray() во втором классе (просто еще попытка сохранить прозрачность).

ответ

1

ниже код работает для меня в 1.5.1 и 2.0b8 ... Если я вам право это делать то, что вам нужно ... Проверьте это:

PGraphics p; 

void setup(){ 
    size(400,400,P3D); 
    p = createGraphics(400,400,P3D); 
    smooth(); 
    stroke(180,90,210); 

} 

void draw(){ 
    background(180,90,210); 
    p.beginDraw(); 
    p.background(220, 180, 40,0); 
    p.noFill(); 
    p.stroke(220, 180, 40); 
    p.translate(width/2 - (width/2 - mouseX), height/2, 400-mouseY*5); 
    p.sphere(100); 
    p.endDraw(); 
    pushMatrix(); 
    translate(width/2, height/2, -200); 
    rotateY(radians(frameCount)); 
    rotateX(radians(frameCount/2)); 
    box(100); 
    popMatrix(); 
    image(p,0,0); 
} 
+0

привет @ v.k. - Я пробовал ваш код в обработке pde и даже заменял его на 'png's, и он отлично работает! Странно, однако, когда я пытаюсь использовать код в Eclipse (где я пишу свой проект, используя Обработку как компонент), это не сработает. Я сделал обновление моего вопроса выше с кодом из Eclipse. Мысли? – gromiczek

+0

UPDATE: Я обнаружил, что в Eclipse я использовал версию библиотеки Core.jar для обработки с 2010 года, которая поставляется с версией Proclipsing, которую я больше не использую, но библиотекой, которую я использую в качестве внешней ссылки. Моя копия Обработка pde использовала гораздо более новую версию ядра, поэтому ваш код работал там, но не в Eclipse. Я обновил свои основные и и OpenGL-библиотеки, на которые ссылаются в Eclipse, и теперь все отлично работает. Благодаря! – gromiczek

+0

Эй, рад, что это помогло. Приветствия. –