С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
ivagor, это всё ещё сырая альфа, и робот там полупрозрачный, и NPC ещё нет пока. Планов громадьё, но сейчас я really хочу чуть-чуть отдохнутьЧуть офигевший от перетолмачивания графики. Сборка, которая пошла в 0.65a была собрана буквально сегодня. Буду несказанно рад, если походишь, побродишь, меня самого там несколько моментов достаёт: в частности - очень много труб на которые надо запрыгивать IMHO. В общем, игровой процесс там всё ещё далеко несбалансирован, потому, что весь мой пар пошёл на антураж и скорость рендеринга. Рано наверное запулять в ютубу. Но когда-то мы доберёмся до заветной версии 1.0b
С Наступающим тебя!
PS. Демо-режим сделаю![]()
"... жизнь удалась, если найдётся кто-нибудь, кто заберёт с помойки твои книги и инструменты, когда ты умрёшь". (c) marta_ketro
Любой компьютер, в котором стоят резисторы, компьютером может называться с натяжкой. (с) Д. Михайлов
Ждем авторского демо-режима.
PPC, а ты коллизии спрайтов с тайлами и с другими спрайтами по координатам определяешь?
ivagor, а там пока только координаты ГГ проверяются, а что? На самом деле, алгоритм (но не имплементация!!!) примерно такой (по памяти): берётся текущая ширина ГГ в тайлах (движок считает эту величину переменной), и определяется координата центра спрайта в пикселах. Может попасть либо на границу тайлов из которых сделан спрайт, либо - на центр тайла (когда количество тайлов в спрайте - нечётное). К вычисленному в "экранных" координатах центру, прибавляются "физические" толщины ГГ в пикселах от центра, заданные в специальном файле-описателе параметров ГГ, и полученные величины превращаются в координаты в тайлах с округлением в большую сторону. Затем на тайловой карте производится проверка на попадания "граничных" тайлов ГГ на свободное (тайлы с величинами 0-0x7F) или занятое (0x80-0xFF) место. На самом деле, всё ешё сложнее, потому, что многие вещи не вычисляются каждый раз, а предкомпилированы, и код гонится по заранее известным веткам в зависимости от нажатых клавиш. Но на самом деле, всё ещё сложнее, потому, что во время прыжка или бега, алгоритм задаёт не единичные входы, и обсчёт движения за одно обновления экрана может включать несколько итераций. Как-то так. Если у тебя остался сырок, то вся эта байда происходит в файле vp.mac. Единственно, о чём надо помнить, что кроме соударений с препятствиями, на ГГ могут действовать и другие силы и они тоже обсчитываются там-же. Так сделана гравитация и также сделан эффект движения на платформе лифта.
Подскажите, здесь приведён пример с прерыванием и выводом графики. Вроде бы разобрался, даже будет работать, если в этот момент не спрайты рисуются. Но возникает вопрос. Если стек SP был на одном адресе, то при переходе на прерывание он уменьшается. Здесь где выделено, он уже уменьшенный и imm_sp он присваивается, уменьшенный, а не каким он был изначально. Ведь выход не RET, а JP. Значит он не увеличится сам. Как это понять? Не должен ли быть он между PUSH и POP?Код:;hl адрес спрайта Код: ;вот это вешаем на прерывание ISR_sub di ex (sp),hl ;обмениваем вершину стека и содержимое HL ld (imm_jp),hl pop hl ;заменяем испорченное слово спрайта push bc ;на текущее слово находящееся в BC ld (imm_sp),sp ld sp,ISR_sp ;здесь идет обработка прерывания ; ... ;---------------------------------- ld sp,$ imm_sp equ $-2 ei jp $ imm_jp equ $-2
И ещё,
это то же, что иКод:ld (imm_jp),hl jp $ imm_jp equ $-2
?Код:ld (imm_jp+1),hl imm_jp jp $
unreal
здесь похоже на ошибку.
оно должно выглядеть так
Код:;hl адрес спрайта Код: ;вот это вешаем на прерывание ISR_sub di ex (sp),hl ;обмениваем вершину стека и содержимое HL ld (imm_jp),hl pop hl ld (imm_sp),sp ;заменяем испорченное слово спрайта push bc ;на текущее слово находящееся в BC ld sp,ISR_sp ;здесь идет обработка прерывания ; ... ;---------------------------------- ld sp,$ imm_sp equ $-2 ei jp $ imm_jp equ $-2
С уважением,
Jerri / Red Triangle.
Код из Robotz 0.65a
Пояснения:
Assembler: Microsoft M80
ISR прерывает выполнение в multi bank mode: спрайты с 2-х байтными gaps в отдельном 64К банке с доступом стековыми операциями, операции память-память происходят в основной RAM
PGE_OFF - макро, выключающее банкинг и включающее 64K main RAM в адресное пространство 8080 на Векторе
XTB_SP - стек для ISR в основной памяти (предустановлен при настройке рендерера спрайтов)
XTB_RDM - слово-состояние порта 10h (банк со спрайтами, куда нужно переключиться по выходу из ISR, также предустановлено заранее)
Код:RamDrv EQU 10h PGE_SET Macro out RamDrv EndM PGE_OFF Macro xra a PGE_SET EndM ;=========================================== ; Tile Renderer Interrupt Service Routine ;------------------------------------------- ;INPUT: <BC> stack top restore value ;OUTPUT: none ;=========================================== IsrXTB: shld XTB_HL pop h shld XTB_RET push PSW lxi h,0 dad SP ; <CY> is FUBARed shld XTB_ESP PGE_OFF ; assumption is that XTB_SP is in main RAM bank DB (lxi SP) XTB_SP: DW 0 push d push b call SndCBH ; call sound/SFX callback hook with assumption ;PGE_OFF ; that SndCBH will set STACK access to main RAM pop b ; bank 0 on return (PgeRDM set satisfies this) pop d DB (mvi a) XTB_RDM:DB 0 PGE_SET DB (lxi sp) XTB_ESP:DW 0 ; entry stack pop PSW push b ; restore stack, corrupted by XTB_RET pop b ; using <BC> DB (lxi h) XTB_HL: DW 0 ei DB (jmp) XTB_RET:DW 0
Последний раз редактировалось PPC; 04.07.2021 в 15:43. Причина: Пояснения к значению XTB_RDM
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)