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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
import math
import Image
from api.Vector import CVector
from Mouse import CMouse
class CSprite(pygame.sprite.Sprite):
""" An enhanced Sprite class
expects a gameEngine.Scene class as its one parameter
Use methods to change image, direction, speed
Will automatically travel in direction and speed indicated
"""
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.mPos = CVector(0.0, 0.0)
self.mVel = CVector(0.0, 0.0)
# Registration point offset.
self.mOffsetX = 0
self.mOffsetY = 0
# Speed of the sprite.
self.mSpeed = 0
self.maxSpeed = 50
self.minSpeed = -3
self.mactive = False
self.mclicked = False
self.font = pygame.font.Font('assets/fonts/DejaVuSans.ttf', 30)
self.mImageMaster = self.font.render(">sprite>", True, (0,0,0), (0xFF, 0xFF, 0xFF))
# Set the image of the sprite.
self.image = self.mImageMaster.copy()
self.update()
def setRegistrationPointOffset(self, aOffsetX, aOffsetY):
self.mOffsetX = aOffsetX
self.mOffsetY = aOffsetY
def setXY(self, aX, aY):
self.mPos.setXY(aX, aY)
self.calculatePositionWithOffset()
def setVelXY(self, aVelX, aVelY):
self.mVel.setXY(aVelX, aVelY)
self.mVel.truncate(self.maxSpeed)
def setVelVec(self, aVec):
self.mVel.setXY(aVec.getX(), aVec.getY())
self.mVel.truncate(self.maxSpeed)
def setMaxSpeed(self, aMaxSpeed):
self.maxSpeed = aMaxSpeed
def update(self):
self.mPos.add(self.mVel)
self.calculatePositionWithOffset()
self.mclicked = False
if CMouse().firstPress():
if self.rect.collidepoint(CMouse().getPos()):
#print("first press in button")
self.mactive = True
#check for mouse release
if self.mactive == True:
if CMouse().release():
self.mactive = False
if self.rect.collidepoint(CMouse().getPos()):
#print("release in button")
self.mclicked = True
def setSpeed(self, speed):
""" immediately sets the objects speed to the
given value.
"""
self.mSpeed = speed
def speedUp(self, amount):
""" changes speed by the given amount
Use a negative value to slow down
"""
self.mSpeed += amount
if self.mSpeed < self.minSpeed:
self.mSpeed = self.minSpeed
if self.mSpeed > self.maxSpeed:
self.mSpeed = self.maxSpeed
def loadImage(self, aImageFilename, aIsTransparent=True):
self.mImageMaster = Image.loadImage(aImageFilename, aIsTransparent)
self.setImage(self.mImageMaster)
def setImage(self, aImage):
self.mImageMaster = aImage
self.image = aImage
self.rect = self.image.get_rect()
self.calculatePositionWithOffset()
def setPosition (self, position):
""" place the sprite directly at the given position
expects an (x, y) tuple
"""
self.mPos.setX(position.getX())
self.mPos.setY(position.getY())
def setSpeedLimits(self, amax, amin):
""" determines maximum and minimum
speeds you will allow through
speedUp() method. You can still
directly set any speed you want
with setSpeed() Default values:
max: 10
min: -3
"""
self.maxSpeed = amax
self.minSpeed = amin
def dataTrace(self):
""" utility method for debugging
print major properties
extend to add your own properties
"""
print "x: %d, y: %d, speed: %.2f, dx: %.2f, dy: %.2f" % \
(self.mPos.x, self.mPos.y, self.mSpeed, self.mAngle, self.dx, self.dy)
def mouseDown(self):
""" boolean function. Returns True if the mouse is
clicked over the sprite, False otherwise
"""
self.pressed = False
if CMouse().pressed():
if self.rect.collidepoint(CMouse().getPos()):
self.pressed = True
return self.pressed
def mouseOver(self):
if not CMouse().pressed():
if self.rect.collidepoint(CMouse().getPos()):
return True
else:
return False
else:
return False
def clicked(self):
""" Boolean function. Returns True only if mouse
is pressed and released over sprite
"""
return self.mclicked
def distanceTo(self, point):
""" returns distance to any point in pixels
can be used in circular collision detection
"""
(pointx, pointy) = point
dx = self.mPos.x - pointx
dy = self.mPos.y - pointy
dist = math.sqrt((dx * dx) + (dy * dy))
return dist
def destroy(self):
self.font = None
self.mImageMaster = None
self.image = None
def calculatePositionWithOffset(self):
self.rect = self.image.get_rect()
self.rect.x = self.mPos.getX() - self.mOffsetX
self.rect.y = self.mPos.getY() - self.mOffsetY
def getX(self):
return self.mPos.getX()
def getY(self):
return self.mPos.getY()
def getSize(self):
if self.image:
rect = self.image.get_rect()
return (rect[2], rect[3])
else:
return (0,0)
|