В этой статье я хочу поведать людям о том, как сменить цвет любого графического примитива в Java классе, но на этот раз для примера возьму мобильную игру (Java ME) Gish reloaded.
Попробуем сменить цвет брызг в желтой воде на свой.
Первое, что надо сделать — это узнать код цвета элемента в RGB.
Для этого запустим мидлет в KEmulator. Кликаем на вкладку «Вид» и нажимаем «Инфо».
Играем до момента, когда увидите на экране нужный элемент, у нас это брызги. Далее переходим во вкладку «Мидлет» и жмем «Ожидание».
В итоге должно получиться что-то вроде этого:
Цвет в 16 CC = 0xffaaa586
Теперь декомпилируем все классы и ищем строку «aaa586».
Находим в k.class
Код
g1.setColor(i13 != 0?i13 != 1?0xffaaa586:0xffb9b926:0xff7a6c5a);
Метод setColor класса Graphics устанавливает цвет графическим примитивам(прямоугольники, круги, треугольники и т.д.) и тексту. Тут мы видим три значения для наших брызг.
Я особо не буду заморачиваться по этому поводу и все три значения сделаю равными 0x5f6ffe.
Для простой модификации, вроде смены значений, я использую дизассемблер
Class Construction Kit.
Установка цвета в классе происходит в методе private void b(Graphics g1)
Значит находим вызов setColor(int arg0) в этом методе. Строка 5114
Выше видим наши значения(опкод ldc) в привычной нам десятичной системе счисления
-8754086 = 0xffffffffff7a6c5a
-4605658 = 0xffffffffffb9b926
-5593722 = 0xffffffffffaaa586
Ой, а как так получилось, мы ведь знаем, что там должно быть 0xff7a6c5a вместо 0xffffffffff7a6c5a ?
Все очень просто! При компиляции все числа переводятся в беззнаковый формат(unsigned int)
Можете почитать как это делается
здесь.
В принципе, если Ваш декомпилятор не имеет функции представления чисел в 16 СС, то Вы спокойно можете найти нужный цвет переведя его в знаковое целое число.
Далее меняете эти три значения цвета на 0xffffffffff5f6ffe = -10522626.
Сохраняете. Остается преверефицировать.
Так же некоторые программисты юзают метод setColor(int r, int g, int b )
Т.е. если Вы не нашли упоминание в классах нужного цвета способом описанным ранее, возможно используется не
COLORREF, а задается каждый канал по отдельности.
Автор урока -
kiriman.