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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 07:44   #11
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Спасибо большое, теперь понятно))
Ещё вот такие вопросы:
Я так поняла, вот эта процедура описывает движение шариков, но как именно не совсем понятно

Код:
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;
И ещё... Чтобы проверить столкновение шариков, нужно ведь использовать радиусы двух столкнувшихся окружностей, но у нас они в списке, как их оттуда достать????
И при уничтожении окружностей нужно удалять запись из списка? Тоже не знаю с помощью чего это можно сделать...
Alena_44 вне форума Ответить с цитированием
Старый 02.05.2011, 09:27   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но как именно не совсем понятно
Если фанкция dist покажет столкновение шарика с бортиком, меняется угол. Шарик начинает двигаться под другим углом. Преобразование из полярных координат в декартовы изучала? Если нет то еще не поздно, и оч. полезно - описывать движение фигуры углом и длинной вектора.
Цитата:
нужно ведь использовать радиусы двух столкнувшихся окружностей
да
Цитата:
но у нас они в списке
Если речь идет о моем примере то:
Код:
with TForm1(Form).Shars do begin
 for i:=0 to Count-1 do 
  if (self<>Items[i]) and distance(Items[i]) then begin
    шарики столкнулись;
    delete(i);
  end;
При условии что есть функция distance(Shar:TShar), возвращающая ложь или истину, после проверки на столкновение переданного ей шарика и того шара, кому пренадлежит этот код - это код именно для класса TShar.
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2011, 11:26   #13
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Уже поняла как дописать программу. Написала код.
Хотела чтобы выглядело это так:
Радиус i-того шарика передаётся в функцию distance, в которой он сравнивается с другими радиусами. Если есть столкновение то функция возвращает значение true и iй элемент удаляется.
Код получился таким:
Код:
procedure TShar.Kill;
var i:integer;
begin
with TForm1(Form).Shars do begin
 for i:=0 to Count-1 do
  if (self<>Items[i]) and distance(Items[i].Radius) then
    delete(i);
end;


function TShar.distance (rad:integer):boolean;
d:double;
begin
d:=sqrt(sqr(x)+sqr(y));
with TForm1(Form).Shars do begin
 for i:=0 to Count-1 do
  if (d>rad+Items[i].Radius)or(d<abs(rad-Items[i].Radius)) then
  Result:=false
  else Result:= true;
  end;
end;
Выдаётся куча ошибок
Со списками никогда не работала((( Поэтому уверена что пишу что-то не так...
Alena_44 вне форума Ответить с цитированием
Старый 03.05.2011, 17:37   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так первое, что я пропустил у себя это:
Код:
 for i:=(Count-1) downto 0 do
  if (self<>Items[i]) and distance(Items[i].Radius) then
    delete(i);
Отут собака порыться может.
Цитата:
(d>(rad+Items[i].Radius))
Отут тоже - Приоритетов не помню, но всегда в скобочки беру дабы не попасться

Ну и потом: Куча, это сколько? Какие? От кого? По какой статье? Из какой страны? На основании какого документа вылезают ошибки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2011, 19:18   #15
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Вот такая вот куча:
Код:
if (self<>Items[i]) and distance(Items[i].Radius) then
Too many actual parameters

Код:
function TShar.distance (rad:integer):boolean;
[Error] SharikiUnit1.pas(133): Statement expected but 'FUNCTION' found
[Error] SharikiUnit1.pas(133): Declaration of 'distance' differs from previous declaration

Код:
d:=sqrt(sqr(x)+sqr(y));
[Error] SharikiUnit1.pas(136): Undeclared identifier: 'd'
[Error] SharikiUnit1.pas(136): Undeclared identifier: 'x'

Код:
with TForm1(Form).Shars do begin
[Error] SharikiUnit1.pas(137): Undeclared identifier: 'Form'
[Error] SharikiUnit1.pas(139): Undeclared identifier: 'rad'
[Error] SharikiUnit1.pas(139): Undeclared identifier: 'Radius'
Alena_44 вне форума Ответить с цитированием
Старый 03.05.2011, 19:35   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Алёна, судя по ошибкам, либо вы куда-то не туда вставили код, либо забыли его описать/сделать методом нужного класса...

давайте исходный код целиком...


Stilet, Виталий, Вы надеюсь, не возражаете, что я вмешиваюсь в Вашу беседу?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.05.2011, 06:19   #17
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Вот код целиком:
Код:
unit SharikiUnit1;

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);
    procedure kill;

    function dist:Boolean;
    function distance: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;             
begin
 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(Form1); 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 TShar.Kill;
var i:integer;
begin
with TForm1(Form).Shars do begin
 for i:=0 to Count-1 do
  if (self<>Items[i]) and distance(Items[i].Radius) then
    delete(i);
end;


function TShar.distance (rad:integer):boolean;
d:double;
begin
d:=sqrt(sqr(x)+sqr(y));
with TForm1(Form).Shars do begin
 for i:=0 to Count-1 do
  if (d>rad+Items[i].Radius)or(d<abs(rad-Items[i].Radius)) then
  Result:=false
  else Result:= true;
  end;

end;


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

end.
Alena_44 вне форума Ответить с цитированием
Старый 05.05.2011, 14:58   #18
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

В чём ошибка то? ((
Я так и не нашла...
Alena_44 вне форума Ответить с цитированием
Старый 05.05.2011, 16:22   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

о, всё очень плохо..
начиная с простых вещей
забыли написать var
Цитата:
Код:
function TShar.distance (rad:integer):boolean;
d:double;
begin
надо:
Код:
function TShar.distance (rad:integer):boolean;
var d:double;
begin
в продолжении - вещи похуже:
в описании класса шаров:
Цитата:
Код:
    function distance:Boolean;
а при вызове:
Цитата:
Код:
function TShar.distance (rad:integer):boolean;
откуда параметр взялся, если в описании его не было?

дальше:
Цитата:
Код:
function TShar.distance (rad:integer):boolean;
var d:double;
begin
  d:=sqrt(sqr(x)+sqr(y));
откуда взялись переменные X и Y ?! Да, у шара есть такие проперти.
Но ведь шары перебираюстя кодом ниже! А вне контекста TShar X и Y - не существуют...

но это всё полбеды.
Смотрите у шара есть метод distance
1) что за параметр Вы в него хотите передать?
2) это метод возвращает boolean: TRUE или FALSE
вопрос. Если для третьего шара (для пример) он вернул TRUE то что это означает?!
да и я не понимаю, что Вы пытаетесь в этом методе вычислить...

короче - не зачёт!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.05.2011, 17:32   #20
Alena_44
Пользователь
 
Аватар для Alena_44
 
Регистрация: 24.04.2011
Сообщений: 18
По умолчанию

Метод distance для того чтобы проверять столкновение шариков друг с другом. Если шарики столкнулись, то возвращается значение true и i-й шарик удаляется.
Цитата:
в описании класса шаров:
Цитата:Код:

function distance:Boolean;


а при вызове:
Цитата:Код:

function TShar.distance (rad:integer):boolean;


откуда параметр взялся, если в описании его не было?
А где параметр описать?

... А с var это да, затупила xDD
Alena_44 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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