МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет «Львівська політехніка»
Кафедра АСУ
Розрахункова робота
з курсу “Об'єктно орієнтоване програмування”
Варіант 16
Тема Створення проекту з елементами графіки”
ЗАВДАННЯ:
Створити проект Delphi для побудови рухомих графічних зображень. Основні елементи зображення розглядати як об’єкти класів, які необхідно ввести та описати. Рух або зміну об’єктів реалізувати за допомогою відповідних методів класів. Рух більшості об’єктів здійснюється зліва направо, а тоді повторюється або змінює напрямок. Програма має реагувати на керуючі клавіші: 1) для видачі підказки; 2) для зупинки (паузи) та продовження руху; 3) старт із початкового стану; 4) збільшення-зменшення об’єкта; 5) уповільнення-прискорення руху; 6) завершення програми.
Примітка. Опис класів та реалізацію методів виконати в окремому програмному модулі.
Індивідуальне завдання: 16) Автозаправна станція заправляє.
.
Аналіз методів та алгоритмув виконнання завдання
У даної задачі є безліч методів рішення. Проце свідчить навіть те що є безліч варіантів створення зображення кульки а саме її побудова чи прив’язки розмірів або координат.
Хоча побудова класу не залежить від зовнішнього предствалення даних які містяться в класі оскільки воно формується реалізацією тих чи інших класів завданням яких є відображення інформації об’єкту.
Опис класів та об’єктів
В програмі створено три нові класи : TCar , TAZC, TScena.
Текст Програми
Zapravka;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
const
MaxBak=150;
MaxFuel=100;
Type
TCar=class
private
x,y:double;
Length:integer;
Height:integer;
Fuel:double;
public
Fueled:boolean;
constructor Create(x,y:double;Length,Height:integer;Fuel:double);
procedure Go(dx:double);
procedure Draw(Can:TCanvas);
procedure Scale(Scale:double);
function GetBakX:integer;
function GetBackX:integer;
function GetFuel:integer;
end;
TAZC=class
private
x,y:double;
Height:integer;
Fuel:double;
ConLen:integer;
public
Connected:boolean;
Disconnect:boolean;
constructor Create(x,y:double;Height:integer;Fuel:double);
procedure Draw(Can:TCanvas);
procedure Scale(Scale:double);
procedure LoadFuel(Load:integer);
function StopX:integer;
function GetFuel:integer;
procedure DoConnectWith(tx:integer);
procedure DoDisconnect;
end;
TScena=class
public
Changes:boolean;
Stoped:boolean;
CarFuelLoad:boolean;
C:TCar;
Wog:TAZC;
GroundY:integer;
Canvas:TCanvas;
MaxX:integer;
procedure Draw;
procedure Scale(scale:double);
constructor Create(Can:TCanvas;y:integer;MaxX:integer);
end;
implementation
{ TCar }
constructor TCar.Create(x, y: double; Length,Height: integer;Fuel: double);
begin
Self.x:=x;
Self.y:=y;
Self.Length:=Length;
Self.Height:=Height;
Self.Fuel:=Fuel;
Fueled:=false;
end;
procedure TCar.Draw(Can: TCanvas);
var xi,yi,color:integer;
begin
xi:=round(x);
yi:=round(y-Height/5);
Can.Pen.Width:=3;
Can.Font.Name:='Arial Black';
Can.Font.Size:=Height div 12;
with Can do
begin
Arc(xi-Height,yi-Height,xi,yi,xi,yi-Height div 2,xi-Height div 2,yi-Height);
color:=Brush.Color;
Brush.Color:=$07F6FF;
Rectangle(xi-Length,yi-Height div 2,xi,yi);
Brush.Color:=$FF9E28;
Rectangle(xi-Length,yi-Height,xi-Height div 2,yi-Height div 2);
TextOut(xi-Length+round(Height*(0.2)),yi-Height+round(Height*(0.15)),'Купуй українське!');
Brush.Color:=Color;
//колеса
color:=Brush.Color;
Brush.Color:=$0;
Ellipse(xi-round(Height*(0.55)),yi-round(Height/4),xi-round(Height*(1/8)),round(y));
Ellipse(xi-Length+round(Height*(0.1)),yi-round(Height/4),xi-Length+round(Height*(0.55)),round(y));
Brush.Color:=$C4C4C4;
Ellipse(xi-round(Height*(0.45)),yi-round(Height/7),xi-round(Height*(0.22)),round(y-Height*(0.1)));
Ellipse(xi-Length+round(Height*(0.2)),yi-round(Height/7),xi-Length+round(Height*(0.45)),round(y-Height*(0.1)));
Brush.Color:=Color;
//------
Rectangle(xi-Length+round(Height*(0.8)),yi-round(Height*(0.4)),xi-Length+round(Height*(0.9)),round(yi-Height*(0.3)));
Ellipse(xi-round(Height*(0.1)),yi-round(Height/3),xi-round(Height*(0.03)),yi-round(Height*(0.2)));
end;
end;
function TCar.GetBackX: integer;
begin
result:=round(x-Length);
end;
function TCar.GetBakX: integer;
begin
result:=round(x-Length+round(Height*(0.85)));
end;
{
function TCar.GetBakY: integer;
begin
result:=round(y-Height*(0.3));
end; }
function TCar.GetFuel: integer;
begin
result:=round(Fuel);
end;
procedure TCar.Go(dx: double);
begin
x:=x+dx;
end;
procedure TCar.Scale(Scale: double);
begin
Length:=round(Length*scale);
Height:=round(Height*scale);
end;
{ TScena }
constructor TScena.Create(Can:TCanvas;y:integer;MaxX:integer);
begin
Self.MaxX:=MaxX;
Canvas:=Can;
C:=TCar.Create(10,y,150,80,50);
GroundY:=y;
Wog:=TAZC.Create(MaxX div 2,y,80,100);
C.Scale(2);
Wog.Scale(2);
end;
procedure TScena.Draw;
begin
C.Draw(Canvas);
Wog.Draw(Canvas);
with Canvas do
begin
MoveTo(0,groundy);
LineTo(MaxX,groundy);
end;
Changes:=false;
end;
procedure TScena.Scale(scale: double);
begin
C.Scale(scale);
Wog.Scale(scale);
end;
{ TAZC }
constructor TAZC.Create(x, y: double; Height: integer; Fuel: double);
begin
Self.x:=x;
Self.y:=y;
Self.Height:=Height;
Self.Fuel:=Fuel;
Connected:=false;
Disconnect:=true;
end;
procedure TAZC.DoConnectWith(tx: integer);
begin
ConLen:=ConLen+round(Height*0.02);
if (ConLen+x)>tx then Connected:=true
else Connected:=false;
end;
procedure TAZC.DoDisconnect;
begin
ConLen:=ConLen-round(Height*0.02);
if (ConLen-1)<0 then Disconnect:=true;
end;
procedure TAZC.Draw(Can: TCanvas);
var xi,yi:integer;
color:TColor;
Delta:double;
begin
xi:=round(x);
yi:=round(y);
With Can do
begin
Rectangle(round(xi-Height/2.2),round(yi-Height*2),round(xi-Height/5),round(yi));
Rectangle(round(xi-Height*1.6),round(yi-Height*2.3),round(xi+Height),round(yi-Height*1.8));
Font.Size:=round(Height*0.25);
Font.Color:=$00FF00;
TextOut(round(xi-Height*1.21),round(yi-Height*2.28),'WELCOME');
Font.Color:=$000000;
Rectangle(round(xi),round(yi-Height*0.58),round(xi+ConLen),round(yi-Height*0.52));
Ellipse(round(xi-Height/10),round(yi-Height*0.65),round(xi+Height/9),round(yi-Height*0.47));
Rectangle(round(xi-Height/1.5),yi-Height,xi,yi);
Rectangle(round(xi-Height/1.7),round(yi-Height/1.1),round(xi-Height/11),round(yi-Height/1.5));
Rectangle(round(xi-Height/1.7),round(yi-Height/1.6),round(xi-Height/2.2),round(yi-Height/5));
color:=Brush.Color;
Brush.Color:=$68C0FF;
Delta:=(Height/5-Height/1.6)*0.01*(MaxFuel-Fuel);
Rectangle(round(xi-Height/1.7),round(yi-Height/1.6-Delta),round(xi-Height/2.2),round(yi-Height/5));
Brush.Color:=color;
Font.Size:=round(Height*0.08);
TextOut(round(xi-Height/2.78),round(yi-Height/1.74),'A95');
Arc(round(xi-Height/2.5),round(yi-Height/1.6),round(xi-Height/9),round(yi-Height/3),0,0,0,0);
Font.Size:=round(Height/10);
TextOut(round(xi-Height/2.5),round(yi-Height/1.15),IntToStr(100-round(Fuel)));
end;
end;
function TAZC.GetFuel: integer;
begin
result:=round(Fuel);
end;
procedure TAZC.LoadFuel(Load: integer);
begin
if Fuel-Load>0 then
Fuel:=Fuel-Load;
end;
procedure TAZC.Scale(Scale: double);
begin
Height:=round(Height*Scale);
end;
function TAZC.StopX: integer;
begin
result:=round(x+Height*0.5);
end;
end.
Інструкція користувачеві програми.
Щоб відкрити допомогу натисніть h
'Пробіл- зупинити/продовжити
‘+’ збільшення масштабу
‘-‘ зменшення масштабу
BackSpace - програти з початку
Скріншоти роботи програми:
Висновок: Знання графічних можливостей системи є невід’ємною частиною при побудові сучасних програмних вжитків, що дозволяє приваблювати клієнтів зовнішнім виглядом, тому використання лише стандартних компонентів призводить до одноманіності програм. Крім того
Особливо цікавим є побудова анімації та динамічних зображень що забезпечує створення унікального інтерфейсу.