Показать сообщение отдельно
Старый 29.06.2011, 02:33   #1
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
MP3CC [+x] - "Пользовательская модификация" компилятора

Ссылка на скачивание текущей версии (обновляется, см. название архивов при скачивании): [ссылка]
Страница информации (содержит списки изменений и новых функций): [ссылка]
Ссылка перенаправляющая, поскольку я не имею возможности редактировать собственные темы через несколько дней после их создания. А иметь "текущую" ссылку в первом сообщении все же хочется.
Если упомянутый веб-сервис все же для вас не работает, на странице информации так же есть ссылка на файл.


Цель этой модификации - добавить простые, часто используемые процедуры и функции в язык, упрощая написание программ и использование библиотек. Совместимость с существующими остается.

Инструкция по установке:
1. Открываем папку с MIDletPascal 3.3 (текущей по SourceForge версии).
2. Делаем "резервную копию" MP3CC.exe.
3. Копируем скачанный архив в папку с MP.
4. Распаковываем архив, заменяя MP3CC на новый.
Готово. На следующей компиляции проэкта через MP будет использован новый компилятор.

Основные изменения (причины для скачивания):
  • "родная" поддержка сенсора в надлежащем формате.
    Функции getPointerX, getPointerY, isPointerPressed, hasPointerEvents, hasPointerMotionEvents, возвращающие integer и boolean соответственно.
  • "родная" поддержка getKeyStates для MIDP2.0 (GameCanvas).
    Константы кнопок прилагаются.
  • Добавлены некоторые недостающие функции рисования
    Треугольники, закрытые арки 'Arc', хекс-цвет рисования.
  • Добавлены функции для пере-направления вывода изображения.
    На самом деле не такие уж это и функции - компилятор заменяет их вызов на несколько байт-кодов.
  • Добавлены "магические" функции преобразования между Boolean и Integer.
    Поскольку MP хранит булевые значения как int, то приведение типа является весьма визуальным - в конечном результате это будет соответственное присвоение.

Это не является официальной версией компилятора. Как упомянул j-a-s-d, новые "магические функции" в официальный компилятор добавляться не будут как минимум до версии 4:
About the request of adding more magic compiler functions to MP, as I stated in other forum replies, I do not agree with that. It's not convenient to add too much magic functions to a compiler, it's better to extend the external RTL (as Delphi, FreePascal and other compilers do). The compiler is a translator that should be the smallest, quickest and simplest possible. And, the most important thing in this case, MP3 compiler is just suppossed to be mantained only until a full pascal MP4 got released, so extending it too much is pointless.
Пример программы, использующей часть функциональности:
Стрелки\цифры\основное клавиатурное устройство ввода - перемещать круг по экрану.
Указатель\мышь - рисование линий.
Круг стирает следы кисти, находящиеся непосредственно под ним.
program MPplusDemo;

const
  
color1 = $404040;
  
color2 $FFCC00;

var 
kpauseinteger;
  
cbImage;
  
circleXcircleYinteger;
  
pPointerXpPointerYinteger;
  
wasPointerPressedboolean;
  
cxcycsinteger// переменные символа

begin
  
// Нехитрый способ вычисления паузы между перерисовками:
  
setColorHex(0);
  
fillRect(00getWidthgetHeight);
  
pause := getRelativeTimeMs;
  
rePaint;
  
pause := 32 - (getRelativeTimeMs pause);
  
debug('Pause set to ' pause);
  
// Инициализируем изображения:
  
:= imageFromCanvas(00getWidthgetHeight); // Создаем буффер
  
:= imageOfCanvas// Заносим указатель на полотно в переменную
  // Определяем размеры и положение символа:
  
if getWidth getHeight then cs := getHeight else cs := getWidth;
  
cx := (getWidth cs) / 2;
  
cy := (getHeight cs) / 2;
  
// Перезначаем вывод в буффер:
  
imageAsCanvas(b);
    
// Фон:
    
setColorHex(color1);
    
fillRect(00getWidthgetHeight);
    
// Основной круг:
    
setColorHex(color2);
    
fillEllipse(cxcycscs);
    
// Удаляем центр круга:
    
setColorHex(color1);
    
fillEllipse(cx cs 6cy cs 6cs 2/3cs 2/3);
    
// Удаляем полосы из круга:
    
for := 1 to 6 do fillArc(cxcycscs60 1020);
  
// Переназначаем вывод обратно на полотно:
  
imageAsCanvas(c);
  
// Задаем начальные координаты круга-курсора:
  
circleX := getWidth 2;
  
circleY := getHeight 2;
  
repeat
    
// Вывод в изображение-буффер:
    
imageAsCanvas(b);
      
// Если зажат указатель:
      
if isPointerPressed then begin
        setColorHex
(color2);
        
// Если был нажат прошлый кадр, рисуем линию:
        
if wasPointerPressed then
          drawLine
(pPointerXpPointerYgetPointerXgetPointerY);
        
// Запоминаем текущие (а в следующем кадре - прошлые) координаты:
        
pPointerX := getPointerX;
        
pPointerY := getPointerY;
      
end;
      
// Запоминаем, был ли нажат указатель:
      
wasPointerPressed := isPointerPressed;
      
// Стираем область под кружком:
      
setColorHex(color1);
      
fillEllipse(circleX 11circleY 112121);
    
// Переключаем вывод обратно на полотно:
    
imageAsCanvas(c);
    
// Рисуем изображение-буффер:
    
drawImage(b00);
    
// Рисуем круг:
    
setColorHex(color2);
    
fillEllipse(circleX 10circleY 101919);
    
rePaint;
    
// Перемещение круга:
    
:= getKeyStates;
    if (
and vk_up) > 0 then circleY := circleY 4;
    if (
and vk_down) > 0 then circleY := circleY 4;
    if (
and vk_left) > 0 then circleX := circleX 4;
    if (
and vk_right) > 0 then circleX := circleX 4;
    
// Ожидание следующего кадра:
    
if pause 0 then delay(pause);
  
forever;
end

В текущих планах - добавить функции для манипуляций над массивами и изображениями.

Комментарии, идеи, и рапорты недочетов (созданных мной) приветствуются.
Хорошего дня.
__________________

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

Последний раз редактировалось YellowAfterlife, 29.06.2011 в 03:52.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
blackman (29.06.2011), Igor (30.06.2011)