Показать сообщение отдельно
Старый 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..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...
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
cherepets (15.05.2011), Igor (15.05.2011), Phantom (14.07.2011), Rock2roll (15.05.2011), scimitar (11.06.2011)