Необходимо на паскале написать игрушку-стрелялку, проблема заключается в том что нигде не могу найти описания как в паскаль вставить картинку, желаетельно bmp, используя модуль graph для рисования человечика стандартными процедурами не подходит, т.е. задание заключается именно в том чтобы использовать картинку, помогите оч нужна помощь!!!!!!!
1) преобразовать картинку в OBJ-файл через BINOBJ (как это делается - см. на форуме, уже было) 2) подключить OBJ как процедуру к программе на Паскале (директивой {$L}, таким образом у тебя изображение уже будет добавлено к EXE-шнику) 3) написать процедуру отображения BMP из памяти, в которую передать адрес подключенной процедуры.
Вот, собственно, и все. Помощь нужна, или сам справишься?
P.S. Ты бы тему переименовал все-таки, а то ее название не очень-то информативно.
Дано: файл Walker.BMP, который надо включить в EXE-шник и отобразить потом на экране. Что делаем: 1) копируем BMP в папку, где установлен сам TurboPascal (чтоб не заморачиваться с путями), и потом из командной строки:
Цитата
F:\Tp70\BIN>binobj walker.bmp walker.obj Walker
- преобразуем его в OBJ-файл... Можешь забрать WALKER.OBJ и закинуть его в папку со своим проектом... 2) берем любой модуль, который способен отобразить BMP-файл (из файла, собственно). Я взял отсюда: Модули для вывода графики. (bmp, Pcx ...) (BMP.PAS). И чуть-чуть корректируем его, чтобы он принимал не название файла, а указатель на участок памяти, и работал с ним точно так же, как и раньше с файлом. 3) в основной программе подключаем OBJ, инициализируем любой нужный режим (я сделал 256 цветов, просто чтобы показать, как оно делается, с 16-ю ты наверняка знаком, раз замахнулся на игрушку), и выводим картинку в двух местах...
Результат - в архиве. Распакуй, откомпилируй и посмотри...
а можно как нибудь сделать фон картинки прозрачным
Там, где выводится очередной пиксель на экран, делай проверку, если выводимый цвет совпадает с цветом фона - ничего не делать. Но для этого придется, скажем, принять за правило, что самый первый пиксель, который должен был бы отобразиться на экране (верхний левый) является "цветом прозрачности", и все пиксели, которые имеют тот же цвет, просто не будут выводиться. Устраивает тебя такой вариант?
Допусти цвет пекселя может совпадать с цветом фона находящемся внутри тела рисунка, как быть в такой ситуации, и где в модуле осуществляется проверка пикселя.
for yt:= height-1 downto 0 do begin move(p^[curr_index], lin8^.Data, width); inc(curr_index, width); for i:=0 to width-1 do if (lin8^.data[i]+palOffset) <> TransparentColor then { <--- Вот это добавлено } putpixel(Xstart+i, Ystart+yt,lin8^.data[i]+palOffset) end;
, только надо значение цвета для верхнего левого правого (обработка идет сверху вниз, но справа налево) пикселя занести в переменную TransparentColor. (проверить сейчас не могу, набирал прямо здесь)
Тогда все, что НЕ совпадает с цветом фона, будет выводиться, все, что совпадает - будет пропускаться... Идея понятна?
Возникла небольшая проблема: При последовательном выводе рисунков, тот рисунок который был выведен первым закрашевается совершенно другими цветами, второй нормальными цветами, если выводить дальше, то предыдущий закрышивается непонятными цветами, т.е. если выводить 2 рисунка первый закрашевается совершенно другими цветами, а второй нормальными, если еще вывести рисунок, то 2й непонятными цветами, а 3й нормальными и т.д. как испрвить положение?
PROCEDURE ShowImage8(palOffset: integer; xstart,Ystart:WORD); type TLin8=record x,y:word; data:array[0..1023] of byte; end; var lin8 : ^TLin8; i : integer; l,col :longint; width,height,xt,yt,sizeP :word; TransparentColor:word; begin TransparentColor:=white; width:=bfh.biwidth; height:=bfh.biheight; while (width mod 4)<>0 do inc(width); {seek(f,bfh.bfoffbits);} curr_index := bfh.bfOffbits; sizeP:=sizeof(Tlin8); getmem(lin8,sizep); lin8^.X:=bfh.biwidth-1; lin8^.Y:=0; for yt:= height-1 downto 0 do begin {blockRead(f,lin8^.Data,width);} move(p^[curr_index], lin8^.Data, width); inc(curr_index, width); for i:=0 to width-1 do if (lin8^.data[i]+palOffset) <> TransparentColor then putpixel(Xstart+i, Ystart+yt,lin8^.data[i]+palOffset) end; freeMem(lin8,sizep) end;
Никак. Это объясняется тем, что у всех рисунков разная палитра, в таком случае НЕтекущие изображения будут менять цвета (если вызывать SetPalette, разумеется). Если же SetPalette убрать, то с самого начала цвета могут быть искажены, но зато при добавлении рисунков никаких "мельканий предыдущих рисунков" не будет...
Либо создавай рисунки так, чтобы у всех была одинаковая палитра, и устанавливай ее только при выводе первого рисунка.
блин плохо((((( А если попробовать каждому изображению назначить свой индекс, и для каждого создавать свою палитру? У меня просто в игрушке используется примерно 10 рисунков, и все с разной палитрой... как быть даже не знаю...
И еще такой вопрос почему не рботает процедура setbkcolor?
А если попробовать каждому изображению назначить свой индекс, и для каждого создавать свою палитру?
Это ничего не даст... Палитра может быть только одна в каждый момент времени, если ты меняешь ее для вывода очередного изображения, то она меняется и для всего экрана, т.е., изменения затрагивают и все остальные, ранее выведенные картинки.
Цитата
И еще такой вопрос почему не рботает процедура setbkcolor?
Потому что не работает SetBkColor в 256-цветном режиме под Турбо-Паскалем... В качестве замены могу предложить:
а тут сама игра точнее только 1 персонаж, и тоже проблема с фоном, т.е. если фон черный и фон картинки черный то все отлично, но если цвет фона допустим белый и используя условие
if (lin8^.data[i]+palOffset) <> TransparentColor then
опять проблема с фоном.
Движение рисунка на стрелки влево-вправо, прыжок - пробел cs.rar ( 33.79 килобайт )
Кол-во скачиваний: 617
как решить проблему даже не представляю, может использовать 16 цветов, другой драйвер, хотя пробывал другие драйвера замечались "глюки" торможения, или формат файла использовать pcx? Но опять же редактировать bmp легче чем pcx, не нашел ни одного редактора чтоб можно было менять количество цветов в pcx, в отличие от bmp.
Погоди. А зачем ты рисуешь картинки по отдельности? Рисуй их на одном большом изображении, а когда они будут готовы - просто разрежешь их один раз и всё. Тогда все эти изображения (и фон, и персонаж тоже) будут иметь одну палитру, и никаких проблем с отображением не будет. Вот, смотри: test_pal.zip ( 731.48 килобайт )
Кол-во скачиваний: 631
(сначала нарисована полная картинка в 24-битном labirynth.bmp, туда же добавишь своего персонажа, потом порезана на части и сконвертирована в формат "256 цветов". При отображении все в порядке...)
Сделал как ты сказал, сохраняю все объекты на одном рисунке, далее вырезаю каждый объект и вставляю по отдельности, все равно закрашивание идет палитрой последнего объекта
сначала нарисована полная картинка в 24-битном labirynth.bmp
. А ты рисуешь в 256-цветном... Есть большая разница, рисовать ли в 256-цветах сразу или конвертировать Paint-ом 24bit -> 8bit. При подобном конвертировании как раз и будет одинаковая палитра... Вот, я взял твой рисунок, скопировал его в Paint, и сохранил как 24-битное изображение. Потом оттуда вырезал 2 фрагмента, сохранил их опять же как 24-битные (через выделение + Copy To...). И только потом - открыл каждый сохраненный кусок и сконвертировал (Save As -> 256 color bitmap) в нужный формат... И, о - чудо ! test_pal2.zip ( 18.24 килобайт )
Кол-во скачиваний: 607
Сталкнулся с такой проблемой, что при движении картинки оч сильно мерцает экран, как можно это исправить??? Пробовал SetVisualPage и SetActivePage - не помогает. Пробывал так же ассемблеровскую вставку
Function wait: Integer; Assembler; Asm mov dx, $03DA @@1: in al,dx test al,8 jz @@1 End
Еще проблема с исключением цвета, точнее с этим условием:
if (lin8^.data[i]+palOffset) <> TransparentColor then
задаю цвет
TransparentColor:=getpixel(1,1);
и все равно рисует все цвета
begin
width:=bfh.biwidth; height:=bfh.biheight; while (width mod 4)<>0 do inc(width); {seek(f,bfh.bfoffbits);} curr_index := bfh.bfOffbits; sizeP:=sizeof(Tlin8); getmem(lin8,sizep); lin8^.X:=bfh.biwidth-1; lin8^.Y:=0; TransparentColor:=getpixel(1,1); for yt:= height-1 downto 0 do begin
{blockRead(f,lin8^.Data,width);} move(p^[curr_index], lin8^.Data, width); inc(curr_index, width); for i:=0 to width-1 do if (lin8^.data[i]+palOffset) <> TransparentColor then putpixel(Xstart+i, Ystart+yt,lin8^.data[i]+palOffset) end; freeMem(lin8,sizep) end;