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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 21:02   #1
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию Арканоид в Делфи (столкновение шаров)

здравствуйте. Мне требуется разработать программку (визуализация) по типу арканоид. Круги (шарики) должны двигаться по форме в 8 направлениях, сталкиваясь с другими шарами и со стенками формы отталкиваться, не сливаясю с шарами и без разных странных приключений.
Я смогла сделать только для одного шарика.Программка полностью работает.Нет ни массивов, ни матриц.Но скорее всего как раз как-то нужно с матрицами или массивами оперировать. Никак не получается нарисовать много шариков и чтобы они при этом двигались.
Как я понимаю надо вводить массив для координаты x и y?!... что-то это пока у меня никак не получается


Мне нужна помощь:
1. в алгоритме *рисования* n-количества шаров
2.чтобы они все двигались
3.отталкивались друг от друга и стенок.



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TDirection=(dLeft,dUpleft,dupright, dright,
ddownright,ddownleft,ddown,dup);
TBall=record
Button1: TButton;
id:byte;
size:byte;
Direction:TDirection;
Speed:byte;
Color:TColor;
BorderColor:TColor;
end;
TForm1 = class(TForm)
Paint: TButton;
Image1: TImage;
Timer1: TTimer;
Timer2: TTimer;

procedure Timer1Timer(Sender: TObject);

procedure PaintClick(Sender: TObject);
procedure FormCreate(Sender: TObject);


{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;
MyBMP:TBitmap;
ball:TBall;
I:integer;
x,y,x1,y1,n,b,k:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
{n:=10; 'число шарок'

r:=10;

'радиус шаров }

x:=120;
y:=120;
x1:=140;
y1:=140;
end;

procedure TForm1.PaintClick(Sender: TObject);
begin
if( Timer1.Enabled ) Then
Timer1.Enabled := false
else
Timer1.Enabled := true;
randomize();

Ball.Direction:= TDirection ( random(8) );

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
MyBMP:=TBitmap.Create;
MyBMP.Width:=500;
MyBMP.Height:=500;
MyBMP.Canvas.Pen.Color:=clRed;
MyBMP.Canvas.Pen.Width:=1;
MyBMP.Canvas.Brush.Color:=clRed;

{ for k:=1 to n do begin

}

case Ball.Direction of
dLeft: begin
x:=x-1;
y:=y;
x1:=x1-1;
y1:=y1;

end;

dUpleft: begin
x:=x-1;
y:=y-1;
x1:=x1-1;
y1:=y1-1;
end;

dupright: begin
x:=x+1;
y:=y-1;
x1:=x1+1;
y1:=y1-1;
end;

dright: begin
x:=x+1;
y:=y;
x1:=x1+1;
y1:=y1;
end;

ddownright: begin
x:=x+1;
y:=y+1;
x1:=x1+1;
y1:=y1+1;
end;

ddownleft: begin
x:=x-1;
y:=y+1;
x1:=x1-1;
y1:=y1+1;
end;
ddown: begin
x:=x;
y:=y+1;
x1:=x1;
y1:=y1+1;
end;

dup: begin
y:=y-1;
x1:=x1;
x:=x;
y1:=y1-1;

end;
end;

if x=0 then
begin
if( Ball.Direction = dLeft ) Then Ball.Direction:= dright;
if( Ball.Direction = dUpleft ) Then Ball.Direction:= dupright;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= ddownright;
end;

if y=0 then
begin
if( Ball.Direction = dUpleft ) Then Ball.Direction:= ddownright;
if( Ball.Direction = dup ) Then Ball.Direction:= ddown;
if( Ball.Direction = dupright ) Then Ball.Direction:= ddownright;
end;

if x1 = Image1.Width then
begin
if( Ball.Direction = dright ) Then Ball.Direction:= dLeft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= ddownleft;
if( Ball.Direction = dupright ) Then Ball.Direction:=dUpleft;
end;

if y1 = Image1.Height then
begin
if( Ball.Direction = ddown ) Then Ball.Direction:= dup;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= dUpleft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= dupright;
end;

MyBMP.Canvas.ellipse(x,y,x1,y1);
Image1.Picture.Bitmap:=MyBMP;
MyBMP.Free;

end;

end.
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.

Последний раз редактировалось Scabby; 28.01.2009 в 22:38.
Scabby вне форума Ответить с цитированием
Старый 28.01.2009, 23:29   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Нужен массив шаров. Обработка столкновений и отрисовка - все делается перебором этого массива.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 28.01.2009, 23:34   #3
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию

вот в этом-то и сама проблема.
мне конкретно придется как я понимаю всю прогу менять.

а движение как будет проиходить? цикл сделать и все мои варианты направлений?
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.
Scabby вне форума Ответить с цитированием
Старый 29.01.2009, 00:43   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Все также как и для одного шара, но только перебором массива в цикле. Добавить только столкновения шаров, а то у вас только стенки.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 29.01.2009, 06:56   #5
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию

спасибо, попробую сделать
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.
Scabby вне форума Ответить с цитированием
Старый 29.01.2009, 09:35   #6
]Wowan[
Delphi forever
Форумчанин
 
Аватар для ]Wowan[
 
Регистрация: 13.01.2009
Сообщений: 113
По умолчанию

Вместо цикла лучше использую TTimer
Программы на заказ Delphi, Pascal.
ася: 415 253 529. Мыло: wowan141750@gmail.com.
]Wowan[ вне форума Ответить с цитированием
Старый 01.02.2009, 17:39   #7
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию

Не догоняю почему шарики у меня не двигаются... что не так? :

Код:
unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
const MaxBalls=10;
type
     TDirection=(dLeft,dUpleft,dupright,dright,
                ddownright,ddownleft,ddown,dup);
    TBall=record
    Button1: TButton;
    id:byte;
    x,y,x1,y1:integer;
    size:byte;
    Direction:TDirection;
    Speed:byte;
    Color:TColor;
    BorderColor:TColor;
    end;
    TForm1 = class(TForm)
    Paint: TButton;
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure PaintClick(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  balls:array[1..MaxBalls] of TBall;
  end;
var
  Form1: TForm1;
  MyBMP:TBitmap;
  ball:TBall;
  i:integer;
implementation
{$R *.dfm}
procedure TForm1.PaintClick(Sender: TObject);
  begin
    MyBMP:=TBitmap.Create;
    MyBMP.Width:=500;
    MyBMP.Height:=500;
    MyBMP.Canvas.Pen.Width:=1;
    MyBMP.Canvas.Brush.Color:=clRed;
    randomize;
      for I := 1 to MaxBalls do
    with balls[i] do begin
      id:=i;
      size:=10;
      direction:=TDirection (random(8) );
      speed:=random(10);
      color:=clRed;
      BorderColor:=clBlack;
      x:=random(471)+10;
      y:=random(471)+5;
      x1:=x+20;
      y1:=y+20;
      MyBMP.Canvas.ellipse(x,y,x1,y1);
      Image1.Picture.Bitmap:=MyBMP;
    end;
    MyBMP.Free;
    if( Timer1.Enabled ) Then
        Timer1.Enabled := false
    else
        Timer1.Enabled := true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    MyBMP:=TBitmap.Create;
    MyBMP.Width:=500;
    MyBMP.Height:=500;
    MyBMP.Canvas.Pen.Color:=clRed;
    MyBMP.Canvas.Pen.Width:=1;
    MyBMP.Canvas.Brush.Color:=clRed;
 case  Ball.Direction  of
   dLeft:
    with ball do begin
    x:=x-1;
    y:=y;
    x1:=x1-1;
    y1:=y1;
     end;
   dUpleft: with ball do begin
    x:=x-1;
    y:=y-1;
    x1:=x1-1;
    y1:=y1-1;
     end;
   dupright: with ball do begin
    x:=x+1;
    y:=y-1;
    x1:=x1+1;
    y1:=y1-1;
     end;
   dright: with balls[i] do begin
    x:=x+1;
    y:=y;
    x1:=x1+1;
    y1:=y1;
     end;
   ddownright: with ball do begin
    x:=x+1;
    y:=y+1;
    x1:=x1+1;
    y1:=y1+1;
    end;
   ddownleft: with ball do begin
    x:=x-1;
    y:=y+1;
    x1:=x1-1;
    y1:=y1+1;
     end;
   ddown: with ball do begin
    x:=x;
    y:=y+1;
    x1:=x1;
    y1:=y1+1;
     end;
   dup: with ball do begin
    y:=y-1;
    x1:=x1;
     x:=x;
    y1:=y1-1;
    end;
    end;
    if ball.x=0 then
    begin
      if( Ball.Direction = dLeft ) Then Ball.Direction:= dright;
      if( Ball.Direction = dUpleft  ) Then Ball.Direction:= dupright;
      if( Ball.Direction = ddownleft  ) Then  Ball.Direction:= ddownright;
    end;
    if ball.y=0 then
    begin
      if( Ball.Direction = dUpleft ) Then Ball.Direction:= ddownleft;
     if( Ball.Direction = dup ) Then  Ball.Direction:= ddown;
     if( Ball.Direction =  dupright ) Then  Ball.Direction:= ddownright;
    end;
    if ball.x1 = Image1.Width then
    begin
     if( Ball.Direction = dright ) Then  Ball.Direction:= dLeft;
     if( Ball.Direction = ddownright ) Then Ball.Direction:= ddownleft;
     if( Ball.Direction = dupright   ) Then  Ball.Direction:=dUpleft;
     end;
    if ball.y1 = Image1.Height then
    begin
     if( Ball.Direction = ddown ) Then  Ball.Direction:= dup;
     if( Ball.Direction = ddownleft ) Then Ball.Direction:= dUpleft;
     if( Ball.Direction = ddownright ) Then  Ball.Direction:= dupright;
    end;
end;
end.
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.

Последний раз редактировалось Scabby; 01.02.2009 в 18:26.
Scabby вне форума Ответить с цитированием
Старый 01.02.2009, 18:04   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Сейчас поглядим (пошел запускать Дельфи)
кстати чтоб я не тратил время, можно проект в архиве прикрепить?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 01.02.2009, 18:15   #9
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию

сейчас прикреплю секу
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.
Scabby вне форума Ответить с цитированием
Старый 01.02.2009, 18:17   #10
Scabby
Пользователь
 
Аватар для Scabby
 
Регистрация: 20.01.2009
Сообщений: 26
По умолчанию

ШАРЫ.zip

вот файл
Осознание того,что есть место "гдевсехорошо" даёт надежду,что ещё не все потеряно.
Scabby вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арканоид Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 03.04.2021 21:50
Помогите с задачей на Делфи! f1n!Sh Помощь студентам 8 02.05.2008 18:28