Я пытаюсь создать некоторое 2d-освещение в slick2D. Однако результат не совсем то, что я ищу.Slick2d Освещение с умножением
В настоящее время он работает, рисуя свет на карту света, а затем рисует световую карту на экране. При рисовании света в световой карте я просто использую режим рисования экрана, а при рисовании световой карты я использую режим многократного рисования.
В результате this Обращая Lightmap с нормальным режимом дро я получаю this
Я использовал образ Lightmap в фотошопе и изменил blendingmode размножаться и получил this.
По какой-то причине результат фотошоп очень темный. Он выглядит намного лучше в фотошопе перед сохранением, а не темным.
Вопрос теперь в том, как мне приблизиться к результату фотошопа?
Это мой код:
public class Light
{
public Vector2f Pos;
public static Image light;
public Image lightCopy;
public static Image lightmap;
private float size=256;
private static float maxSize=1024;
public Color lightColor = new Color(255,255,255,255);;
private static Graphics g2;
private static Graphics g3;
public static ArrayList<Light> LightList = new ArrayList<Light>();
public static void init() throws SlickException
{
light = new Image("Light.png");
lightmap = new Image(1920,1080);
g3=lightmap.getGraphics();
maxSize=light.getWidth();
}
public Light(Vector2f Pos) throws SlickException
{
this.Pos=Pos;
LightList.add(this);
lightCopy = light.copy();
g2=lightCopy.getGraphics();
}
public void updateSingle(GameContainer gc, ArrayList<Object> BlockingObjects) throws SlickException
{
lightCopy = light.copy();
g2.setDrawMode(Graphics.MODE_NORMAL);
g2.setColor(Color.black);
Rectangle lightPosAndSize = new Rectangle(0,0,maxSize,maxSize);
g2.fill(lightPosAndSize);
Vector2f pos = new Vector2f((maxSize/2)-(size/2),(maxSize/2)-(size/2));
g2.drawImage(light.getScaledCopy(size/maxSize),pos.x, pos.y);
for(int i=0;i!=BlockingObjects.size();i++)
{
Object temp = BlockingObjects.get(i);
String type = temp.getClass().getSimpleName();
switch(type)
{
case "Circle":
{
Circle c = (Circle) temp;
caseCircle(c);
break;
}
default:
}
}
g2.flush();
}
public void renderToLightMap(Graphics g) throws SlickException
{
g3.setDrawMode(Graphics.MODE_SCREEN);
g3.drawImage(lightCopy, Pos.x-maxSize/2, Pos.y-maxSize/2,lightColor);
g3.setDrawMode(Graphics.MODE_NORMAL);
g3.flush();
}
public static void renderLightmap(Graphics g)
{
g.setDrawMode(Graphics.MODE_COLOR_MULTIPLY);
g.drawImage(lightmap, 0, 0);
g.setDrawMode(Graphics.MODE_NORMAL);
}
private void caseCircle(Circle c)
{
}
public static void renderAll(Graphics g, GameContainer gc,ArrayList<Object> BlockingObjects) throws SlickException
{
g3=lightmap.getGraphics();
g3.setColor(new Color(0,0,0));
g3.fill(new Rectangle(0,0,1920,1080));
g3.flush();
for(int i=0;i!=LightList.size();i++)
{
Light temp = LightList.get(i);
temp.updateSingle(gc, BlockingObjects);
temp.renderToLightMap(g);
}
renderLightmap(g);
}
Я собирался отправить это на slick2d форуме, однако я не Получать почту активации, так что я не мог создать поток там.
Надеюсь, вы поймете мою проблему, и если вам нужна дополнительная информация, я постараюсь предоставить вам ее. Надеюсь, ссылки моих изображений также работают.