repulsiveruby.sprites
module
Source code
from __future__ import print_function
import pygame
from repulsiveruby import physics
from repulsiveruby import resources
class BaseBallSprite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.position = (0, 0)
self.direction = 0
self.speedX = 0
self.speedY = 0
self.accelerationX = 0
self.accelerationY = 0
self.maxSpeed = 15
self.radius = 32
def updateSpeed(self):
self.speedX += self.accelerationX
self.speedY += self.accelerationY
currentSpeed = physics.norm((self.speedX, self.speedY))
if currentSpeed > self.maxSpeed:
self.speedX = self.speedX / currentSpeed * self.maxSpeed
self.speedY = self.speedY / currentSpeed * self.maxSpeed
def updatePosition(self, bounce):
x, y = self.position
x += self.speedX
y += self.speedY
# boundary detection
if x < self.radius:
x = self.radius
if bounce:
self.speedX *= -1
else:
self.speedX /= 2
if x > resources.SCREEN_W - self.radius:
x = resources.SCREEN_W - self.radius
if bounce:
self.speedX *= -1
else:
self.speedX /= 2
if y < self.radius:
y = self.radius
if bounce:
self.speedY *= -1
else:
self.speedY /= 2
if y > resources.SCREEN_H - self.radius:
y = resources.SCREEN_H - self.radius
if bounce:
self.speedY *= -1
else:
self.speedY /= 2
self.position = (x, y)
def updateImageAndRect(self):
self.direction += (self.speedX + self.speedY) / 2
self.image = pygame.transform.rotate(self.srcImage, self.direction)
self.rect = self.image.get_rect()
self.rect.center = self.position
def update(self):
self.computeAcceleration()
self.updateSpeed()
self.updatePosition(self.bounce)
self.updateImageAndRect()
class MainBallSprite(BaseBallSprite):
def __init__(self, image, position):
BaseBallSprite.__init__(self)
self.srcImage = image
self.position = position
self.bounce = False
self.k_left = 0
self.k_right = 0
self.k_down = 0
self.k_up = 0
def computeAcceleration(self):
# compute acceleration
self.accelerationX = (-self.k_left + self.k_right)
self.accelerationY = (-self.k_up + self.k_down)
class RepulsiveBallSprite(BaseBallSprite):
def __init__(self, image, position, ballMain):
BaseBallSprite.__init__(self)
self.srcImage = image
self.position = position
self.ballMain = ballMain
self.bounce = True
def computeAcceleration(self):
# compute acceleration
vecToMain = (
self.position[0] - self.ballMain.position[0],
self.position[1] - self.ballMain.position[1])
distanceToMain = physics.norm(vecToMain)
if distanceToMain < 200:
self.accelerationX = vecToMain[0] / distanceToMain * 3
self.accelerationY = vecToMain[1] / distanceToMain * 3
else:
self.accelerationX = 0
self.accelerationY = 0}
Classes
class BaseBallSprite (ancestors: pygame.sprite.Sprite)
-
simple base class for visible game objects
pygame.sprite.Sprite(*groups): return Sprite
The base class for visible game objects. Derived classes will want to override the Sprite.update() method and assign Sprite.image and Sprite.rect attributes. The initializer can accept any number of Group instances that the Sprite will become a member of.
When subclassing the Sprite class, be sure to call the base initializer before adding the Sprite to Groups.
Source code
class BaseBallSprite(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.position = (0, 0) self.direction = 0 self.speedX = 0 self.speedY = 0 self.accelerationX = 0 self.accelerationY = 0 self.maxSpeed = 15 self.radius = 32 def updateSpeed(self): self.speedX += self.accelerationX self.speedY += self.accelerationY currentSpeed = physics.norm((self.speedX, self.speedY)) if currentSpeed > self.maxSpeed: self.speedX = self.speedX / currentSpeed * self.maxSpeed self.speedY = self.speedY / currentSpeed * self.maxSpeed def updatePosition(self, bounce): x, y = self.position x += self.speedX y += self.speedY # boundary detection if x < self.radius: x = self.radius if bounce: self.speedX *= -1 else: self.speedX /= 2 if x > resources.SCREEN_W - self.radius: x = resources.SCREEN_W - self.radius if bounce: self.speedX *= -1 else: self.speedX /= 2 if y < self.radius: y = self.radius if bounce: self.speedY *= -1 else: self.speedY /= 2 if y > resources.SCREEN_H - self.radius: y = resources.SCREEN_H - self.radius if bounce: self.speedY *= -1 else: self.speedY /= 2 self.position = (x, y) def updateImageAndRect(self): self.direction += (self.speedX + self.speedY) / 2 self.image = pygame.transform.rotate(self.srcImage, self.direction) self.rect = self.image.get_rect() self.rect.center = self.position def update(self): self.computeAcceleration() self.updateSpeed() self.updatePosition(self.bounce) self.updateImageAndRect()}
Subclasses
Methods
def __init__(self)
-
Initialize self. See help(type(self)) for accurate signature.
Source code
def __init__(self): pygame.sprite.Sprite.__init__(self) self.position = (0, 0) self.direction = 0 self.speedX = 0 self.speedY = 0 self.accelerationX = 0 self.accelerationY = 0 self.maxSpeed = 15 self.radius = 32}
def update(self)
-
method to control sprite behavior
Sprite.update(*args):
The default implementation of this method does nothing; it's just a convenient "hook" that you can override. This method is called by Group.update() with whatever arguments you give it.
There is no need to use this method if not using the convenience method by the same name in the Group class.
Source code
def update(self): self.computeAcceleration() self.updateSpeed() self.updatePosition(self.bounce) self.updateImageAndRect()}
def updateImageAndRect(self)
-
Source code
def updateImageAndRect(self): self.direction += (self.speedX + self.speedY) / 2 self.image = pygame.transform.rotate(self.srcImage, self.direction) self.rect = self.image.get_rect() self.rect.center = self.position}
def updatePosition(self, bounce)
-
Source code
def updatePosition(self, bounce): x, y = self.position x += self.speedX y += self.speedY # boundary detection if x < self.radius: x = self.radius if bounce: self.speedX *= -1 else: self.speedX /= 2 if x > resources.SCREEN_W - self.radius: x = resources.SCREEN_W - self.radius if bounce: self.speedX *= -1 else: self.speedX /= 2 if y < self.radius: y = self.radius if bounce: self.speedY *= -1 else: self.speedY /= 2 if y > resources.SCREEN_H - self.radius: y = resources.SCREEN_H - self.radius if bounce: self.speedY *= -1 else: self.speedY /= 2 self.position = (x, y)}
def updateSpeed(self)
-
Source code
def updateSpeed(self): self.speedX += self.accelerationX self.speedY += self.accelerationY currentSpeed = physics.norm((self.speedX, self.speedY)) if currentSpeed > self.maxSpeed: self.speedX = self.speedX / currentSpeed * self.maxSpeed self.speedY = self.speedY / currentSpeed * self.maxSpeed}
class MainBallSprite (ancestors: BaseBallSprite, pygame.sprite.Sprite)
-
Inherited from:
BaseBallSprite
simple base class for visible game objects …
Source code
class MainBallSprite(BaseBallSprite): def __init__(self, image, position): BaseBallSprite.__init__(self) self.srcImage = image self.position = position self.bounce = False self.k_left = 0 self.k_right = 0 self.k_down = 0 self.k_up = 0 def computeAcceleration(self): # compute acceleration self.accelerationX = (-self.k_left + self.k_right) self.accelerationY = (-self.k_up + self.k_down)}
Methods
def computeAcceleration(self)
-
Source code
def computeAcceleration(self): # compute acceleration self.accelerationX = (-self.k_left + self.k_right) self.accelerationY = (-self.k_up + self.k_down)}
Inherited members
class RepulsiveBallSprite (ancestors: BaseBallSprite, pygame.sprite.Sprite)
-
Inherited from:
BaseBallSprite
simple base class for visible game objects …
Source code
class RepulsiveBallSprite(BaseBallSprite): def __init__(self, image, position, ballMain): BaseBallSprite.__init__(self) self.srcImage = image self.position = position self.ballMain = ballMain self.bounce = True def computeAcceleration(self): # compute acceleration vecToMain = ( self.position[0] - self.ballMain.position[0], self.position[1] - self.ballMain.position[1]) distanceToMain = physics.norm(vecToMain) if distanceToMain < 200: self.accelerationX = vecToMain[0] / distanceToMain * 3 self.accelerationY = vecToMain[1] / distanceToMain * 3 else: self.accelerationX = 0 self.accelerationY = 0}
Methods
def computeAcceleration(self)
-
Source code
def computeAcceleration(self): # compute acceleration vecToMain = ( self.position[0] - self.ballMain.position[0], self.position[1] - self.ballMain.position[1]) distanceToMain = physics.norm(vecToMain) if distanceToMain < 200: self.accelerationX = vecToMain[0] / distanceToMain * 3 self.accelerationY = vecToMain[1] / distanceToMain * 3 else: self.accelerationX = 0 self.accelerationY = 0}
Inherited members