Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/api/Sprite2.py
blob: e19c510aae63fc0a8158e24d52997fddd87c87c2 (plain)
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
#!/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)
        self.mVel = CVector(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.mImageMaster = pygame.surface.Surface((0, 0), 0)
        self.image = self.mImageMaster.copy()
 
    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()):
                self.mactive = True

        if self.mactive == True:
            if CMouse().release():
                self.mactive = False
                if self.rect.collidepoint(CMouse().getPos()):
                    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.setImage(Image.loadImage(aImageFilename, aIsTransparent))
    
    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 vector
        """
        self.mPos.setX(position.getX())
        self.mPos.setY(position.getY())

    def setPosTuple(self, position):
        """ place the sprite directly at the given position

            expects an (x, y) tuple
        """
        self.mPos.setXY(position[0], position[1])

    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
        """
        dx = self.mPos.x - point[0]
        dy = self.mPos.y - point[1]
        
        return math.sqrt((dx * dx) + (dy * dy))

    def destroy(self):
        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)