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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2009, 17:39   #51
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
Радость

Щас попробую... Насчет переменной изменяющей положение персонажа в массиве - нет так как передвигаться по этим процедурам буду не только я но и другие персогажы игры, да к тому же зачем делать ее переменной если можно просто вычесть или прибавить 1. А вот насчет переменой попиксельного сдвига там почти также но раз эта скорость изменяемая тоггда конечно ее нужно делать переменной Но зачем ей делать знаки + или - если скорость в минус уходить не должна.
Shadow_1329 вне форума Ответить с цитированием
Старый 14.08.2009, 18:14   #52
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shadow_1329, ты сначала хорошо хорошо подумай, потом говори "нет"
Попробую объяснить еще раз. Твой персонаж - центровой, это от него считается зона видимости карты, это его координаты лежат в основе "вырезания" фрагмента карты. Остальные персонажи двигаются как и двигались, они нам не нужны. Вот ушел какой-то перс за экран, он нам нужен? ...нет, ...и пусть себе ушел, его координаты нас не волнуют в прорисовке текущего кадра. Понятно?
Про скорость. В школе учат, что скорость отрицательной не бывает, меняется вектор направления, ...считай что знак "+" или "-" это вектор направления. Если персонаж шел вперед со скоростью 2, то его смещение изменяется на 2, т.е. прибавляем. Если перс идет назад, мы должны отнимать скорость 2, ...теперь, внимание! если я прибавлю к смещению минус 2, куда пойдет перс? ...мы фактически убираем еще одно условие на смещение, оно теперь одно, но в зависимости от нажатой клавиши персонаж сам знает куда ему идти, ведь переменная скорости указывает не только приращение, но и "вектор", кроме того, в зависимости от того, положительное значение или отрицательное нужно выставлять направление анимации. Понятно?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.08.2009, 18:23   #53
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

Понятно. Попробовал тот способ. Почему то подложка не перерисовывается заного. И все равно там что-то тормозит комп аж 78 процентов загрузки. Но перс теперь при передвижении не тормозит что уже радует! Ща буду исправлять.
Shadow_1329 вне форума Ответить с цитированием
Старый 14.08.2009, 18:40   #54
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

А ты при запуске карты собрал подложку? ...если нет, то просто перекидывать нечего, вот и пусто. Укажи при старте флаг UpdateTerr True, ...и внимательно с переменными выреза участка карты, они должны быть заданы при старте, потом меняются динамически.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 14.08.2009 в 18:43.
Beermonza вне форума Ответить с цитированием
Старый 14.08.2009, 18:41   #55
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

Все терь норм. Но теперь когда он дооезжает до определенной координаты опять подложка не рисуется.
Вот код. Вроди все правильно...
Код:
//Эт собственно сама прорисовка
 If UpdateTerr=true then
    Begin

      For MMH := MapUp to MapDown do//
       begin
        For MMW := MapLeft to MapRight do
         Begin
          If map[MMW, MMH] = 1 then FullMap.Canvas.Draw((MMW-MapLeft)*100,(MMH-MapUp)*100, Grass);//флллмап заменяет TerrBuf
         end;
       end;

      For MMH := MapUp to MapDown do
       begin
        For MMW := MapLeft to MapRight do
         begin
          if mapobj[MMW,MMH] = 1 then FullMap.Canvas.Draw(MMW*100-230,MMH*100-350,Tree);
          if mapobj[MMW,MMH] = 3 then
           begin
            FullMap.Canvas.Draw(Pc[1].Ux*100+Pc[1].SPX,Pc[1].Uy*100+Pc[1].SPY,PC[1].Anim[1]);//для обьектов тоже нужна прорисовка
           end;
         end;
       end;
  UpdateTerr:=false;
end;
buf.canvas.draw(Gx,gy,Fullmap);//прорисовываем на буфере карту
//передвижение

if PC[plco].ChRight=true then
 begin
  PC[plco].ChUp:=false;
  PC[plco].ChDown:=false;
  PC[plco].ChLeft:=false;
  If (PC[plco].SPX <= 100) or (PC[plco].SPX >= 0) then
    Begin
      Pc[plco].SPX:=Pc[plco].SPX+PC[plco].Speed;
      if Pc[plco].Ux>4 then Gx:=Gx-PC[plco].Speed;//Gx - это переменная сдвига экрана относительно перса(скролллинг)
    end;

  if Pc[plco].SPX>=100 then
    begin
     Pc[plco].Spx:=0;
     Pc[plco].Ux:=Pc[plco].Ux+1;
     MapLeft:=MapLeft+1;//к левому краю куска карты прибавляем 1
     MapRight:=MapRight+1;//к правому
     If MapRight > MapW then MapRight := MapW;//если вылазиет за пределы то делаем так чтобы не вылазил=)
     Mapobj[Pc[plco].Ux,Pc[plco].Uy]:=3;
     Mapobj[Pc[plco].Ux-1,Pc[plco].Uy]:=0;
    end;                       
   PC[plco].Speed:=PC[plco].MaxSpeed;
   UpdateTerr := True;//обновляем
 end;

//и в событии создания вот что 
MapLeft:=0;//по горизонтали левому краю присваиваем значение нулю
MapRight:=8;//правому так как у меня 800 на 600 то присваеваем значие 8
MapUp:=0;//верхнему
MapDown:=6;//нижнему по вертикали 
UpdateTerr:=true;

Последний раз редактировалось Shadow_1329; 15.08.2009 в 08:38.
Shadow_1329 вне форума Ответить с цитированием
Старый 15.08.2009, 11:57   #56
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Если человеку хочется чем-то заниматься, он этим занимается, советы давать можно, но "нажимать" ни в коем случае,
Да никто не давит. Просто я считаю что если человек не совсем понимает что такое игровой движок, а что такое графический движок то нужно объяснить ему . Никто не говорит что пытаться оптимизировать что-то плохое занятие. Просто если цель - делать игру то зачем все усложнять при этом так и не добиться хорошего результата.
P.S Больше оффтопить не буду .
Вадим Буренков вне форума Ответить с цитированием
Старый 15.08.2009, 22:51   #57
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Он и не ставит целью - сделать игру во что бы то не стало, ...ему интересно просто вот так копаться в коде, узнавать что-то новое, преодолевать трудности, ...да что я, ...он сам скажет, или уже сказал, нужно только внимательно посмотреть текст прошлых сообщений.
Слышь, Shadow_1329, ...а почему вдруг прорисовка объектов оказалась в сборе подложки? Вот только это в ней:

Код:
  If UpdateTerr = true then
    Begin
      For MMH := MapUp to MapDown do//
        begin
          For MMW := MapLeft to MapRight do
            Begin
              If map[MMW, MMH] = 1 then FullMap.Canvas.Draw((MMW-MapLeft)*100,(MMH-MapUp)*100, Grass);//флллмап заменяет TerrBuf
            end;
        end;
      UpdateTerr := false;
    end;
После этого кода идет переброс подложки в буфер кадра:
Код:
buf.canvas.draw(Gx,gy,Fullmap);
а потом уже все объекты и персонажи. Они рисуются уже сразу в буфер кадра Buf.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 15.08.2009 в 23:01.
Beermonza вне форума Ответить с цитированием
Старый 16.08.2009, 07:32   #58
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

Насчет того что сказал Beermonza да я это уже говорил. Может и не в этой теме, а хотя даже в этой. Начет прорисовки, щас попробую.

Работает!!!!!!!! Он работает!!!!! УРРА!!!!!!!!!!!!!!!!!!! Спасибо большое!!!!!!!!!! Токо вернулся к старой проблеме деревья сильно тормозят и загружают процессор=) Щас перейду на BitBlt()

Н-да с BitBlt не тормозит вообще. Но прозрачность вокруг обьектов куда-то делась=(

З.Ы. Я еще тут хотел узнать про тени от обьектов и свет на них(а то чтото я нигде тут этого не нашел), но думаю лучшев другой теме.

Последний раз редактировалось Shadow_1329; 16.08.2009 в 09:44.
Shadow_1329 вне форума Ответить с цитированием
Старый 16.08.2009, 17:34   #59
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

BitBlt() не поддерживает прозрачность, он копирует пискели из источника в приемник. Давай-ка тут опишу создание буферов подложки и кадра более лучшим способом, это предмет темы.
Вот ты у себя создаешь буфера вот так:

Код:
FullMap := TBitmap.Create;
FullMap.Width := W;
FullMap.Height := H;

Buf := TBitmap.Create;
Buf.Width := W;
Buf.Height := H;
Напиши вот такую структуру создания буферов:

Код:
  var
     BInfo: tagBITMAPINFO;
     BufPointer, FullMapPointer: Pointer;
     BufLengthDiv: Integer;
  ...

  BInfo.bmiHeader.biSize := SizeOf(tagBITMAPINFOHEADER);
  BInfo.bmiHeader.biWidth := W;
  BInfo.bmiHeader.biHeight := H;
  BInfo.bmiHeader.biPlanes := 1;
  BInfo.bmiHeader.biBitCount := 24;
  BInfo.bmiHeader.biCompression := BI_RGB;

// создание буфера кадра
  Buf := TBitmap.Create();
  Buf.Handle := CreateDIBSection(Canvas.Handle, BInfo, DIB_RGB_COLORS, BufPointer, 0, 0);

// создание подложки
  FullMap := TBitmap.Create();
  FullMap.Handle := CreateDIBSection(Canvas.Handle, BInfo, DIB_RGB_COLORS, FullMapPointer, 0, 0);

// зададим размер буферов (у нас 24 бита текстуры, поэтому множитель 3
// а делим нацело на 8, чтобы не терять в скорости на вычислениях
// при переносе данных блоками)
  BufLengthDiv := (H*W*3) div 8;
Что происходит. Мы создали битовые буфера, получили на них указатели в памяти, узнали размер данных буферов. Теперь будем переносить подложку в буфер не через Canvas, а с помощью вот этой ассемблерной вставки:

Код:
asm
    push esi
    push edx

    mov ecx, BufLengthDiv
    mov esi, FullMapPointer
    mov edx, BufPointer

  @@mix:
    movq      xmm0, [esi]     // FullMap -> в регистр
    movq      [edx], xmm0     // Buf <- из регистра

    add esi, 8
    add edx, 8

    loop @@mix

    pop edx
    pop esi

    emms
  end;
Это самый быстрый софтварный способ переместить данные из одного участка памяти в другой, т.е. скопировать содержимое подложки в буфер кадра, при том не схлопнув их. Пробуй.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.08.2009, 17:47   #60
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

Это прям так и написать? вместо Buf.Canvas.Draw(gx,gy,FullMap) писать это? Щас попробую.
Shadow_1329 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно самому сделать так, чтобы программы грузились с диска, до загрузки ОС? Лукманов Александр Софт 1 18.04.2009 12:14
оптимизировать для максимальной скорости выполнения программы, т.е. заменить ее кодом на ассемблере gusluk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 10.12.2008 04:21
Увеличение и уменьшение картинок zzzzz Мультимедиа в Delphi 2 30.08.2008 20:53
запуск программы после загрузки Windows matus Windows 3 25.04.2008 11:16
отслеживание загрузки программы ГОСЕАН Общие вопросы Delphi 4 13.12.2007 18:04