AMPASIDE / ANPASIDE — IDE для MIDletPascal 4.10.2026 / 10:59 | | GOAR  Пользователь
Сейчас: Offline
Имя: Николай Николаевич Откуда: Одесса, Украина Регистрация: 29.11.2014
| Потестил, полет нормальный, ,редактор откликается норм, тип record те пихай куда хотишь все гуд. Компиляция мгновенная практически, даже модуль mobs теперь не почем) Установка на планшет андроид 7 работает, только правда падает производительность, но это скорее дело в планшете, или я с машьабированием что-то намутил А так как по мне очень годно! Мож выкладывать P.s а когда case будет?  Изменено GOAR (4.10 / 11:01) (всего 1 раз) |
4.10.2026 / 15:58 | | Helltar  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| GOAR, case готов, вышло в 2.5.0: селектор - integer, char или string. метки - числа, символы, строки и именованные константы (в т.ч. из юнитов), можно списком через запятую и диапазоном. в ветке один оператор или begin..end: key := getKeyClicked;
case key of
KE_KEY2: y := y - 1;
KE_KEY8: y := y + 1;
// несколько меток на одну ветку
KE_KEY4, KE_KEY6: x := x + key - KE_KEY5;
// несколько операторов - через begin..end
KE_KEY5:
begin
drawText('hello', 10, 10);
repaint;
end;
// пустая ветка
KE_STAR: ;
// диапазон, границы включены
0..31: delay(50);
else
// если ничего не совпало
x := 0;
y := 0;
end;
по строкам и символам тоже работает: case name of
'left', 'l': dx := -1;
'right': dx := 1;
end;
case c of
'a', 'e', 'i', 'o', 'u': kind := 1;
'0'..'9': kind := 2;
#32: kind := 3;
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): case n of
1: if ok then go;
else stop; // это else от case, а не от if
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  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| |
4.10.2026 / 18:36 | | GOAR  Пользователь
Сейчас: Offline
Имя: Николай Николаевич Откуда: Одесса, Украина Регистрация: 29.11.2014
| Наконец, ПК версией не думаешь заниматься?)
|
4.10.2026 / 18:39 | | GOAR  Пользователь
Сейчас: Offline
Имя: Николай Николаевич Откуда: Одесса, Украина Регистрация: 29.11.2014
| Ещё просьба , не горит особо, в следующих обновлениях, добавь возможность устанавливать пробелы в версии сборки чтоб не только целое число , а и "1.05", знаю это не начто не влияет, но было бы не плоха. Или что автоматически поднималась версии , при каждой новой сборке в апк то ли мидлета  |
18.10.2026 / 20:16 | | Helltar  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| Цитата 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  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| В 2.5.2 в ANPASIDE встроена библиотека Touch, класть ничего в libs/ не нужно: program buttons;
uses Touch;
var
w, h, x, y, vy, floor: integer;
begin
Touch.Init;
w := GetWidth;
h := GetHeight;
floor := h - 120;
x := w div 2;
y := floor;
vy := 0;
repeat
// каждая кнопка держится своим пальцем, независимо от остальных
if touch_area(0, h - 80, 80, 80) > 0 then x := x - 4;
if touch_area(90, h - 80, 80, 80) > 0 then x := x + 4;
if (touch_area(w - 80, h - 80, 80, 80) > 0) and (y = floor) then vy := -15;
y := y + vy;
vy := vy + 1;
if y >= floor then
begin
y := floor;
vy := 0;
end;
SetColor(0, 0, 0);
FillRect(0, 0, w, h);
SetColor(255, 255, 255);
FillRect(x, y - 40, 20, 40);
DrawRect(0, h - 80, 80, 80);
DrawRect(90, h - 80, 80, 80);
DrawRect(w - 80, h - 80, 80, 80);
Repaint;
Delay(20);
until false;
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пальцы и тапы: program taps;
uses Touch;
var
i, taps: integer;
begin
Touch.Init;
taps := 0;
repeat
for i := 0 to 9 do
if touch_pressed(i) = 1 then taps := taps + 1;
SetColor(0, 0, 0);
FillRect(0, 0, GetWidth, GetHeight);
SetColor(255, 200, 0);
for i := 0 to 9 do
if touch_down(i) = 1 then FillRect(touch_x(i) - 10, touch_y(i) - 10, 20, 20);
SetColor(255, 255, 255);
DrawText('fingers: ' + IntegerToString(touch_count) + ' taps: ' + IntegerToString(taps), 4, 4);
Repaint;
Delay(20);
until false;
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  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| GOAR, по SandCraft: идти и прыгать одновременно не получится даже с Touch, потому что k_tap возвращает одну кнопку на кадр, а senhandler обрабатывает только ее. что поменять: 1) uses Sensor -> uses Touch, Sensor.Init -> Touch.Init. Lib_sensor.class из libs/ можно убрать 2) tap - любой палец, а не только первый: function tap(x, y, w, h: integer): boolean;
begin
Result := touch_area(x, y, w, h) > 0;
end;
3) кнопки читать каждую отдельно, а не одним кодом из k_tap, и обрабатывать независимо: left := tap(5, sh - kw * 2, kw, kh);
right := tap(5 + kw * 2, sh - kw * 2, kw, kh);
jump := tap(sw - 15 - kw, sh - kw * 2 - 15, kw, kh);
if right then ...
if left then ...
if jump then ...
в collblock то же самое: вместо k_tap = 2 и k_tap = 8 - jump и down 4) cli. сейчас click сбрасывается, только когда с экрана убраны все пальцы, поэтому пока держишь ходьбу, по поясу кликнешь один раз. лучше смотреть касания этого кадра: var
tapped: array[0..9] of boolean;
// один раз в начале кадра, до меню, инвентаря и пояса
procedure read_taps;
var
i: integer;
begin
for i := 0 to 9 do
tapped[i] := touch_pressed(i) = 1;
end;
// клик: палец коснулся в этом кадре внутри прямоугольника
function cli(x, y, w, h: integer): boolean;
var
i: integer;
begin
Result := false;
for i := 0 to 9 do
if tapped[i] and (touch_x(i) >= x) and (touch_x(i) < x + w)
and (touch_y(i) >= y) and (touch_y(i) < y + h) then
Result := true;
end;
снимок нужен потому, что touch_pressed сбрасывает отметку при чтении - без него второй cli за кадр этот тап уже не увидит 5) тап по миру (курсор блока) сейчас берет pointer_pressed_x/y, а это первый палец. если им держишь ходьбу, курсор встанет на кнопку. брать нужно палец, который не на кнопке: // палец для тапа по миру: на экране и не на кнопке, -1 если такого нет
function world_finger: integer;
var
i: integer;
begin
Result := -1;
for i := 0 to 9 do
if (touch_down(i) = 1) and not on_button(touch_x(i), touch_y(i)) then
Result := i;
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  Пользователь
Сейчас: Offline
Регистрация: 29.11.2011
| |
19.10.2026 / 01:06 | | GOAR  Пользователь
Сейчас: Offline
Имя: Николай Николаевич Откуда: Одесса, Украина Регистрация: 29.11.2014
| Helltar, а я уже аналоговый стик запил, пока обнова вышла, ну ниче, будет два типа управления)) Мой код тебя не ужаснул  ? Если не сложно кинь мне исходники, пересобраного проэкта, нашел баг в твоей пересборке, блоки ламаются только кнопкой  Изменено GOAR (19.10 / 01:11) (всего 1 раз) |
 Всего сообщений: 628 Фильтровать сообщения
Поиск по теме
Файлы топика (28)
|