179 lines
5.8 KiB
Python
179 lines
5.8 KiB
Python
"""
|
|
City Scape Generator
|
|
|
|
If Python and Arcade are installed, this example can be run from the command line with:
|
|
python -m arcade.examples.shape_list_skylines
|
|
"""
|
|
import random
|
|
import arcade
|
|
import time
|
|
|
|
SCREEN_WIDTH = 1200
|
|
SCREEN_HEIGHT = 600
|
|
SCREEN_TITLE = "Skyline Using Buffered Shapes"
|
|
|
|
|
|
def make_star_field(star_count):
|
|
""" Make a bunch of circles for stars. """
|
|
|
|
shape_list = arcade.ShapeElementList()
|
|
|
|
for star_no in range(star_count):
|
|
x = random.randrange(SCREEN_WIDTH)
|
|
y = random.randrange(SCREEN_HEIGHT)
|
|
radius = random.randrange(1, 4)
|
|
brightness = random.randrange(127, 256)
|
|
color = (brightness, brightness, brightness)
|
|
shape = arcade.create_rectangle_filled(x, y, radius, radius, color)
|
|
shape_list.append(shape)
|
|
|
|
return shape_list
|
|
|
|
|
|
def make_skyline(width, skyline_height, skyline_color,
|
|
gap_chance=0.70, window_chance=0.30, light_on_chance=0.5,
|
|
window_color=(255, 255, 200), window_margin=3, window_gap=2,
|
|
cap_chance=0.20):
|
|
""" Make a skyline """
|
|
|
|
shape_list = arcade.ShapeElementList()
|
|
|
|
# Add the "base" that we build the buildings on
|
|
shape = arcade.create_rectangle_filled(width / 2, skyline_height / 2, width, skyline_height, skyline_color)
|
|
shape_list.append(shape)
|
|
|
|
building_center_x = 0
|
|
|
|
skyline_point_list = []
|
|
color_list = []
|
|
|
|
while building_center_x < width:
|
|
|
|
# Is there a gap between the buildings?
|
|
if random.random() < gap_chance:
|
|
gap_width = random.randrange(10, 50)
|
|
else:
|
|
gap_width = 0
|
|
|
|
# Figure out location and size of building
|
|
building_width = random.randrange(20, 70)
|
|
building_height = random.randrange(40, 150)
|
|
building_center_x += gap_width + (building_width / 2)
|
|
building_center_y = skyline_height + (building_height / 2)
|
|
|
|
x1 = building_center_x - building_width / 2
|
|
x2 = building_center_x + building_width / 2
|
|
y1 = skyline_height
|
|
y2 = skyline_height + building_height
|
|
|
|
skyline_point_list.append([x1, y1])
|
|
|
|
skyline_point_list.append([x1, y2])
|
|
|
|
skyline_point_list.append([x2, y2])
|
|
|
|
skyline_point_list.append([x2, y1])
|
|
|
|
for i in range(4):
|
|
color_list.append([skyline_color[0], skyline_color[1], skyline_color[2]])
|
|
|
|
if random.random() < cap_chance:
|
|
x1 = building_center_x - building_width / 2
|
|
x2 = building_center_x + building_width / 2
|
|
x3 = building_center_x
|
|
|
|
y1 = y2 = building_center_y + building_height / 2
|
|
y3 = y1 + building_width / 2
|
|
|
|
shape = arcade.create_polygon([[x1, y1], [x2, y2], [x3, y3]], skyline_color)
|
|
shape_list.append(shape)
|
|
|
|
# See if we should have some windows
|
|
if random.random() < window_chance:
|
|
# Yes windows! How many windows?
|
|
window_rows = random.randrange(10, 15)
|
|
window_columns = random.randrange(1, 7)
|
|
|
|
# Based on that, how big should they be?
|
|
window_height = (building_height - window_margin * 2) / window_rows
|
|
window_width = (building_width - window_margin * 2 - window_gap * (window_columns - 1)) / window_columns
|
|
|
|
# Find the bottom left of the building so we can start adding widows
|
|
building_base_y = building_center_y - building_height / 2
|
|
building_left_x = building_center_x - building_width / 2
|
|
|
|
# Loop through each window
|
|
for row in range(window_rows):
|
|
for column in range(window_columns):
|
|
if random.random() < light_on_chance:
|
|
x1 = building_left_x + column * (window_width + window_gap) + window_margin
|
|
x2 = building_left_x + column * (window_width + window_gap) + window_width + window_margin
|
|
y1 = building_base_y + row * window_height
|
|
y2 = building_base_y + row * window_height + window_height * .8
|
|
|
|
skyline_point_list.append([x1, y1])
|
|
skyline_point_list.append([x1, y2])
|
|
skyline_point_list.append([x2, y2])
|
|
skyline_point_list.append([x2, y1])
|
|
|
|
for i in range(4):
|
|
color_list.append((window_color[0], window_color[1], window_color[2]))
|
|
|
|
building_center_x += (building_width / 2)
|
|
|
|
shape = arcade.create_rectangles_filled_with_colors(skyline_point_list, color_list)
|
|
shape_list.append(shape)
|
|
|
|
return shape_list
|
|
|
|
|
|
class MyGame(arcade.Window):
|
|
""" Main application class. """
|
|
|
|
def __init__(self):
|
|
""" Initializer """
|
|
# Call the parent class initializer
|
|
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
|
|
|
|
self.stars = make_star_field(150)
|
|
self.skyline1 = make_skyline(SCREEN_WIDTH * 5, 250, (80, 80, 80))
|
|
self.skyline2 = make_skyline(SCREEN_WIDTH * 5, 150, (50, 50, 50))
|
|
|
|
arcade.set_background_color(arcade.color.BLACK)
|
|
|
|
def setup(self):
|
|
""" Set up the game and initialize the variables. """
|
|
|
|
def on_draw(self):
|
|
"""
|
|
Render the screen.
|
|
"""
|
|
|
|
# This command has to happen before we start drawing
|
|
|
|
start_time = int(round(time.time() * 1000))
|
|
arcade.start_render()
|
|
|
|
self.stars.draw()
|
|
self.skyline1.draw()
|
|
self.skyline2.draw()
|
|
end_time = int(round(time.time() * 1000))
|
|
total_time = end_time - start_time
|
|
|
|
arcade.draw_text(f"Time: {total_time}", 10, 10, arcade.color.WHITE)
|
|
|
|
def update(self, delta_time):
|
|
""" Movement and game logic """
|
|
self.skyline1.center_x -= 0.5
|
|
self.skyline2.center_x -= 1
|
|
|
|
|
|
def main():
|
|
window = MyGame()
|
|
window.setup()
|
|
arcade.run()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|