コード例 #1
0
    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)
コード例 #2
0
from polygon import Polygon

# square = Square()
# square.draw()
# turtle.done()

shape = Polygon(6, "hexagon", color="pink")
shape.draw()

コード例 #3
0
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
コード例 #4
0
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)