ПроЭктировщик
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений (для 219 пользователей)
|
[MP3.0+] Магия inline()
Итак, если вы не заметили, MidletPascal поддерживает вставки (inline) java байт-кодов, начиная с версии 3.0.
Это можно эффективно использовать для расширения программ без использования библиотек.
Так же это позволяет реализовывать вещи, которые библиотеками делаются очень сложно, такие как взаимодействие библиотеки с переменными основной программы, и прямое использование оных в процедурах и функциях.
Поэтому, пользуясь доступными базами знаний по этой теме, я написал и собрал на одну страницу некоторые простые в реализации, но полезные для разработки MP приложений и игр функции и процедуры:
http://yellow.orgfree.com/micro/mpinline/
На момент написания этого сообщения страница содержит 16 функций
, включающих в себя манипуляции над строками, изменение размеров "родных" для MP массивов, функции переназначения вывода в свое изображение, системные функции, и даже две функции, которые можно использовать для попиксельной обработки изображений.
Для последних упомянутых приведу пример:
Эта программа заполняет экран разноцветными полосками, после чего обесцвечивает часть изображения.

program pxproc;
//
var _ipx:array[0..1] of integer; _iw, _ih, _il: integer;
procedure ImageToRGB(img: image; x, y, w, h: integer);
begin inline(
iload_3; iload_1; isub; putstatic field 'M','_iw','I';
iload 4; iload_2; isub; putstatic field 'M','_ih','I';
getstatic field 'M','_iw','I'; getstatic field 'M','_ih','I'; imul;
putstatic field 'M','_il','I'; getstatic field 'M','_il','I'; newarray 10;
putstatic field 'M','_ipx','[I'; aload_0; getstatic field 'M','_ipx','[I';
iconst_0; iload_3; iload_1; iload_2; iload_3; iload 4;
invokevirtual method 'javax/microedition/lcdui/Image','getRGB','([IIIIIII)V';
return;
); end;
function ImageFromRGB(w, h: integer): image;
begin inline(
getstatic field 'M','_ipx','[I'; iload_0; iload_1; iconst_1;
invokestatic method 'javax/microedition/lcdui/Image','createRGBImage',
'([IIIZ)Ljavax/microedition/lcdui/Image;'; areturn;
); end;
//
var i, j, r, g, b, a, p: integer;
begin
j := 10;
i := 0;
while i < GetWidth do begin
SetColor(random(255), random(255), random(255));
FillRect(i, 0, j, GetHeight);
i := i + j;
end;
RePaint;
Delay(1000);
ImageToRGB(ImageFromCanvas(0, 0, GetWidth, 64), 0, 0, GetWidth, 64);
for i := 0 to _il-1 do begin
p := _ipx[i];
// Разбираем цвет пикселя на детали:
a := (_ipx[i] and $FF000000) shr 24;
r := (_ipx[i] and $00FF0000) shr 16;
g := (_ipx[i] and $0000FF00) shr 8;
b := (_ipx[i] and $000000FF);
// Тут делаем несопрественно преобразования цвета:
j := (r + g + b) div 3; // это конечно неправильный grayscale, но все же.
r := j;
g := j;
b := j;
// Собираем пиксель обратно:
_ipx[i] := (a and $FF) shl 24 or (r and $FF) shl 16
or (g and $FF) shl 8 or (b and $FF);
end;
DrawImage(ImageFromRGB(_iw, _ih), 0, 0);
RePaint;
Delay(5000);
end.
Со временем я постараюсь расширять список функций (на данный момент некоторые из них невозможно реализовать изза неработающих лейблов и *store команд, которые j-a-s-d собирается исправить в MP3.4).
Так же некоторые функции (такие как изменение размера массива) станут значительно меньше с выходом следующих версий MP.
Если у вас есть идеи, или же вам известны небольшие, полезные Java функции (в виде кода или байт-кодов), говорите.
Хорошего дня 
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
|