forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Разработка MIDlet Pascal (http://forum.boolean.name/forumdisplay.php?f=127)
-   -   MP3CC [+x] - "Пользовательская модификация" компилятора (http://forum.boolean.name/showthread.php?t=15021)

YellowAfterlife 29.06.2011 02:33

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.
Пример программы, использующей часть функциональности:
Стрелки\цифры\основное клавиатурное устройство ввода - перемещать круг по экрану.
Указатель\мышь - рисование линий.
Круг стирает следы кисти, находящиеся непосредственно под ним.
PHP код:

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


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

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

cherepets 30.06.2011 01:48

Ответ: MP3CC [+x] - "Пользовательская модификация" компилятора
 
Хм, родная поддержка сенсора - хорошо. Попробую в ближайшие дни -)

Igor 30.06.2011 09:45

Ответ: MP3CC [+x] - "Пользовательская модификация" компилятора
 
можно ли создавать неквадратные массивы? А то неудобно...
В МР2.02 приходится создавать тип - массив, а потом массив данных этого типа.

YellowAfterlife 30.06.2011 10:22

Ответ: MP3CC [+x] - "Пользовательская модификация" компилятора
 
Цитата:

Сообщение от Igor (Сообщение 193757)
можно ли создавать неквадратные массивы? А то неудобно...
В МР2.02 приходится создавать тип - массив, а потом массив данных этого типа.

Насколько я помню, этот баг был исправлен еще в первых релизах 3.0 версии.
PHP код:

program notsquare;
var
  
int: array[0..30..7of integer;
  
img: array[0..30..7of image;
begin
  int
[37] := 7;
  
img[37] := loadImage('/icon.png');
  
debug('ImageWidth: ' getImageWidth(img[37]) + '; Seven: ' int[37]);
  
delay(4000);
end


Zorba 09.08.2011 18:49

Ответ: MP3CC [+x] - "Пользовательская модификация" компилятора
 
YellowAfterlife не подскажешь почему компилятор MP3 выдает ошибку при добавлении нескольких библиотек в проект?


Часовой пояс GMT +4, время: 17:26.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot