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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2009, 17:12   #301
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Алекс Ялта, посмотрел твой пример с космическим корабликом. Можно ускорить намного и сделать так, чтобы не было рывков при движении, ...но это уже тема не для новичков, там GDI и ассемблер.
Можно посоветовать хранить каждый кадр кораблика в отдельной ячейке массива типа TBitmap. Вот эта строчка будет ненужна:
Код:
ShipBuf.Canvas.CopyRect(bounds(0,0,64,64),ShipSprite.Canvas,bounds(k*64,str*64,64,64));
Сразу в буфер вместо:
Код:
Buffer.Canvas.Draw(px,py,ShipBuf);
Вот так:
Код:
Buffer.Canvas.Draw(px,py,ShipAnimMas[{код направления},{номер кадра}].Tex);
Вот картинку тебе кинул на задний фон.
Вложения
Тип файла: zip bgrd.zip (474.0 Кб, 67 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 13.04.2009 в 17:17.
Beermonza вне форума Ответить с цитированием
Старый 13.04.2009, 18:27   #302
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Алекс Ялта, посмотрел твой пример с космическим корабликом. Можно ускорить намного и сделать так, чтобы не было рывков при движении, ...но это уже тема не для новичков, там GDI и ассемблер.
Можно посоветовать хранить каждый кадр кораблика в отдельной ячейке массива типа TBitmap. Вот эта строчка будет ненужна:
Код:
ShipBuf.Canvas.CopyRect(bounds(0,0,64,64),ShipSprite.Canvas,bounds(k*64,str*64,64,64));
Сразу в буфер вместо:
Код:
Buffer.Canvas.Draw(px,py,ShipBuf);
Вот так:
Код:
Buffer.Canvas.Draw(px,py,ShipAnimMas[{код направления},{номер кадра}].Tex);
Вот картинку тебе кинул на задний фон.
Спасибо за совет. Думаю, пора приступать к изучению WinApi, т.к. наконец то мне стало понятно, что есть медленный вывод графики и в чем он выражается)
P.S. На данный момент изучаю основы работы с сетью на компонентах ClientSocket - ServerSocket по Вашим примерам (http://pblog.ru/?p=91). Кстати, полезнее и доступнее пока примеров в инете не нашел. Так что и за это тоже спасибо)
Алекс Ялта вне форума Ответить с цитированием
Старый 13.04.2009, 18:38   #303
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
P.S. На данный момент изучаю основы работы с сетью на компонентах ClientSocket - ServerSocket по Вашим примерам (http://pblog.ru/?p=91).
Интересно! Нужно будет как нибудь сделать какую-нибудь прстую игру по интернету.
Вадим Буренков вне форума Ответить с цитированием
Старый 28.04.2009, 17:36   #304
oleg91
 
Регистрация: 11.04.2009
Сообщений: 3
По умолчанию

Вот тут хороший исходник http://gigapeta.com/dl/196396ab01834. Показывает все основные методы программирования графики. И весит немного.
oleg91 вне форума Ответить с цитированием
Старый 29.04.2009, 22:44   #305
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию Не могу понять что за ошибка

Решил написать свою первую игру, ближе к сердцу аркада.
Взял за образец Игру от Kostia,
пост № 106 (Огромное спасибо, надеюсь авторских прав не нарушил ) почитав здесь хорошенько, усложнил код:
Не могу продолжить из-за того что :
1 когда нажимаешь пробел много раз
2 когда нажимаешь пробел и Юнит бьется головой о потолок
Выходит ошибка:
Цитата:
First chance exception at $7C812A6B. Exception class EAccessViolation with message 'Access violation at address 00452BA0 in module 'Project1_2.exe'. Read of address 02CF9D50'. Process Project1_2.exe (3456)
Жму Break, Делфи остонавливается на строке Вывода изображения:
Код:
 mapbmp.Canvas.draw(round(xp-20),round(yp-20),SpArr[UnitSplineN]);
вот исходный код:
Код:
unit Unit1;

interface

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

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

const
  g=0.5; //ускорение свободного падения

var
  Form1: TForm1;
  map: array[1..40,1..35]of char; //карта
  mapbmp: tbitmap; //буфер
  sx,sy: real; //скорость по x и y
  xp,yp: real; //позиция игрока на экране(в пикселах)
  wall,Lu1,lu2,ru1,ru2:Tbitmap; //Текстуры
  leftU:boolean;
  Getunitstate:integer;
  Spline:Tbitmap;
  SpArr: array [1..256] of Tbitmap;
  UnitSplineN:integer;
implementation

{$R *.dfm}

function keypressed(key: byte): boolean;
var
  keys: TKeyboardState;
begin
  result:=false;
  GetKeyboardState(keys);
  if(keys[key]=128)or(keys[key]=129)then result:=true;
end;
procedure LoadTexture;
var i:integer;
begin
// n определяется сразу, если вы точно знаете сколько будет текстур
  for i:=1 to 15 do
    begin
      Spline:=TBitmap.Create;
      Spline.LoadFromFile(IntToStr(i)+'.bmp');
      SpArr[i]:=Spline;
    end;
end;

procedure loadlevel();
var
  f: TextFile;
  x,y: integer;
begin
  sx:=0; sy:=0;
  AssignFile(f,'level1.txt');
  Reset(f);
  for y:=1 to 35 do
    for x:=1 to 40 do
    begin
      if x<40 then
        read(f,map[x,y])
      else
        readln(f,map[x,y]);
      if map[x,y]='2'then
      begin
        xp:=x*20; yp:=y*20;
      end;
    end;
  CloseFile(f);
end;

procedure TForm1.AnimTimerTimer(Sender: TObject);
var n:integer;
begin
case GetUnitState of
0: n:=1;
1: n:=11;
2: n:=6;
3: ;
end;
  if UnitSplineN<n then
  UnitSplineN:=n;
  if UnitSplineN<n+4 then
  UnitSplineN:=UnitSplineN+1
  else UnitSplineN:=n;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadTexture;
  loadlevel;
  mapbmp:=TBitmap.Create;
  mapbmp.Width:=800;
  mapbmp.Height:=700;
  mapbmp.Canvas.Brush.Color:=clWhite;
  wall:=TBitmap.Create;
  wall.LoadFromFile('wall.bmp');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  x,y: integer;
begin
 GetUnitState:=0;
  //если под ногами пусто, то падаем(проверяем 2 нижние точки(ноги))
  if (map[round(xp)div 20,round((yp+sy+20))div 20]<>'1')and
     (map[round(xp+19)div 20,round((yp+sy+20))div 20]<>'1') then
    sy:=sy+g
  else
  begin
    sy:=0;
    //прыжок
    if keypressed(32) then
    begin
      sy:=-8;    
      GetUnitState:=3;
    end;
  end;
  if keypressed(39) then
    begin
    sx:=1;
    GetUnitState:=1;
    end;
  if keypressed(37) then
    begin
    sx:=-1;
    GetUnitState:=2;
    end;
  //если головой ударились, то польше не летим ввер, а начинаем падать
  if (map[round(xp)div 20,round((yp+sy))div 20]='1')or
     (map[round(xp+19)div 20,round((yp+sy))div 20]='1')then
    sy:=0;
  //если слево или справо стена, то не идем на таран
  if (map[round(xp+sx)div 20,round(yp+sy)div 20]='1')or
     (map[round(xp+sx)div 20,round(yp+sy+18)div 20]='1')or
     (map[round(xp+sx+19)div 20,round(yp+sy)div 20]='1')or
     (map[round(xp+sx+19)div 20,round(yp+sy+19)div 20]='1')then
    sx:=0;

  xp:=xp+sx;
  yp:=yp+sy;

  sx:=0;

  //проверим, нашел игрок конец уровня или нет
  if map[round(xp+10)div 20,round(yp+10)div 20]='3'then loadlevel;
  mapbmp.Canvas.FillRect(Rect(0,0,20*40,20*35));
  mapbmp.Canvas.draw(round(xp-20),round(yp-20),SpArr[UnitSplineN]);
   for y:=1 to 35 do
    for x:=1 to 40 do
      case map[x,y] of
      '1': mapbmp.Canvas.draw(x*20-20,y*20-20,Wall);
      '3': mapbmp.Canvas.rectangle(x*20-16,y*20-16,x*20-6,y*20-6)
      end;
  form1.Canvas.Draw(0,0,mapbmp);
end;

end.
Оставляю игру+ эдитор.
P.S. Заранее спасибо.
Вложения
Тип файла: rar Robofrog.rar (368.6 Кб, 95 просмотров)
Чтобы наделать ошибок надо для начала уметь хоть что то делать!
Gigabit вне форума Ответить с цитированием
Старый 02.05.2009, 17:36   #306
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Брр! Я сейчас и в своем коде не разберусь. Вы лучше начните проект заново. Писать не много и пользы больше!

А еще лучше, если вы в тетради изложите свои мысли в словесно-математичеко-формульной форме. У вас наверняка возникнут вопросы и вот их спросите на форуме, а когда закончите с тетрадью, переводите словесную-математическую-формульную форму на язык программирования.
Kostia вне форума Ответить с цитированием
Старый 03.05.2009, 18:19   #307
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию

Спасибо вам Kostia за совет, в тетради всё действительно понятней.
Я исправил ошибку
Код:
    //прыжок
    if keypressed(32) then
    begin
      sy:=-8;    
      GetUnitState:=3;
Всё окозалось просто -
GetUnitState Параметр задавал тип анимации 3 (анимация прыжка) для юнита, но анимации этой я не сделал.
Код:
case GetUnitState of
0: n:=1;
1: n:=11;
2: n:=6;
3: ;
Если я правельно всё понял оператор Case из-за этого барахлил.
Цитата:
Вы лучше начните проект заново. Писать не много и пользы больше!
Я не хочу "Бросать", этот проект, уж больно он мне понравился.
Просто если я начну писать всё заново, то именно того что есть сейчас, я повторить не смогу.
А на сегодня у меня в игре есть Редактор карт, два Бонуса (скорость, прыжок), и два ... не знаю как назвать вообщем Шипы и анимираванный Огонь.
Чтобы наделать ошибок надо для начала уметь хоть что то делать!
Gigabit вне форума Ответить с цитированием
Старый 21.05.2009, 16:19   #308
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Алекс Ялта, посмотрел твой пример с космическим корабликом. Можно ускорить намного и сделать так, чтобы не было рывков при движении, ...но это уже тема не для новичков, там GDI и ассемблер.
Beermonza, расскажи пожалуйста. Очень нужно.
Вадим Буренков вне форума Ответить с цитированием
Старый 21.05.2009, 16:41   #309
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вадим Буренков, в теме "Как Вы относитесь к созданию игр на Delphi?" с поста #46 читай подряд, найдешь создание буферов, отрисовку, перебрасывание подложки в кадр, и много интересного и поучительного.
Здесь описывать не буду, да и не имею право, ...тема не та, чтобы такие сложность показывать.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.05.2009, 17:31   #310
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Я там найду как выводить графику на Canvas без тормозов и ряби?А то мне не хочется убивать весь вечер на чтение 265 топиков и так ничего не добиться.
Проблема в том, что в Canvas меня устраивает все, кроме скорости вывода графики.Я использую два буфера и это дает результат, но не достаточный.
Вадим Буренков вне форума Ответить с цитированием
Ответ


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

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

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


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