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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Очень нужна помощь в написании игры! использование bmp в Pascal, Помогите плз!!!
сообщение
Сообщение #1


Пионер
**

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

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


Необходимо на паскале написать игрушку-стрелялку, проблема заключается в том что нигде не могу найти описания как в паскаль вставить картинку, желаетельно bmp, используя модуль graph для рисования человечика стандартными процедурами не подходит, т.е. задание заключается именно в том чтобы использовать картинку, помогите оч нужна помощь!!!!!!!

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






1) преобразовать картинку в OBJ-файл через BINOBJ (как это делается - см. на форуме, уже было)
2) подключить OBJ как процедуру к программе на Паскале (директивой {$L}, таким образом у тебя изображение уже будет добавлено к EXE-шнику)
3) написать процедуру отображения BMP из памяти, в которую передать адрес подключенной процедуры.

Вот, собственно, и все. Помощь нужна, или сам справишься?

P.S. Ты бы тему переименовал все-таки, а то ее название не очень-то информативно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


Да если можешь, помоги, буду признателен

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Значит, смотри на последовательность действий...

Дано: файл 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-ю ты наверняка знаком, раз замахнулся на игрушку), и выводим картинку в двух местах...

Результат - в архиве. Распакуй, откомпилируй и посмотри...


Прикрепленные файлы
Прикрепленный файл  bmp_mem.zip ( 28.83 килобайт ) Кол-во скачиваний: 411
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


Спасибо большущее, ща буду разбераться.


Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

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

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


volvo еще не большой вопрос, а можно как нибудь сделать фон картинки прозрачным, т.е. если одну картинку накладывать на другую чтоб обе было видно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
а можно как нибудь сделать фон картинки прозрачным
Там, где выводится очередной пиксель на экран, делай проверку, если выводимый цвет совпадает с цветом фона - ничего не делать. Но для этого придется, скажем, принять за правило, что самый первый пиксель, который должен был бы отобразиться на экране (верхний левый) является "цветом прозрачности", и все пиксели, которые имеют тот же цвет, просто не будут выводиться. Устраивает тебя такой вариант?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

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

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


Допусти цвет пекселя может совпадать с цветом фона находящемся внутри тела рисунка, как быть в такой ситуации, и где в модуле осуществляется проверка пикселя.

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ну вот же:
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. (проверить сейчас не могу, набирал прямо здесь)

Тогда все, что НЕ совпадает с цветом фона, будет выводиться, все, что совпадает - будет пропускаться... Идея понятна?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


ага, сейчас попробую сделать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

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

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


Возникла небольшая проблема:
При последовательном выводе рисунков, тот рисунок который был выведен первым закрашевается совершенно другими цветами, второй нормальными цветами, если выводить дальше, то предыдущий закрышивается непонятными цветами, т.е. если выводить 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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
как испрвить положение?
Никак. Это объясняется тем, что у всех рисунков разная палитра, в таком случае НЕтекущие изображения будут менять цвета (если вызывать SetPalette, разумеется). Если же SetPalette убрать, то с самого начала цвета могут быть искажены, но зато при добавлении рисунков никаких "мельканий предыдущих рисунков" не будет...

Либо создавай рисунки так, чтобы у всех была одинаковая палитра, и устанавливай ее только при выводе первого рисунка.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

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

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


блин плохо((((( А если попробовать каждому изображению назначить свой индекс, и для каждого создавать свою палитру? У меня просто в игрушке используется примерно 10 рисунков, и все с разной палитрой... как быть даже не знаю...


И еще такой вопрос почему не рботает процедура setbkcolor?


setbkcolor(2);
clearviewport;


и цвет всеравно черный.

P.S. Спасибо тебе огромное что помогаешь!

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Цитата
А если попробовать каждому изображению назначить свой индекс, и для каждого создавать свою палитру?
Это ничего не даст... Палитра может быть только одна в каждый момент времени, если ты меняешь ее для вывода очередного изображения, то она меняется и для всего экрана, т.е., изменения затрагивают и все остальные, ранее выведенные картинки.

Цитата
И еще такой вопрос почему не рботает процедура setbkcolor?
Потому что не работает SetBkColor в 256-цветном режиме под Турбо-Паскалем... В качестве замены могу предложить:
setfillstyle(solidfill, green);
bar(с_нужными_координатами);
, это по крайней мере сработает. Но опять же, при выводе картинки палитра изменится и цвет с зеленого может стать любым другим.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

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

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


получается вся работа коту под хвост((((((

если не трудно посмотри плз тут когда вставляю 2 картинки проблема с фоном

Прикрепленный файл  bkfon.rar ( 27.58 килобайт ) Кол-во скачиваний: 624



а тут сама игра точнее только 1 персонаж, и тоже проблема с фоном, т.е. если фон черный и фон картинки черный то все отлично, но если цвет фона допустим белый и используя условие

 if (lin8^.data[i]+palOffset) <>  TransparentColor then
опять проблема с фоном.

Движение рисунка на стрелки влево-вправо, прыжок - пробел
Прикрепленный файл  cs.rar ( 33.79 килобайт ) Кол-во скачиваний: 617


как решить проблему даже не представляю, может использовать 16 цветов, другой драйвер, хотя пробывал другие драйвера замечались "глюки" торможения, или формат файла использовать pcx? Но опять же редактировать bmp легче чем pcx, не нашел ни одного редактора чтоб можно было менять количество цветов в pcx, в отличие от bmp.

Заранее спасибо.

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Погоди. А зачем ты рисуешь картинки по отдельности? Рисуй их на одном большом изображении, а когда они будут готовы - просто разрежешь их один раз и всё. Тогда все эти изображения (и фон, и персонаж тоже) будут иметь одну палитру, и никаких проблем с отображением не будет. Вот, смотри:
Прикрепленный файл  test_pal.zip ( 731.48 килобайт ) Кол-во скачиваний: 631

(сначала нарисована полная картинка в 24-битном labirynth.bmp, туда же добавишь своего персонажа, потом порезана на части и сконвертирована в формат "256 цветов". При отображении все в порядке...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

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

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


Сделал как ты сказал, сохраняю все объекты на одном рисунке, далее вырезаю каждый объект и вставляю по отдельности, все равно закрашивание идет палитрой последнего объекта



вот рисунок



Прикрепленный файл  bmp.rar ( 29.48 килобайт ) Кол-во скачиваний: 606


Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата
Сделал как ты сказал
Я не это сказал... Я сказал
Цитата
сначала нарисована полная картинка в 24-битном labirynth.bmp
. А ты рисуешь в 256-цветном... Есть большая разница, рисовать ли в 256-цветах сразу или конвертировать Paint-ом 24bit -> 8bit. При подобном конвертировании как раз и будет одинаковая палитра... Вот, я взял твой рисунок, скопировал его в Paint, и сохранил как 24-битное изображение. Потом оттуда вырезал 2 фрагмента, сохранил их опять же как 24-битные (через выделение + Copy To...). И только потом - открыл каждый сохраненный кусок и сконвертировал (Save As -> 256 color bitmap) в нужный формат... И, о - чудо ! smile.gif
Прикрепленный файл  test_pal2.zip ( 18.24 килобайт ) Кол-во скачиваний: 607


Где видно смену палитры? Я не вижу...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

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

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


Спасибо!!! все получилось smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

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

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


Сталкнулся с такой проблемой, что при движении картинки оч сильно мерцает экран, как можно это исправить??? Пробовал 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;



Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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