![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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    2- кирпичный блокif q[i,f] = 0 then ... чёрный пиксель end; end; Последний раз редактировалось RobinStone, 02.06.2013 в 23:47.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Не нужно рисовать напрямую на TImage, рисуй в буферном битмапе и после полной отрисовки выводи в TImage. К тому же нет нужды перерисовывать каждый раз с нуля, если есть неизменяемая часть лабиринта, то она один раз отрисовывется на битмапе оригинале, при запросе на отрисовку с битмапа оригинала копируем во 2-ой битмап, где дорисовываем необходимое и копируем в TImage. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
 
RobinStone (03.06.2013)
  | ||
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 А лучше отририсуй начальные битмапы уровней заранее и просто подгружай их. Поверь, так будет самое простое и самое быстрое.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
RobinStone (03.06.2013)
  | ||
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Так не совсем подойдет так как 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Цитата: 
	
  | 
| Этот пользователь сказал Спасибо 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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Цитата: 
	
  | 
| 
		 
			 
			#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 раз в секунду хотя-бы... вот как-то так... ПОМОГИТЕ...  |