Вниз  AMPASIDE / ANPASIDE — IDE для MIDletPascal
- 4.10.2026 / 10:59
GOAR
  Пользователь

GOAR 
Сейчас: Offline
Потестил, полет нормальный,
,редактор откликается норм, тип record те пихай куда хотишь все гуд.
Компиляция мгновенная практически, даже модуль mobs теперь не почем)

Установка на планшет андроид 7 работает, только правда падает производительность, но это скорее дело в планшете, или я с машьабированием что-то намутил :gg:

А так как по мне очень годно! :gg:
Мож выкладывать :)

P.s а когда case будет? :gg:

Изменено GOAR (4.10 / 11:01) (всего 1 раз)
- 4.10.2026 / 15:58
Helltar
  Пользователь

Helltar 
Сейчас: Offline
GOAR, case готов, вышло в 2.5.0:

селектор - integer, char или string. метки - числа, символы, строки и именованные константы (в т.ч. из юнитов), можно списком через запятую и диапазоном. в ветке один оператор или begin..end:

  1. key := getKeyClicked;
  2.  
  3. case key of
  4.   KE_KEY2: y := y - 1;
  5.   KE_KEY8: y := y + 1;
  6.  
  7.   // несколько меток на одну ветку
  8.   KE_KEY4, KE_KEY6: x := x + key - KE_KEY5;
  9.  
  10.   // несколько операторов - через begin..end
  11.   KE_KEY5:
  12.     begin
  13.       drawText('hello', 10, 10);
  14.       repaint;
  15.     end;
  16.  
  17.   // пустая ветка
  18.   KE_STAR: ;
  19.  
  20.   // диапазон, границы включены
  21.   0..31: delay(50);
  22.  
  23. else
  24.   // если ничего не совпало
  25.   x := 0;
  26.   y := 0;
  27. end;

по строкам и символам тоже работает:

  1. case name of
  2.   'left', 'l': dx := -1;
  3.   'right': dx := 1;
  4. end;
  5.  
  6. case c of
  7.   'a', 'e', 'i', 'o', 'u': kind := 1;
  8.   '0'..'9': kind := 2;
  9.   #32: kind := 3;
  10. end;

что нужно знать:

1) метка - только константа, переменную туда нельзя (ошибка E410)
2) в else можно писать сколько угодно операторов до end, без begin..end
3) срабатывает первая совпавшая ветка, в следующую ничего не проваливается. если ничего не совпало и else нет - ничего не происходит
4) повтор метки или пересечение диапазонов - ошибка компиляции E465 duplicate case label
5) вложенные case, break и exit внутри ветки работают. break выходит из цикла, в котором стоит case
6) строки сравниваются с учетом регистра, как и через =

один нюанс с if внутри ветки: else после ; относится к case, а не к if (как в turbo pascal):

  1. case n of
  2.   1: if ok then go;
  3.   else stop; // это else от case, а не от if
  4. end;

в 2.5.0 также вошло все из прошлой тестовой сборки: новый редактор, record в разных модулях, быстрая компиляция больших модулей, apk под android 7

описание case с примерами в доке: https://helltar.com/midletpascal/#statements

Изменено Helltar (4.10 / 16:01) (всего 1 раз)
- 4.10.2026 / 15:58
Helltar
  Пользователь

Helltar 
Сейчас: Offline
- 4.10.2026 / 18:36
GOAR
  Пользователь

GOAR 
Сейчас: Offline
Наконец, ПК версией не думаешь заниматься?)
- 4.10.2026 / 18:39
GOAR
  Пользователь

GOAR 
Сейчас: Offline
Ещё просьба , не горит особо, в следующих обновлениях, добавь возможность устанавливать пробелы в версии сборки чтоб не только целое число , а и "1.05", знаю это не начто не влияет, но было бы не плоха.
  Или что автоматически поднималась версии , при каждой новой сборке в апк то ли мидлета :)
- 18.10.2026 / 20:16
Helltar
  Пользователь

Helltar 
Сейчас: Offline
Цитата GOAR:
Ещё просьба , не горит особо, в следующих обновлениях, добавь возможность устанавливать пробелы в версии сборки чтоб не только целое число , а и "1.05", знаю это не начто не влияет, но было

дробную версию пиши в MIDlet-Version (MANIFEST.MF), например 1.05 - она же попадает в apk как versionName, ее андроид и показывает. version code в настройках apk - только целое число, так у андроида устроено, по нему он решает, что новее при обновлении

если version code оставить пустым, он считается из MIDlet-Version сам: 1.05 -> 10500, 1.2 -> 10200, 1.10 -> 11000. то есть хватит поднимать только MIDlet-Version. одно но: 1.2 считается меньше, чем 1.05 (05 читается как 5), так что либо 1.20, либо по порядку 1.1, 1.2 ... 1.10
- 18.10.2026 / 20:27
Helltar
  Пользователь

Helltar 
Сейчас: Offline
В 2.5.2 в ANPASIDE встроена библиотека Touch, класть ничего в libs/ не нужно:

  1. program buttons;
  2.  
  3. uses Touch;
  4.  
  5. var
  6.   w, h, x, y, vy, floor: integer;
  7.  
  8. begin
  9.   Touch.Init;
  10.  
  11.   w := GetWidth;
  12.   h := GetHeight;
  13.   floor := h - 120;
  14.   x := w div 2;
  15.   y := floor;
  16.   vy := 0;
  17.  
  18.   repeat
  19.     // каждая кнопка держится своим пальцем, независимо от остальных
  20.     if touch_area(0, h - 80, 80, 80) > 0 then x := x - 4;
  21.     if touch_area(90, h - 80, 80, 80) > 0 then x := x + 4;
  22.     if (touch_area(w - 80, h - 80, 80, 80) > 0) and (y = floor) then vy := -15;
  23.  
  24.     y := y + vy;
  25.     vy := vy + 1;
  26.  
  27.     if y >= floor then
  28.     begin
  29.       y := floor;
  30.       vy := 0;
  31.     end;
  32.  
  33.     SetColor(0, 0, 0);
  34.     FillRect(0, 0, w, h);
  35.     SetColor(255, 255, 255);
  36.     FillRect(x, y - 40, 20, 40);
  37.     DrawRect(0, h - 80, 80, 80);
  38.     DrawRect(90, h - 80, 80, 80);
  39.     DrawRect(w - 80, h - 80, 80, 80);
  40.     Repaint;
  41.     Delay(20);
  42.   until false;
  43. end.

палец - номер от 0 до 9: 0 - первый коснувшийся, следующий получает наименьший свободный номер.

1) touch_count - сколько пальцев сейчас на экране
2) touch_down(n) - 1, пока палец n на экране
3) touch_x(n), touch_y(n) - последняя позиция пальца, после отпускания остается где был
4) touch_pressed(n) - 1, если палец n коснулся экрана с прошлого вызова для него. короткий тап между кадрами не теряется
5) touch_released(n) - то же самое для отпускания
6) touch_area(x, y, w, h) - сколько пальцев внутри прямоугольника. кнопка зажата, пока больше 0, каким бы пальцем ее ни держали

все функции lib_sensor тоже есть, с теми же именами, они следят за первым пальцем. чтобы перейти с Sensor, хватит заменить uses Sensor на uses Touch и Sensor.Init на Touch.Init

пальцы и тапы:

  1. program taps;
  2.  
  3. uses Touch;
  4.  
  5. var
  6.   i, taps: integer;
  7.  
  8. begin
  9.   Touch.Init;
  10.   taps := 0;
  11.  
  12.   repeat
  13.     for i := 0 to 9 do
  14.       if touch_pressed(i) = 1 then taps := taps + 1;
  15.  
  16.     SetColor(0, 0, 0);
  17.     FillRect(0, 0, GetWidth, GetHeight);
  18.     SetColor(255, 200, 0);
  19.  
  20.     for i := 0 to 9 do
  21.       if touch_down(i) = 1 then FillRect(touch_x(i) - 10, touch_y(i) - 10, 20, 20);
  22.  
  23.     SetColor(255, 255, 255);
  24.     DrawText('fingers: ' + IntegerToString(touch_count) + ' taps: ' + IntegerToString(taps), 4, 4);
  25.     Repaint;
  26.     Delay(20);
  27.   until false;
  28. end.

что нужно знать:

1) когда проект использует Touch, IDE сама добавляет в манифест Nokia-UI-Enhancement: EnableMultiPointTouchEvents - без этого второй палец до мидлета не доходит
2) номер пальца берется через nokia-свойство com.nokia.pointer.number, так что jar работает и в J2ME Loader. на телефоне без мультитача все касания - палец 0, и Touch работает как Sensor
3) если в libs/ проекта лежит свой Lib_touch.class, берется он, а не встроенный

еще два исправления в эмуляторе и экспорте apk:

1) палец, отпущенный за краем экрана или перехваченный системным жестом, больше не залипает нажатым
2) в экспортированном apk картинка больше не обрезается снизу. мидлет запускался до того, как пряталась панель навигации, и буфер экрана создавался по высоте без нее, а потом экран вырастал - так обрезалась клавиатура в SandCraft. касалось любой программы на MIDletPascal, чинится пересборкой apk в новой версии
- 18.10.2026 / 20:39
Helltar
  Пользователь

Helltar 
Сейчас: Offline
GOAR, по SandCraft: идти и прыгать одновременно не получится даже с Touch, потому что k_tap возвращает одну кнопку на кадр, а senhandler обрабатывает только ее. что поменять:

1) uses Sensor -> uses Touch, Sensor.Init -> Touch.Init. Lib_sensor.class из libs/ можно убрать

2) tap - любой палец, а не только первый:

  1. function tap(x, y, w, h: integer): boolean;
  2. begin
  3.   Result := touch_area(x, y, w, h) > 0;
  4. end;

3) кнопки читать каждую отдельно, а не одним кодом из k_tap, и обрабатывать независимо:

  1. left := tap(5, sh - kw * 2, kw, kh);
  2. right := tap(5 + kw * 2, sh - kw * 2, kw, kh);
  3. jump := tap(sw - 15 - kw, sh - kw * 2 - 15, kw, kh);
  4.  
  5. if right then ...
  6. if left then ...
  7. if jump then ...

в collblock то же самое: вместо k_tap = 2 и k_tap = 8 - jump и down

4) cli. сейчас click сбрасывается, только когда с экрана убраны все пальцы, поэтому пока держишь ходьбу, по поясу кликнешь один раз. лучше смотреть касания этого кадра:

  1. var
  2.   tapped: array[0..9] of boolean;
  3.  
  4. // один раз в начале кадра, до меню, инвентаря и пояса
  5. procedure read_taps;
  6. var
  7.   i: integer;
  8.  
  9. begin
  10.   for i := 0 to 9 do
  11.     tapped[i] := touch_pressed(i) = 1;
  12. end;
  13.  
  14. // клик: палец коснулся в этом кадре внутри прямоугольника
  15. function cli(x, y, w, h: integer): boolean;
  16. var
  17.   i: integer;
  18.  
  19. begin
  20.   Result := false;
  21.  
  22.   for i := 0 to 9 do
  23.     if tapped[i] and (touch_x(i) >= x) and (touch_x(i) < x + w)
  24.       and (touch_y(i) >= y) and (touch_y(i) < y + h) then
  25.       Result := true;
  26. end;

снимок нужен потому, что touch_pressed сбрасывает отметку при чтении - без него второй cli за кадр этот тап уже не увидит

5) тап по миру (курсор блока) сейчас берет pointer_pressed_x/y, а это первый палец. если им держишь ходьбу, курсор встанет на кнопку. брать нужно палец, который не на кнопке:

  1. // палец для тапа по миру: на экране и не на кнопке, -1 если такого нет
  2. function world_finger: integer;
  3. var
  4.   i: integer;
  5.  
  6. begin
  7.   Result := -1;
  8.  
  9.   for i := 0 to 9 do
  10.     if (touch_down(i) = 1) and not on_button(touch_x(i), touch_y(i)) then
  11.       Result := i;
  12. end;

on_button - твоя проверка, что точка попала на какую-то из кнопок управления

6) Menu в правом верхнем углу на Pixel 9 срезается скругленным углом экрана (радиус 132 px), отодвинь его от края хотя бы на 40 px

и apk надо будет пересобрать в новой версии, тогда пропадет обрезка снизу. идею я проверил на твоем apk, пропатчив байткод (k_tap, tap и senhandler) - ходьба с прыжком работает, но это костыль, в исходнике лучше сделать нормально

- https://helltar.com/tmp/SandCraft-multitouch-fit.apk
- 18.10.2026 / 20:41
Helltar
  Пользователь

Helltar 
Сейчас: Offline
- 19.10.2026 / 01:06
GOAR
  Пользователь

GOAR 
Сейчас: Offline
Helltar, а я уже аналоговый стик запил, пока обнова вышла, ну ниче, будет два типа управления))
Мой код тебя не ужаснул :gg: ?
Если не сложно кинь мне исходники, пересобраного проэкта, нашел баг в твоей пересборке, блоки ламаются только кнопкой :gg:

Изменено GOAR (19.10 / 01:11) (всего 1 раз)
Наверх  Всего сообщений: 628
Фильтровать сообщения
Поиск по теме
Файлы топика (28)