Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2010, 11:02   #1
GaLiof
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 52
Восклицание арканоид

Здравствуйте. Завтра экзамен и мне срочно нужно написать игру "АРКАНОИД"...Прошу помочь. Подсмотрел на каком-то сайте часть исходника, малость подредактировал, вот что получилось(shape1 - шар, shape2 - бита, shape3 - обьект который надо уничтожить):
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Shape1: TShape;
    Shape2: TShape;
    Timer1: TTimer;
    Shape3: TShape;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x,y,b,s,l:integer;
  xc,yc:integer;
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
shape1.Top:=shape1.Top+y;
shape1.Left:=shape1.Left+x;
if shape1.Left < 2 then x:=5;
if shape1.Top < 2 then y:=5;
if shape1.Left > panel1.Left - 80 then x:=-5;
If Shape1.Top>=Shape2.Top-20 Then
If (Shape1.Left>=Shape2.Left-10) and (Shape1.Left<=Shape2.Left+Shape2.Width-10) Then
y:=-5
else
begin
Timer1.Enabled:=false;
Shape1.Top:=Shape2.Top-15;
Shape1.Left:=Shape2.Left + 35;
b:=b-1;// ÷èñëî øàðèêîâ
Label6.Caption:=inttostr (b);
If b < 0 Then Form2.Showmodal;
end;
 //ñáèâàíèå êèðïè÷à
xc:=Shape1.Left+10;
yc:=Shape1.Top+10;

// óäàð î íèæíþþ ãðàíü
If (yc=Shape3.Top+Shape3.Height) and (xc>=Shape3.Left) and
(xc<=Shape3.Left+Shape3.Width) and (Shape3.Visible) Then
begin
y:=5;
Shape3.Visible:=False;
s:=s+50;
Label2.Caption:=inttostr(s);
// ñ÷¸ò ñáèòûõ êèðïè÷åé
end;

// óäàð î âåðõíþþ ãðàíü
If (yc=Shape3.Top) and (xc>=Shape3.Left) and 
(xc<=Shape3.Left+Shape3.Width) and (Shape3.Visible) then
begin
y:=-5;
Shape3.Visible:=False;
s:=s+50;
Label2.Caption:=inttostr(s);
// ñ÷¸ò ñáèòûõ êèðïè÷åé
end;

// óäàð î ïðàâóþ ãðàíü
If (xc=Shape3.Left + Shape3.width) and (yc>=Shape3.Top) and
(yc<=Shape3.Top+Shape3.height) and(Shape3.Visible) then
begin
x:=5;
Shape3.Visible:=False;
S:=s+50;
Label2.Caption:=inttostr(s);
// ïîäñ÷¸ò ñáèòûõ êèðïè÷åé 
end;

// óäàð î ëåâóþ ãðàíü
If (xc=Shape3.Left) and (yc>=Shape3.Top) and
(yc<=Shape3.Top+Shape3.height) and(Shape3.Visible) then
begin
x:=-5;
Shape3.Visible:=False;
s:=s+50;
Label2.Caption:=inttostr(s);
// ïîäñ÷¸ò ñáèòûõ êèðïè÷åé
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
x:=1;
y:=1;
b:=3;
s:=0;
l:=1;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
If key=Vk_Left Then
If Shape2.Left > 0 Then
Shape2.Left:=Shape2.Left - 20;
If key=Vk_Right Then
If Shape2.Left <panel1.Left - Shape2.Width - 10 Then
Shape2.Left:=Shape2.Left +20;

end;

end.
Но есть несколько проблем:
1. Как сделать, чтобы при движении shape2(палка) обьекс shape1(шар) двигался вместе с ней? А то при "смерти" он появляется на ней, но когда я её двигаю остаётся на месте.
2.Чтобы сделать много "целей" надо разместить примерно 30 шейпов...как риализовать это более правильно?
Заранее благодарю за помощь!
GaLiof вне форума Ответить с цитированием
Старый 18.01.2010, 11:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как риализовать это более правильно?
Ну достаточно правильно будет организовать массив t:array[1..30] of TShape
или в цикле в TObjectList примерно так:
Код:
var l:TComponentList;i:integer;  s:TShape;
begin
 for i:=0 to 30 do begin
   s:=TShape.Create(self);
   s.Parent:=self;
   ... Тут настраиваем его свойства
   l.Add(s);
 end;
end;
А потом TShape(l[5]).Свойство пятого шейпа.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арканоид Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 03.04.2021 21:50
арканоид aruy Помощь студентам 4 30.07.2009 11:37
арканоид aruy Общие вопросы Delphi 4 29.07.2009 17:30
Арканоид Mclaren Помощь студентам 10 14.05.2009 15:06