Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Демка моего Тениса   Найти похожие ветки 

 
rsy   (2005-06-24 14:03) [0]

Уважаемые программисты посмотрите эту Демку.
Игра Тенис на двоих.
Я сделал Демку и у меня возникли такие вопросы :
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.


 
rsy   (2005-06-24 14:04) [1]

Ссылка на мою демку :
http://www.delphi-live1.narod.ru/Tenis.rar


 
rsy   (2005-06-24 14:06) [2]

Ссылка :
http://www.delphi-live1.narod.ru/Tenis.rar


 
Xenon   (2005-06-24 14:46) [3]

>>3. Почему тормозит игра, когда включается звук столкновения с нижней или верхней стенкой.
Коль я не ошибаюсь, то в delphiX всегда были проблемы вот с ентой штуковиной, т.е. с collisono"m и с выводом звука одновременно. DX это старая хренотень, вернее не старая, а устаревшая.
>>1. Как сделать чтобы мяч отбивался как в DX-ball или Рикошет (ReflexiveArcade), а у меня генератор случайных чисел.
То же было и у меня.Если я правильно понял ТО:
Короче если по простому, то есть какой-то определенный угол, при столкновении, мы меняем его на противоположный, если ты учил физику, то в разделе оптика была такая тема отражение света от зеркала и там была такая хрень: угол падения равен углу отражения. (Не знаю почему, но при слове арканоид или что-то арканоидного типа, я сразу вспоминаю оптику). Дык вот применям тоже самое, только плюс ко всему этому прибавляем/вычитаем какой-то random( ну шоб угол хоть как-то менялся). Фффффу ну вроде бы тута усе ясно. Я предложил самый простой способ (на мой взгляд)
>>2. Почему разная скорость игры в Windows 98 и Xp.
У меня когда-то была игрушка на DX, тестил и на Me и на 98 и на XP. Существенных различий в скорости не заметил
А че ента за фича когда тыкаешь 8 на KeyPad"e, то шар зависает в воздухе.
Игра(особенно графа) нормальная, но поменяй управление


 
Zak3D[@Tm] ©   (2005-06-24 15:19) [4]

rsy
http://code.rpro.ru
Лезь в раздел Арканойд, качай работы и учись =).


 
Zer0 ©   (2005-06-24 19:28) [5]

серьезный арканоид должен плавно увеличивать скорость мячика - после каждого отражения (с участием рандома) нужно вектор скорости нормализовать и умножать на текущую игровую скорость.
средней паршивости шаровары часто не делают этого. поэтому мячик в случае попадения в "туннель" и кучи переотражений набирает просто космическую скорость.


 
Кефир87 ©   (2005-06-24 20:55) [6]


> Демка моего Тениса

А я вместо Т прочитал П... уа-ха-ха-ха 8)))))
Поиграл... как-то медленно все...


 
Zak3D[@Tm] ©   (2005-06-24 21:32) [7]

rsy
Посмотрел игру...
Тебе срочно нужно на  http://code.rpro.ru  =)


 
Sphinx ©   (2005-06-24 23:04) [8]

Медленно...
Красиво...
Не понятно почему если я отбиваю крайним левым углом подставки (ракетки или как там её) мяч полетел вправо чуть ли не горизонтально...абсолютный рандом ?

В целом хорошо :)



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
14-1129266176
Ega23
2005-10-14 09:02
2005.11.06
С днем рождения! 14 октября


8-1118919925
PiOnEr
2005-06-16 15:05
2005.11.06
Траблы с JPEG... Хелп!


6-1121720841
LexaDup
2005-07-19 01:07
2005.11.06
Нахождение клиентом сервера


4-1125413034
Русланка
2005-08-30 18:43
2005.11.06
Как заставить Windows произвести обновление оборудования


2-1129014464
MasterVovan
2005-10-11 11:07
2005.11.06
Page control