![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Очень прошу помочь. На форумах общался мало, поэтому - сразу прошу прощения, что может не совсем по правилам.
Написал игру, что-то вроди лодерунора (KOLOBOK FOREVER), назвал, пишу уже скоро как 6- месяцев. Со временем из допотопной бродилки по лабиринтам, стала получаться полноценная игра со своим сюжетом и предисторией, но лучьше о главном. Дано: лабиринт 400 Х 400 клеток, каждая клетка - либо кирпичи, броня, вода, дерево, огонь и мн.другое. По этому лабиринту ходит-бродит КОЛОБОК, стреляет вирусы, прыгает сквозь порталы, собирает различные вещи и т.п. САМА ПРОБЛЕМА : карта лабиринта постоянно должна прорисовываться, кирпичи - один цвет пикселя, броня - другой, и остальное. В этом лабиринте живут и другие существа БОТЫ, одни лабиринт копают (доделывают), другие гоняются за колобком, и т.д. Нужно постоянно прорисовывать карту и выводить её на Image. Всё хорошо работает, до тех пор пока не включаешь эту самую карту, как только это делаешь, процес игры тормозит сразу на все 98%. Если возможно помогите мне, ну или хотя-бы подскажите в какую сторону копать. Заранее спасибо. Если кто заинтересуется - буду рад любой помощи. Жалко просто - игра получается действительно интерестной. ![]() Создавал прорисовку так : массив q[0..500, 0..500]; for f:= 0 to 500 do begin for i:= 0 to 500 do begin if q[i,f] = 2 then (так объясню... дальше на Image ставлю пиксель Pixel[i,f]:= clGreen ![]() if q[i,f] = 0 then ... чёрный пиксель end; end; Последний раз редактировалось RobinStone, 02.06.2013 в 23:47. |
#2
|
||||
|
||||
![]() Не нужно рисовать напрямую на TImage, рисуй в буферном битмапе и после полной отрисовки выводи в TImage. К тому же нет нужды перерисовывать каждый раз с нуля, если есть неизменяемая часть лабиринта, то она один раз отрисовывется на битмапе оригинале, при запросе на отрисовку с битмапа оригинала копируем во 2-ой битмап, где дорисовываем необходимое и копируем в TImage.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
RobinStone (03.06.2013)
|
#3
|
|||
|
|||
![]() Цитата:
А лучше отририсуй начальные битмапы уровней заранее и просто подгружай их. Поверь, так будет самое простое и самое быстрое. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
RobinStone (03.06.2013)
|
#4
|
||||
|
||||
![]() Так не совсем подойдет так как
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
RobinStone (03.06.2013)
|
#5
|
|||
|
|||
![]() Цитата:
Ну дык дорисовывать, а не рисовать полностью. Тем более, что боты изначально могут двигаться, соответсвенно их все-равно отрисовывать, так что сначала выводим битмап уровня, потом просто поверх него отрисовываем всех персонажей. Кстати, для отрисовки персонажей можно использовать ту же технику - сделать заранее все нужные картинки и потом их выводить в нужном месте. ЗЫ. Такая технология отрисовки называется "спрайты", использовалась при создании игрушек до появления 3D движков. Кстати, Diablo I и WarCraft II еще спрайтовые. Это к вопросам о возможностях такой отрисовки. Там движок конечно более сложный, но факт остается фактом - это спрайтовые игры. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
RobinStone (03.06.2013)
|
#6
|
|||
|
|||
![]() И вместо ..Canvas.Pixels[X,Y] научись работать со Bitmap.ScanLine
|
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
RobinStone (03.06.2013)
|
#7
|
||||
|
||||
![]() Цитата:
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
![]() Цитата:
Всем громадное спасибо! Не ожидал, что станете вообще обращать внимание., только вот что - я совершенно не знаю как работать с этими Bitmap - ами. Игра написана только при помощи того что я понимал, ну или понимаю. Если вам не трудно подскажите где можно почитать про Bitmap -ы, и вообще прошу, если не трудно объяснить на пальцах как они работают... |
#9
|
|||
|
|||
![]() Цитата:
Спасибо, что уделили мне время, но я не сказал, что мои познания видимо сильно отличаются от Ваших. Я понял, что Вы сразу поняли как исправить мою ошибку, но не могли бы Вы подсказать где можно прочитать про эти самые битмапы, но только, если можно, с азов. Типа что вообще это такое? Не прошу написать код, т.к. хочу именно сам разобраться и написать... И ещё раз прошу извинить за беспокойство. ![]() |
#10
|
|||
|
|||
![]() procedure TForm2.SpeedButton5Click(Sender: TObject); var a,s: integer; begin for a:= 1 to 500 do begin for s:= 1 to 500 do begin if q[a,s] <> 1 then form4.Image1.Canvas.Pixels[a,s]:= clBlack; if (q[a,s] = 1) or (q[a,s] = 101) then form4.Image1.Canvas.Pixels[a,s]:= clBlue; if q[a,s] = 3 then form4.Image1.Canvas.Pixels[a,s]:= clWhite; if q[a,s] = 0 then form4.Image1.Canvas.Pixels[a,s]:= clRed; if q[a,s] = 8091 then form4.Image1.Canvas.Pixels[a,s]:= clNavy; if q[a,s] = 117 then form4.Image1.Canvas.Pixels[a,s]:= clMaroon; if (q[a,s] = 333) or (q[a,s] = 777) then form4.Image1.Canvas.Pixels[a,s]:= clTeal; end; end; end; вот код (то до чего я дорос) он рисует карту, по виду она меня очень даже устраивает, но скорости нет совершенно. |
#11
|
||||
|
||||
![]() Цитата:
|
#12
|
|||
|
|||
![]() Цитата:
Всё понял, СПАСИБО ! А теперь, если можно - как?!!!! Мой браузер уже выучил комбинации клавишь по которым я делаю запросы в гугл и яндекс, по поводу этих битмапав, но мозг крайне негативно относится к способам там изложеным и ни в какую не желает идти на компромис по УСВАЯЕМОСТИ изложеной там информации... Если кто может --- помогите понять... |
#13
|
||||
|
||||
![]() Если начнешь работать с ScanLine, то там работа идет с форматом RGB. И еще, Очень уж много "IF" в цикле, работу это тоже не очень ускоряет (хоть и не очень замедляет). Лучше уж использовать в массиве вместо значений 1,2,3... уже готовые цвета - 255, 32768, 16711680.
Пример использования ScanLine: Код:
type TRGBArray = array[0..32767] of TRGBTriple; PRGBArray = ^TRGBArray; var X, Y : Integer; Rows : PRGBArray; Begin for y := 0 to Bitmap.Height - 1 do begin rows := Bitmap.ScanLine[y]; for x := 0 to Bitmap.Width - 1 do begin //здесь идут все проверки и задается цвет соотв. пикселя - в // системе RGB rows[x].rgbtRed := 255; rows[x].rgbtGreen := 128; rows[x].rgbtBlue := 0; end; end; end; |
#14
|
|||
|
|||
![]() Признателен очень, только мне Твой ответ показал, что я ещё очень далеко от понимания настоящего программирования. У меня в программе все команды очень простые и как работать с RGB я и вообще не знаю.
Одна пожалуй только просьба : если не сложно то напишите пожалуйста код с пояснениями (построчными если можно), именно моей задачи. И прошу поверьте я совсем не собираюсь этот код тупо скопировать в программу и всё, я хотел бы понять как он работает. Ещё раз спасибо. |
#15
|
|||
|
|||
![]() Цитата:
ЗАДАЧА (это что б я понял) : есть массив q: array[1..500,1..500] of integer; этот массив уже заполнен нужными мне значениями теперь нужно выводить на Image 500 x 500 этот массив в виде точек определённых цветов, т.е. for a:= 1 to 500 do begin for s:= 1 to 500 do begin if q[a,s] = 3 then form1.Image1.Canvas.Pixels[a,s]:= clWhite; if q[a,s] = 0 then form1.Image1.Canvas.Pixels[a,s]:= clRed; end; end; примерно 1 раз в секунду хотя-бы... вот как-то так... ПОМОГИТЕ... |