129 lines
3.3 KiB
Python
129 lines
3.3 KiB
Python
"""
|
|
This simple animation example shows how to use classes to animate
|
|
multiple objects on the screen at the same time.
|
|
|
|
Because this is redraws the shapes from scratch each frame, this is SLOW
|
|
and inefficient.
|
|
|
|
Using buffered drawing commands (Vertex Buffer Objects) is a bit more complex,
|
|
but faster.
|
|
|
|
See http://arcade.academy/examples/index.html#shape-lists for some examples.
|
|
|
|
Also, any Sprite class put in a SpriteList and drawn with the SpriteList will
|
|
be drawn using Vertex Buffer Objects for better performance.
|
|
|
|
If Python and Arcade are installed, this example can be run from the command line with:
|
|
python -m arcade.examples.shapes
|
|
"""
|
|
|
|
import arcade
|
|
import random
|
|
|
|
# Set up the constants
|
|
SCREEN_WIDTH = 800
|
|
SCREEN_HEIGHT = 600
|
|
SCREEN_TITLE = "Shapes!"
|
|
|
|
RECT_WIDTH = 50
|
|
RECT_HEIGHT = 50
|
|
|
|
NUMBER_OF_SHAPES = 200
|
|
|
|
|
|
class Shape:
|
|
|
|
def __init__(self, x, y, width, height, angle, delta_x, delta_y,
|
|
delta_angle, color):
|
|
self.x = x
|
|
self.y = y
|
|
self.width = width
|
|
self.height = height
|
|
self.angle = angle
|
|
self.delta_x = delta_x
|
|
self.delta_y = delta_y
|
|
self.delta_angle = delta_angle
|
|
self.color = color
|
|
|
|
def move(self):
|
|
self.x += self.delta_x
|
|
self.y += self.delta_y
|
|
self.angle += self.delta_angle
|
|
|
|
|
|
class Ellipse(Shape):
|
|
|
|
def draw(self):
|
|
arcade.draw_ellipse_filled(self.x, self.y, self.width, self.height,
|
|
self.color, self.angle)
|
|
|
|
|
|
class Rectangle(Shape):
|
|
|
|
def draw(self):
|
|
arcade.draw_rectangle_filled(self.x, self.y, self.width, self.height,
|
|
self.color, self.angle)
|
|
|
|
|
|
class MyGame(arcade.Window):
|
|
""" Main application class. """
|
|
|
|
def __init__(self):
|
|
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
|
|
self.shape_list = None
|
|
|
|
def setup(self):
|
|
""" Set up the game and initialize the variables. """
|
|
self.shape_list = []
|
|
|
|
for i in range(NUMBER_OF_SHAPES):
|
|
x = random.randrange(0, SCREEN_WIDTH)
|
|
y = random.randrange(0, SCREEN_HEIGHT)
|
|
width = random.randrange(10, 30)
|
|
height = random.randrange(10, 30)
|
|
angle = random.randrange(0, 360)
|
|
|
|
d_x = random.randrange(-3, 4)
|
|
d_y = random.randrange(-3, 4)
|
|
d_angle = random.randrange(-3, 4)
|
|
|
|
red = random.randrange(256)
|
|
green = random.randrange(256)
|
|
blue = random.randrange(256)
|
|
alpha = random.randrange(256)
|
|
|
|
shape_type = random.randrange(2)
|
|
|
|
if shape_type == 0:
|
|
shape = Rectangle(x, y, width, height, angle, d_x, d_y,
|
|
d_angle, (red, green, blue, alpha))
|
|
else:
|
|
shape = Ellipse(x, y, width, height, angle, d_x, d_y,
|
|
d_angle, (red, green, blue, alpha))
|
|
self.shape_list.append(shape)
|
|
|
|
def update(self, dt):
|
|
""" Move everything """
|
|
|
|
for shape in self.shape_list:
|
|
shape.move()
|
|
|
|
def on_draw(self):
|
|
"""
|
|
Render the screen.
|
|
"""
|
|
arcade.start_render()
|
|
|
|
for shape in self.shape_list:
|
|
shape.draw()
|
|
|
|
|
|
def main():
|
|
window = MyGame()
|
|
window.setup()
|
|
arcade.run()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|