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

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


Гость






Цитата
при движении картинки оч сильно мерцает экран, как можно это исправить???
Присоедини тестовый проект, чтоб можно было откомпилировать его и запустить. Интересует, как именно ты двигаешь картинку.
Цитата
задаю цвет
TransparentColor:=getpixel(1,1);

и все равно рисует все цвета
А какой цвет имеет пиксель (1, 1) на экране? Такие цвета точно есть в картинке?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Пионер
**

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

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


Движение осуществляется при нажатии клавиш влево-вправо, пробел, клавиш Z и X
При движении меняется координата рисунка по X экран очищается и заново выводяится но у же на новой координате.

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


Цвет фиолетовый
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гость






А теперь ответь мне на 2 вопроса:
1) Зачем тебе отображать заново то, что не изменяется? Если у тебя движется только фигура человечка, а сам фон остается неизменным, гораздо проще перед отрисовкой фигуры запомнить изображение ПОД ней (GetMem + GetImage), а потом, вместо того, чтобы перерисовывать всё, просто восстановить изображение (PutImage + FreeMem) и отрисовать фигуру в другом месте.

2) я спрашивал тебя, какой цвет в позиции (1, 1) на экране. Ты сказал "фиолетовый". Можно назвать номер строки и название файла, где пиксел, имеющий координаты (1, 1) становится фиолетовым? Я например этого не вижу, он равен цвету фона, а это - черный (не путать с битмапом, я спрашивал именно про экран, потому что ты сам сделал:
Цитата
TransparentColor:=getpixel(1,1);
, я тебя за язык не тянул, а GetPixel работает именно с изображением на мониторе)... Откуда вывод: все выводится правильно, если TransparentColor будет содержать значение "фиолетовый цвет" - то этот цвет выводиться не будет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Пионер
**

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

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


 TransparentColor:=5;

5- т.к мне нужно исключить фиолетовый цвет которому соответствует цифра 5.

Все вроде получилось, но почему то у меня возникли сомнения что цвета просто совпали 16 и 256 цветов, или все правильно?





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


Гость






Цитата
почему то у меня возникли сомнения что цвета просто совпали 16 и 256 цветов
Не знаю, откуда такое сомнение... 5-ый элемент палитры содержит RGB(128, 0, 128, 0), а это именно фиолетовый цвет... Вот такая палитра у Paint-а. Первые 16 ее элементов совпадают с 16-ю цветами BGI-графики.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Пионер
**

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

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


При загрузки картинки в память происходит зависание программы либо она просто вылетает, а если запускать через DOS-box просто зависает, никак не пойму из-за чего
 
var
size:word
p:pointer
........
Size:=imagesize(0,0,getmaxX,getmaxY);
getmem(p,size);
getimage(0,0,getmaxx,getmaxy,p^);



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


Гость






Цитата
никак не пойму из-за чего
Максимальный блок памяти, который можно выделить за один раз - 65520 байт. Скорее всего, ImageSize выдает тебе неправильное значение (правильное просто не помещается в Word и усекается), а потом при попытке GetImage ты "вылезаешь" за пределы выделенной памяти, и портишь другие области памяти.

А все потому, что ты хочешь сохранять ВЕСЬ экран. А зачем? Сохраняй только то, что будет непосредственно под выводимой картинкой (у тебя же есть ее размеры, есть координаты, куда она будет выводиться), это будет требовать гораздо меньше памяти и выполняться будет быстрее.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Пионер
**

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

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


Если сохранять изображение только под объектом, то уйдет памяти не меньше, т.к. на экране будет не один движущийся объект, и придется выделять память для каждого! Как быть в данной ситуации?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






Цитата
Если сохранять изображение только под объектом, то уйдет памяти не меньше
А хоть бы и не меньше, но:
1) у тебя будет возможность выделить каждый раз маленький кусок памяти (большой, под весь экран - не выделишь, я объяснил выше, почему)
2) при изменении положения одного объекта будет восстановлен фон под ним, и объект перерисуется в другой позиции (опять с сохранением фона), то есть, при изменении положения одного объекта не будет перерисовываться ВЕСЬ экран, что приведет к уменьшению мерцания...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Пионер
**

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

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


Мерцание стало на порядок меньше smile.gif

Еще такой вопрос: что делает процедура FreeMem очищает ли она блок динамической памяти, или просто разрывает связь указателя с этим блоком?

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


Гость






Цитата
что делает процедура FreeMem очищает ли она блок динамической памяти, или просто разрывает связь указателя с этим блоком?
Освобождает память, разрывая связь переменной с блоком памяти (освобожденная память не очищается, а просто добавляется в список свободных блоком. Следующий GetMem может опять получить этот же участок памяти, если размер позволяет).
Цитата
Это может означать заполненость динамической памяти или клавиатурного буфера?
Это буфер клавиатуры. Можно попробовать избавиться от подтормаживаний путем написания своего обработчика клавиатурного прерывания, но проверить свою идею я смогу только завтра.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Пионер
**

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

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


А если уменьшить клавиатурный буфер?


Если тебя не затруднит, помоги решить данную проблему с подтормаживанием.


P.S. буду очень благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Пионер
**

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

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


Появилась такая идея: что если первому адресу клавиатурного буфера присвоить последний адрес? т.е. при каждом попадании значения в буфер, он будет очищаться.


MemW[Seg0040:$1C]:=MemW[Seg0040:$1A]

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Уникум
*******

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

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


Цитата(ninja @ 10.07.2009 19:29) *
Появилась такая идея: что если первому адресу клавиатурного буфера присвоить последний адрес? т.е. при каждом попадании значения в буфер, он будет очищаться.
Прекрасная идея для любителей музыки типа "бип-бииииииип" smile.gif. Если твоя программа не успевает обрабатывать вводимую информацию, то буфер надо не уменьшать, а увеличивать. В этом и состоит весь смысл буфера. Почему ты решл, что буфер - это вред? Типа придумали его, чтоб осложнять жизнь людям? lol.gif

Но увеличение буфера тоже не выход. Если ты собираешься жать кнопку, пока оно не забьется - оно забьется обязательно smile.gif. Воспринимай сложности с буфером как признак того, что у тебя что-то не так. Тебе надо прогу свою менять. Я бы рекомендовал сделать так.. Когда читаешь символ - читай не один, а сразу все из буфера. И складывай их в свой собственный буфер. При этом ты можешь предусмотреть параметр количества, то есть вместо повторения разных кодов хранить число введенных символов. Например, если ты вводишь:
aaabbbccabcccccc
- а хранишь:
3a3b2c1a1b6c.
При этом программа может распознавать множественные символы и ускоряться - например, рисовать не каждый кадр, а через кадр (если, скажем, коэффициент превышает 10).

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

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


Добавлено через 2 мин.
Да, еще: адреса переменных, хранящих начало и конец буфера, которые ты привел, мне что-то кажутся странными.. Но я мог это забыть.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Профи
****

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

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


Labyrinth Вот от туда можешь взять модуль для клавы, и не мучаться.


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Пионер
**

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

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


Спасибо, правда я уже написал, прикольный лабиринт smile.gif



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

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

 





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