Форум: "Игры";
Текущий архив: 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.064 c