-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCNave.pas
126 lines (107 loc) · 2.5 KB
/
CNave.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
unit CNave;
interface
uses
Types, Vcl.Graphics,
Vcl.Controls, CBala;
type
Nave = class
private
tamanio: integer;
velocidad: integer;
aceleracion: integer;
public
angulo: integer;
enMovimiento: boolean;
centro: TPoint;
p1, p2, p3: TPoint;
rotarIzq, rotarDer, canMove: boolean;
constructor Create(x, y, tam: integer);
procedure dibujar(canvas: TCanvas);
procedure mover;
procedure rotar(angulo: integer);
procedure acelerar;
procedure desacelerar;
end;
implementation
const MAX_SPEED = 15;
{ nave }
{mueve el punto p, respecto al punto t}
procedure trasladar(var p: tpoint; t: tpoint);
begin
p.X := p.X + t.X;
p.Y := p.Y + t.Y;
end;
{rota el punto p, desde el orgen (0, 0) "a" angulos}
{"a" un angulo en radianes}
procedure rotacion(var p: tpoint; a: real);
var t: Tpoint;
begin
t := p;
p.X := trunc(t.X*cos(a)-t.Y*sin(a));
p.Y := trunc(t.X*sin(a)+t.Y*cos(a));
end;
procedure nave.acelerar;
begin
if velocidad < 5 then velocidad := 5;
if enMovimiento then begin
if velocidad < MAX_SPEED then BEGIN
velocidad := velocidad + aceleracion;
END;
end;
enMovimiento := true;
end;
constructor nave.Create(x, y, tam: integer);
begin
centro := Point(x, y);
tamanio := tam;
velocidad := 5;
angulo := 0;
aceleracion := 1;
enMovimiento := false;
rotarIzq := false;
rotarDer := false;
canMove := false;
end;
procedure nave.desacelerar;
begin
if enMovimiento then begin
if velocidad > 1 then velocidad := velocidad - aceleracion
else enMovimiento := false;
end else velocidad := 5;
end;
procedure nave.dibujar(canvas: TCanvas);
var w: integer;
a: real;
begin
a := angulo*pi/180.0;
w := tamanio div 2;
p1 := point(0, -w-20);
p2 := point(-w, +w);
p3 := point(+w, +w);
rotacion(p1, a);
rotacion(p2, a);
rotacion(p3, a);
trasladar(p1, centro);
trasladar(p2, centro);
trasladar(p3, centro);
canvas.Pen.Width := 3;
canvas.Pen.Color := clWhite;
canvas.Polygon([p1, p2, p3, p1]);
end;
procedure nave.mover;
var moverPunto: Tpoint;
begin
moverPunto.X := trunc(velocidad * sin(angulo*pi/180));
moverPunto.Y := -trunc(velocidad * cos(angulo*pi/180));
trasladar(p1, moverPunto);
trasladar(p2, moverPunto);
trasladar(p3, moverPunto);
trasladar(centro, moverPunto);
end;
procedure nave.rotar(angulo: integer);
begin
Self.angulo := Self.angulo + angulo;
// if velocidad - aceleracion > 5
// then velocidad := velocidad - aceleracion;
end;
end.