Важная информация

User Tag List

Страница 21 из 32 ПерваяПервая ... 171819202122232425 ... ПоследняяПоследняя
Показано с 201 по 210 из 317

Тема: Что нужно для написания игр ?

  1. #201

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение
    А что ? Танки мчатся - что еще надо ? Теперь можно думать, как с помощью них сценарий реализовать.
    Выше несколькими постами я добавил пример с исходником. Посмотри.

    В нём уже управление есть. Только вывод надо переделать с LDI на ОR, иначе не получится расталкивать танки корпусом... будет затираться столбец одного из танков.

    ---
    Посмотрел сорцы, отсечение по границе экрана вообще не так делается. Да и оно не нужно, т.к. я понял будет скролинг.
    Последний раз редактировалось drbars; 04.08.2013 в 17:09.

  2. #202

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от drbars Посмотреть сообщение
    Выше несколькими постами я добавил пример с исходником. Посмотри.

    В нём уже управление есть. Только вывод надо переделать с LDI на ОR, иначе не получится расталкивать танки корпусом... будет затираться столбец одного из танков.
    Програмка короткая. Значит рисовать будет медленно. Атрибуты для полного спрайта у меня также рисуются. Управление посмотрю. Спасибо.
    ---
    Посмотрел сорцы, отсечение по границе экрана вообще не так делается. Да и оно не нужно, т.к. я понял будет скролинг.
    Скроллинг будет для фона и танков. При этом цвета будут серыми. Но возможна ситуация, когда танк сам заезжает в окно. Для этого и нужна обрезка. А целые спрайты выводятся максмиально быстро с использованием указателя стека. Я сделал обрезку с помощью индексной адресации, так как в данном случае через стек преимуществ почти нет. Зато одна универсальная процедура для разных (четырех) вариантов обрезки по-горизонтали.
    Последний раз редактировалось zx-kit; 04.08.2013 в 17:27.
    "L-256"

  3. #203

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от drbars Посмотреть сообщение
    С уважением,
    Jerri / Red Triangle.

  4. #204

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение

    з - смещение в знакоместах (0-63)
    т - смещение в знакоместе (0-7) (фактически - величина скольжения спрайта)
    д - дробная часть необходимая для задания скорости движения

    зззззз тт т ддддддд

    если ты делаешь add #0080 то спрайт движется со скоростью 1 точка в цикл
    если add #0040 то 1 точка в 2 цикла
    Смещения в знакоместах и в знакоместе у меня пока в разных байтах. Вернее это проекции карты на окно. А вот глобальные коорднинаты наверно так надо сделать.

    ---------- Post added at 18:51 ---------- Previous post was at 18:44 ----------

    Цитата Сообщение от drbars Посмотреть сообщение
    Кстати я не совсем понял, зачем танчики выводить двумя процедурами. Я бы сделал одной процедурой по координатам (x,y). Так намного проще. Стек можно использовать для экранной таблицы. Зачем использовать стек где размер спрайта кратен 3 ? Скорость вывода спрайта нужно считать по самой медленной процедуре. Нет смысла сделать движение по X быстрее, чем по Y.
    Как показал Jerri, максимальная скорость загрузки спрайта из области спрайтов с помощью команд pop de. А дальше я раскидал по трем столбцам по 16 байтов. Я это сделал для печати целых спрайтов. Получилось быстро, хотя громоздко.

    Вот например как сделать чтобы танк буксовал на месте? Или например танк едет по вязкой поверхности? Во всех этих случаях должна быть анимация гусениц. Поскольку у нас фазы спрайтов связаны с анимацией этого нельзя добиться. Лучше всего хранить спрайт не сдвинутым, и доводить до нужно фазы согласно координаты Х. Это даст универсальность и больше физики.
    Буксование - это пока излишество. Если понадобится - сделаем потом...

    Такие игры, как например эта, пишутся по методу клеточного автомата.
    С движениями спрайтов проде пока все понятно. Теперь надо прорабатывать отслеживание игровой ситуации.

    Клеточный автомат - это сложно. Надо что-нибудь попроще. Пока прикидываю реакцию врагов как в DOOM2 - все стоят на месте, пока не увидят. А дальше все идут в бой.

    Каждый вражеский танк видит только спереди. При пересечении главным героем линии его обзора должен запускаться механизм на уничтожение врага, вернее главного героя. Возможна, наверно, также и радиосвязь между ними, чтобы звать на помощь или докладывать обстановку. Но тогда они могут съехаться со всего игрового поля, если один из танков обнаружил главного героя... Только скорости Z80 может не хватить, если постоянно сканировать линию обзора каждого танка.

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

    Спрайтов для лабиринта пока нет. Скорее всего это будут трубы и различные металлоконструкции. Ведь по сюжету игры действие происходит на заводе-автомате, который был перепрограммирован на производство древней техники - автоматических танков.
    Последний раз редактировалось zx-kit; 04.08.2013 в 18:19.
    "L-256"

  5. #205

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение
    Как показал Jerri, максимальная скорость загрузки спрайта из области спрайтов с помощью команд pop de. А дальше я раскидал по трем столбцам по 16 байтов. Я это сделал для печати целых спрайтов. Получилось быстро, хотя громоздко.
    jerri показал один из способов вывода. Совсем не обязательно юзать стек для загрузки спрайта в регистры.

    Возьмём 3 байта танка.

    pop de ; 10t
    ld (hl),e ; 7
    inc l ; 4
    ld (hl),d ; 7
    inc l ; 4
    pop de ; 10
    ld (hl),e ; 7
    inc h ; 4

    Всего 53 такта на строку.

    Теперь у меня:

    ldi ; 16
    ldi
    ldi

    Всего 48 тактов на строку. При этом можно рисовать в любую область экрана. И использовать для вертикального движения спрайта.

  6. #206

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от drbars Посмотреть сообщение
    jerri показал один из способов вывода. Совсем не обязательно юзать стек для загрузки спрайта в регистры.

    Возьмём 3 байта танка.

    pop de ; 10t
    ld (hl),e ; 7
    inc l ; 4
    ld (hl),d ; 7
    inc l ; 4
    pop de ; 10
    ld (hl),e ; 7
    inc h ; 4

    Всего 53 такта на строку.

    Теперь у меня:

    ldi ; 16
    ldi
    ldi

    Всего 48 тактов на строку. При этом можно рисовать в любую область экрана. И использовать для вертикального движения спрайта.
    Что-то не очень понятно. В первой процедуре на копирование одного байта тратится 5+7+4=16 тактов. У вас тоже 16 тактов на 1 байт. Хотя можно без стека обойтись. Это тоже может быть удобно.

    Небольшое уточнение. Если копировать "змейкой", то по второму способу будет так:
    ldi
    ldi
    ldi
    dec e
    inc d
    ldd
    ldd
    ldd
    inc e
    inc d
    ...
    На три байта тратится 16+16+16+4+4. Все-таки первый способ быстрее.

    Если посмотреть это фрагмент:
    Код:
    ; Вывод спрайта
    ; HL = Адрес спрайта
    ; DE = Адрес экрана
    SP_OUT:
    	LD IX,SPR_OUT
    	LD BC,#18FF
    	JP (IX)
    COR_DE	LD A,E
    	SUB #E0
    	LD E,A
    	SBC A,A
    	AND #F8
    	ADD A,D
    	LD D,A
    	JP (IX)
    LOOP_1	DEC DE
    	LD E,A
    	INC D
    	LD A,D
    	AND #07
    	JR Z,COR_DE
    SPR_OUT	LD A,E	
    	LDI	 
    	LDI	 
    	LDI	 
    	DJNZ LOOP_1	 
    	RET
    Выглядит мудрено. И непонятно, зачем команда DEC DE. Ведь у вас до этого были LD A,E, а потом LD E,A и INC D. Если только LDI перескакивает...
    На мой взгляд ваша процедура подходит для движения по-вертикали. А для движения по-горизонтали использовать стек.
    Последний раз редактировалось zx-kit; 04.08.2013 в 19:51.
    "L-256"

  7. #207

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zst Посмотреть сообщение
    Небольшое уточнение. Если копировать "змейкой", то по второму способу будет так:
    ldi
    ldi
    ldi
    dec e
    inc d
    ldd
    ldd
    ldd
    inc e
    inc d
    Эта конструкция не будет работать. LDD уменьшает HL на 1. Будешь рисовать первую строку спрайта 2 раза.

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

    --
    По организации игры:
    1) Нужна процедура которая рисует танк с заданными параметрами (X,Y,направление, цвет).
    2) Определяемся сколько маскимально танков может быть на игровой локации и формируем статический список из параметров танков и флагом активности. Эта процедура должна будет отрисовывать весь список каждые N фреймов. Далее у нас логические процедуры будут работать уже с этим списком.
    3) Карта. Задаём коодинату каждого танка типа word. Получается большой максимальный размер карты 8192 знакомест по X и по Y.
    4) Задаём координаты окна проекции (X:word,Y:word). Процедура читает массив карты коодинат танков, пересчитывает координаты для окна (в экранные), а также устанавливает флаг активности для тех танков которые попали в область проекции. Процедура №2 этот список отрисовывает.
    5) Игрок изменяет глобальные координаты танка, при этом отслеживаются границы проекции... как только танк у границы, изменяются координаты окна проекции. Процедура №4 все пересчитывает, экран сдвигается. Все танки перерисовываются.

    Как-то так. Но это без логики ещё.
    Последний раз редактировалось drbars; 04.08.2013 в 21:02.

  8. #208

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    концепт неверный
    если использовать ковер то копировать можно так

    Код:
    ldi:ldi:ld a,(hl):ld (de),a
    inc h
    inc d: вот тут надо проверку воткнуть на переход на следующее знакоместо
    
    ldd:ldd:ld a,(hl):ld (de),a
    inc h
    inc d
    а тут да есть ошибка

    Код:
    ; Вывод спрайта
    ; HL = Адрес спрайта
    ; DE = Адрес экрана
    SP_OUT:
    	LD IX,SPR_OUT
    	LD BC,#18FF
    	JP (IX)
    COR_DE	
            LD A,E
    	SUB #E0
    	LD E,A
    	SBC A,A
    	AND #F8
    	ADD A,D
    	LD D,A
    	JP (IX)
    LOOP_1	
    	LD E,A
    	INC D
    	LD A,D
    	AND #07
    	JR Z,COR_DE
    SPR_OUT	LD A,E	
    	LDI	 
    	LDI	 
    	LDI	 
    	DJNZ LOOP_1	 
    	RET
    Последний раз редактировалось jerri; 04.08.2013 в 20:42.
    С уважением,
    Jerri / Red Triangle.

  9. #209

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    а тут да есть ошибка
    Нет там ошибки.. Чтобы я пожертвовал 7 тактов на пустоту! никогда!

    Например спрайт находится по адресу:
    #47FD, размер 3 байта.

    Следующая строка спрайта:
    #481D

    LD A,E ; D=#47 ; E=#FD
    1) LDI, de=#47fe
    2) LDI, de=#47ff
    3) LDI, de=#4800 (!)
    LD E,A ; D =#48 ; E=#FD
    получаем #48fd !

    для расчёта следующей строки D должен быть #47, без DEC DE он будет уже #48

    а далее расчёт следующей строки слетит с катушек сделая INC D.

    Можно конечно классично сделать PUSH DE, POP DE обрамить LDI'шки. Но это уже 11+10=21 такт.
    Моя версия восстанавлиает DE после LDI за 15 таков не используя стек
    Процедура универсальная, из моего проекта.. там это актуально, когда спрайт попадает в эту область.
    В этом проекте можно опустить такую коррекцию.
    Последний раз редактировалось drbars; 04.08.2013 в 21:58.

  10. #210

    Регистрация
    11.04.2009
    Адрес
    г. Санкт-Петербург
    Сообщений
    3,603
    Записей в дневнике
    15
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    67
    Поблагодарили
    52 сообщений
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от drbars Посмотреть сообщение
    Эта конструкция не будет работать. LDD уменьшает HL на 1. Будешь рисовать первую строку спрайта 2 раза.
    Да вы правы. LDD не будет работать. А команда DEC DE нужна у вас в некоторых ситуациях у правой границы экрана. У меня там спрайтов пока нет.
    Цитата Сообщение от drbars Посмотреть сообщение
    Нет там ошибки.. Чтобы я пожертвовал 7 тактов на пустоту! никогда!
    Но вашу подпрограмму можно немного изменить, как посоветовал jerri. Тогда DEC DE будет не нужна:
    Код:
     ...
    LOOP_1 ; -7 ;DEC DE
    	 LD E,A
    	 INC D
    	 LD A,D
    	 AND #07
    	 JR Z,COR_DE
    SPR_OUT	 LD A,E
    	 LDI
    	 LDI
    	 LD A,(HL) ;-16+7  ;LDI
    	 LD (DE),A ;7
    	 INC HL     ;7 
    	 DJNZ LOOP_1	 
    	 RET
    итого в тактах время исполнения увеличится на -7-16+7+7+7=-2, т.е. будет работать быстрее на 2 такта.
    Последний раз редактировалось zx-kit; 05.08.2013 в 05:26.
    "L-256"

Страница 21 из 32 ПерваяПервая ... 171819202122232425 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. простой скрипт для написания хелпов
    от jim в разделе Программирование
    Ответов: 2
    Последнее: 09.04.2007, 14:33
  2. Ответов: 26
    Последнее: 09.08.2006, 14:48
  3. Ищу программистика для написания игры МИНОТАВР
    от TomCaT в разделе Программирование
    Ответов: 13
    Последнее: 15.04.2006, 03:09

Ваши права

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