![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Демка моего Тениса [Delphi, Windows]
rsy © (2005-06-24 14:03:00)Уважаемые программисты посмотрите эту Демку.
Игра Тенис на двоих.
Я сделал Демку и у меня возникли такие вопросы :
1. Как сделать чтобы мяч отбивался как в DX-ball или Рикошет (ReflexiveArcade), а у меня генератор случайных чисел.
2. Почему разная скорость игры в Windows 98 и Xp.
3. Почему тормозит игра, когда включается звук столкновения с нижней или верхней стенкой.
Внизу я привёл код своей демки.
------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXClass, DXSprite, DXInput, DXDraws, DXSounds, Wave,math,
ExtCtrls, StdCtrls;
type
TForm1 = class(TDXForm)
DXImageList1: TDXImageList;
DXDraw1: TDXDraw;
DXInput1: TDXInput;
DXSpriteEngine1: TDXSpriteEngine;
DXTimer1: TDXTimer;
DXSound1: TDXSound;
DXWaveList1: TDXWaveList;
Panel1: TPanel;
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
procedure FormCreate(Sender: TObject);
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Label11Click(Sender: TObject);
procedure Label12Click(Sender: TObject);
procedure Label13Click(Sender: TObject);
procedure Label14Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
m,G:real;
i:boolean;
RESPL1,RESPL2:real;
implementation
{$R *.dfm}
Type
Tplayer = class (Timagesprite)
Protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
Procedure DoMove (move:integer);override;
end;
Tball = class (Timagesprite)
Protected
Procedure DoMove (move:integer);override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
PUBLIC
constructor Create (Aparent:tsprite);override;
end;
Tcomp = class (Timagesprite)
Protected
Procedure DoMove (move:integer);override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
// PUBLIC
// constructor Create (Aparent:tsprite);override;
end;
var
Player:TPlayer;
Playerai:TComp;
constructor TBALL.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := form1.DXImageList1.Items.Find('ball');
Width := Image.Width;
Height := Image.Height;
end;
{
constructor Tcomp.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := form1.DXImageList1.Items.Find('pl');
Width := Image.Width;
Height := Image.Height;
end;
}
Procedure Tcomp.DoMove(move:integer);
begin
inherited Domove (move);
if form1.DXInput1.Keyboard.Keys[49] then x:=x-1;
if form1.DXInput1.Keyboard.Keys[50] then x:=x+1;
if x <= 0 then x:=0;
if x >= 430 then x:=430;
Collision;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
M:=0.5;
g:=0.5;
i:=false;
RESPL1:=0;
RESPL2:=0;
with TPlayer.Create(Dxspriteengine1.Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('PL');
x:=150;
y:=450;
Width := Image.Width;
Height := Image.Height;
end;
with Tball.Create(Dxspriteengine1.Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('ball');
x:=10;
y:=20;
Width := Image.Width;
Height := Image.Height;
end;
with Tcomp.Create(Dxspriteengine1.Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('PL');
x:=150;
y:=0;
Width := Image.Width;
Height := Image.Height;
end;
with TBackgroundSprite.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(1,1);
Image := dxImageList1.Items.Find('bgr');
Z:= -2;
Tile := True;
end;
end;
Procedure Tplayer.DoMove(move:integer);
begin
inherited DoMove (move);
if isleft in form1.DXInput1.States then x:=x-1;
if isright in form1.DXInput1.States then x:=x+1;
if x <= 0 then x:=0;
if x >= 430 then x:=430;
end;
Procedure Tball.DoMove(move:integer);
begin
inherited DoMove (move);
x:=x+m;
y:=y+G;
IF isup in form1.DXInput1.States then y:=y+1;
if x <= 0 then begin x:=0; m:=+0.5; end;
if x >= 500 then begin x:=500; m:=-0.5; end;
if Y <= 0 then begin
form1.DXWaveList1.Items.Find('ball').Play(true);
RESPL1:=RESPL1+1;
form1.Label4.Caption:=''+floattostr (RESPL1);
Y:=0; G:=+0.7; end;
if Y >= 460 then begin
form1.DXWaveList1.Items.Find('ball').Play(true);
RESPL2:=RESPL2+1;
form1.Label2.Caption:=''+floattostr (RESPL2);
Y:=460; G:=-0.7; end;
Collision;
end;
Procedure Tplayer.DoCollision (Sprite: TSprite; var Done: Boolean);
begin
{if Sprite is Tball then
begin
M:= +0.7;
G:= -0.7;
end;}
end;
Procedure Tcomp.DoCollision (Sprite: TSprite; var Done: Boolean);
begin
{ if Sprite is Tball then
begin
M:= +0.7;
G:= +0.7;
end;}
end;
Procedure Tball.DoCollision (Sprite: TSprite; var Done: Boolean);
var
c,c1:real;
begin
if Sprite is Tplayer then
begin
randomize;
C:=random (3)+1;
if C=1 then c1:=+1;
if C=2 then c1:=+0.0 ;
if C=3 then c1:=-1;
M:= +C1;
G:= -1;
end;
if Sprite is Tcomp then
begin
randomize;
C:=random (3)+1;
if C=1 then c1:=+1;
if C=2 then c1:=+0.0 ;
if C=3 then c1:=-1;
M:= +C1;
G:= +1;
end;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit; // Если нет DirectX выходим
DXInput1.Update;
DXSpriteEngine1.Move(LagCount);
DXSpriteEngine1.Dead;
DXDraw1.Surface.Fill(0);
DXSpriteEngine1.Draw;
DXDraw1.Flip;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = Vk_escape then application.Terminate;
end;
procedure TForm1.Label11Click(Sender: TObject);
begin
RESPL1:=0;
RESPL2:=0;
label2.Caption:='0';
label4.Caption:='0';
dxtimer1.Enabled:=true;
label12.Visible:=true;
label13.Visible:=false;
form1.DXWaveList1.Items.Find('click').Play(true);
end;
procedure TForm1.Label12Click(Sender: TObject);
begin
dxtimer1.Enabled:=false;
label12.Visible:=false;
label13.Visible:=true;
form1.DXWaveList1.Items.Find('click').Play(true);
end;
procedure TForm1.Label13Click(Sender: TObject);
begin
dxtimer1.Enabled:=true;
label13.Visible:=false;
label12.Visible:=true;
form1.DXWaveList1.Items.Find('click').Play(true);
end;
procedure TForm1.Label14Click(Sender: TObject);
begin
close;
form1.DXWaveList1.Items.Find('click').Play(true);
end;
end.
Sphinx (2005-06-24 23:04:00) [1]Медленно...
Красиво...
Не понятно почему если я отбиваю крайним левым углом подставки (ракетки или как там её) мяч полетел вправо чуть ли не горизонтально...абсолютный рандом ?
В целом хорошо :)
Zak3D[@Tm] (2005-06-24 21:32:00) [2]rsy
Посмотрел игру...
Тебе срочно нужно на http://code.rpro.ru =)
Кефир87 (2005-06-24 20:55:00) [3]
> Демка моего Тениса
А я вместо Т прочитал П... уа-ха-ха-ха 8)))))
Поиграл... как-то медленно все...
Zer0 (2005-06-24 19:28:00) [4]серьезный арканоид должен плавно увеличивать скорость мячика - после каждого отражения (с участием рандома) нужно вектор скорости нормализовать и умножать на текущую игровую скорость.
средней паршивости шаровары часто не делают этого. поэтому мячик в случае попадения в "туннель" и кучи переотражений набирает просто космическую скорость.
Zak3D[@Tm] (2005-06-24 15:19:00) [5]rsy
http://code.rpro.ru
Лезь в раздел Арканойд, качай работы и учись =).
Xenon (2005-06-24 14:46:00) [6]>>3. Почему тормозит игра, когда включается звук столкновения с нижней или верхней стенкой.
Коль я не ошибаюсь, то в delphiX всегда были проблемы вот с ентой штуковиной, т.е. с collisono'm и с выводом звука одновременно. DX это старая хренотень, вернее не старая, а устаревшая.
>>1. Как сделать чтобы мяч отбивался как в DX-ball или Рикошет (ReflexiveArcade), а у меня генератор случайных чисел.
То же было и у меня.Если я правильно понял ТО:
Короче если по простому, то есть какой-то определенный угол, при столкновении, мы меняем его на противоположный, если ты учил физику, то в разделе оптика была такая тема отражение света от зеркала и там была такая хрень: угол падения равен углу отражения. (Не знаю почему, но при слове арканоид или что-то арканоидного типа, я сразу вспоминаю оптику). Дык вот применям тоже самое, только плюс ко всему этому прибавляем/вычитаем какой-то random( ну шоб угол хоть как-то менялся). Фффффу ну вроде бы тута усе ясно. Я предложил самый простой способ (на мой взгляд)
>>2. Почему разная скорость игры в Windows 98 и Xp.
У меня когда-то была игрушка на DX, тестил и на Me и на 98 и на XP. Существенных различий в скорости не заметил
А че ента за фича когда тыкаешь 8 на KeyPad'e, то шар зависает в воздухе.
Игра(особенно графа) нормальная, но поменяй управление
rsy (2005-06-24 14:06:00) [7]Ссылка :
http://www.delphi-live1.narod.ru/Tenis.rar
rsy (2005-06-24 14:04:00) [8]Ссылка на мою демку :
http://www.delphi-live1.narod.ru/Tenis.rar