1
Fork 0

added rain and a simple camera

This commit is contained in:
Andy Killorin 2021-01-13 09:14:44 -06:00
parent aa704150ce
commit e005abc073
No known key found for this signature in database
GPG key ID: 549CE32BAC1E3D4B

View file

@ -2,16 +2,31 @@ __docformat__ = "reStructuredText"
import pymunk, pymunk.pygame_util, pygame, random import pymunk, pymunk.pygame_util, pygame, random
class camera(object): class Camera(object):
def __init__(self, x = 0, y = 0) -> None: """
This class implements a simple camera that can pan through the level
"""
def __init__(self, x = 0, y = 0, w=400, h = 600) -> None:
self.x = x self.x = x
self.y = y self.y = y
self.w = w
self.h = h
def translate(self, pos): def translate(self, pos):
return (pos[0]-self.x,pos[1]-self.y) return (pos[0]-self.x,pos[1]-self.y)
class thing(object): def outOfBounds(self, pos):
def __init__(self, game, mass = 1, moment = 1666, bodyType = pymunk.Body.DYNAMIC) -> None: if (pos[0] > self.w-self.x or pos[0] < 0-self.x
or pos[1] > self.h-self.y or pos[1] < 0-self.y):
return True
else:
return False
class Thing(object):
"""
This class implements a generic pymunk object that can be written to the pygame window
"""
def __init__(self, game, mass = 1.0, moment = 1666, bodyType = pymunk.Body.DYNAMIC) -> None:
self._mass = mass # weight self._mass = mass # weight
self._moment = moment # rotational inertia self._moment = moment # rotational inertia
self._bodyType = bodyType # fixed/moving self._bodyType = bodyType # fixed/moving
@ -29,7 +44,10 @@ class thing(object):
def draw(self): def draw(self):
pass pass
class circle(thing): class Circle(Thing):
"""
This class implements a pymunk circle that can be displayed on a pygame window
"""
def __init__(self, game, radius = 80, color = pygame.Color(0,0,255,1), mass = 1, moment = 1666, bodyType = pymunk.Body.DYNAMIC) -> None: def __init__(self, game, radius = 80, color = pygame.Color(0,0,255,1), mass = 1, moment = 1666, bodyType = pymunk.Body.DYNAMIC) -> None:
super().__init__(game, mass=mass, moment=moment, bodyType=bodyType) super().__init__(game, mass=mass, moment=moment, bodyType=bodyType)
self.radius = radius self.radius = radius
@ -41,7 +59,10 @@ class circle(thing):
if self.visible: if self.visible:
pygame.draw.circle(self._game._screen,self.color,self._body.position,self.radius) pygame.draw.circle(self._game._screen,self.color,self._body.position,self.radius)
class platform(thing): class Platform(Thing):
"""
This class implements a static platform
"""
def __init__(self, game, pos1 = (20,40), pos2 = (40,40), width = 5, color = pygame.Color(0,0,0,1)) -> None: def __init__(self, game, pos1 = (20,40), pos2 = (40,40), width = 5, color = pygame.Color(0,0,0,1)) -> None:
super().__init__(game, bodyType=pymunk.Body.DYNAMIC) super().__init__(game, bodyType=pymunk.Body.DYNAMIC)
self._body = pymunk.Body(body_type=pymunk.Body.STATIC) self._body = pymunk.Body(body_type=pymunk.Body.STATIC)
@ -56,7 +77,68 @@ class platform(thing):
if self.visible: if self.visible:
pygame.draw.line(self._game._screen, self.color, self._pos1, self._pos2, self._width) pygame.draw.line(self._game._screen, self.color, self._pos1, self._pos2, self._width)
class riseToFall(object): class RainDrop(Thing):
"""
Raindrop
"""
def __init__(self,game, maxTime):
super().__init__(game, 0.02)
self.radius = 2
self.color = pygame.Color(0,0,255,1)
self._poly = pymunk.Circle(self._body,self.radius)
self._maxTime = maxTime
self._startTime = pygame.time.get_ticks()
self.destroy = False
self._game._space.add(self._body,self._poly)
self.setPos(random.randint(0,400),0)
self._body.apply_force_at_local_point((0,self._game._space.gravity[1]*1))
def update(self):
t = pygame.time.get_ticks()
dt= t - self._startTime
if (dt > self._maxTime):
self.destroy = True
if self._game.camera.outOfBounds(self.getPos()):
self.destroy = True
def draw(self):
if self.visible:
pygame.draw.circle(self._game._screen,self.color,self._body.position,self.radius)
def delete(self):
self._game._space.remove(self._body,self._poly)
class Rain(object):
def __init__(self,game,maxDrops = 10,maxTime = 15000, dropRate=400):
self.dropList = [RainDrop(game, maxTime)]
self.lastSpawn = pygame.time.get_ticks()
self.maxDrops = maxDrops
self.maxTime = maxTime
self.dropRate = dropRate
self.game = game
self.raining = True
def update(self):
t = pygame.time.get_ticks()
dt= t - self.lastSpawn
print(len(self.dropList))
if self.raining:
if (len(self.dropList) < self.maxDrops and dt > self.dropRate):
self.dropList.append(RainDrop(self.game, self.maxTime))
self.lastSpawn = t
for raindrop in self.dropList:
raindrop.update()
if (raindrop.destroy == True):
self.dropList.remove(raindrop)
raindrop.delete()
del raindrop
else:
raindrop.draw()
class RiseToFall(object):
""" """
riseToFall game class riseToFall game class
""" """
@ -64,7 +146,7 @@ class riseToFall(object):
def __init__(self) -> None: def __init__(self) -> None:
# create space # create space
self._space = pymunk.Space() self._space = pymunk.Space()
self._space.gravity = 0,10 self._space.gravity = 0,100
# initialize pygame # initialize pygame
pygame.init() pygame.init()
@ -78,10 +160,14 @@ class riseToFall(object):
self._shapes = [] self._shapes = []
box = platform(self, (100,140), (150,160)) box = Platform(self, (100,140), (150,160))
self._shapes.append(box) self._shapes.append(box)
# font = pygame.font.SysFont("Arial",16) # font = pygame.font.SysFont("Arial",16)
self.rain = Rain(self)
self.camera = Camera()
# set draw options # set draw options
self._print_options = pymunk.pygame_util.DrawOptions(self._screen) self._print_options = pymunk.pygame_util.DrawOptions(self._screen)
@ -101,10 +187,12 @@ class riseToFall(object):
self._running = False self._running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
#self._createBox() #self._createBox()
shape = circle(self, 10) shape = Circle(self, 10)
shape.setPos(random.randint(0,400),0) shape.setPos(random.randint(0,400),0)
shape.color = pygame.Color(255,0,255,1) shape.color = pygame.Color(255,0,255,1)
self._shapes.append(shape) self._shapes.append(shape)
self._space.gravity = (self._space.gravity[0]*-1,self._space.gravity[1]*-1)
self.rain.raining = not self.rain.raining
def _drawEntities(self): def _drawEntities(self):
for shape in self._shapes: for shape in self._shapes:
@ -117,10 +205,11 @@ class riseToFall(object):
self._screen.fill(pygame.Color("white")) self._screen.fill(pygame.Color("white"))
# self._space.debug_draw(self._print_options) # self._space.debug_draw(self._print_options)
self._drawEntities() self._drawEntities()
self.rain.update()
pygame.display.flip() pygame.display.flip()
if __name__ == "__main__": if __name__ == "__main__":
game = riseToFall() game = RiseToFall()
game._createBox() game._createBox()
game.run() game.run()