Jak zrobić efekt światła

0

Witam, mam problem ze zrobieniem światła w grze. Nie mam nawet pomysłu jak coś takiego napisać. Dla zobrazowania chodzi mi o coś takiego:

user image

Idealnym rozwiązaniem dla mnie byłoby dodanie czarnej nakładki na ekran i w promieniu od danego obiektu np. postaci, latarki, pochodni, kursora myszy czarna nakładka znikałaby. Ale czy da się wyciąć koło z czarnego kwadratu? Pewnie się da, ale czy takie rozwiązanie jest opłacalne pod względem pamięciowym itd. Pisząc to przypomniałem sobie o metodzie exclusiveOr() - czy takie rozwiązanie mojego problemu byłoby odpowiednie?

0

Kółeczko wygląda na zwykły blurr.

Pobaw się przeźroczystością :)

0

Sorki za double ale znalazłem coś takiego:

http://forums.tigsource.com/index.php?topic=8803.0

Na pewno się przyda.

0

Nałóż takie kółko
user image
(albo jego negatyw) gdzie jasność oznacza poziom przezroczystości (kanał alfa).

0

Szczerze powiedziawszy nie do końca rozumiem co mam zrobić z tym kółkiem. Nie widzę za bardzo jak czarne kółko ma przysłonić cały ekran i stać się przezroczyste po tym zabiegu. Mógłbym prosić o jakieś rozwinięcie?

0

Normalnie maskę robisz, tak jak to jest zrobione we Flashu, PSie. Stare gry wykorzystywały np. taką maskę, by sprity były przezroczyste. Teraz użyjesz png i masz wyrąbane, ale kiedyś robiło się maskę właśnie jak jpg się używało..

0

Dzięki za odpowiedzi, ale nadal jestem zmieszany. Szukam, czytam ale takie generalne pytanie - czy ja muszę pisać coś w kodzie, czy to wszystko jest odpowiedzialne przez .png? Bo na grafice się nie znam, a dla mnie dziwne jest to, że nakładam kółko na czarny obraz i ono odsłania to co znajduje się pod czarnym obrazem jednocześnie nie przebijając się przez kafelki mapy. Z drugiej strony nie mam pomysłu na napisanie komendy, która odsłania obszar, na którym znajduje się prześwitujące kółko no, chyba że za pomocą wspomnianej wcześniej metody exclusiveOr.

0

Metoda drawImage dla obrazków w formacie ARGB lub RGBA pd razu uwzględnia Ci przy rysowaniu kanał alfa. Nakładane piksele mają wartość z nim zgodną - czyli w przypadku obrazka (w danym miejscu) nieprzezroczystego - piksel z nakładanego obrazka zostanie narysowany i zastąpi poprzedni; w przypadku całkowicie przezroczystego zostanie zignorowany i piksel pozostanie o wartości takiej jaką dotychczas miał (czyli ze "starego" obrazka). W każdym przypadku pośrednim wartość dotychczasowego piksela zostanie zmiksowana z nowym proporcjonalnie do wartości kanału przezroczystości nakładanego obrazka.

0

Dziękuję wszystkim za pomoc. Klasa którą napisałem do mojej gry odpowiedzialna za odkrywanie tego co ukryte wygląda tak:

public class Shadow {
    
    private float alphaValue = 1.0f;
    public int compositeRule = AlphaComposite.CLEAR;
  AlphaComposite ac;
  
    public void tick(){
        
    }
    public void render(Graphics g){
        
        Graphics2D g2D = (Graphics2D) g;
        BufferedImage bi = new BufferedImage(560, 560, BufferedImage.TYPE_INT_ARGB);
        Graphics2D big = bi.createGraphics();

        ac = AlphaComposite.getInstance(compositeRule, alphaValue);
        
        big.setColor(new Color(0,0,0,250));
        big.fill(new Rectangle2D.Double(0, 0, 560, 560));
        
        big.setComposite(ac);
        big.fill(new Ellipse2D.Double(Component.mousex - 25, Component.mousey - 25, 50, 50));
    
        g2D.drawImage(bi, null, 0, 0);
    }
}

Może się komuś przyda. Teraz zrobienie efektu latarki to już bajka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1