Показать сообщение отдельно
Старый 15.05.2011, 01:03   #1
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 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..1of integer_iw_ih_ilinteger;
procedure ImageToRGB(imgimagexywhinteger);
begin inline(
iload_3iload_1isubputstatic field 'M','_iw','I';
iload 4iload_2isubputstatic 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_0getstatic field 'M','_ipx','[I';
iconst_0iload_3iload_1iload_2iload_3iload 4;
invokevirtual method 'javax/microedition/lcdui/Image','getRGB','([IIIIIII)V';
return;
); 
end;
function 
ImageFromRGB(whinteger): image;
begin inline(
getstatic field 'M','_ipx','[I'iload_0iload_1iconst_1;
invokestatic method 'javax/microedition/lcdui/Image','createRGBImage',
'([IIIZ)Ljavax/microedition/lcdui/Image;'areturn;
); 
end;
//
var ijrgbapinteger;
begin
:= 10;
:= 0;
while 
GetWidth do begin
SetColor
(random(255), random(255), random(255));
FillRect(i0jGetHeight);
:= j;
end;
RePaint;
Delay(1000);
ImageToRGB(ImageFromCanvas(00GetWidth64), 00GetWidth64);
for 
:= 0 to _il-do begin
  p 
:= _ipx[i];
  
// Разбираем цвет пикселя на детали:
  
:= (_ipx[i] and $FF000000shr 24;
  
:= (_ipx[i] and $00FF0000shr 16;
  
:= (_ipx[i] and $0000FF00shr 8;
  
:= (_ipx[i] and $000000FF);
  
// Тут делаем несопрественно преобразования цвета:
  
:= (bdiv 3// это конечно неправильный grayscale, но все же.
  
:= j;
  
:= j;
  
:= j;
  
// Собираем пиксель обратно:
  
_ipx[i] := (and $FFshl 24 or (and $FFshl 16
          
or (and $FFshl 8  or (and $FF);
end;
DrawImage(ImageFromRGB(_iw_ih), 00);
RePaint;
Delay(5000);
end
Со временем я постараюсь расширять список функций (на данный момент некоторые из них невозможно реализовать изза неработающих лейблов и *store команд, которые j-a-s-d собирается исправить в MP3.4).
Так же некоторые функции (такие как изменение размера массива) станут значительно меньше с выходом следующих версий MP.

Если у вас есть идеи, или же вам известны небольшие, полезные Java функции (в виде кода или байт-кодов), говорите.
Хорошего дня
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
cherepets (15.05.2011), Igor (15.05.2011), Phantom (14.07.2011), Rock2roll (15.05.2011), scimitar (11.06.2011)