?? scenemainunit.pas
字號:
//UnTitledRTS for UnDelphiX
unit SceneMainUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DXClass, DXSprite, DXInput, DXDraws,
DXSounds, DIB , DXWStatObj,DXWPath, DXWImageSprite;
Var
StartSelection : boolean;
procedure StartSceneMain;
procedure SceneMain;
procedure EndSceneMain;
procedure ScrollSpriteEngine;
procedure WatchForEnemy;
procedure Attack;
procedure SceneMainMouseDown(Shift: TShiftState; X, Y: Integer);
procedure SceneMainMouseUp(Shift: TShiftState; X, Y: Integer);
procedure SceneMainMouseMove(Shift: TShiftState; X, Y: Integer);
procedure OutSelSpriteInf;
implementation
Uses Main,GameSpritesUnit,Menu, DXWNavigator, Pathes ;
procedure ScrollSpriteEngine;
Const
StepScroll=20;
Var
dx,dy,ScrollCount : integer;
NewX,NewY : double;
Xmax,Xmin,Ymax,Ymin : double;
begin
With MainForm do begin
Xmax:=0;
Ymax:=0;
Xmin:=SpriteEngine.Engine.Width-MapW;
Ymin:=SpriteEngine.Engine.Height-MapH;
if DXTimer.FrameRate=0
then ScrollCount:=Trunc(StepScroll)
else ScrollCount:=Trunc(StepScroll*(80/DXTimer.FrameRate));
dx:=0;
dy:=0;
if MouseXY.Y=0 then dy:=ScrollCount;
if MouseXY.Y=479 then dy:=-ScrollCount;//(480-1)
if MouseXY.X=0 then dx:=ScrollCount;
if MouseXY.X=639 then dx:=-ScrollCount;//(640-1)
if ( isUp in DXInput.States )then dy:=ScrollCount;
if ( isDown in DXInput.States )then dy:=-ScrollCount;
if ( isLeft in DXInput.States )then dx:=ScrollCount;
if ( isRight in DXInput.States )then dx:=-ScrollCount;
NewX:=SpriteEngine.Engine.X+dx;
NewY:=SpriteEngine.Engine.Y+dy;
if ( NewX<=Xmax ) and ( NewX>=Xmin )
then SpriteEngine.Engine.X:=NewX
else
if NewX>Xmax
then SpriteEngine.Engine.X:=Xmax
else SpriteEngine.Engine.X:=Xmin;
if ( NewY<=Ymax ) and ( NewY>=Ymin )
then SpriteEngine.Engine.Y:=NewY
else
if NewY>Ymax
then SpriteEngine.Engine.Y:=Ymax
else SpriteEngine.Engine.Y:=Ymin;
end;
end;
procedure WatchForEnemy;
Var
i : integer;
begin
// need optimiztion
With MainForm do
begin
//Zprofiler.mark(1,true);
For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
if (MainForm.SpriteEngine.Engine.Items[i] is TGameUnit)
then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doWatchForEnemy;
{
i := -1;
repeat
i := MainForm.SpriteEngine.Engine.FindInstanceOf(TGameUnit, false, i+1);
if i >= 0
then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doWatchForEnemy;
until(i < 0);
}
//Zprofiler.mark(1,false);
end;
end;
procedure Attack;
Var
i : integer;
begin
// need optimiztion
With MainForm do
begin
For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
if (MainForm.SpriteEngine.Engine.Items[i] is TGameUnit)
then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doAttack;
end;
end;
procedure SceneMain;
Const
StepMove=25;// (1000/40)
Counter : LongInt=0;
Var
i : integer;
selX : integer;
begin
With MainForm do begin
if DXTimer.FrameRate=0
then SpriteEngine.Move(Trunc(StepMove))
else SpriteEngine.Move(Trunc(StepMove*(80/DXTimer.FrameRate)));
SpriteEngine.Dead;
ScrollSpriteEngine;
//simple AI
If Counter>(DXTimer.FrameRate div 2) then// no need exectly
begin
WatchForEnemy;
Counter:=0;
end
else Inc(Counter);
Attack;
DXDraw.Surface.Fill(0);// may do not this
if FNextScene=gsNone then
begin
SpriteEngine.Draw;
//TmpImageList2.Items.Find('Map1_1').Draw(DXDraw.Surface,0,0, 0);
//TmpImageList2.Items.Find('Map1_2').Draw(DXDraw.Surface,22,0, 0);
//TmpImageList2.Items.Find('Map1_3').Draw(DXDraw.Surface,22,458, 0);
TmpImageList2.Items.Find('Map1_4').Draw(DXDraw.Surface,446,0, 0);
For i:=0 to FBtnList.Count-1
do TDXImageButton(FBtnList[i]).DoDraw;
Navigator.DrawSelf;
if SubSceneMainMenuEnabled then SubSceneMainMenu;
//---------- Frame rate display and GroupeSelRect---------
with DXDraw.Surface.Canvas do
begin
if StartSelection then
begin
Pen.Color:=clGreen;
Pen.Style:=psDot;
Pen.Width:=1;
if MouseXY.X >SpriteEngine.Engine.Width
then selX:=SpriteEngine.Engine.Width
else selX:=MouseXY.X;
Rectangle(Trunc(MapDownPointX+SpriteEngine.Engine.X),
Trunc(MapDownPointY+SpriteEngine.Engine.Y),
selX,MouseXY.Y);
end;
Pen.Style:=psSolid;
Brush.Style := bsClear;
Font.Color := clWhite;
//Font.Name := 'MS Sans Serif';
Font.Name := 'Arial';
Font.Size := 7;
//Textout(480, 150, 'FPS: '+inttostr(DXTimer.FrameRate));
//Textout(480, 160, 'Sprite: '+inttostr(SpriteEngine.Engine.AllCount));
Textout(480, 160, 'Sprite: '+inttostr(SpriteEngine.Engine.Count));
Textout(480, 170, 'Draw: '+inttostr(SpriteEngine.Engine.DrawCount));
Textout(480, 180, format('Engine.W/H: %d,%d ',[SpriteEngine.Engine.Width,SpriteEngine.Engine.Height]));
Textout(480, 190, format('Engine.XY: %.0f,%.0f ',[SpriteEngine.Engine.X,SpriteEngine.Engine.Y]));
Textout(480, 200, format('Engine.WorldXY: %.0f,%.0f ',[SpriteEngine.Engine.WorldX,SpriteEngine.Engine.WorldY]));
Textout(400, 210, format('Engine.SerfaseRect: %d,%d,%d,%d ',
[SpriteEngine.Engine.SurfaceRect.left,
SpriteEngine.Engine.SurfaceRect.top,
SpriteEngine.Engine.SurfaceRect.Right,
SpriteEngine.Engine.SurfaceRect.Bottom]));
Textout(400, 220, format('Engine.BoundsRect: %d,%d,%d,%d ',
[SpriteEngine.Engine.BoundsRect.left,
SpriteEngine.Engine.BoundsRect.top,
SpriteEngine.Engine.BoundsRect.Right,
SpriteEngine.Engine.BoundsRect.Bottom]));
Textout(480, 230, format('MapW/H: %d,%d ',[MapW,MapH]));
Textout(400, 240, format('ScrollBackground.WorldXY: %.0f,%.0f ',[ScrollBackground.WorldX,ScrollBackground.WorldY]));
Textout(400, 250, format('ScrollBackground.XY: %.0f,%.0f ',[ScrollBackground.X,ScrollBackground.Y]));
Release;
end;
OutSelSpriteInf;
end;
end;
end;
procedure StartSceneMain;
Var
i, j : Integer;
FileName : string;
begin
MainForm.SpriteEngine.Engine.SurfaceRect :=Rect(0,0,446,480);
FileName:='MainFon.dxg';
MainForm.LoadPicData(MainForm.TmpImageList2,FileName);
//MainForm.TmpImageList2.Items.LoadFromFile(GetName('Graphics\DXG',FileName));
MainForm.SavePicData(MainForm.TmpImageList2,FileName);
FileName:='GameSprites.dxg';
MainForm.LoadPicData(MainForm.ImageList,FileName);
//MainForm.ImageList.Items.LoadFromFile(GetName('Graphics\DXG',FileName));
MainForm.SavePicData(MainForm.ImageList,FileName);
MainForm.LoadWaves;
//MainForm.DXWaveList.Items.LoadFromFile(GetName('Sound\DXW','SpriteEffect.dxw'));
//FScore := 0;
//FEnemyAdventPos := 0;
//FFrame := 0;
{
For i:=1 to 5 do begin
With TPlayer2.Create(SpriteEngine.Engine) do
begin
X:=50 + 70*i;
Y:=100;
Z := Trunc(Y);
end;
end;
}
{ Cursor object }
// CursorSprite:=TCursorSprite.Create(SpriteEngine.Engine);
{
With TBuilding.Create(SpriteEngine.Engine) do
begin
Image := MainForm.ImageList.Items.Find('Castle');
Width := Image.Width;
Height := Image.Height;
//PixelCheck:=true;
X := 150;
Y := 300;
Z := Trunc(Y);
end;
Randomize;
For i:=1 to 30 do begin
With TBuilding.Create(SpriteEngine.Engine) do
begin
Image := MainForm.ImageList.Items.Find('Trees');
Width := Image.Width;
Height := Image.Height;
//PixelCheck:=true;
if i<=15 then
begin
X := -1800+ 200*i;
Y := 0;
Z := Trunc(Y);
end
else
begin
X := -1800+ 200*(i-15);
Y := 450;
Z := Trunc(Y);
end;
end;
end;
With TBuilding.Create(SpriteEngine.Engine) do
begin
Image := MainForm.ImageList.Items.Find('Mine');
Width := Image.Width;
Height := Image.Height;
//PixelCheck:=true;
X := 350;
Y := 350;
Z := Trunc(Y);
end;
}
// Background // Background // Background // Background // Background // Background
ScrollBackground:=TScrollBackground.Create(MainForm.SpriteEngine.Engine);
//ScrollBackground.LoadObstacle;
ScrollBackground.LoadMap(GetName('Map','Test2.map'));
PathInf:=TDXPath.Create(DimW,DimH);
For j :=0 to (DimH-1) do
For i :=0 to(DimW-1) do
PathInf.FObstacle[j,i]:=ScrollBackground.Obstacle[j,i];
For i:=1 to 5 do begin
With TGameUnit.Create(MainForm.SpriteEngine.Engine) do
begin
UnitName:='Player1Spr';
Direction:=Random(8);
FChipH:=ChipH;
FChipW:=ChipW;
X:=150 + 90*i;
Y:=130;
//X:=Random(MapW);
//Y:=Random(MapH);
Z := Trunc(Y);
Life := 20;
FLifeMax := 20;
FDamage := 1;
FAttackRange := 200;
FSight := 200;
FSpeed := 75/1000;
FAllyID := 1;
FUnitColor :=DXRed;
end;
end;
For i:=1 to 5 do begin
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -