c = contact(my_poly, wall, restitution=0) if bool(c): overlap = True # DRAW section # clear the screen if overlap: screen.fill([255, 255, 0]) else: screen.fill([255, 255, 255]) # draw objects for o in objects: o.update(dt) o.draw(screen) if bool(c): pos = my_poly.pos vel = my_poly.vel c.resolve() my_poly.draw(screen) my_poly.pos = pos my_poly.vel = vel pygame.draw.circle(screen, [0, 0, 0], c.contact_point(), 5) # update the display pygame.display.update() # delay for correct timing clock.tick(fps)
from polygon import Polygon # square = Square() # square.draw() # turtle.done() shape = Polygon(6, "hexagon", color="pink") shape.draw()
def main(screen): running = True clock = pygame.time.Clock() speed = 7 chunk_depth = 25 chunk_width = 20 bonus = 0 coin_sound = pygame.mixer.Sound("SOUND/smw_coin.wav") explosion_sound = pygame.mixer.Sound("SOUND/airland.wav") explosion_sound.set_volume(0.2) best_score = 0 if os.path.exists("score.txt"): with open("score.txt", "r") as f: content = f.read() if content and content.isdigit(): best_score = int(content) else: with open("score.txt", "w") as f: f.write("0") rx = 32 ry = 0 camera = pygame.Vector3(0, 5, 2) font = pygame.font.SysFont('arial', 30) sky = pygame.transform.flip(pygame.transform.scale(pygame.image.load("PNG/sky.png"), SCREEN_DIMENSION), False, True) pols = [] for i in range(-chunk_width, chunk_width): for j in range(chunk_depth): pol = Polygon(i, 0, -j, (random.randint(0, 150), random.randint(200, 255), random.randint(0, 150))) perlin(pol) pols.append(pol) kite = Kite(-0.5, 1.5, 0) k_ry = 0 while running: t = clock.get_time() / 1000 for event in pygame.event.get(): if event.type == pygame.QUIT: return False pressed = pygame.key.get_pressed() camera.z -= speed * t if pressed[pygame.K_q]: camera.x -= speed * t for part in kite.polygons: for p in part.points: p.x -= speed * t k_ry += 0.6 elif pressed[pygame.K_d]: camera.x += speed * t for part in kite.polygons: for p in part.points: p.x += speed * t k_ry -= 0.6 else: if k_ry > 0: k_ry -= 1 if k_ry < 0: k_ry += 1 if k_ry > 10: k_ry = 10 if k_ry < -10: k_ry = -10 if pressed[pygame.K_SPACE]: camera.y += speed * t for part in kite.polygons: for p in part.points: p.y += speed * t if pressed[pygame.K_LSHIFT]: camera.y -= speed * t for part in kite.polygons: for p in part.points: p.y -= speed * t new_pol = [] for pol in pols: if not isinstance(pol, Prop): if not pol.can_render_z(camera): new_pol.append(Polygon(pol.x, pol.y, pol.z - chunk_depth, (random.randint(0, 150), random.randint(200, 255), random.randint(0, 150)))) perlin(new_pol[-1], new_pol) elif not pol.can_render_x_left(camera, chunk_width): new_pol.append(Polygon(pol.x - chunk_width * 2, pol.y, pol.z, (random.randint(0, 150), random.randint(200, 255), random.randint(0, 150)))) perlin(new_pol[-1], new_pol) elif not pol.can_render_x_right(camera, chunk_width): new_pol.append(Polygon(pol.x + chunk_width * 2, pol.y, pol.z, (random.randint(0, 150), random.randint(200, 255), random.randint(0, 150)))) perlin(new_pol[-1], new_pol) else: new_pol.append(pol) else: new_pol.append(pol) pols = new_pol pols.sort(key=lambda s: distance(s.points, camera), reverse=True) screen.blit(sky, (0, 0)) for pol in pols: pol.draw(screen, camera, rx, ry) if kite.collision(pol): kite.life -= 0.5 if isinstance(pol, Prop): if pol.collide(kite): bonus += 50 coin_sound.play() if kite.index < 10: for part in kite.polygons: for p in part.points: p.z -= speed * t part.draw(screen, camera, rx, ry, k_ry) kite.rope_particles(screen, camera, rx, ry, k_ry, 200, 880) else: speed -= 1 if kite.index == 1: explosion_sound.play() speed = max(speed, 0) s = int(-camera.z + bonus + 2) screen.blit(font.render(f"Score = {s}", True, (0, 0, 0)), (20, 20)) screen.blit(font.render(f"Best score = {max(s, best_score)}", True, (0, 0, 0)), (20, 50)) kite.draw_explosion(screen) kite.draw_life(screen) kite.draw_height(screen) pygame.display.flip() clock.tick() pygame.display.set_caption(f"{clock.get_fps():.2f}") if kite.index >= 71: if s > best_score: with open("score.txt", "w") as f: f.write(str(s)) return True
class Renderer: ROTATION_ANGLES = cycle((radians(3), radians(-3), radians(3))) WHITE_COLOR = (255, 255, 255, 255) BLACK_COLOR = (0, 0, 0, 255) VIEWPORT_PADDING = 100 WIDTH = 600 HEIGHT = 600 VIEWPORT_POINTS = [(VIEWPORT_PADDING, VIEWPORT_PADDING), (WIDTH - VIEWPORT_PADDING, VIEWPORT_PADDING), (WIDTH - VIEWPORT_PADDING, HEIGHT - VIEWPORT_PADDING), (VIEWPORT_PADDING, HEIGHT - VIEWPORT_PADDING)] INITIAL_RECTANGLE_POINTS = [(150, 325), (450, 325), (450, 375), (150, 375)] INITIAL_TRIANGLE_POINTS = [(150, 325), (450, 325), (300, 175)] INITIAL_CIRCLE_PARAMETERS = ((600, 350), 100) def __init__(self, window): self._window = window self.sdl_renderer = sdl2.SDL_CreateRenderer( self._window.sdl_window, -1, sdl2.SDL_RENDERER_ACCELERATED) self._viewport = Polygon(self.sdl_renderer, Renderer.VIEWPORT_POINTS) rectangle = Polygon(self.sdl_renderer, Renderer.INITIAL_RECTANGLE_POINTS, is_point_visible=self._viewport.contains) circle = Circle( self.sdl_renderer, *Renderer.INITIAL_CIRCLE_PARAMETERS, lambda point: self._viewport.contains(point) and not self._shapes[ 0].contains(point)) triangle = Polygon( self.sdl_renderer, Renderer.INITIAL_TRIANGLE_POINTS, lambda point: self._viewport.contains(point) and not self._shapes[ 0].contains(point) and not self._shapes[2].contains(point)) self._shapes = [ rectangle, triangle, circle, ] @property def size(self): return self._window.size def _draw_shapes(self): self._clear_draw_field() self._viewport.draw() for shape in self._shapes: shape.draw() self._present_render() def resize(self): self._draw_shapes() def mouse_move(self, position, vector, pressed): if pressed: for index, shape in enumerate(self._shapes): if shape.contains(position): self._shapes[index] = shape.move(vector) self._draw_shapes() def on_rotate(self): def rotate(shape): return shape.rotate(next(Renderer.ROTATION_ANGLES)) self._shapes = [*map(rotate, self._shapes)] self._draw_shapes() def _clear_draw_field(self): sdl2.SDL_SetRenderDrawColor(self.sdl_renderer, *self.WHITE_COLOR) sdl2.SDL_RenderClear(self.sdl_renderer) sdl2.SDL_SetRenderDrawColor(self.sdl_renderer, *self.BLACK_COLOR) def _present_render(self): sdl2.SDL_RenderPresent(self.sdl_renderer)