User Tag List

Страница 38 из 54 ПерваяПервая ... 343536373839404142 ... ПоследняяПоследняя
Показано с 371 по 380 из 531

Тема: ZX Like Pascal

  1. #371
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, встроенная функция, дающая два кода клавиш, как-то не очень подходит для игр. Нажав диагональ и огонь - это уже три кнопки. Да и опрашивать каждый раз каждую клавишу клавиатуры, шифровка в две позиции. Потом расшифровка этих позиций... слишком много траты проц времени. Сейчас напишу альтернативный клавиатурный опросник.

    - - - Добавлено - - -

    Код:
    KEY_1	EQU 0FEF7H
    KEY_2	EQU 0FDF7H
    KEY_3	EQU 0FBF7H
    KEY_4	EQU 0F7F7H
    KEY_5	EQU 0EFF7H
    KEY_0	EQU 0FEEFH
    KEY_9	EQU 0FDEFH
    KEY_8	EQU 0FBEFH
    KEY_7	EQU 0F7EFH
    KEY_6	EQU 0EFEFH
    KEY_Q	EQU 0FEFBH
    KEY_W	EQU 0FDFBH
    KEY_E	EQU 0FBFBH
    KEY_R	EQU 0F7FBH
    KEY_T	EQU 0EFFBH
    KEY_P	EQU 0FEDFH
    KEY_O	EQU 0FDDFH
    KEY_I	EQU 0FBDFH
    KEY_U	EQU 0F7DFH
    KEY_Y	EQU 0EFDFH
    KEY_A	EQU 0FEFDH
    KEY_S	EQU 0FDFDH
    KEY_D	EQU 0FBFDH
    KEY_F	EQU 0F7FDH
    KEY_G	EQU 0EFFDH
    KEY_EN	EQU 0FEBFH
    KEY_L	EQU 0FDBFH
    KEY_K	EQU 0FBBFH
    KEY_J	EQU 0F7BFH
    KEY_H	EQU 0EFBFH
    KEY_CS	EQU 0FEFEH
    KEY_Z	EQU 0FDFEH
    KEY_X	EQU 0FBFEH
    KEY_C	EQU 0F7FEH
    KEY_V	EQU 0EFFEH
    KEY_SP	EQU 0FE7FH
    KEY_SS	EQU 0FD7FH
    KEY_M	EQU 0FB7FH
    KEY_N	EQU 0F77FH
    KEY_B	EQU 0EF7FH
    
    KEYTEST
    	pop hl
    	inc hl
    	ld a,(hl)
    	inc hl
    	in a,(0feh)
    	or (hl)
    	inc hl
    	inc a
    	RLCA
    	AND 1
    	ld (_KEYPRESSED),a
    	jp (hl)
    
    _KEYPRESSED defw 0
    использовать нужно так(проверка пробела):
    asm(keytest)
    asm(key_sp);
    if keypressed<>0 then game_state:=1;

    Именно два вызова подряд. Второй вызов это не вызов, а передача константы.
    Переменная keypressed возвращает 0-не нажато или 1-нажато.

    - - - Добавлено - - -

    На счёт проверки коллизий, тоже есть идея, как сделать это проще. Завести матрицу 32 на 16, и там хранить номер объекта, и нужно-ли очистить это знакоместо. Две проблемы сразу решатся.

    Завтра попробую написать.
    Последний раз редактировалось Reobne; 27.10.2019 в 20:28. Причина: Подправил код

  2. Этот пользователь поблагодарил Reobne за это полезное сообщение:

    ALKO (26.10.2019)

  3. #372
    Guru Аватар для ALKO
    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    2,259
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    183
    Поблагодарили
    86 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Неплохо. Но для диагональных перемещений высокоуровневые IF-ы всё равно нужны.
    Проверить клавишу то я проверю, но ведь там отличается затирание следа атрибутами при том или ином направлении.
    А если делать выше указанным методом, то персонаж будет летать ступеньками, а не диагоналями. То бишь вложенные IF-ы таки нужны.

    - - - Добавлено - - -

    Процедура затирания следа от персонажа усложняется ещё тем, что сам персонаж не все знакоместа отведённого ректангла использует (в виду экономии памяти и скорости обновления).

  4. #373
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Писал-писал, но не дописал.
    Написал процентов 80. Конец уже виден.
    Вечером постараюсь выкроить ещё время.

    Стараюсь добавлять комментарии. Патчу встроенные процедуры. (Возможности написать свою библиотеку, аналогичную встроенной, сильно не хватает.) Процесс идёт...

  5. #374
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Закончил писать, начал отлаживать.
    И сразу заметил, что клавиатурный проверятель работает не совсем удобно, ноль правильно выдаёт, когда не нажато, а когда нажато - всякий разный неноль. А хотелось-бы чтобы именно 1. Исправил

  6. #375
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ALKO, Доотлаживал, добился что прога запустилась. Прислал по почте.

    Andrew771, Пока отлаживал, заметил, что иногда оптимизатор LikePascal-я влияет на логику. Когда результат работы с однобайтовой переменной остаётся двубайтовый в HL. При переполнении старший байт изменяется, естественно не сохраняется в ячейке переменной, но используется в следующих операциях.

    Как илюстрация, иногда этот IF сработает:
    byte1:=byte1-dby;
    if byte1=65535 then

    Когда команды идут сподряд. А если их разбить, вставив между ними что нибудь, то уже не сработает. Так как произойдёт повторная загрузка из ячейки byte1, с обнулением старшего байта. И тут уже нужно сравнивать с 255.

  7. Этот пользователь поблагодарил Reobne за это полезное сообщение:

    ALKO (28.10.2019)

  8. #376
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если переменная однобайтовая, то зачем ее сравнивать с 65535? Я в инструкции к Паскалю написал, что за типами переменных следит программист. Проверки на типы и выходы из диапазона не стал делать, чтобы не замедлять и не разрастать код.

  9. #376
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  10. #377
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Если переменная однобайтовая, то зачем ее сравнивать с 65535?
    Для илюстрации.
    Переменная равна 255, но сравнивать её с 255 бесполезно.
    Перечитай моё сообщение внимательнее.
    За переполнением мы прекрасно следим, и знаем что у нас, при отнимании 1 от нуля должно получиться 255.

  11. #378
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Переменная равна 255, но сравнивать её с 255 бесполезно.
    Ты писал про 65535, а не 255. С 255 нормально сравнится.

    Цитата Сообщение от Reobne Посмотреть сообщение
    За переполнением мы прекрасно следим, и знаем что у нас, при отнимании 1 от нуля должно получиться 255.
    Отрицательные числа этим Паскалем сейчас не поддерживаются, так что лучше не получать заведомо отрицательные числа. Про переполнение думаю в будущей версии, чтоб было, как правильно (0-1=255).

  12. #379
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Andrew771, он вот про что:
    Код:
    byte1:=byte1-dby;
    переменная типа byte, в ней значение 0...255, даже если ушли в минус
    Код:
    if byte1=65535 then
    значение типа byte никогда не будет равно 65535, но результат сравнения при определённых условиях всё-таки true из-за оптимизаций в компиляторе.

    - - - Добавлено - - -

    Reobne, может и мою поделку потестируешь?

    - - - Добавлено - - -

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Отрицательные числа этим Паскалем сейчас не поддерживаются, так что лучше не получать заведомо отрицательные числа.
    Поделюсь проблемой, с которой можешь столкнуться в отрицательных числах.
    Код:
    var x,y:longword;
    begin
       x:=0;
       if (x-1)=$FFFFFFFF then ...
       y:=$FFFFFFFF;
       if (y-1)=$FFFFFFFE then ...
    end.
    Попробуй представить ассемблерный код, который учтёт, что X-1=-1 и это -1 не равно $FFFFFFFF, а вот Y-1 всё-таки равно $FFFFFFFE.

  13. #380
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,046
    Спасибо Благодарностей отдано 
    990
    Спасибо Благодарностей получено 
    246
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Попробуй представить ассемблерный код, который учтёт, что X-1=-1 и это -1 не равно $FFFFFFFF, а вот Y-1 всё-таки равно $FFFFFFFE
    Это будет уже больше чем Паскаль. В обычном Паскале к этому относились проще. Хотя это позорная неоднозначность, заставляет программиста делать эксперименты, чтобы проверить как именно работает конкретный компилятор. Если он будет вычислять в 32битной арифметике, то результат один, а если приведёт всё к 64-битным числам, то другой.
    А ты хочешь сделать действительно математический Паскаль. Такой Паскаль должен решать эту проблему на этапе компиляции. Он должен действительно понимать, что такое типы, и каковы их интервалы с математической точки зрения. По идее он должен воспринимать какие угодно большие константы. byte должен быть интервальным типом 0..255, shortint = (-128..127), и так далее.
    Такой компилятор, на этапе компиляции поймёт, что в результате вычисления (x-1) получатся числа в интервале -1..$fffffffe, и это число будет заведомо не равно $ffffffff, а значит, такой IF вообще можно не кодировать.
    Такой компилятор, также в принципе правильно обработает условие x<834658348562893465823648526348956328465893648563 48. Хотя нет фиксированного типа, в котором можно было-бы сохранить такую константу, но на этапе компиляции видно, что условие будет выполнено всегда.
    Последний раз редактировалось Reobne; 28.10.2019 в 17:51.

Страница 38 из 54 ПерваяПервая ... 343536373839404142 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. PASCAL + MACRO11 (УКНЦ-ДВК).
    от hobot в разделе ДВК, УКНЦ
    Ответов: 341
    Последнее: 15.01.2022, 17:30
  2. Turbo Pascal для msx/msx2
    от Оззя в разделе MSX
    Ответов: 4
    Последнее: 23.02.2020, 23:59
  3. в розыске дисковая версия Pascal.
    от goblinish в разделе Программирование
    Ответов: 18
    Последнее: 16.08.2011, 16:30
  4. Pascal
    от Andrew771 в разделе Программирование
    Ответов: 22
    Последнее: 24.05.2011, 21:20
  5. Скопировать/вставить из/в HiSoft Pascal в эмуляторе
    от kit в разделе Программирование
    Ответов: 1
    Последнее: 05.02.2010, 15:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •