Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
14-1129612855
Ega23
2005-10-18 09:20
2005.11.06
Interpolitex-2005 Кто пойдёт?


1-1129278586
Prohodil Mimo
2005-10-14 12:29
2005.11.06
Как установить фокус на компонент?


9-1119607415
rsy
2005-06-24 14:03
2005.11.06
Демка моего Тениса


2-1129296467
kolos_rus
2005-10-14 17:27
2005.11.06
Descktop на DELPHI


6-1122031924
Profik
2005-07-22 15:32
2005.11.06
ClientSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский