|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 10, 2003 03:31:38 Народ! Help! Я написал ОЧЕНЬ простенькую программку (минут за 5, так что извините за корявость), которая переходит в режим 13h (320x200) и по клику левой кнопки мыши ставит синюю точку на экране. Одна проблема - при движении и нажатии на кнопку курсор моргает (это и понятно) Как мне избавиться от этого? Ниже мой код(MASM): .model tiny .code org 100h .186 start: mov ax,13h int 10h mov ax,0 int 33h mov ax,1 int 33h mov ax,000Ch mov cx,0002h mov dx,offset handler int 33h mov ah,0 int 16h mov ax,000Ch mov cx,0000h int 33h mov ax,3 int 10h ret handler: push 0A000h pop es push cs pop ds push cx push dx mov ax,2 int 33h jmp print_point exit_handler: pop dx pop cx mov ax,1 int 33h retf print_point: xor ax,ax mov ah,0Ch shr cx,1 mov al,1 int 10h ret end start А если еще кто и кодом подсобит.. Радости моей не будет предела! :) Сделайте доброе дело, а? |
|
|
Дата: Ноя 10, 2003 04:53:16 Zauberer Почему перед end start стоит ret а не jmp exit_handler, почему не сохраняются и не восстанавливаются регистры es и ds. За мерцание при движении отвечает драйвер мышки, за мерцание при нажатии левой кнопки мышки твой код. Не хочешь мерцания - полностью отвечай за мышку сам, например, ставишь свой обработчик на все события, выключаешь курсор стандартной мышки, рисуешь всю картинку и свой курсор мышки в буфере, затем пересылаешь этот буфер на экран (64’000 не проблема, если постараться можно и меньше). |
|
|
Дата: Ноя 10, 2003 13:39:54 Я ж говорю - написано за 5 мин. Все указанные ошибки были исправлены. Только мне кажется пересылка будет довольно долгой... |
|
|
Дата: Ноя 10, 2003 15:10:47 Вообще, если ты будешь отрисовывать мышиный курсор сам, задача сводится к классическому движению спрайта на изменяющемся фоне, и можно исользовать метод "грязных прямоугольников". Грубо говоря, имеется буфер размером с экран, в который ведётся вся отрисовка фона, и буфер размером вдвое больше спрайта (в данном случае, курсора). Когда изменятся позиция спрайта и/или фон под ним, возможны два случая: либо старая позиция спрайта или место изменения фона перекрывается с новой позицией, либо не перекрывается. Во втором случае всё просто: отдельно восстанавливается/обновляется фон (копируется на экран содержимое фонового буфера) под старой позицией спрайта, отдельно выводится спрайт в новом месте. В первом случае - немного сложнее: вычисляется "грязный прямоугольник" - область, в которую входит и старая позиция спрайта и новая. Очевидно, что, поскольку они перекрываются, он не может быть шире или выше спрайта больше, чем вдвое. Содержимое этого прямоугольника копируется из фонового буфера в спрайтовый, и поверх него добавляется собственно спрайт в новой позиции. После чего, спрайтовый буфер выводится на экран в соответствующем месте, стирая старый, и рисуя новый спрайт за одну операцию - моргание при этом полностью исключено. Лишние пересылки в видеопамять, в самом худшем случае (при перекрытии в один пиксел с противоположных углов спрайта), не превышают двойной площади спрайта. При перекрытии нескольких спрайтов, можно обвести грязным прямоугольником их все. Метод весьма эффективен - им уже очень давно делали спрайтовые игрушки на слабых машинах, где пересылка всего экрана была проблематична. |
|
|
Дата: Ноя 10, 2003 16:36:50 Слушай, как ты заметил по моему коду, я совсем-совсем новичок. Может, поможешь кодом? Так, если не жалко.. |
|
|
Дата: Ноя 10, 2003 19:33:23 Поискал в сети, чем бы тебе помочь. В числе прочего, гугль, на запрос "dirty rectangles", дал ссылку на GRAPHICS PROGRAMMING BLACK BOOK by Michael Abrash. Оказывается, у дядьки Абраша целая глава этому посвящена. 45-я, между прочим. Разжёвано всё с картинками, и даже какие-то примеры есть, причём, как ни странно, некоторые тоже в 13h. Правда, на сях, но это даже хорошо - понятнее будет. С родного сайта книжка отдаётся только за деньги, поэтому качай с какого-нибудь левого, например, http://www.dvara.net/HK/gpbb.asp А вообще, чего ты на самом деле хотел сделать? Если ты совсем-совсем новичок, может, и не стоит со всем этим связываться? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068 |