📄 unit1.~pas
字号:
Begin
// mainform.dxsfx1.items[0].play(false);
PlaySoundFX(xx, yy, 0);
ay := -11 - abs(vx) * 0.3;
vy := 0;
End Else If vy > -4 Then
Begin
aa := isblock(trunc(xx + 16), trunc(yy + 16));
If (-aa >= 5 * 16) And (-aa < 8 * 16) Then
Begin
ay := -1;
End Else
If length(tag) = 3 Then
If (tag[1] + tag[2] = 'H0') Then
Begin
ay := -0.8;
End;
End;
If Not (isButton1 In dxistates) Then game.fireup := true;
If (isButton1 In dxistates) And (game.nextfire <= 0) And game.fireup Then
With game.objs[PlayerObj] Do
If (length(tag) = 3) Then
If tag[1] + tag[2] = 'H2' Then
With game.objs[gethandle] Do
Begin
If game.objs[playerobj].direction <> 0 Then
xx := game.objs[PlayerObj].xx - 32 Else xx := game.objs[PlayerObj].xx + 32;
xx := xx + game.objs[PlayerObj].vx;
yy := game.objs[PlayerObj].yy - 16;
If isblock(trunc(xx), trunc(yy + 30)) > 0 Then typo := 0 Else
Begin
direction := game.objs[PlayerObj].direction;
pic := 18;
pushable := true;
pusher := false;
If isup In dxistates Then vy := -10 Else
If isdown In dxistates Then vy := 5 Else vy := -1;
ay := 0;
ax := 0;
vx := 0;
typo := 30;
stall := 255;
game.fireup := false;
game.nextfire := 20;
PlaySoundFX(xx, yy, 6);
End;
End;
If (isUp In dxistates) Then
With game.objs[PlayerObj] Do
If (length(tag) = 3) Then
If (tag[1] + tag[2] = 'H0') Then
tag[3] := inttostr((strtoint(tag[3]) + 1) Mod 4)[1];
If (isDown In dxistates) And (game.objs[playerobj].vy >= 0) Then
With game.objs[playerobj] Do
Begin
moveobject(playerobj, 0, abs(vx), 1);
If isblock(round(xx) + 16, ceil(yy) + 32) > 0 Then
For aa := 1 To 5 Do
If isblock(round(xx) + 16 + aa, round(yy) + 32) = -1 Then
Begin
direction := 0;
ax := 0.5;
// ay:=2;
slide := true;
pic := 7;
break;
End Else
If isblock(round(xx) + 16 - aa, round(yy) + 32) = -1 Then
Begin
slide := true;
direction := 1;
ax := -0.5;
// ay:=2;
pic := 7;
break;
End;
End;
With game.objs[playerobj] Do
If (isdown In dxistates) And (Not crashx) And (abs(vx) > 2) Then pic := 7; {}
End;
Procedure TMainForm.PlayGame;
Var d : single;
s : tdxinputstates;
scorestr : String;
Begin
With game.gamma Do
Begin
r := 1 - (1 - r) * 0.95;
g := 1 - (1 - g) * 0.95;
b := 1 - (1 - b) * 0.95;
End;
mainform.updategamma;
If Not mainform.dxdraw1.candraw Then exit;
// bakgrunn
If (game.nextfire >= 0) Then dec(game.nextfire);
mainform.dxinput1.Update;
If (isbutton1 In mainform.dxinput1.States) Then
If game.objs[myhandle].typo <> 1 Then
Begin
With game Do score := levelscore;
loadlevel(game.level.currentfile);
End;
// daah
s := mainform.dxinput1.states;
If Not (isup In s) And (mainform.dxinput1.keyboard.keys[17]) Then s := s + [isup];
If Not (isButton1 In s) And (mainform.dxinput1.keyboard.keys[18]) Then s := s + [isButton1]; {}
// inc(mainform.dxinput1.states.isfire);
PlayerInput(myhandle, s);
d := 0.90;
game.scrollx := round(game.scrollx * d + (game.objs[myhandle].xx - mainform.dxdraw1.display.Width / 2) * (1 - d));
game.scrolly := round(game.scrolly * d + (game.objs[myhandle].yy - mainform.dxdraw1.display.height / 2) * (1 - d));
{if game.scrollx>game.objs[myhandle].xx-320 then dec(game.scrollvx);
if game.scrollx<game.objs[myhandle].xx-320 then inc(game.scrollvx);
if abs(game.scrollvx)>5 then game.scrollvx:=5*(game.scrollvx div abs(game.scrollvx));
game.scrollx:=game.scrollx+game.scrollvx;
//if game.scrolly>game.objs[myhandle].yy-320 then game.scrollvy:=-1;
//if game.scrolly<game.objs[myhandle].yy-320 then game.scrollvy:=1;
//game.scrolly:=game.scrolly+game.scrollvy;}
If game.scrolly < 0 Then game.scrolly := 0;
If game.scrolly > game.level.info.height * 32 - mainform.dxdraw1.display.height Then game.scrolly := game.level.info.height * 32 - mainform.dxdraw1.display.height;
If game.scrollx < 0 Then game.scrollx := 0;
If game.scrollx > game.level.info.width * 32 - mainform.dxdraw1.display.width Then game.scrollx := game.level.info.width * 32 - mainform.dxdraw1.display.width;
With game.objs[myhandle] Do
If isbutton2 In s Then
Begin
ax := ax * 1.75;
// ax:=ax*1.5;
End;
processobjs;
If slide Then
With game.objs[myhandle] Do
Begin
// vy:=vy+0.51;
// MoveObject(myhandle,0,15,0);
End;
//game.scrollx:=game.objs[myhandle]-160;
With game Do
Begin
BackgroundDraw(round(scrollx / 1.05), round(scrolly / 1.05), 0);
BackgroundDraw(scrollx, scrolly, 1);
objdraw;
BackgroundDraw(round(scrollx * 1.05), round(scrolly * 1.05), 2);
With dxdraw1.surface.canvas Do
Begin
font.name := 'Arial';
font.size := 8;
font.style := [fsbold];
visiblescore := round(visiblescore * 9 / 10 + score / 10);
scorestr := ' ' + inttostr(visiblescore) + ' ';
If visiblescore > 0 Then
textout(630 - textwidth(scorestr), 10, scorestr);
release;
End;
End;
{with mainform.dxdraw1.surface.canvas do
begin
// textout(0,0,'LECSJDO');
textout(0,0,inttostr(mainform.dxtimer1.framerate));
// textout(0,20,inttostr((mainform.dximagelist1.items[4].Picture.Bitmap.Canvas.Pixels[top,left])));
release;
end;{}
mainform.dxdraw1.flip;
inc(frame);
End;
Procedure TMainForm.LoadWorld(dff: String);
Begin
game.level.filename := dff;
loadlevel(dff);
End;
Procedure tmainform.loadgfx;
Var xx : integer;
Begin
If fileexists('gfx\' + game.level.info.background) Then
Begin
mainform.dximagelist1.items[0].Picture.LoadFromFile('gfx\' + game.level.info.background);
mainform.dximagelist1.items[1].Picture.LoadFromFile('gfx\' + game.level.info.backobjs);
mainform.dximagelist1.items[2].Picture.LoadFromFile('gfx\' + game.level.info.sprites);
mainform.dximagelist1.items[3].Picture.LoadFromFile('gfx\' + game.level.info.sprites);
End Else
Begin //internett zip-fix s
mainform.dximagelist1.items[0].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.background);
mainform.dximagelist1.items[1].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.backobjs);
mainform.dximagelist1.items[2].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.sprites);
mainform.dximagelist1.items[3].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.sprites);
End;
calcbmask(1);
If dxdraw1.display.BitCount = 8 Then
Begin
fiximg8(0);
fiximg8(1);
fiximg8(2);
End;
If (dxdraw1.display.BitCount = 16) Or (dxdraw1.display.bitcount = 15) Then
Begin
fiximg16(0);
fiximg16(1);
fiximg16(2);
fiximg16(4);
End;
flipimg(2, 3);
For xx := 0 To 3 Do
Begin
mainform.dximagelist1.Items[xx].picture.Bitmap.PixelFormat := pf24bit;
mainform.DXImageList1.Items[Xx].restore;
End;
End;
Procedure tmainform.loadlevel(levelfilename: String);
Var filehandle, l, handl, dy, xx, yy: integer;
a : tcollectionitem;
filename, tag : String;
Begin
If myhandle < length(game.objs) Then tag := game.objs[myhandle].tag;
game.levelscore := game.score;
visiblescore := game.score;
With game.gamma Do
Begin
r := 0;
g := 0;
b := 0;
End;
resetlevel;
resetobjs; {}
If fileexists('l\' + levelfilename + '.l') Then
filename := 'l\' + levelfilename + '.l' Else
filename := levelfilename + '.l';
game.level.currentfile := levelfilename;
If Not fileexists(filename) Then
Begin
menuform.quit.click;
showmessage('404! file not found!' + filename);
Exit;
End;
game.level.info.startx := 0;
game.level.info.starty := 0;
randomize;
setlength(game.objs, 0);
//load(dff);
filehandle := fileopen(filename, fmOpenRead);
If filehandle < 0 Then Begin;
messagedlg('Couldn''t open level file:' + filename, mtError, [mbAbort], 0);
exit;
End;
//assignfile(ff,f);
//reset(ff,1);
//blockread(ff,game.level.info,sizeof(levelextrainfotype));
fileread(filehandle, game.level.info, sizeof(levelextrainfotype));
With game.level Do setlength(l, info.layers, info.width, info.height);
For l := 0 To game.level.info.layers - 1 Do
For dy := 0 To game.level.info.width - 1 Do
fileread(filehandle, game.level.l[l][dy, 0], (game.level.info.height * 2));
// blockread(ff,game.level.l[l][dy,0],(game.level.info.height*2));
fileclose(filehandle);
//closefile(ff);{}
For yy := 0 To game.level.info.height - 1 Do
For xx := 0 To game.level.info.width - 1 Do
With game.level Do
Begin
If (l[GameLayer][xx, yy] >= 8) And (l[GameLayer][xx, yy] <= 15) Then l[GameLayer][xx, yy] := -l[GameLayer][xx, yy];
If (l[GameLayer][xx, yy] >= 5 * 16) And (l[GameLayer][xx, yy] < 8 * 16) Then
Begin
l[GameLayer][xx, yy] := -l[GameLayer][xx, yy];
End;
If CreateObjectofBlock(l[gamelayer][xx, yy], xx Shl 5, yy Shl 5) <> -1 Then l[gamelayer][xx, yy] := -1;
If CreateObjectofBlock(l[2][xx, yy], xx Shl 5, yy Shl 5) <> -1 Then l[2][xx, yy] := -1;
End;
//------------------------------------------------------------
myhandle := gethandle;
game.objs[myhandle].pic := 0;
game.objs[myhandle].typo := 1;
game.objs[myhandle].stall := 250;
game.objs[myhandle].pushable := true;
game.objs[myhandle].pusher := true;
game.objs[myhandle].xx := game.level.info.startx;
game.objs[myhandle].yy := game.level.info.starty;
//showmessage('back;'+game.level.info.background);
//mainform.dximagelist1.Items.restore;
loadgfx;
game.scrollx := game.level.info.startx - 320;
game.scrolly := game.level.info.starty - 240;
game.objs[myhandle].tag := tag;
mainform.DXSound1.Restore;
{if fileexists('mfx\itf.wav') then
begin
a:=mainform.dxmusic1.Items.Add;
mainform.dxmusic1.Items.Items[a.Index].wave.loadfromfile('mfx\itf.wav');
mainform.dxmusic1.items.items[a.index].Restore;
// mainform.dxmusic1.Items.Items[a.index].Buffer.LoadFromWave(mainform.dxmusic1.Items.Items[a.Index].wave);
mainform.dxmusic1.Items.Items[a.index].looped:=true;
mainform.dxmusic1.items.items[a.index].play(false);
end;{}
End;
//type atype = array[0..32*32*4] of byte;
Procedure TMainForm.InitGame;
Begin
game.score := 0;
initsnow;
loadworld('openland');
playing := true;
End;
Procedure TMainForm.InitApp;
Var a : String;
Begin
{mainform.top:=0;
mainform.left:=0;{}
//screen.cursor:=crnone;
// DXDraw1.Cursor := crNone;
mainform.clientwidth := 640;
mainform.clientheight := 480;
flipimg(1, 2);
dximagelist1.items.Restore;
End;
Procedure ShowIntro;
Begin
mainform.dximagelist1.items[4].draw(mainform.dxdraw1.surface, 0, 0, 0);
mainform.dxdraw1.flip;
//
{
if introframe=0 then
if fileexists('mfx\joffatun.wav') then
begin
mainform.dxmusic1.Items.Clear;
// a:=mainform.dxmusic1.Items.Add;
with mainform.dxmusic1.Items.Items[mainform.dxmusic1.Items.Add.Index] do
begin
wave.loadfromfile('mfx\joffatun.wav');
// wave.SetPCMFormat(44100,16,2);
Restore;
looped:=true;
play(true);
// mainform.dxsound1.
end;
end;{}
inc(introframe);
End;
Procedure TMainForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
Begin
dxinput1.Keyboard.Update;
{if dxinput1.Keyboard.Keys[0] then
begin
end;{}
If playing Then playgame;
If Not playing Then showintro Else introframe := 0;
End;
Procedure TMainForm.DXPlay1Message(Sender: TObject; From: TDXPlayPlayer;
Data: Pointer; DataSize: Integer);
Var i : integer;
Begin
For i := 0 To maxplayers - 1 Do
If game.players[i].id = from.ID Then
Begin
End;
End;
Procedure TMainForm.FormKeyDown(Sender: TObject; Var Key: Word;
Shift: TShiftState);
Begin
If key = VK_ESCAPE Then
Begin
MenuForm.Left := Left + (Width - MenuForm.Width) Div 2;
MenuForm.Top := Top + (Height - MenuForm.Height) Div 2;
MenuForm.ShowModal;
End;
If key = VK_F4 Then debugform.show;
If (ssAlt In Shift) And (Key = VK_RETURN) Then SwitchMode;
End;
Procedure TMainForm.DXDraw1InitializeSurface(Sender: TObject);
Begin
If dofullscreen In mainform.dxdraw1.Options Then
Begin
mainform.BorderStyle := bsnone;
End Else mainform.borderstyle := bssingle; {}
End;
Procedure TMainForm.FormKeyUp(Sender: TObject; Var Key: Word;
Shift: TShiftState);
Begin
If key = VK_F4 Then debugform.hide;
End;
Procedure TMainForm.FormCreate(Sender: TObject);
Begin
Filemode := fmOpenRead;
End;
Procedure TMainForm.DXDraw1Click(Sender: TObject);
Begin
If Not playing Then
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -