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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2011, 06:25   #1
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
Подмигивание Летающие шарики (Delphi)

Помогите написать программу. У меня никак не выходит
Нужно написать программу в которой по экрану летают шарики и сталкиваясь с друг другом - большие шары поедают маленькие.
Сами шарики нужно сделать в отдельном классе.
Кто поможет??
Alena_44 вне форума Ответить с цитированием
Старый 30.04.2011, 10:25   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Алёна, в поиск ходили? На форуме были примеры реализации движения шариков.
Кроме того, помочь написать - это не написать за Вас!
Вы сами хоть что-то сделали?! Тогда давайте Ваши наработки...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2011, 07:30   #3
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Уж извините что мой уровень программирования не позволяет сейчас написать такую программу.
Подскажите хоть как сделать столкновения с краями формы
Пишу вот такой код:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
n:=5;
Image1.Left:=Image1.Left+n;
if Image1.Left=Form1.Left then
Image1.Left:=Image1.Left+n;
if Image1.Left+Image1.Width=Form1.Left+Form1.Width then
Image1.Left:=Image1.Left-n;

end;
А мой шарик всё равно улетает внекуда...

Так, с движениями шаров разобралась. Как удалять меньший шар при столкновении?Да и вообще со столкновениями проблема- код получается громозким (((

Последний раз редактировалось Stilet; 01.05.2011 в 10:33.
Alena_44 вне форума Ответить с цитированием
Старый 01.05.2011, 11:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Алена, предлагаю тебе подумать вот над таким примером бубльгума:
Код:
unit Unit1;

interface

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

type
  TShar=class
   private
    Fy: double;
    Fx: double;
    FRadius: Double;
    angle:Double;
    procedure draw;
    procedure Setx(const Value: double);
    procedure Sety(const Value: double);
    procedure SetRadius(const Value: Double);
    function dist:Boolean;
   public
    Form:TForm;
    property Radius:Double read FRadius write SetRadius;
    property x:double read Fx write Setx;
    property y:double read Fy write Sety;
    procedure Step(ByStep:Double=30);
    constructor Create(f:TForm);
  end;

  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private  shars:TObjectList;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TShar }

constructor TShar.Create(f: TForm);
begin
 Form:=f;
 angle:=random(7);
end;

function TShar.dist;
var dis:Double;
begin
 dis:=sqrt(sqr(x)+sqr(y));
 Result:=((x-radius)>0)and((x+radius)<form.Width)and((y-radius)>0)and((y+radius)<form.Height);
end;

procedure TShar.draw;
begin
 with form.Canvas do begin
  Brush.Style:=bsClear;
  Ellipse(round(fx-Radius/2),round(fy-Radius/2),round(fx+Radius/2),round(fy+Radius/2));
 end;
 Step;
end;

procedure TShar.SetRadius(const Value: Double);
begin
  FRadius := Value;
end;

procedure TShar.Setx(const Value: double);
begin
  Fx := Value;
end;

procedure TShar.Sety(const Value: double);
begin
  Fy := Value;
end;

procedure TForm1.FormCreate(Sender: TObject);
var s:TShar;  i:integer;
begin              Randomize;
 shars:=TObjectList.Create;
 for i:=1 to 4 do begin
  s:=TShar.Create(self); shars.Add(s);
  s.Radius:=random(200);
  s.x:=random(Width-round(s.Radius));
  s.y:=random(Height-round(s.Radius));
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 shars.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var i:integer;
begin
 for i:=0 to shars.Count-1 do TShar(shars[i]).draw;
end;

procedure TShar.Step;
begin
 if not dist then angle:=angle+pi/(4+random(2));
 fx:=fx+ByStep*cos(angle);
 fy:=fy+ByStep*sin(angle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Repaint;
end;

end.
Я лично бы именно от такой схемы отталкивался, если бы писал прогу летящих шариков.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2011, 13:24   #5
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Спасибо за пример .)
проблема в том что для меня он слишком сложный(((

... Почему он не запускается? Точнее запускается, но на экране появляется пустая форма ...
Alena_44 вне форума Ответить с цитированием
Старый 01.05.2011, 14:12   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот пример от Stilet собранный в проект.
Вложения
Тип файла: rar Project1.rar (1.4 Кб, 133 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2011, 16:36   #7
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Спасибо! Теперь работет)
В этом примере можно в цикле задать количество шариков, мне интересно можно ли сделать такой цикл, если я буду вставлять шарики в Image?
Или придётся тогда для каждого шарика расписывать свой алгоритм движения?
Alena_44 вне форума Ответить с цитированием
Старый 01.05.2011, 17:50   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Или придётся тогда для каждого шарика расписывать свой алгоритм движения?
Дык у меня для каждого свое движение расписано.
Цитата:
если я буду вставлять шарики в Image?
Можно, но какой смысл? Что именно тебя в моем примере смутило - я да и форумчане смогут пояснить механизм.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2011, 19:10   #9
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Ну вот самое непонятное:

Не понимаю как работает конструктор...
Код:
constructor TShar.Create(f: TForm);
begin
 Form:=f;
 angle:=random(7);
end;

Вот в этой функции, я так поняла, мы прописываем столкновение с формой? Зачем тут dis вычисляется?
Код:
function TShar.dist;
var dis:Double;
begin
 dis:=sqrt(sqr(x)+sqr(y));
 Result:=((x-radius)>0)and((x+radius)<form.Width)and((y-radius)>0)and((y+radius)<form.Height);
end;

И вот эти 3 процедуры... Как они работают?

Код:
procedure TShar.SetRadius(const Value: Double);
begin
  FRadius := Value;
end;

procedure TShar.Setx(const Value: double);
begin
  Fx := Value;
end;

procedure TShar.Sety(const Value: double);
begin
  Fy := Value;
end;
Alena_44 вне форума Ответить с цитированием
Старый 01.05.2011, 19:54   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не понимаю как работает конструктор...
В него я передаю ссылку на форму, где будет отрисовываться
Код:
s:=TShar.Create(self);
В данном случае self указывает на форму. С таким же успехом я мог написать
Код:
s:=TShar.Create(Form1);
Но не написал...
Цитата:
Зачем тут dis вычисляется?
Да я хотел через расчет между дистанциями для коллизий вычислить, но потом решил оставить это тебе. Не все же мне писать за тебя. А поскольку форма не круглая - расчет коллизий упростился.
Цитата:
И вот эти 3 процедуры... Как они работают?
Когда я прописал
Код:
   property Radius:Double read FRadius write SetRadius;
    property x:double read Fx write Setx;
    property y:double read Fy write Sety;
в описании класса, и жмакнул CTRL+SHIFT+C Делфи сам создал мне обработчики этих свойств. Собственно можно было и без них, просто полями, но я подумал на будущее, например при изменении одного из свойств перерисовывать форму...
А так это всего лишь пустышки для обработки события изменения свойства X Y или Радиуса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шарики движутся рывками wint1000 Фриланс 28 30.11.2010 17:02
Шарики движутся рывками wint1000 Общие вопросы Delphi 9 28.11.2010 22:21
Шарики sk1p Общие вопросы C/C++ 1 06.04.2010 01:11
Летающие ссылки Yudgin Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 31.08.2007 14:19