Меню сайта
Форма входа

Четверг, 09.01.2025, 07:06
Приветствую Вас Гость

загрузка изображений в игру - Форум

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
загрузка изображений в игру
ThierryHДата: Воскресенье, 23.03.2014, 19:00 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Добрый день.
Заранее прошу сильно не ругаться за мои впоросы, т.к. я только начал изучать Delphi.
Изучаю написание простой игры,
подскажите, пож-та, какие есть способы загрузки изображений.
Вот, например, у меня будут объекты: Player, Enemy, BigEnemy.
Для Player будут использоваться 3 изображения.
Enemy - будет нескольких видов, например 5 различных врагов, и для каждого по 3 изображения.
Попрошу Вас детально описать с примером кода как это реализовать.
Очень прошу.
 
ArmageddetsДата: Понедельник, 24.03.2014, 00:27 | Сообщение # 2
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
Ругаться тут никто сильно не будет так как сайт на новичков и ориентирован. По поводу данной темы, то она уже рассмотрена в статьях несколько раз. Но в любом случае, так и быть на днях напишу и выложу статью, жди...
 
ArmageddetsДата: Понедельник, 24.03.2014, 11:50 | Сообщение # 3
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
Написал для тебя статью статья
 
ThierryHДата: Понедельник, 24.03.2014, 22:39 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Спасибо Вам большое,  я также прочитал вашу статью "Как программировать игры на 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;

  PersImage:=TBitmap.Create;
  PersImage.LoadFromFile('img\player.bmp');
  Form1.Canvas.Draw(Pers.x,Pers.y,PersImage);

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, потому что с ним тоже возникла проблемка)
 
ArmageddetsДата: Вторник, 25.03.2014, 10:53 | Сообщение # 5
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
Размывается или мигает изображение по причине того, что ты рисуешь напрямую на саму форму. Лучше всего сделать как я описывал в своих статьях - создать переменную тоже типа TBitmap и рисовать сначала все на нее. А затем ее саму нарисуем на форме. По поводу  DoubleBuffered:= true; - я вообще его никогда не использую. А в таймере у тебя идет прорисовка лишь самой фоновой картинки. А там должна саначала твойя фоновая картинка рисоваться, а поверх неее (то есть после) рисоваться твой персонаж.
 
ArmageddetsДата: Вторник, 25.03.2014, 11:17 | Сообщение # 6
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
непонятно зачем ты свою фоновую картинку делаешь прозрачной 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 нужно указывать его координаты нужные и также как и персонажа выводить
 
ThierryHДата: Четверг, 27.03.2014, 16:29 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Добрый день, 
прошу вашей помощи еще раз.
Как бы ни старался не получается выполнить поставленную задачу.
Я хочу нарисовать фон(Background), на него ,например, облака(sky) и островки (ground), а также игрока (player).
Делал по вашей инструкции, но  - то фон не получается расширить на весь экран (он остается у меня в углу), то вообще на форму ничего не выводится.

Очень прошу вас привести рабочий код.
 
ArmageddetsДата: Пятница, 28.03.2014, 12:51 | Сообщение # 8
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
Фон рисуется такого размера, какого размера сама картинка фона. Если она маленькая значит и будет маленький квадратик в указаных координатах. 

В таймере 
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); 

И все должно нормально рисоваться. Может быть ты рисуешь все вообще в одних и тех же координатах, например о по иксу и ноль по игреку, тогда картинки будут рисоваться поверх друг друга. А еще лучше показать исходный код, чтобы я мог найти ошибку...
 
ThierryHДата: Вторник, 01.04.2014, 22:59 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Добрый день, вечер.
Что-то я никак, прошу Вас помочь , в очередной раз.

Код
unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls;

type
   TForm1 = class(TForm)
     Image1: TImage;
     Timer1: TTimer;
     procedure FormCreate(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;

implementation

var
   fon,Buf,Player: TBitmap;  //фон, буфер, игрок
   x,y: Integer; //текущее положение, координаты

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   Buf:= TBitmap.Create;
   Buf.Width:= 600;
   Buf.Height:= 600;

   fon:= TBitmap.Create;
   fon.LoadFromFile('img/fon.bmp');
   Form1.Image1.Canvas.Draw(0,0,fon);

   Player:= TBitmap.Create;
   Player.LoadFromFile('img/player.bmp');
   Player.Transparent:= True;

   //Form1.Canvas.Draw(0,0,Buf);
   //Buf.Canvas.Draw(50,100,Player);

end;

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),  то даже фона нет.
Прошу вас что не так с кодом, также попрошу вас объяснить почему надо какие-то элементы в таймер, а какие-то при созд.формы.
 
ArmageddetsДата: Среда, 02.04.2014, 09:47 | Сообщение # 10
Лейтенант
Группа: Администраторы
Сообщений: 68
Репутация: 4
Статус: Offline
Тут элементарная ошибка. Я тебе построково прокоментирую твой код:

Сначала ты рисуешь пустой буфер на самом себе (непонятно зачем). Буфер вообще рисуется в последнюю очередь, когда на нем уже все что нужно нарисовано. И рисуется он на форме, а не на себе

Buf.Canvas.Draw(0,0,Buf); 

А потом ты рисуешь фон на буфере, а поверх него игрока - это правильно, но это все рисуется перед прорисовкаой буфера.

Buf.Canvas.Draw(0,0,fon); 
Buf.Canvas.Draw(30,30,Player); 

В общем правильно будет сделать так: 

Buf.Canvas.Draw(0,0,fon); 
Buf.Canvas.Draw(30,30,Player); 
Form1.Canvas.Draw(0,0,Buf);
 
  • Страница 1 из 1
  • 1
Поиск:

Наш опрос
Какие уроки по созданию игр Вам удобнее?
Всего ответов: 141
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика