Добрый день. Заранее прошу сильно не ругаться за мои впоросы, т.к. я только начал изучать Delphi. Изучаю написание простой игры, подскажите, пож-та, какие есть способы загрузки изображений. Вот, например, у меня будут объекты: Player, Enemy, BigEnemy. Для Player будут использоваться 3 изображения. Enemy - будет нескольких видов, например 5 различных врагов, и для каждого по 3 изображения. Попрошу Вас детально описать с примером кода как это реализовать. Очень прошу.
Ругаться тут никто сильно не будет так как сайт на новичков и ориентирован. По поводу данной темы, то она уже рассмотрена в статьях несколько раз. Но в любом случае, так и быть на днях напишу и выложу статью, жди...
Спасибо Вам большое, я также прочитал вашу статью "Как программировать игры на Delphi" (и некоторые другие), у меня получилось вывести Player на форму. Но при движение он размывается оставляет следы Подскажите, пож-та, как это убрать. А также не получилось вывести фоновую картинку. КодTPers = record x,y,speed: integer; end;
var Form1: TForm1; Ground: TBitmap; Player: array[1..3] of TBitmap; Enemy: array [1..3,1..3] of Tbitmap; Pers: TPers; PersImage: TBitmap;
implementation
procedure TForm1.FormCreate(Sender: TObject); var i,j: integer; begin DoubleBuffered:= true; Form1.Width:= 600; Form1.Height:= 600; Ground:=TBitmap.Create; Ground.Transparent:= true; Ground.LoadFromFile('img\ground.bmp'); Pers.x:=220; Pers.y:=300; Pers.speed:=2;
for i:=1 to 3 do begin Player:= TBitmap.Create; Player.LoadFromFile('img\player'+IntToStr(i)+'.bmp'); Player.Transparent:= true; end;
for i:=1 to 3 do for j:=1 to 3 do begin Enemy[i,j]:= TBitmap.Create; Enemy[i,j].Transparent:= true; Enemy[i,j].LoadFromFile('img\enemy'+IntToStr(i)+IntToStr(j)+'.bmp'); end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin Form1.Canvas.Draw(0,0,Ground);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_UP) then Pers.y:=Pers.y-Pers.speed; if (Key=VK_Down) then Pers.y:=Pers.y+Pers.speed; if (Key=VK_Left) then Pers.x:=Pers.x-Pers.speed; if (Key=VK_Right) then Pers.x:=Pers.x+Pers.speed; end;
end.
На Player и Enemy можете не смотреть, прошу вас показать на примере моего кода как убрать размытие и вывести залить фоновую картинку (и по возможности Enemy, потому что с ним тоже возникла проблемка)
Размывается или мигает изображение по причине того, что ты рисуешь напрямую на саму форму. Лучше всего сделать как я описывал в своих статьях - создать переменную тоже типа TBitmap и рисовать сначала все на нее. А затем ее саму нарисуем на форме. По поводу DoubleBuffered:= true; - я вообще его никогда не использую. А в таймере у тебя идет прорисовка лишь самой фоновой картинки. А там должна саначала твойя фоновая картинка рисоваться, а поверх неее (то есть после) рисоваться твой персонаж.
непонятно зачем ты свою фоновую картинку делаешь прозрачной Ground.Transparent:= true; - нужно убрать эту строку, особенно если она вся одного цвета. Ведь эта строка говорит что цвет, который находится по краям картинки должен быть прозрачным, этот цвет по всей картинке перестает рисоваться. Эта строка удобна для загрузки персонажей, артефактов, объектов, но никак не фоновых картинок или текстур земель.
Например можно добавить переменную: var buf:TBitmap;
При создании формы buf:=TBitmap.Create; buf.Width:= 600; buf.Height:= 600;
В таймере buf.Canvas.Draw(0,0,ground); buf.Canvas.Draw(Pers.x,Pers.,PersImage[?]); for i:=1 to 3 do buf.Canvas.Draw(Enemy.x,Enemy.y,EnemyImage); Form1.Canvas.Draw(0,0,buf);
Для вывода enemy нужно указывать его координаты нужные и также как и персонажа выводить
Добрый день, прошу вашей помощи еще раз. Как бы ни старался не получается выполнить поставленную задачу. Я хочу нарисовать фон(Background), на него ,например, облака(sky) и островки (ground), а также игрока (player). Делал по вашей инструкции, но - то фон не получается расширить на весь экран (он остается у меня в углу), то вообще на форму ничего не выводится.
Фон рисуется такого размера, какого размера сама картинка фона. Если она маленькая значит и будет маленький квадратик в указаных координатах.
В таймере buf.Canvas.Draw(0,0,Background); buf.Canvas.Draw(30,10,sky); buf.Canvas.Draw(80,20,sky); buf.Canvas.Draw(120,0,sky); buf.Canvas.Draw(0,300,ground); buf.Canvas.Draw(60,300,ground); buf.Canvas.Draw(200,300,ground); buf.Canvas.Draw(Pers.x,Pers.,PersImage[?]); for i:=1 to 3 do buf.Canvas.Draw(Enemy.x,Enemy.y,EnemyImage); Form1.Canvas.Draw(0,0,buf);
И все должно нормально рисоваться. Может быть ты рисуешь все вообще в одних и тех же координатах, например о по иксу и ноль по игреку, тогда картинки будут рисоваться поверх друг друга. А еще лучше показать исходный код, чтобы я мог найти ошибку...
procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; begin Buf.Canvas.Draw(0,0,Buf); //Buf.Canvas.Draw(0,0,fon); //Buf.Canvas.Draw(30,30,Player);
end;
end.
Пробовал по-разному, и в таймер выводить, в FormOnCreate, но опять-таки то видно только фон (без Player), то даже фона нет. Прошу вас что не так с кодом, также попрошу вас объяснить почему надо какие-то элементы в таймер, а какие-то при созд.формы.
Тут элементарная ошибка. Я тебе построково прокоментирую твой код:
Сначала ты рисуешь пустой буфер на самом себе (непонятно зачем). Буфер вообще рисуется в последнюю очередь, когда на нем уже все что нужно нарисовано. И рисуется он на форме, а не на себе
Buf.Canvas.Draw(0,0,Buf);
А потом ты рисуешь фон на буфере, а поверх него игрока - это правильно, но это все рисуется перед прорисовкаой буфера.