Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прорисовка карты [Delphi, Windows]


Страницы:   1 2

AbLaZe ©   (2004-03-27 20:26:00) 

Добрый вечер !!!
Я вот что хотел спросить ...
Я пишу игру на DelphiX и создаю карту уровня следующим способом ...

procedure TGameForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var i,n : integer;
x,y : integer;
begin
if DXDraw1.CanDraw=false then exit;
DXDraw1.Surface.Fill(0);

y:=0;
for n:=1 to 15 do begin
x:=0;
for i:=1 to 10 do begin
DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
x:=x+DxImageList1.Items.Find('Terrain').Width;
end;
y:=y+DxImageList1.Items.Find('Terrain').Height;
end;

y:=-16;
for n:=1 to 15 do begin
x:=-32;
for i:=1 to 10 do begin
DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
x:=x+DxImageList1.Items.Find('Terrain').Width;
end;
y:=y+DxImageList1.Items.Find('Terrain').Height;
end;

Потом рисую человечка и двигаю его по опр. закону
Так вот у меня после этого ЛАГИ страшные ...
Машина у меня очень мощная P4 2400 512 DDR 128 GeForce FX
Если я убираю прорисовку карты и оставляю только человечка, то все OK
В чем проблема ???

Если я что-то делаю не так, то подскажите мне как правильно прорисовывать карту местности, ведь она у меня будет больших размеров ...


woolf/psycho   (2004-04-08 17:02:00) [1]

Ну, раз на то пошло Speccy Rulez 4ever! А ежели серьезно, не в первый раз встречаюсь с этой проблемой (в смысле с тормозами в оконном режиме).Долго я копался и вот чё выкопал DirectX после 7й версии не умеет работать с 2D графикой!!! А тем более в оконном. И все более-менее новые карты нормальной поддержки двумерной графики практически не имеют. У меня жесточайшие тормоза в MM VI на GF2 MX400. И это при том, что на старенькой ривке все летает... Кроме того было замечено, что DelphiX несколько неадекватно реагирует на оконные режимы. Точнее загадочно. На одинаковых видеокартах, но с разной конфигурацией системы выдаются абсолютно разные результаты. Разброс 30fps - 270 fps...

to AbLaZe 
Может, попробуй не

for i:=1 to 10 do begin
  Land.Draw(DXDraw1.Surface,x,y,0);


А чегонить в стиле:
 lnd:=xxxx;
 for i:=1 to 10 do begin
   DxImageList1.Items [lnd].Draw (DXDraw1.Surface,x,y,0);

Так вроде малость быстрее...


GrayFace   (2004-04-06 14:30:00) [2]

TButton ©   (28.03.04 20:09) [32]
>значит гефорс - маздай, бери пример с меня RivaTNT M64 16Mb + 3D тормозитель и никаких тебе лагов =)

RivaTNT - тоже Windows(так переводится мастдай на английский). EGA forever!!


lyeh   (2004-03-29 02:50:00) [3]

Да, архивчик выкладывай. А еще попробуй удалить драйвер джифорса (в смысле не дистрибутив, а из меню), и затем переустанови - и ничего руками там не трогай. Возможно ты в биосе поковырялся, там есть настройки относительно AGP


TButton   (2004-03-28 22:18:00) [4]

=)


cyborg   (2004-03-28 22:17:00) [5]

Только всякие .~ddp .~dfm .~pasубирай.


cyborg   (2004-03-28 22:15:00) [6]

Выложи архив с исходником и графикой, посмотрю.


TButton   (2004-03-28 20:33:00) [7]

нет.


AbLaZe   (2004-03-28 20:22:00) [8]

это-та понятно но что Вы можете мне существенного посоветовать, всмысле как мне писать игрульку чтобы не лагало на гефорсе ???


TButton   (2004-03-28 20:09:00) [9]

значит гефорс - маздай, бери пример с меня RivaTNT M64 16Mb + 3D тормозитель и никаких тебе лагов =)


AbLaZe   (2004-03-28 20:06:00) [10]

Спрайты - 64*32
Да я сам не понимаю в чем дело ??????????????????????????????
Может быть какие-нибудь настройки GeForce 5 FX 128 Mb надо поменять, чтобы перло ?????????????????????????
Потому что тут вот какие дела:
Скачал я с сайта http://nerosg.narod.ru/files_3.htm
файлик "gnev.exe" и запустил его на одном компе где карточка интегринная S3 Savage 32 Mb
Все класс !!!
Потом ту же игру запустил на моей тачке GeForce 5 FX 128 Mb
ЛАГИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИ !!!


TButton   (2004-03-28 20:00:00) [11]

ну сделал я прорисовку, в точности как у тебя. 30-40ms занимает бэз лагов. странно. у тебя спрайты каких размеров? у меня 64х64 каждый.


AbLaZe   (2004-03-28 19:43:00) [12]

Графон я держу сразу в DXImageList !!!


AbLaZe   (2004-03-28 19:15:00) [13]


unit GameUnit;

interface

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

type
 TGameForm = class(TForm)
   DXDraw1: TDXDraw;
   DXImageList1: TDXImageList;
   DXTimer1: TDXTimer;
   OptionsPanel: TPanel;
   SkillPanel: TPanel;
   CharPanel: TPanel;
   InvPanel: TPanel;
   OtherPanel: TPanel;
   CmdPanel: TPanel;
   Label1: TLabel;
   CmdText: TComboBox;
   CmdButton: TButton;
   SayTimer: TTimer;
   procedure DXDraw1Initialize(Sender: TObject);
   procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
   procedure DXDraw1Finalize(Sender: TObject);
   procedure CmdTextKeyPress(Sender: TObject; var Key: Char);
   procedure CmdButtonClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure SayTimerTimer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 GameForm: TGameForm;

implementation

{$R *.dfm}

Uses TypeUnit, NetUnit;

var CurBx, CurBy, Bx,By : integer;
say, Move : boolean;
MyText : String;
w,h : integer;
Land,hero : TPictureCollectionItem;

procedure TGameForm.DXDraw1Initialize(Sender: TObject);
begin
DxTimer1.Enabled:=true;
Bx:=150;
By:=150;
CurBx:=150;
CurBy:=150;
Move:=false;
say:=false;
w:=DxImageList1.Items.Find('Terrain').Width;
h:=DxImageList1.Items.Find('Terrain').Height;
Land:=DxImageList1.Items.Find('Terrain');
Hero:=DxImageList1.Items.Find('Bot');
end;

procedure TGameForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var i,n : integer;
x,y : integer;
begin
if DXDraw1.CanDraw=false then exit;
DXDraw1.Surface.Fill(0);

y:=0;
for n:=1 to 15 do begin
x:=0;
for i:=1 to 10 do begin
Land.Draw(DXDraw1.Surface,x,y,0);
x:=x+w;
end;
y:=y+h;
end;

y:=-16;
for n:=1 to 15 do begin
x:=-32;
for i:=1 to 10 do begin
Land.Draw(DXDraw1.Surface,x,y,0);
x:=x+w;
end;
y:=y+h;
end;

if Move=false then
Hero.Draw(DXDraw1.Surface,CurBx,CurBy,0) else
begin

if Bx>CurBx then
if CurBx < Bx then begin
CurBx:=CurBx+5;
if CurBx>Bx then CurBx:=Bx;
end;
if Bx<CurBx then
if CurBx > Bx then begin
CurBx:=CurBx-5;
if CurBx<Bx then CurBx:=Bx;
end;

if By>CurBy then
if CurBy < By then begin
CurBy:=CurBy+5;
if CurBy>By then CurBy:=By;
end;
if By<CurBy then
if CurBy > By then begin
CurBy:=CurBy-5;
if CurBy<By then CurBy:=By;
end;
Hero.Draw(DXDraw1.Surface,CurBx,CurBy,0);
end;
if (CurBx=Bx) and (CurBy=By) then Move:=false;

if say=true then begin
with DXDraw1.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clRed;
Font.Size := 15;
Font.Name := 'Monotype Corsiva';
Textout(CurBx, CurBy-20, MyText);
Release;
end;
end;

DXDraw1.Surface.Canvas.Release;
DXDraw1.Flip;

Gameform.Caption:=Inttostr(DXTimer1.FrameRate);
end;

procedure TGameForm.DXDraw1Finalize(Sender: TObject);
begin
DxTimer1.Enabled:=false;
end;

procedure TGameForm.CmdTextKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 then CmdButton.Click;
end;

procedure TGameForm.CmdButtonClick(Sender: TObject);
begin
CmdText.Text:=Trim(CmdText.Text);
if CmdText.Text='выход' then close;
if Pos('сказать',CmdText.Text)=1 then
begin
MyText:=CmdText.Text;
Delete(MyText,Pos('сказать',MyText),7);
MyText:=trim(MyText);
Say:=true;
sayTimer.Enabled:=true;
end;
if CmdText.Text<>'' then CmdText.Items.Add(CmdText.Text);
CmdText.Text:='';
end;

procedure TGameForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Game.Connected=true then Disconnect;
end;

procedure TGameForm.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin
BX:=X;
By:=Y;
Move:=true;
end;
end;

procedure TGameForm.SayTimerTimer(Sender: TObject);
begin
say:=false;
SayTimer.Enabled:=false;
end;

end.


TButton   (2004-03-28 19:06:00) [14]

да откуда там лаги!
приведи весь код, а то я никак не пойму почему у меня лагов нет.


Kobik   (2004-03-28 18:57:00) [15]

Не надо ставить 8 бит. От этого сильные лаги доже в полноэкранном режиме. Чем тебе не нравятся 16 и 32?


AbLaZe   (2004-03-28 18:10:00) [16]

Тут есть кто-нить ???
Если вы не хотите отвечать так и скажите ...
Чего ВЫ молчите ???
Мне нужна помощь вы что не можете мне помочь ????


AbLaZe   (2004-03-28 17:01:00) [17]

Я ВАС очень сильно прошу помогите мне написать этот кусок кода !
Мне надо чтобы рисовалась поверхность земли из маленьких спрайтиков (64*32) и по этой поверхности двигался человечек (но это я уже сделал !!!) Мне осталось только нарисовать поверхность большого размера, так, чтобы был scroll по карте, но у меня ЛАГИ
Когда я убираю прорисовку карты и оставляю только человечка то все OK !!!


AbLaZe   (2004-03-28 16:48:00) [18]

Ну ответьте мне please !!!!!!!!


AbLaZe   (2004-03-28 16:28:00) [19]

А как это не по таймеру ???
И как выводить во вторичный буфер ???


cyborg   (2004-03-28 16:26:00) [20]

1) Рисовать не по таймеру
2)выводить графику во вторичный буфер
3) писать хороший код


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо