![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прорисовка карты [Delphi, Windows]
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) писать хороший код