Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame as pg
- import pymunk.pygame_util
- from pygame.locals import *
- from random import uniform, randrange
- import sys
- from numba import njit
- pymunk.pygame_util.positive_y_is_up = False
- WIDTH, HEIGHT = 1280, 720
- FPS = 60
- # объявление всего необходимого
- pg.init()
- display = pg.display.set_mode((WIDTH, HEIGHT), pg.RESIZABLE)
- pg.display.set_caption("Мячики с физикой на PyGame + Pymunk")
- clock = pg.time.Clock()
- draw_option = pymunk.pygame_util.DrawOptions(display)
- space = pymunk.Space()
- space.gravity = 0, 2000
- """ объекты """
- # кубик
- box_mass, box_size = 1, (40, 30)
- # платформа
- segment_shape = pymunk.Segment(space.static_body, (1, HEIGHT + 35), (WIDTH + 10000, HEIGHT + 35), 50)
- segment_shape.elasticity = 0.5
- segment_shape.friction = 0.5
- space.add(segment_shape)
- # создать мячик
- ball_arr = []
- ball_size = 10
- ballSize_font = pg.font.SysFont('serif', 18)
- ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
- placePos_ballSizeFont = ballSize_fontRender.get_rect(topleft=(5, 18))
- ball_elasticity = 0.5
- ballElasticity_font = pg.font.SysFont('serif', 18)
- ballElasticity_fontRender = ballElasticity_font.render(f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True,
- (0, 0, 0))
- placePos_ballElasticityFont = ballElasticity_fontRender.get_rect(topleft=(5, 36))
- ball_friction = 0.5
- ballFriction_font = pg.font.SysFont('serif', 18)
- ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True, (0, 0, 0))
- placePos_ballFrictionFont = ballFriction_fontRender.get_rect(topleft=(5, 54))
- ball_mass = 1
- ballMass_font = pg.font.SysFont('serif', 18)
- ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True, (0, 0, 0))
- placePos_ballMassFont = ballMass_fontRender.get_rect(topleft=(5, 72))
- def createBall(mass, radius, position, elasticity, friction, color):
- ball_mass, ball_radius = mass, radius
- ball_moment = pymunk.moment_for_circle(ball_mass, 0, ball_radius)
- ball_body = pymunk.Body(ball_mass, ball_moment)
- ball_body.position = position
- ball_shape = pymunk.Circle(ball_body, ball_radius)
- ball_shape.elasticity = elasticity
- ball_shape.friction = friction
- ball_shape.color = color
- space.add(ball_body, ball_shape)
- ball_arr.append(ball_body)
- ball_arr.append(ball_shape)
- # threading.Thread(target=createBall).start()
- # статический мячик для рисования платформ
- painter_line_arr = []
- painter_line_size = 10
- painter_line_font = pg.font.SysFont('serif', 18)
- painter_line_fontRender = painter_line_font.render(f"Размер кисти препятствий: {painter_line_size}(→ or ←)", True,
- (0, 0, 0))
- placePos_painter_ballFont = painter_line_fontRender.get_rect(topleft=(5, 0))
- # вот тут вот я РАНЬШЕ не понимал, в чём проблема и как заставить это работать(сейчас это работает)
- lastMousePos = None
- mousePressed = False
- def createPainterLine(radius, singleClickVerify):
- if singleClickVerify == False:
- segment_shape = pymunk.Segment(space.static_body, lastMousePos,
- (pg.mouse.get_pos()[0], pg.mouse.get_pos()[1]), radius)
- segment_shape.elasticity = 0.4
- segment_shape.friction = 0.5
- space.add(segment_shape)
- painter_line_arr.append(segment_shape)
- else:
- segment_shape = pymunk.Segment(space.static_body, lastMousePos,
- (pg.mouse.get_pos()[0] + 1, pg.mouse.get_pos()[1] + 1), radius)
- segment_shape.elasticity = 0.4
- segment_shape.friction = 0.5
- space.add(segment_shape)
- painter_line_arr.append(segment_shape)
- def deletePainterLine():
- for i in range(0, len(painter_line_arr)):
- space.remove(painter_line_arr[i])
- painter_line_arr.clear()
- def deleteBalls():
- for i in range(0, len(ball_arr)):
- space.remove(ball_arr[i])
- ball_arr.clear()
- # надпись с FPS
- fps_font = pg.font.SysFont('serif', 18)
- fps_fontRender = fps_font.render(f"FPS = {round(clock.get_fps(), 2)}", True, (0, 0, 0))
- display_rect = display.get_rect()
- placePos_fps_font = painter_line_fontRender.get_rect(topright=(pg.display.get_window_size()[0] + 220, 0))
- # создать прямоугольник
- while True:
- display.fill((0, 160, 90))
- for event in pg.event.get():
- if event.type == pg.QUIT:
- sys.exit()
- elif event.type == pg.MOUSEBUTTONUP:
- mousePressed = False
- elif event.type == pg.MOUSEBUTTONDOWN:
- if event.button == 1:
- createBall(ball_mass, ball_size, pg.mouse.get_pos(), ball_elasticity, ball_friction,
- [uniform(0, 255) for i in range(4)])
- elif event.button == 3:
- singleClickVerify = True
- lastMousePos = pg.mouse.get_pos()
- createPainterLine(painter_line_size, singleClickVerify)
- mousePressed = True
- elif event.button == 2:
- deletePainterLine()
- deleteBalls()
- elif event.type == pg.MOUSEMOTION:
- if mousePressed == True:
- singleClickVerify = False
- createPainterLine(painter_line_size, singleClickVerify)
- lastMousePos = pg.mouse.get_pos()
- elif event.type == pg.WINDOWSIZECHANGED:
- placePos_fps_font = painter_line_fontRender.get_rect(topright=(pg.display.get_window_size()[0] + 220, 0))
- space.remove(segment_shape)
- segment_shape = pymunk.Segment(space.static_body, (1, pg.display.get_window_size()[1] + 35),
- (pg.display.get_window_size()[0], pg.display.get_window_size()[1] + 35), 50)
- segment_shape.elasticity = 0.5
- segment_shape.friction = 0.5
- space.add(segment_shape)
- elif event.type == pg.KEYDOWN:
- if event.key == pg.K_RIGHT:
- painter_line_size += 1
- painter_line_fontRender = painter_line_font.render(
- f"Размер кисти препятствий: {painter_line_size}(→ or ←)", True,
- (0, 0, 0))
- elif event.key == pg.K_LEFT:
- painter_line_size -= 1
- painter_line_fontRender = painter_line_font.render(
- f"Размер кисти препятствий: {painter_line_size}(→ or ←)", True,
- (0, 0, 0))
- elif event.key == pg.K_UP:
- ball_size += 1
- ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
- elif event.key == pg.K_DOWN:
- ball_size -= 1
- ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
- elif event.key == pg.K_F1:
- temp_elasticity = ball_elasticity
- temp_elasticity += 0.1
- ball_elasticity = round(temp_elasticity, 2)
- ballElasticity_fontRender = ballElasticity_font.render(
- f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True, (0, 0, 0))
- elif event.key == pg.K_F2:
- temp_elasticity = ball_elasticity
- temp_elasticity -= 0.1
- ball_elasticity = round(temp_elasticity, 2)
- ballElasticity_fontRender = ballElasticity_font.render(
- f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True, (0, 0, 0))
- del temp_elasticity
- elif event.key == pg.K_F5:
- temp_mass = ball_mass
- temp_mass += 0.1
- ball_mass = round(temp_mass, 2)
- ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True,
- (0, 0, 0))
- del temp_mass
- elif event.key == pg.K_F6:
- temp_mass = ball_mass
- temp_mass -= 0.1
- ball_mass = round(temp_mass, 2)
- ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True,
- (0, 0, 0))
- del temp_mass
- elif event.key == pg.K_F3:
- temp_friction = ball_friction
- temp_friction += 0.1
- ball_friction = round(temp_friction, 2)
- ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True,
- (0, 0, 0))
- del temp_friction
- elif event.key == pg.K_F4:
- temp_friction = ball_friction
- temp_friction -= 0.1
- ball_friction = round(temp_friction, 2)
- ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True,
- (0, 0, 0))
- del temp_friction
- mouseKeys = pg.mouse.get_pressed()
- keyboardKeys = pg.key.get_pressed()
- if mouseKeys[0] and keyboardKeys[K_LSHIFT]:
- createBall(ball_mass, ball_size, pg.mouse.get_pos(), ball_elasticity, ball_friction,
- [uniform(0, 255) for i in range(4)])
- space.step(1 / FPS)
- space.debug_draw(draw_option)
- display.blit(painter_line_fontRender, placePos_painter_ballFont)
- display.blit(ballSize_fontRender, placePos_ballSizeFont)
- display.blit(ballElasticity_fontRender, placePos_ballElasticityFont)
- display.blit(ballMass_fontRender, placePos_ballMassFont)
- display.blit(ballFriction_fontRender, placePos_ballFrictionFont)
- display.blit(fps_fontRender, placePos_fps_font)
- pg.display.flip()
- clock.tick(FPS)
- fps_fontRender = fps_font.render(f"FPS: {round(clock.get_fps(), 2)}", True, (0, 0, 0))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement