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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2014, 14:31   #1
Евгений_А
 
Регистрация: 27.03.2014
Сообщений: 5
По умолчанию Требуется помощь по баллистической игре

При запуске программы не всегда срабатывает анимация, я где то напортачил, и не могу понять где ткните носом пожалуйста)
Смысл игры в следующем Трэкбаром задаем угол и скорость полета снаряда, жмем кнопку выстрел и начинается полет снаряда проверка на попал, не попал и появление соответствующей надписи
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Shape1: TShape;
    Shape2: TShape;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    procedure Button1Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  x,y,x1,x2,y1,y2,tn,v,t,a:real;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 t:=t+0.2;
 x:=v*cos(a)*t;
  y:=172-(v*sin(a)*t-(9*t*t)/2);
  shape1.Left:=trunc(x);
  shape1.Top:=trunc(y);
  if t>tn then
  begin
    t:=0;
    timer1.Enabled:=false;
    shape1.top:=216;
    shape1.Left:=72;
  end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Edit1.Text:=inttostr(Trackbar1.Position);
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
    Edit2.Text:=inttostr(Trackbar2.Position);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  v:=Trackbar2.Position;
  a:=Trackbar1.Position;

  tn:=(2*v*sin(a))/9;
  x:=v*cos(a)*tn;
  y:=172-(v*sin(a)*tn-(9*tn*tn)/2);
  timer1.Enabled:=true;
  if (x>x1) and (x<x2) and (y>y1) and (y<y2)
  then
    Label3.Caption:='Победа!'
    else Label3.Caption:='Промах';
    end;




procedure TForm1.FormCreate(Sender: TObject);
begin
  v:=strtofloat(edit2.text);
  x1:=240;
  y1:=172;
  x2:=395;
  y2:=247;
   a:=strtofloat(edit1.text);
   t:=0;
end;

end.
Вложения
Тип файла: rar баллистическая игра.rar (1.8 Кб, 13 просмотров)

Последний раз редактировалось Евгений_А; 30.03.2014 в 14:37.
Евгений_А вне форума Ответить с цитированием
Старый 31.03.2014, 09:00   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Код:
uses Math;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  t := t + 0.02;
  x := v * cos(a) * t;
  y := (v * sin(a) * t - (9 * t * t) / 2);
  shape1.Left := trunc(x*40);
  shape1.Top := trunc(y1 - y*40);
  if t > tn then
  begin
    t := 0;
    timer1.Enabled := False;
    shape1.Top := 216;
    shape1.Left := 72;
    if (x > x1) and (x < x2) and (y > y1) and (y < y2) then
      Label3.Caption := 'Победа!'
    else
      Label3.Caption := 'Промах';
  end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Edit1.Text := IntToStr(Trackbar1.Position);
  a := DegToRad(Trackbar1.Position);
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
  v := Trackbar2.Position;
  Edit2.Text := FloatToStr(v);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  tn := (2 * v * sin(a)) / 9;
//  x := v * cos(a) * tn;
//  y := y1 - (v * sin(a) * tn - (9 * tn * tn) / 2);
  timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  x1 := 240;
  y1 := 172;
  x2 := 395;
  y2 := 247;
  t := 0;
  Trackbar2.Position := 12;
  Trackbar1.Position := 12;
end;
Пока такое вот решение. Будет время, накачу нормальное. Нормальное, это когда не 100500 глобальных переменных и незначащих циферок, а когда каждая сущность определяется чётким набором данных и имеет методы по управлению этими этой сущностью (и/или данными в ней, непосредственно или опосредованно) с максимально простым интерфейсом. В данном случае, объект ядро (с данными: вектор позиции, вектор начальной скорости, вектор текущей скорости, и метод Update), объект пушка (по сути только вектор стартовой позиции ядра), объект цель (область попадания), объект "полигон" (он знает про пушку, ядро, цель, сам имеет размер "зоны" и инициирует необходимые методы, запуск ядра, возврат ядра, итерацию ядра, проверку попадания).

В Вашем же решении было пару существенных ошибок. 1. использования углов там, где функции берут аргументы в радианах (косинус и синус) 2. Ошибки масштабирования решения в координаты формы. 3. Ошибки инициализации и изменения данных.
Сами формулы вроде как верные, т.к. в моём решении ядро летает по баллистической кривой.
phomm вне форума Ответить с цитированием
Старый 31.03.2014, 11:27   #3
Евгений_А
 
Регистрация: 27.03.2014
Сообщений: 5
По умолчанию

Спасибо за помощь, учту свои ошибки
Евгений_А вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться с формулами траектории полета баллистической ракеты tmr Помощь студентам 9 05.03.2012 14:54
Требуется помощь etrom Помощь студентам 4 19.10.2008 16:36
Требуется помощь! Artazzz БД в Delphi 4 17.06.2008 01:52
Требуется помощь ! Garacio_cain Работа с сетью в Delphi 3 06.01.2008 14:53