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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2011, 17:38   #1
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию движение шарика и отскок от стенок

ни у кого нет реализованного алгоритма? язык любой.
legendary вне форума Ответить с цитированием
Старый 13.04.2011, 17:45   #2
Тутонхамон
Пользователь
 
Аватар для Тутонхамон
 
Регистрация: 09.02.2011
Сообщений: 43
По умолчанию

Код:
procedure shar();

// Текущая координата шарика + скорость 
PosX:= PosX+VelX;
PosY:= PosY+VelY;

// Что бы шарик не вылетал за границы поля по ширине
// Если X координата шарика больше ширины формы - ширины самого //шарика то 
if PosX > ClientWidth - Shape1.Width then
begin
//X координата шарика присвоит значение ширина формы - ширина //шарика 
PosX:= ClientWidth - Shape1.Width;
// Включаем заднюю скорость) или меняем значение скорости на минус
VelX:= - VelX;
end
else if PosX < 0 then
begin
POsX:= 0;
VelX:= - VelX;
end;

// Здесь по аналогии только работаем с Y координатой
if PosY > ClientHeight - Shape1.Width then
begin
POsY:= ClientHeight - Shape1.Width;
VelY:= - VelY;
end
else if PosY < 0 then
begin
POsY:= 0;
VelY:= - VelY;
end;
// Перемещаем шарик в пространстве
Shape1.Left:= Round(PosX);
Shape1.Top:= Round(PosY);
Переменные PosX и PosY хранят координаты положение шарика в пространстве, VelX и VelY отвечают за скорость его перемещения. ClientWidth, ClientHeight - ширина и высота формы. Shape1.Width ширина шарика.

Последний раз редактировалось Тутонхамон; 13.04.2011 в 17:59.
Тутонхамон вне форума Ответить с цитированием
Старый 13.04.2011, 19:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, ответ Тутонхамон в виде исходника...
Вложения
Тип файла: rar sharik.rar (1.4 Кб, 164 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.05.2012, 13:41   #4
rrrinat
Новичок
Джуниор
 
Регистрация: 26.05.2012
Сообщений: 1
По умолчанию

Спасибо! Искал!
rrrinat вне форума Ответить с цитированием
Старый 26.05.2012, 14:14   #5
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
Радость

Цитата:
Сообщение от legendary Посмотреть сообщение
ни у кого нет реализованного алгоритма? язык любой.
не большой пример визуальных эффектов про шарики, может кому пригодиться.
демонстрирует возможность перетаскивания объекта по сложному фону (картинка bmp)
http://netsoftware.ucoz.ru/news/vizu.../2012-02-29-16
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 26.05.2012, 14:44   #6
studen
Пользователь
 
Регистрация: 21.05.2012
Сообщений: 88
По умолчанию

Код:
unit Unit1;

interface

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

const
  FieldWidth          = 640;
  FieldHeight         = 400;
  BallWidth           =  24;
  BallHeight          =  24;
  BallSpeed           =  10;

type
  TForm1              = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender:    TObject);
    procedure FormClose(Sender:     TObject;
              var Action:           TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TBall               = object
    Width, Height:                  Word;
    x, y:                           Extended;
    vx, vy:                         Extended;
    procedure           initialize;
    procedure           move;
    procedure           print;
  end;

var
  Form1:                            TForm1;
  pryg:                             TBall;
  main, back, ball:                 TBitmap;

implementation

{$R *.dfm}

procedure TBall.initialize;
var
  angle:                            Byte;                   //   0 =   0° ->
begin                                                       //  64 =  90°
  x:=                   Random(FieldWidth - BallWidth);     // 128 = 180° <-
  y:=                   Random(FieldHeight - BallHeight);   // 192 = 270°
  angle:=               Random(256);
  vx:=                  Cos(angle / 256 * pi) * BallSpeed;
  vy:=                  Sin(angle / 256 * Pi) * BallSpeed;
end;

procedure TBall.move;
begin
  x:=                   x + vx;
  y:=                   y + vy;
  if x < 0 then begin
    x:=                 -x;
    vx:=                -vx;
  end;
  if x > FieldWidth - BallWidth then begin
    x:=                 2 * (FieldWidth - BallWidth) - x;
    vx:=                -vx;
  end;
  if y < 0 then begin
    y:=                 -y;
    vy:=                -vy;
  end;
  if y > FieldHeight-BallHeight then begin
    y:=                 2 * (FieldHeight - BallHeight) - y;
    vy:=                -vy;
  end;
end;

procedure TBall.print;
begin
  main.Canvas.          Draw(Trunc(x), Trunc(y), ball);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientWidth:=         FieldWidth;
  ClientHeight:=        FieldHeight;

  main:=                TBitmap.Create;
  main.Width:=          FieldWidth;
  main.Height:=         FieldHeight;

  back:=                TBitmap.Create;
  back.                 LoadFromFile('back.bmp');

  ball:=                TBitmap.Create;
  ball.                 LoadFromFile('ball.bmp');
  ball.Transparent:=    True;
  ball.TransparentColor:=//rgb(255,0,255)
                        clFuchsia;
  Randomize;

  pryg.                 initialize;

  Canvas.               Draw(0, 0, main);
end;

procedure TForm1.FormClose(Sender:  TObject;
      var Action:                   TCloseAction);
begin
  main.                 Free;
  back.                 Free;
  ball.                 Free;
end;

procedure TForm1.Timer1Timer(
          Sender:                   TObject);
begin
  pryg.                 move;
  main.Canvas.          Draw(0, 0, back);
  pryg.                 print;
  Canvas.               Draw(0, 0, main);
end;

procedure TForm1.FormPaint(Sender:  TObject);
begin
  Canvas.               Draw(0, 0, main);
end;

procedure TForm1.FormMouseDown(
          Sender:                   TObject;
          Button:                   TMouseButton;
          Shift:                    TShiftState;
          X, Y:                     Integer);
begin
  pryg.                 initialize;
end;

end.
studen вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение шарика Stradivarius Паскаль, Turbo Pascal, PascalABC.NET 1 09.04.2010 00:45
PascalABC-Движение шарика m@xon Паскаль, Turbo Pascal, PascalABC.NET 8 24.09.2009 15:05
Движение шарика в С# mak-mar Общие вопросы .NET 7 13.05.2009 17:59
Движение шарика по контуру delphi Map4eJIo Помощь студентам 2 03.03.2009 11:10
движение изображения с зеркальным отображением от стенок nev Помощь студентам 6 11.06.2007 21:38