annotate atc_plane.py @ 13:4a95c5552d3b

Stall speed and normal rate of climb adjustment committer: Jeff Sipek <jeffpc@jeff.(none)> 1120872321 -0400
author Jeff Sipek <jeffpc@jeff.(none)>
date Sat, 09 Jul 2005 01:25:21 -0400
parents 243941ec0a36
children d9c394a5ef77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
1 #/*
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
2 # * ATC - Air Traffic Controller simulation game
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
3 # *
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
4 # * Copyright (C) 2004, 2005 Josef "Jeff" Sipek <jeffpc@optonline.net>
6
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
5 # *
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
6 # * This program is free software; you can redistribute it and/or modify
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
7 # * it under the terms of the GNU General Public License as published by
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
8 # * the Free Software Foundation; either version 2 of the License, or
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
9 # * (at your option) any later version.
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
10 # *
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
11 # * This program is distributed in the hope that it will be useful,
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
12 # * but WITHOUT ANY WARRANTY; without even the implied warranty of
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
13 # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
14 # * GNU General Public License for more details.
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
15 # *
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
16 # * You should have received a copy of the GNU General Public License
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
17 # * along with this program; if not, write to the Free Software
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
18 # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
19 # *
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
20 # * @(#) %M% %I% %E% %U%
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
21 # */
f346ce878117 GPL License
Jeff Sipek <jeffpc@jeff.(none)>
parents: 1
diff changeset
22
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
23 import os
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
24 import sys
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
25 import time
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
26 import pygame
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
27 from math import *
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
28
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
29 import atc_colors
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
30 import atc_utils
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
31 from atc_plane_specs import *
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
32
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
33 mperpix = 30000.0/800.0 # 800 px == 30 km
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
34 mperdeg = 1852.0*60.0 # == 1852 m/min * 60 min/deg
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
35
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
36 def m2pix(m):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
37 """ Meters to pixels conversion fn """
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
38 return m/mperpix
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
39
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
40 def pix2m(pix):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
41 """ Pixels to meters conversion fn """
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
42 return pix*mperpix
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
43
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
44 def pix2geo(pix):
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
45 return pix2m(pix)/mperdeg
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
46
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
47 plane_OK = 0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
48 plane_RANGE = 1
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
49 plane_CRASHED = 2
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
50 plane_STALL = 3
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
51 plane_DEAD = 4
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
52 plane_PROXY = 5
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
53
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
54 class Plane(pygame.sprite.Sprite):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
55 """ Class to manage one plane's motion """
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
56 def __init__(self,callsign,flightno,pos=(0.0, 0.0, 0.0),vel=(0.0, 0.0, 0.0)):
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
57 """ Set up everything """
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
58 pygame.sprite.Sprite.__init__(self)
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
59
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
60 # screen
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
61 screen = pygame.display.get_surface()
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
62 self.area = screen.get_rect()
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
63
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
64 # plane image
1
4c7bb645fd75 Data separated into image and sound files
Jeff Sipek <jeffpc@jeff.(none)>
parents: 0
diff changeset
65 (self.image, self.rect) = atc_utils.load_png('data/image/plane.png')
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
66
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
67 # call sign
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
68 self.callsign = callsign
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
69
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
70 # flight number
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
71 self.flightno = flightno
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
72
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
73 # position (X, Y, Z)
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
74 self.pos = { \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
75 "X":pos[0], \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
76 "Y":pos[1], \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
77 "Z":pos[2]}
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
78
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
79 # target position
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
80 self.targetPos = { \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
81 "X":None, \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
82 "Y":None, \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
83 "Z":None}
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
84
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
85 # velocity
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
86 self.vel = { \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
87 "i":vel[0], \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
88 "j":vel[1], \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
89 "k":vel[2], \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
90
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
91 "heading":0, \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
92 "speed":0, \
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
93 "climb":0}
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
94 self.complete_vel(ijk=1)
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
95
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
96 self.timer = 0 # this is timeout the next time we try to recalculate position
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
97
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
98 # plane specs
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
99 self.specs = plane_SPECS[0] # default to a simple prop plane, FIXME: add param to override
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
100
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
101 # status flag
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
102 self.status = plane_OK
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
103
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
104 def complete_vel(self, ijk=None, hac=None):
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
105 """ Recalculate all the velocity variables """
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
106 if ijk == None and hac == None:
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
107 print "Nothing calculated"
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
108 return
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
109
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
110 if ijk == None:
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
111 self.vel["i"] = sin(self.vel["heading"]) * sqrt(self.vel["speed"]**2 - self.vel["climb"]**2)
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
112 self.vel["j"] = cos(self.vel["heading"]) * sqrt(self.vel["speed"]**2 - self.vel["climb"]**2)
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
113 self.vel["k"] = self.vel["climb"]
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
114 else:
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
115 self.vel["heading"] = self.calc_head()
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
116 self.vel["speed"] = sqrt(self.vel["i"]**2 + self.vel["j"]**2 + self.vel["k"]**2)
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
117 self.vel["climb"] = self.vel["k"]
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
118
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
119 def update(self):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
120 """ Move the plane, and check for collisions """
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
121 if (self.timer > time.time()):
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
122 return
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
123
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
124 if (self.status != plane_OK):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
125 return
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
126
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
127 self.pos["X"] += self.vel["i"]/10.0
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
128 self.pos["Y"] += self.vel["j"]/10.0
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
129 self.pos["Z"] += self.vel["k"]/10.0
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
130
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
131 # FIXME: need physics
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
132 if (self.targetPos["Z"] != None) and (self.pos["Z"] >= (self.targetPos["Z"] - 25)) and (self.pos["Z"] <= (self.targetPos["Z"] + 25)):
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
133 self.vel["k"] = 0
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
134 self.targetPos["Z"] = None
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
135
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
136 self.complete_vel(ijk=1)
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
137
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
138 #if (self.pos["X"] < 0) or (self.pos["Y"] < 0): # FIXME: max values
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
139 # self.status = plane_RANGE
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
140
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
141 if (self.pos["Z"] < 0):
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
142 self.vel["i"] = self.vel["j"] = self.vel["k"] = 0
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
143 self.status = plane_CRASHED
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
144
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
145 if (self.vel["speed"]<m2pix(self.specs["stall_speed"])) and (not self.status==plane_CRASHED):
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
146 self.status = plane_STALL
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
147
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
148 self.rect.move(m2pix(self.vel["i"])/10.0,m2pix(self.vel["j"])/10.0)
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
149
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
150 self.timer = time.time() + m2pix(self.vel["speed"])**-1/10.0
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
151
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
152 def calc_head(self):
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
153 """ Calculate heading of the airplane (in radians)"""
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
154 if (self.vel["i"] == self.vel["j"] == 0): # no movement
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
155 return 0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
156
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
157 try:
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
158 head = fabs(atan(self.vel["i"]/-self.vel["j"]))
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
159 except ZeroDivisionError:
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
160 if (self.vel["i"]>0):
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
161 return pi/2 # east
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
162 return 3*pi/2 # west
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
163
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
164 return head
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
165
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
166 def calc_geo(self, xy, prefix):
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
167 """ Return a geographic coodrinate-formated xy """
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
168 df = m2pix(pix2geo(xy))
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
169 minus = prefix[0]
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
170 if df<0:
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
171 df *= -1
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
172 minus = prefix[1]
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
173 d = floor(df)
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
174 mf = (df-d) * 60.0
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
175 m = floor(mf)
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
176 s = (mf-m) * 60.0
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
177
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
178 return "%s %dd %02dm %02ds" % (minus, int(d), int(m), int(s))
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
179
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
180 def process(self,cmd):
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
181 """ Process a user command """
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
182
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
183 # FIXME: convert multiple spaces to single
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
184 parts = cmd.split(' ')
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
185
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
186 if (parts[0] == "ALT"):
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
187 print "Changing altitude to " + parts[1] + "m"
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
188 self.targetPos["Z"] = int(parts[1])
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
189 self.vel["k"] = self.specs["climb_normal"]
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
190 if (self.pos["Z"] > self.targetPos["Z"]):
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
191 self.vel["k"] *= -1
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
192 self.complete_vel(ijk=1)
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
193
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
194 if (parts[0] == "HEAD"):
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
195 self.vel["heading"] = int(parts[1])
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
196 while(True):
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
197 if self.vel["heading"]>=360:
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
198 self.vel["heading"] -= 360
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
199 elif self.vel["heading"]<0:
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
200 self.vel["heading"] += 360
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
201 else:
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
202 break
10
7bb4cd2fa1bc Changed window size from 800x600 to 1024x768
Jeff Sipek <jeffpc@jeff.(none)>
parents: 9
diff changeset
203
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
204 print "Changing heading to " + str(self.vel["heading"])
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
205 self.vel["heading"] *= pi/180.0
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
206 self.complete_vel(hac=1)
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
207
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
208 def display(self,screen):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
209 """ Put everything onto the screen """
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
210 screen.blit(self.image, (int(1024/2+m2pix(self.pos["X"])), int(768/2-m2pix(self.pos["Y"]))))
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
211
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
212 # Plane info
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
213 font = pygame.font.Font(None, 16)
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
214
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
215 color = atc_colors.planeinfo_ok
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
216 if (self.status == plane_CRASHED) or (self.status == plane_DEAD):
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
217 color = atc_colors.planeinfo_crashed
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
218
11
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
219 x = int(1024/2+m2pix(self.pos["X"])) + 10
300ba3412449 Fixed velocity calc formulas
Jeff Sipek <jeffpc@jeff.(none)>
parents: 10
diff changeset
220 y = int(768/2-m2pix(self.pos["Y"])) - 5
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
221
9
480ccfc8a57e Display dms instead of m (for geo coords)
Jeff Sipek <jeffpc@jeff.(none)>
parents: 8
diff changeset
222 # FIXME: display geographic coordinates with NSWE appended/prepended
12
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
223 #strings = ( self.flightno,
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
224 # self.callsign + " " + str(self.status),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
225 # "Alt: " + str(int(self.pos["Z"])),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
226 # "Lat: " + self.calc_geo(self.pos["Y"],"NS"),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
227 # "Long: " + self.calc_geo(self.pos["X"],"EW"),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
228 # "Head: " + str(int(atc_utils.todeg(self.vel["heading"]))),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
229 # "AS: " + str(int(self.vel["speed"]*3.6)))
8
8a4a829f1cc0 Nicer splashscreen
Jeff Sipek <jeffpc@jeff.(none)>
parents: 6
diff changeset
230 strings = ( self.flightno,
12
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
231 "%03d %03d" % (int(atc_utils.todeg(self.vel["heading"])), int(self.vel["speed"]*3.6)),
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
232 self.specs["name"])
243941ec0a36 Make the plane info more realistic
Jeff Sipek <jeffpc@jeff.(none)>
parents: 11
diff changeset
233
0
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
234 for stri in strings:
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
235 alt = font.render(stri, 1, color)
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
236 altpos = alt.get_rect()
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
237 altpos.topleft = (x,y)
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
238 screen.blit(alt, altpos)
919a9eff76a3 Initial import
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
diff changeset
239 (x,y) = (x,y+10)