Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2009, 18:32   #271
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

щас выложу пример там всё расписано с этим у меня проблем нету а вот с мапой никак не разбирусь ппц(
вот код и пример:
Код:
// "кидаем" в буфер кадра задний фон карты
  Buf.Canvas.Draw(0,0,BackBuf);
// смена кадра если персонаж идет
  t:=t+1;
  if (Pers.TypeAnim > 0) and (t > 10) then
    begin
      inc(Pers.Kadr);
      if Pers.Kadr > Pers.MaxKadr then Pers.Kadr:=1;
      t:=0;
    end;

// если персонаж стоит, то анимация одного из кадров
  if Pers.TypeAnim = 0 then
    begin
      Rect2.Left:=(2-1)*Pers.TexWidth;
      Rect2.Top:=(3-1)*Pers.TexHeight;
      Rect2.Right:=Rect2.Left+Pers.TexWidth;
      Rect2.Bottom:=Rect2.Top+Pers.TexHeight;
    end
// иначе в соответствии со сменой кадров и типом анимации
  else
    begin
      Rect2.Left:=(Pers.Kadr-1)*Pers.TexWidth;
      Rect2.Top:=(Pers.TypeAnim-1)*Pers.TexHeight;
      Rect2.Right:=Rect2.Left+Pers.TexWidth;
      Rect2.Bottom:=Rect2.Top+Pers.TexHeight;
    end;

// готовим участок текстуры анимации персонажа (вырезаем кадр)
  PersAnimTex.Height:=Pers.TexHeight;
  PersAnimTex.Width:=Pers.TexWidth;
  PersAnimTex.Canvas.CopyRect(Rect1,Pers.Pic.Canvas,Rect2);

// рисуем в буфере кадра персонажа в нужном месте
  Buf.Canvas.Draw( Pers.PosX*Rax                       // положение по-X
                  + Pers.MoveX                         // смещение по-X
                  + Round(Abs(Rax-Pers.TexWidth)/2)    // центрирование по-X
                  , Pers.PosY*Ray                      // положение по-Y
                  + Pers.MoveY                         // смещение по-Y
                  + Round(Abs(Ray-Pers.TexHeight)/2)   // центрирование по-Y
                  , PersAnimTex);                      // граф. изображение кадра анимации персонажа

// выводим кадр на экран (в форму)
  Form1.Canvas.Draw(0,0,Buf);
Вложения
Тип файла: zip GameRPG.zip (15.5 Кб, 61 просмотров)
IvaniuS вне форума Ответить с цитированием
Старый 05.04.2009, 18:37   #272
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Спасибо. Пример Очень расширенный) На самом деле всё оказалось проще чем я думал. Нужно создать дополнительный буффер, в котором задается прозрачность и её цвет. В этот буффер отрисовывается кадр, а буффер рисуется в основной буффер программы.
Алекс Ялта вне форума Ответить с цитированием
Старый 05.04.2009, 18:42   #273
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

это уже давным давно надо было использовать с сапого начало создать буфер и внём могое отрисовывать у можеш небольшой пример загрузки карты привести или сказать что в моём непрально? щас выложу
у меня или нерисуеться вообще или ошибка в самом приложении когда её закрываеш то она исчезает
вот он по моему всё должно строиться:
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  map:array[1..500,1..500] of byte;
  MapW,MapH: byte; //размары карты
  gx,gy: integer; //смещение карты по x и y, их мы будем прибывлять к каждобу объекту на карте
  mapbmp: tbitmap; //буфер
  sx,sy: real; //скорость по x и y
  xp,yp: real; //позиция игрока на экране(в пикселах)
  x,y: integer;
  level: integer;//уровень
  brick0: tbitmap; //проходимые кирпичи(задний план)
  brick1: tbitmap; //не проходимые кирпичи
implementation

{$R *.dfm}
procedure loadlevel();
var
  f: file of byte;

begin
  sx:=0; sy:=0;
  if not FileExists('levels/'+inttostr(level)+'.txt')then
  begin
    level:=1;
  end;
  AssignFile(f,'levels/'+inttostr(level)+'.txt');
  Reset(f);
  Read(f,MapW);
  Read(f,MapH);
  for y:=1 to MapH do
    for x:=1 to MapW do
    begin
        read(f,map[x,y]);
    end;
  CloseFile(f);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
loadlevel;
  brick0:=TBitmap.Create;
  brick0.LoadFromFile('gfx/brick0.bmp');
  brick1:=TBitmap.Create;
  brick1.LoadFromFile('gfx/brick1.bmp');
 mapbmp:=TBitmap.Create;
 mapbmp.Width:=form1.Width;
 mapbmp.Height:=form1.Height;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //  if ((gx+x*16-16<=form1.Width)and(gx+x*16>=0))or((gy+y*16-16<=form1.Height)and(gy+y*16>=0))then
вот ошибко, этого небыло дана было добавить и всё пашет:{for y:=1 to MapH do
    for x:=1 to MapW do}
case map[x,y] of
      0: {проходимая стена} mapbmp.Canvas.Draw(gx+x*16-16,gy+y*16-16,brick0);
      1: {не проходимая стена}mapbmp.Canvas.Draw(gx+x*16-16,gy+y*16-16,brick1);
 end;
  form1.Canvas.Draw(0,0,mapbmp);
end;

end.
строиться ток 1 кирпич неизвестно где

Последний раз редактировалось IvaniuS; 05.04.2009 в 21:53.
IvaniuS вне форума Ответить с цитированием
Старый 05.04.2009, 19:40   #274
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Вот тебе пример построения карты. Взят из этой же темы из ранних постов. Карта представлена не байтами. Всё проще. Изучи.
Твоя ошибка в том, что ты взял усложненный готовый код программы и пытаешься его адаптировать под свою программу.
Вложения
Тип файла: zip 2.zip (14.5 Кб, 62 просмотров)
Алекс Ялта вне форума Ответить с цитированием
Старый 05.04.2009, 20:24   #275
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Алекс Ялта Посмотреть сообщение
что ты взял усложненный готовый код программы и пытаешься его адаптировать под свою программу.
все виды пробовал даже отдельно сам писал отдельно на пару картинок получаеться, а внедрить некак(((
Я СДЕЛАЛ грац меня короче говоря я просто напросто не считывал и всё нада было добавить цикл для считывания хотя в примерах его нету и как оно пашет я хз(

Последний раз редактировалось IvaniuS; 05.04.2009 в 21:50. Причина: УРА ПОЛУЧИЛОСЬ
IvaniuS вне форума Ответить с цитированием
Старый 05.04.2009, 22:14   #276
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

IvaniuS, а зачем для построения карты нужен таймер?

Цитата:
Сообщение от Алекс Ялта Посмотреть сообщение
Спасибо. Пример Очень расширенный) На самом деле всё оказалось проще чем я думал. Нужно создать дополнительный буффер, в котором задается прозрачность и её цвет. В этот буффер отрисовывается кадр, а буффер рисуется в основной буффер программы.
Что-то я не догнал логику действий. Нужен один буфер кадра, на нем все рисуется, ...нужен битмап сборного заднего фона, размером как буфер, ...и спрайты с заданным ключом прозрачности.
Происходит так:
1) По кускам собирается задний фон, один раз для определенного участка карты, и хранится пока не будет произведено смещение по карте;
2) Фон перекидывается в буфер кадра каждый раз вначале цикла отрисовки каждого кадра. Он кладется поверх, затирая все что было в буфере;
3) В цикле накладываются спрайты объектов, с анимацией или без. Каждый спрайт, суть, Bitmap, ему можно задать прозрачность и ее цвет.
4) Через Canvas или BitBlt() буфер кадра выводится в форму.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 05.04.2009 в 22:23.
Beermonza вне форума Ответить с цитированием
Старый 06.04.2009, 00:47   #277
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
IvaniuS, а зачем для построения карты нужен таймер?
как это для обновление если произошли изменения, в картостроении ваще хз зачем он если можно обрабатывать онклик.
у меня после всего а у меня все получилось даже больше есть 2 вопроса:
1:проблема с размером бмп хочу использовать 64х64 рачество заметно возрастает весит мало под сжатием а он отображаеться как 16х16 всеравно, как в программе это изменить?
2:проблема с масивом типа байт если обьектов много больше 10 что делать? трехзначные использовать значения чтоли или двух? а уже к ним присваивать название? это же полный бред, как-то видел прогу "моя третя гра" там какойто формат карты очень хороший хочу типа такого прогу сделать
ОТВЕЧАЮ НА 1 ВОПРОС СВОЙ: у каждой текстуры есть "программный размер" Tex.Width Tex.Height которые можно менять

Последний раз редактировалось IvaniuS; 06.04.2009 в 01:12.
IvaniuS вне форума Ответить с цитированием
Старый 06.04.2009, 13:05   #278
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от IvaniuS Посмотреть сообщение

2:проблема с масивом типа байт если обьектов много больше 10 что делать? трехзначные использовать значения чтоли или двух? а уже к ним присваивать название? это же полный бред, как-то видел прогу "моя третя гра" там какойто формат карты очень хороший хочу типа такого прогу сделать
Существет 2 варианта решения проблемы на данном этапе)
1. Простой вариант: при использовании на карте символов char (map: array [1..X,1..Y] of char; ) можно кроме цифры использовать латинские символы a,b,c,d...z
2. Вариант посложнее: отлистнуть страницу назад и изучить информацию с поста 267
Алекс Ялта вне форума Ответить с цитированием
Старый 06.04.2009, 15:05   #279
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение

Что-то я не догнал логику действий. Нужен один буфер кадра, на нем все рисуется, ...нужен битмап сборного заднего фона, размером как буфер, ...и спрайты с заданным ключом прозрачности.
Это я и имел ввиду. Но выразился неправильно) Я поначалу пытался вывести кадр на общий битмап сборного заднего фона.
Алекс Ялта вне форума Ответить с цитированием
Старый 06.04.2009, 15:38   #280
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от IvaniuS Посмотреть сообщение
как это для обновление если произошли изменения, в картостроении ваще хз зачем он если можно обрабатывать онклик.
у меня после всего а у меня все получилось даже больше есть 2 вопроса:
1:проблема с размером бмп хочу использовать 64х64 рачество заметно возрастает весит мало под сжатием а он отображаеться как 16х16 всеравно, как в программе это изменить?
2:проблема с масивом типа байт если обьектов много больше 10 что делать? трехзначные использовать значения чтоли или двух? а уже к ним присваивать название? это же полный бред, как-то видел прогу "моя третя гра" там какойто формат карты очень хороший хочу типа такого прогу сделать
Если карта не двигается, то весь задний фон, суть - картинка, собирать каждый кадр заново не нужно. Массив карты тоже не обновляется, каждый раз - это статика. По таймеру на задний фон в буфере накладываются объекты игры, те что могут двигаться или не могут, но анимированы. Если произошел сдвиг по карте, то запускается процедура обновления заднего фона, и соответственно диапазон выборки ячеек массива карты.
1) Посмотри как ты использовал отрисовку:
Код:
case map[x,y] of
      0: {проходимая стена} mapbmp.Canvas.Draw(gx+x*16-16,gy+y*16-16,brick0);
      1: {не проходимая стена}mapbmp.Canvas.Draw(gx+x*16-16,gy+y*16-16,brick1);
 end;
Число 16 - не константа, вместо нее нужно записать размеры твоих спрайтов, соответственно Tex.Width для X и Tex.Height для Y.
2) Смотри посты #265 - #270

Послесловие: IvaniuS, пиши грамотно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 06.04.2009 в 15:41.
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07