2016-05-16 1 views
0

в соответствии с заголовком, я умею рисовать фигуру в режиме 13h, но не знаю, как переместить ее на экран, следующая вещь будет заставлять фигуру отскакивать от краев на экране, я думаю, чтобы перерисовать фигуру в цикле ... но не уверен, как только начал с сборки, я работаю над Tasm. Спасибо за любые предложения.как перемещать фигуры, например, квадрат в сборке x86 язык

+1

Опубликуйте свой код, чтобы улучшить его. –

+1

Ждите vsync. Очистите экран. Привлечь. Повторение.Не совсем ясно, с чем вы столкнулись, поэтому вам нужно быть более конкретным, если вы не хотите, чтобы этот вопрос закончился закрытием. – Michael

+0

Рисование в сборке - это @Michael. Это полностью зависит от вас, чтобы повторно отобразить экран, если вы хотите что-то «Переместить». Я предлагаю вам начать с очистки и перерисовки на vsync, как делает майкл. После этого вверх ваша игра, только переписывая изменения на vsync, давая вам больше циклов, чтобы делать другие вещи. –

ответ

2

Относительно сборки вообще. Если вы знаете, как рисовать фигуры в режиме 13h, просто выполняйте умственные упражнения. Представьте себе, как выглядит область видеопамяти (область 000: 0000), когда вы рисуете квадрат в первой позиции, а затем представляйте содержимое vram, когда квадрат находится во второй позиции.

Разница между этими двумя является необходимым минимумом между шагами для достижения этого эффекта перемещения фигуры. Очистка всего экрана и перерисовка формы достигнут этого, но, как вы можете себе представить, с большим количеством записей на vram, чем требуемый минимум.

Множество исследований игр, проведенных в ранние годы, проводилось для того, чтобы максимально приблизить минимальные изменения, насколько это возможно, чтобы обеспечить множество графических изменений на медленных процессорах. На некоторых ранних компьютерах даже такое простое, как «очищающий экран», возможно, занимало больше времени, чем один кадр на дисплее, т. Е. Было невозможно очистить экран без эффекта «разрыва». В таком случае наивный подход к четкому экрану + рисование фигуры в новом положении приведет к большому количеству мигания фигуры (так как некоторые рамы дисплея будут показывать прозрачный экран вместо формы).

Мигание/разрывание позже было предотвращено двойной (тройной) буферизацией экрана - сначала подготовьте окончательное изображение в буфере памяти вне экрана, сохранив на нем старое изображение, а затем максимально быстро переместите весь буфер (вкл. некоторые карты gfx можно переключить адрес vram, так что это дешевая работа по настройке регистра gfx, на некоторых компьютерах вам нужно было скопировать байт по байтам в пункт назначения. Режим VGA DOS 13h разрешает набор адресов Vram IIRC, но не могу вспомнить, можете ли вы перейти в другой 64-разрядный RAM-регион, или вы привязаны к 000-сегменту, что не позволяет удвоить буфер).

Еще один распространенный подход - это метод обновления «грязных прямоугольников», в котором вы сначала оценили граничные поля всех движущихся/изменяющихся графических элементов, вычисляя регионы vram, которые нуждаются в обновлениях, после чего вы полностью перерисовываете только те области, сохраняя при этом остальную часть vram ,

Все это просто манипулирование значениями в видеопамяти, вы можете сделать это одинаково в сборке, C, pascal, независимо от того ... (фактически javascript + canvas работает одинаково, поэтому применяются все принципы). Современный API gfx обычно предлагает приятные методы для быстрого обновления больших областей vram, таких как заполнение формы, рисование спрайта (копирование значений из буфера спрайтов с экрана в vram), смешивание (значение не просто записывается в vram, а смешивается со старым значением некоторыми алгоритм смешивания) и т. д.

На самом деле одно семейство трюков состояло в том, чтобы не касаться значений самого vram (что является дорогостоящей операцией процессора), но создает иллюзию движения, изменяя значения палитры (всего несколько палаток/сотен инструкций CPU на каждый кадр), см., например: http://www.effectgames.com/effect/article.psp.html/joe/Old_School_Color_Cycling_with_HTML5

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

Для другого умственного вызова google для спецификаций Atari 2600 у него вообще не было никакого видео-плейера, игры должны были воссоздать изображение, настроив регистры видеочипов на лету по строкам, а также подсчитав остальное от игровой логики между ними. Это может дать вам более глубокое понимание того, как компьютер отображает вещи.

+1

Как это часто бывает для этих «как я делаю * X * в asm», ответ «такой же, как на любом другом языке». Я думаю, что новички часто заставляют задуматься о конкретных инструкциях сразу и не отступать и смотреть, какой алгоритм и движение данных действительно произойдет. –

Смежные вопросы