IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Графический режим, с поддержкой мышки и клавы, Fpc
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Не знаю проблемы у меня или в модуле Wingraph или еще в чем-то, но не всегда получается отловить нажатие кнопки мыши, а после readkey графическое окно вообще перестает реагировать на другие события. sad.gif

Как я пытаюсь работать с мышой:
 
repeat
if PollMouseEvent(MEvent) then
begin
GetMouseEvent(MEvent);
MouseX:=MEvent.x; MouseY:=MEvent.y;
if (MouseX <> x0) or (MouseY <> y0) then
begin
x0:=MouseX; y0:=MouseY;
if (MEvent.action=MouseActionDown) or (keypressed) then
Arrow.StartNew
else
Arrow.ChangePosition(round(MouseX/step)*step,
round(MouseY/step)*step);
end;
Delay(1);
end;
until CloseGraphRequest;
CloseGraph;


Полный исходник: Прикрепленный файл  PolDevelop.rar ( 1.06 килобайт ) Кол-во скачиваний: 639

При каждом нажатии любой кнопки мыши шарик, который постоянно бегает за курсором, должен оставаться на том месте, где была нажата клавиша, но это происходит далеко не всегда sad.gif .
Если проблемы в коде укажите, пожалуйста, ошибку, в противном случае - подскажите другие модуле с такими же функциями или другие способы работы с мышой в граф. режиме. Отдельно интересует такая возможность используя WinApi.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Да, наверно никакой, так назвалось. И последний и предпоследний пример в 2.0.2 версии у меня запустились. Спешил, не было времени другую демку делать. Версий причин неполадок у меня 3:
1 Пример выводит на экран картинку BMP. Программа могла не найти в текущем каталоге графический файл указанного разрешения и имени файла.
2
screen := SDL_SetVideoMode(width, height, colordepth, (SDL_FULLSCREEN + SDL_SWSURFACE));
Последний параметр в функции, сумма констант, маска. Она определяет многое, можно убирать лишние и прибавлять дополнительные константы. Если убрать SDL_FULLSCREEN, окно будет не полноэкранным. SDL_SWSURFACE - тип используемой видеорежимом памяти, можно использовать другой, прибавить константы - двойная буферизация, опенгл. Но с последней константой у меня не работало. Попробуй использовать другой тип памяти.
3 У тебя железо тянет глубину цветности 32 бита? Можно и 16 и 8 поставить.

Пример с пояснениями, без картинок. Кодировка перепуталась, но в иде норм видно.

program demo;

uses
SDL, SDL_Video, SDL_Events, SDL_Mouse, crt;

const
width = 800;
height = 600;

{Ј«гЎЁ­  梥⭮бвЁ}
colordepth = 32;

var
screen: PSDL_Surface;
event: PSDL_Event;
done: Boolean;
XX,YY,q,w : word;


{Ґб«Ё Ј«гЎЁ­  梥⭮бвЁ 16 ЎЁв, ЁбЇ®«м§®ў вм вЁЇ word, 8 - byte}
Type
Pixel = cardinal ; { Must have colordepth bits }

Type {ЎгдҐа ў Є®в®а®¬ Ўг¤Ґ¬ аЁб®ў вм Ја дЁЄг}
{ This type mimics the pixel surface srtucture: 'height' sequential rows
of 'width' pixels each. }
TpixelBuf = Array [0..height-1, 0..width-1] of Pixel ;


var zzz: Pixel;


begin

SDL_Init(SDL_INIT_VIDEO);
event := new(PSDL_Event);

{Ё­ЁжЁ «Ё§ жЁп Ја д ०Ё¬ , ў ЇҐаҐ¬Ґ­­го screen § ЇЁблў овбп Ї а ¬Ґвал Ја д ®Є­  }
screen := SDL_SetVideoMode(width, height, colordepth, ({SDL_FULLSCREEN +} SDL_SWSURFACE));

if screen = nil then
begin
writeLn ('Couldn''t initialize video mode at ', width, 'x', height, 'x', colordepth, 'bpp');
halt(1);
end;

{Ё§ в Ў«Ёжл 梥⮢ нв®Ј® ўЁ¤Ґ®аҐ¦Ё¬  ўлЎЁа Ґ¬ ­г¦­л© § ЇЁблў п ҐЈ® Єа б­®Ґ,
§Ґ«с­®Ґ Ё бЁ­ҐҐ §­ зҐ­ЁҐ - ЎЁвҐ}
zzz:=SDL_MapRGB(screen^.format, 255,0,255);


{§ ЇЁблў Ґ¬ ў ЎгдҐа Ї® Є®®а¤Ё­ в ¬ е=400, г=200 дЁ®«Ґв®ўго в®зЄг}
Tpixelbuf(screen^.pixels^)[200,400] :=zzz;


{Ґб«Ё Ї®б«Ґ¤­ЁҐ 4 Ї а ¬Ґва  =0 - ®Ў­®ў«пҐвбп нЄа ­, в®Ј¤  в®зЄ  Ї®Ї ¤св ­  нЄа ­}
SDL_updateRect(screen, 0, 0, 0, 0);


Tpixelbuf(screen^.pixels^)[200,100] := SDL_MapRGB(screen^.format, 255,255,255);
Tpixelbuf(screen^.pixels^)[300,400] := SDL_MapRGB(screen^.format, 0,255,0);
delay(3000);
SDL_updateRect(screen, 0, 0, 0, 0);


done := FALSE;
while (done = FALSE) do
begin
if (SDL_PollEvent(event) > 0) then
begin
CASE event^.eventtype OF

{Їа®Ё§®и«® б®ЎлвЁҐ - ­ ¦ вЁҐ ­  Є« ўг}
SDL_KEYDOWN :begin
{зЁв Ґ¬ § ЇЁб ­­л© бЄ ­Є®¤ ­ ¦ в®© Є« ўл}
xx:= event^.Key.keysym.sym ;
w:=1;
done := TRUE;
end;
{Їа®Ё§®и«® б®ЎлвЁҐ - ­ ¦ вЁҐ ­  Є­®ЇЄг Єалбл}
SDL_MOUSEBUTTONDOWN : begin
{зЁв Ґ¬ § ЇЁб ­­лҐ Є®®а¤Ё­ вл Єгаб®а  ­  ¬®¬Ґ­в Є«ЁЄ }
xx:=event^.MOTION.x;
yy:=event^.MOTION.y;
q:=1;
done := TRUE;
end;
end;
end;
end;


{ў®§ўа йҐ­ЁҐ нЄа ­г ҐЈ® த­®Ј® а §аҐиҐ­Ёп}
SDL_freeSurface(screen);
SDL_Quit ;



if q=1 then writeln('x Ї®§ЁжЁп Єгаб®а  ', xx,', y Ї®§ЁжЁп Єгаб®а  ',yy);
if w=1 then writeln('Ўл«  ­ ¦ в  Є« ў , Ґс бЄ ­Є®¤ ',xx);

delay(5000);

writeln('rfrjq tynj dsvjhf;bdf.obq vfhfpv nsrfnm d dbylt vbrhjcrjgbxtcrbt cbvdjks');



end.

Ни одного гото не используется, почти подвиг smile.gif В принципе, поправить кодировочку и можно на хранение в фак, в рунете с примерами к SDL - совсем не густо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bokul   Графический режим   30.12.2006 1:19
volvo   Погоди, а зачем PollMouseEvent? Насколько я помню,…   30.12.2006 3:13
Bokul   Эта функция проверяет есть ли новые события, а …   30.12.2006 3:39
volvo   Во-первых, я ничего просто не привожу, и если я на…   30.12.2006 3:46
Bokul   А можно поинтересоваться- почему стандартный модул…   30.12.2006 7:05
volvo   Ну, модуль Graph я тоже не знаю, зачем поддерживае…   30.12.2006 7:19
Bokul   Работает! :good: Можно ссылочку на полное …   30.12.2006 7:37
volvo   :blink: :blink: У тебя в папке "FPC\un…   30.12.2006 7:49
Bokul   Нет, мед - правильный, это у меня что-то неправиль…   30.12.2006 7:55
volvo   :yes2: Лучше всего - в виде "OpenGL Programmi…   30.12.2006 8:02
SKVOZNJAK   Тема обработки событий уже жевалась, и не на одном…   30.12.2006 22:40
Bokul   SKVOZNJAK, можешь чуть подробнее объяснить? Почему…   31.12.2006 12:34
SKVOZNJAK   Да, наверно никакой, так назвалось. И последний и …   3.01.2007 19:44
Bokul   Обижаешь. :) Нет, ты не угадал. А дело было т…   4.01.2007 11:35
volvo   Сообщение об ошибке - военная тайна? С твоих слов,…   4.01.2007 15:21
Bokul   Ухты, а я и не знал что их может быть так много…   4.01.2007 15:27
volvo   Как выяснить какая? :rolleyes: http://userpage.f…   4.01.2007 15:39
Bokul   :lol: Действительно, большой аудитории заин…   4.01.2007 23:28
Ozzя   А те кто остаются встречаются с проблемой нех…   11.01.2007 14:25
volvo   Создавай :)   4.01.2007 23:35
SKVOZNJAK   P.S. первому варианту можно давать любую bmp-шку…   5.01.2007 18:10
Bokul   Ozzя, а же о этом и писал..   12.01.2007 4:17


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 10:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name