Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Изучаю Асм на примере игр


Автор: Xshot1 11.9.2009, 21:29
Занялся изучением асм под dos. Немного поднадоело копаться в учебных резидентах, решил попробовать сделать простенькие игрушки на Асме под dos. Я думаю все знают японскую игрульку "сокобан", так вот.... Вопрос в следующем- как реализовывается "толкание" ящика в данной игрульке. Допустим есть сам "грузчик" по адресу ...... ,  и есть "ящик" по другому адресу.....  
 Когда мы подошли к "ящику" вплотную, как обьяснить ПС что мы собираемся толкать данный байт в опрделённом направлении, а не затирать его символом "грузчика". Как реализовать такой алгоритм и какими командами. Логически, я так думаю, мы должны проверить находится ли "ящик" впереди,сзади,вверху или внизу, и если он находится по ходу движения нашего "грузчика", то  по нажатию клавиши движения, ПС должен перерисовать данные байты ("ящика" и "грузчика")  по новому адресу. Но как это реализовать программно и главное правильно...
 Работаю в текстовом режиме, пока удалось создать рабочий периметр, спрятал курсор, сделал передвижение смайлика "грузчика" по экрану при помощи клавиш управления, вывел тестовый символ "ящика". 
П.С. программирование раньше не занимался, знания асма по урокам Калашникова, Зубкова, Пирогова,Абеля (читаю).. Прошу помочь.... Далее по полному завршению в текстовом режиме игры, буду пробовать реализовать графический.
и есчо один вопросик... как то в сети видел сайт буржуйский с рисунками персонажей из игр для создания покадровой анимации. Может у кого нибудь есть ссылочка, никак не могу найти...
 smile    smile    smile 

Автор: Mikl_ 14.9.2009, 03:57
Xshot1, анимацию в текстовом режиме? Смешно -- http://forum.vingrad.ru/forum/topic-261679.html пример анимированного движужегося человечка под DOS -- изучай создание графических приложений, http://www.wasm.ru/baixado.php?mode=src&id=72, gif-анимацию, проигрыш музыки и т.д. Сразу предупреждаю -- придется переходить на С/С++ или на любой другой ЯВУ, а на ассемблере делать только вставки 

Автор: Xshot1 15.9.2009, 19:50
спасибо, понял
Игрульку написал, 2 уровня сделал, мало но всё же первая игрушка  smile 

Автор: Xshot1 20.9.2009, 21:31
Возник такой вопрос. Как в текстовом режиме заменить стандартный символ "А" на произвольный символ, созданный пользователем?
Допустим есть битовая карта символа к которой идёт обращение и дальнейшая отрисовка символа, а как сделать чтобы отрисовка происходила по моей карте и уже мой символ выводился на экран?
Идея вот в чём. Запускаешь файл, на экране появляется рамка, не из стандартных символов, а из символов которые я перерисовал.
если кто знает помогите,можно какой-нибудь примерчик.

Автор: Ипатьев 20.9.2009, 21:49
для вдохновения smile

Автор: Xshot1 21.9.2009, 18:32
спасибо, у меня точно также, только com и уровни взяты с тел. сименс а52  smile 

Автор: Ипатьев 21.9.2009, 19:59
ну тогда http://www.kiarchive.ru/pub/msdos/games/play/logic/pusher.tar.Z
тут, как я понимаю, ответы на все вопросы есть

Автор: Xshot1 26.9.2009, 17:24
Суть такая, написать вывод символа минуя int и таблицу векторов прерывания
есть такой код
Код

CSEG segment 
org 100h
begin:

JMP  over_data           ; перепрыгнем через данные
              ;
              ;
saved_int10:  DD   0                   ; данные (хранилище для адреса INT 10h
              ;                        ;   -- 2 слова)
              ;
over_data:    XOR  DX,DX               ; DX = 0
              MOV  DS,DX               ; DS = 0
              ;
              ;--сохраняем в хранилище адрес исходн. п/п-мы INT 10h (2 слова)-¬
              ;                                    ;                          ¦
              MOV  AX,DS:[10h*4]                   ;мы указываем лишь порядко-¦
              MOV  word ptr CS:[saved_int10  ],AX  ;вый номер прерывания      ¦
              MOV  AX,DS:[10h*4+2]                 ;                          ¦
              MOV  word ptr CS:[saved_int10+2],AX  ;                          ¦
              ;----------------------------------------------------------------
              ;
              ;--запасаем в стеке информацию, необходимую для автоматического-¬
              ;         возврата  из п/п-мы обработки прерыв-я                ¦
              ;                                    ;                          ¦
              PUSHF                                ;                          ¦
              PUSH CS                              ;                          ¦
              MOV  BX,OFFSET after_int             ;---¬  засунуть в стек     ¦
              PUSH BX                              ;---+- IP точки возврата   ¦
              ;----------------------------------------------------------------
              ;
              ;
              MOV  AH,0Eh                     ;входные параметры
              MOV  AL,61h                     ;  прерыв-я 10h (печатать 'a')
              ;
              JMP  dword ptr CS:[saved_int10] ;длин. джамп по адресу, котор. на-
              ;                               ; ходится теперь в хранилище
after_int:    ;                               ;   saved_int10
              ;
              RET                             ;закончить программу и вывалиться
              ;                               ;  в DOS
              ;

cseg ends
end begin


так вот почему то не происходит правильный переход по
Код

JMP  dword ptr CS:[saved_int10]


хотя в "saved_int10" лежит адрес int 10 (в памяти, при cs=0700 и смещением "saved_int10" лежит DD такое же как при ds=0000 : 0040h (int10))
при трассировки кода доходит до 
Код

saved_int10:  DD   0 

и всё, прога вылетает
помогите плз.

Автор: Goodwin98 26.9.2009, 21:47
А у меня работает.

Автор: Xshot1 26.9.2009, 23:11
Goodwin98,  ясно значит у меня проблемы с компиляцией, пробовал и masm-ом и эмулятором EMU8086. Подскажите чем собирали и каким способом.

Автор: Goodwin98 26.9.2009, 23:46
Собирал я масмом. В коде ничего особенно не менял, только строчку 
Код

cseg segment 'CODE'

и в 
Код

saved_int10:  DD   0

двоеточие убрал.

Автор: Xshot1 27.9.2009, 11:22
Goodwin98, спасибо. По запарке двоеточие впихнул.. Долго над примером голову ломал  и пропустил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)