Добавил:
sergey123
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ООП / ООП / new_lab3_2 / unit_main
.cpp//---------------------------------------------------------------------------
#include <vcl.h>
#include <cmath>
#pragma hdrstop
#include "unit_main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Clear(){
tmrMain->Enabled = false;
paused = false;
txtSpeedX->Enabled = true;
txtSpeedY->Enabled = true;
(dynamic_cast<CBall*>(arr[6]))->center = DPoint(50, 50);
(dynamic_cast<CBall*>(arr[6]))->v = DPoint(0., 0);
DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
SetWindowLong(txtSpeedX->Handle, GWL_STYLE, GetWindowLong(txtSpeedX->Handle, GWL_STYLE) | ES_RIGHT);
SetWindowLong(txtSpeedY->Handle, GWL_STYLE, GetWindowLong(txtSpeedY->Handle, GWL_STYLE) | ES_RIGHT);
frmMain->KeyPreview = true;
rotation = false;
paused = false;
arr.reserve(7);
AddBorder(arr, DPoint(0., 0.), DPoint(static_cast<double>(imgMain->Width),
static_cast<double>(imgMain->Height)));
AddTarget(arr, DPoint(650.,150.), DPoint(700., 400.), 5);
AddSupport(arr, DPoint(140, 300), 110, 110, 3*M_PI/3);
AddBall(arr, DPoint(50,50), 10);
trbSemiAxisA->Position = 100;
trbSemiAxisB->Position = 150;
trbLength->Position = 40;
DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::imgMainMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
switch(Button){
case mbLeft : {
old_p = TPoint(X, Y);
m = FindItem(imgMain->Canvas, TPoint(X, Y), arr);
if(dynamic_cast<CBall*>(m) != NULL){
tmrMain->Enabled = false;
paused = true;
}
break;
}
case mbRight : {
old_p = TPoint(X, Y);
m = FindItem(imgMain->Canvas, TPoint(X, Y), arr);
if(dynamic_cast<CSupport*>(m)) rotation = true;
else m = NULL;
break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::imgMainMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(paused){
if(dynamic_cast<CBall*>(m) != NULL) tmrMain->Enabled = true;
paused = false;
}
m = NULL;
rotation = false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::imgMainMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(m){
if(rotation){
CSupport *support = dynamic_cast<CSupport*>(m);
support->Rotate(atan2(static_cast<double>(- Y + old_p.y), static_cast<double>(X - old_p.x)));
DrawAll(imgMain->Canvas, arr);
}
else{
MoveItem(m, TPoint(X - old_p.x, Y - old_p.y));
old_p = TPoint(X, Y);
DrawAll(imgMain->Canvas, arr);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
for(vector<Elements*>:: iterator p = arr.begin(); p < arr.end(); ++p)
delete (*p);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::bttPauseClick(TObject *Sender)
{
tmrMain->Enabled = false;
paused = true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStartClick(TObject *Sender)
{
if(!paused){
try{
(dynamic_cast<CBall*>(arr[6]))->v = DPoint(StrToFloat(txtSpeedX->Text), StrToFloat(txtSpeedY->Text));
}
catch(exception &e){
(dynamic_cast<CBall*>(arr[6]))->v = DPoint(0., 0.);
txtSpeedX->Text = "";
txtSpeedY->Text = "";
}
}
txtSpeedX->Enabled = false;
txtSpeedY->Enabled = false;
tmrMain->Enabled = true;
paused = false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tmrMainTimer(TObject *Sender)
{
try{
MoveIt(imgMain->Canvas, dynamic_cast<CBall*>(arr[6]), arr,
static_cast<double>(trbGravity->Position) * 0.01,
static_cast<double>(trbBounce->Position) * 0.01,
1 - static_cast<double>(trbFriction->Position) * 0.01);
}
catch(int points){
tmrMain->Enabled = false;
ShowMessage("<< " + IntToStr(points) + " >>");
Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStopClick(TObject *Sender)
{
Clear();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::trbSemiAxisBChange(TObject *Sender)
{
dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
static_cast<double>(trbSemiAxisB->Position),
static_cast<double>(trbLength->Position) * M_PI / 50.);
DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::trbSemiAxisAChange(TObject *Sender)
{
dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
static_cast<double>(trbSemiAxisB->Position),
static_cast<double>(trbLength->Position) * M_PI / 50.);
DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::trbLengthChange(TObject *Sender)
{
dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
static_cast<double>(trbSemiAxisB->Position),
static_cast<double>(trbLength->Position) * M_PI / 50.);
DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::txtVKeyPress(TObject *Sender, char &Key)
{
if(((Key < '0') || (Key > '9')) && (Key != DecimalSeparator) && (Key != '-') && (Key != VK_BACK) && (Key != VK_DELETE)) Key = NULL;
else{
if(Key == '.'){
if(dynamic_cast<TEdit*>(Sender)->Text.Pos(DecimalSeparator)) Key = NULL;
}
if(dynamic_cast<TEdit*>(Sender)->Text == "") dynamic_cast<TEdit*>(Sender)->Text = "0";
}
}
//---------------------------------------------------------------------------
Соседние файлы в папке new_lab3_2