-
Notifications
You must be signed in to change notification settings - Fork 2
/
sprite_circle_movement.py
140 lines (106 loc) · 3.79 KB
/
sprite_circle_movement.py
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
"""
Move a sprite in a circle.
Sample Python/Pygame Programs
Simpson College Computer Science
http://programarcadegames.com/
http://simpson.edu/computer-science/
"""
import pygame
import random
import math
# Define some colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
RED = ( 255, 0, 0)
class Block(pygame.sprite.Sprite):
""" This class represents the ball that moves in a circle. """
def __init__(self, color, width, height):
""" Constructor that create's the ball's image. """
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
# The "center" the sprite will orbit
self.center_x = 0
self.center_y = 0
# Current angle in radians
self.angle = 0
# How far away from the center to orbit, in pixels
self.radius = 0
# How fast to orbit, in radians per frame
self.speed = 0.05
def update(self):
""" Update the ball's position. """
# Calculate a new x, y
self.rect.x = self.radius * math.sin(self.angle) + self.center_x
self.rect.y = self.radius * math.cos(self.angle) + self.center_y
# Increase the angle in prep for the next round.
self.angle += self.speed
class Player(pygame.sprite.Sprite):
""" Class to represent the player. """
def __init__(self, color, width, height):
""" Create the player image. """
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
def update(self):
"""Set the user to be where the mouse is. """
pos = pygame.mouse.get_pos()
self.rect.x = pos[0]
self.rect.y = pos[1]
# Initialize Pygame
pygame.init()
# Set the height and width of the screen
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 400
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
# This is a list of 'sprites.' Each block in the program is
# added to this list. The list is managed by a class called 'Group.'
block_list = pygame.sprite.Group()
# This is a list of every sprite. All blocks and the player block as well.
all_sprites_list = pygame.sprite.Group()
for i in range(50):
# This represents a block
block = Block(BLACK, 20, 15)
# Set a random center location for the block to orbit
block.center_x = random.randrange(SCREEN_WIDTH)
block.center_y = random.randrange(SCREEN_HEIGHT)
# Random radius from 10 to 200
block.radius = random.randrange(10, 200)
# Random start angle from 0 to 2pi
block.angle = random.random() * 2 * math.pi
# radians per frame
block.speed = 0.008
# Add the block to the list of objects
block_list.add(block)
all_sprites_list.add(block)
# Create a RED player block
player = Player(RED, 20, 15)
all_sprites_list.add(player)
#Loop until the user clicks the close button.
done = False
# Used to manage how fast the screen updates
clock = pygame.time.Clock()
score = 0
# -------- Main Program Loop -----------
while not done:
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
done = True # Flag that we are done so we exit this loop
all_sprites_list.update()
# Clear the screen
screen.fill(WHITE)
# See if the player block has collided with anything.
blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)
# Check the list of collisions.
for block in blocks_hit_list:
score += 1
print( score )
# Draw all the spites
all_sprites_list.draw(screen)
# Go ahead and update the screen with what we've drawn.
pygame.display.flip()
# Limit to 60 frames per second
clock.tick(60)
pygame.quit()