ПроЭктировщик
Регистрация: 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...
|