Advertisement
Guest User

Physics Balls

a guest
Jan 1st, 2022
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.68 KB | None | 0 0
  1. import pygame as pg
  2. import pymunk.pygame_util
  3. from pygame.locals import *
  4. from random import uniform, randrange
  5. import sys
  6. from numba import njit
  7.  
  8. pymunk.pygame_util.positive_y_is_up = False
  9.  
  10. WIDTH, HEIGHT = 1280, 720
  11. FPS = 60
  12.  
  13. # объявление всего необходимого
  14. pg.init()
  15.  
  16. display = pg.display.set_mode((WIDTH, HEIGHT), pg.RESIZABLE)
  17. pg.display.set_caption("Мячики с физикой на PyGame + Pymunk")
  18. clock = pg.time.Clock()
  19. draw_option = pymunk.pygame_util.DrawOptions(display)
  20.  
  21. space = pymunk.Space()
  22. space.gravity = 0, 2000
  23.  
  24. """ объекты """
  25. # кубик
  26. box_mass, box_size = 1, (40, 30)
  27.  
  28. # платформа
  29. segment_shape = pymunk.Segment(space.static_body, (1, HEIGHT), (WIDTH + 10000, HEIGHT), 13)
  30. segment_shape.elasticity = 1
  31. segment_shape.friction = 0.5
  32. space.add(segment_shape)
  33.  
  34. # создать мячик
  35. ball_arr = []
  36. ball_size = 10
  37. ballSize_font = pg.font.SysFont('serif', 18)
  38. ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
  39. placePos_ballSizeFont = ballSize_fontRender.get_rect(topleft=(5, 18))
  40.  
  41. ball_elasticity = 0
  42. ballElasticity_font = pg.font.SysFont('serif', 18)
  43. ballElasticity_fontRender = ballElasticity_font.render(f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True,
  44.                                                        (0, 0, 0))
  45. placePos_ballElasticityFont = ballElasticity_fontRender.get_rect(topleft=(5, 36))
  46.  
  47. ball_friction = 0.5
  48. ballFriction_font = pg.font.SysFont('serif', 18)
  49. ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True, (0, 0, 0))
  50. placePos_ballFrictionFont = ballFriction_fontRender.get_rect(topleft=(5, 54))
  51.  
  52. ball_mass = 1
  53. ballMass_font = pg.font.SysFont('serif', 18)
  54. ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True, (0, 0, 0))
  55. placePos_ballMassFont = ballMass_fontRender.get_rect(topleft=(5, 72))
  56.  
  57.  
  58. def createBall(mass, radius, position, elasticity, friction, color):
  59.     ball_mass, ball_radius = mass, radius
  60.     ball_moment = pymunk.moment_for_circle(ball_mass, 0, ball_radius)
  61.     ball_body = pymunk.Body(ball_mass, ball_moment)
  62.     ball_body.position = position
  63.     ball_shape = pymunk.Circle(ball_body, ball_radius)
  64.     ball_shape.elasticity = elasticity
  65.     ball_shape.friction = friction
  66.     ball_shape.color = color
  67.     space.add(ball_body, ball_shape)
  68.     ball_arr.append(ball_body)
  69.     ball_arr.append(ball_shape)
  70.  
  71.  
  72. # статический мячик для рисования платформ
  73. painter_ball_arr = []
  74. painter_ball_size = 10
  75. painter_ball_font = pg.font.SysFont('serif', 18)
  76. painter_ball_fontRender = painter_ball_font.render(f"Размер кисти препятствий: {painter_ball_size}(→ or ←)", True,
  77.                                                    (0, 0, 0))
  78. placePos_painter_ballFont = painter_ball_fontRender.get_rect(topleft=(5, 0))
  79.  
  80. # вот тут вот я не понимаю, в чём проблема и как заставить это работать
  81. def createPainterBall(radius):
  82.  
  83.     whileIsRun = True
  84.     last_mpos = None
  85.     mx, my = pg.mouse.get_pos()
  86.     while whileIsRun:
  87.         if not last_mpos is None:
  88.             segment_shape = pymunk.Segment(space.static_body, (last_mpos),
  89.                                            (pg.mouse.get_pos()[0], pg.mouse.get_pos()[1] + 1), radius)
  90.             segment_shape.elasticity = 0.4
  91.             segment_shape.friction = 1.0
  92.             space.add(segment_shape)
  93.             painter_ball_arr.append(segment_shape)
  94.             whileIsRun = False
  95.         else:
  96.             last_mpos = (mx, my)
  97.  
  98.  
  99. # надпись с FPS
  100. fps_font = pg.font.SysFont('serif', 18)
  101. fps_fontRender = fps_font.render(f"FPS = {round(clock.get_fps(), 2)}", True, (0, 0, 0))
  102. display_rect = display.get_rect()
  103. placePos_fps_font = painter_ball_fontRender.get_rect(topright=(pg.display.get_window_size()[0] + 220, 0))
  104.  
  105. # создать прямоугольник
  106. pass
  107.  
  108.  
  109. while True:
  110.     display.fill((0, 160, 90))
  111.  
  112.     for event in pg.event.get():
  113.         if event.type == pg.QUIT:
  114.             sys.exit()
  115.         elif event.type == pg.MOUSEBUTTONDOWN:
  116.             if event.button == 1:
  117.                 createBall(ball_mass, ball_size, pg.mouse.get_pos(), ball_elasticity, ball_friction,
  118.                            [uniform(0, 255) for i in range(4)])
  119.             elif event.button == 3:
  120.                 createPainterBall(painter_ball_size)
  121.             elif event.button == 2:
  122.                 for i in range(0, len(painter_ball_arr)):
  123.                     space.remove(painter_ball_arr[i])
  124.                 painter_ball_arr.clear()
  125.  
  126.                 for i in range(0, len(ball_arr)):
  127.                     space.remove(ball_arr[i])
  128.                 ball_arr.clear()
  129.         elif event.type == pg.WINDOWSIZECHANGED:
  130.             placePos_fps_font = painter_ball_fontRender.get_rect(topright=(pg.display.get_window_size()[0] + 220, 0))
  131.             space.remove(segment_shape)
  132.             segment_shape = pymunk.Segment(space.static_body, (1, pg.display.get_window_size()[1]),
  133.                                            (pg.display.get_window_size()[0] + 1000, pg.display.get_window_size()[1]),
  134.                                            13)
  135.             space.add(segment_shape)
  136.         elif event.type == pg.KEYDOWN:
  137.             if event.key == pg.K_RIGHT:
  138.                 painter_ball_size += 1
  139.                 painter_ball_fontRender = painter_ball_font.render(
  140.                     f"Размер кисти препятствий: {painter_ball_size}(→ or ←)", True,
  141.                     (0, 0, 0))
  142.  
  143.             elif event.key == pg.K_LEFT:
  144.                 painter_ball_size -= 1
  145.                 painter_ball_fontRender = painter_ball_font.render(
  146.                     f"Размер кисти препятствий: {painter_ball_size}(→ or ←)", True,
  147.                     (0, 0, 0))
  148.  
  149.             elif event.key == pg.K_UP:
  150.                 ball_size += 1
  151.                 ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
  152.             elif event.key == pg.K_DOWN:
  153.                 ball_size -= 1
  154.                 ballSize_fontRender = ballSize_font.render(f"Размер мячиков: {ball_size}(↑ or ↓)", True, (0, 0, 0))
  155.             elif event.key == pg.K_F1:
  156.                 temp_elasticity = ball_elasticity
  157.                 temp_elasticity += 0.1
  158.                 ball_elasticity = round(temp_elasticity, 2)
  159.                 ballElasticity_fontRender = ballElasticity_font.render(
  160.                     f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True, (0, 0, 0))
  161.             elif event.key == pg.K_F2:
  162.                 temp_elasticity = ball_elasticity
  163.                 temp_elasticity -= 0.1
  164.                 ball_elasticity = round(temp_elasticity, 2)
  165.                 ballElasticity_fontRender = ballElasticity_font.render(
  166.                     f"Коэф. упругости мячиков: {ball_elasticity}(F1 or F2)", True, (0, 0, 0))
  167.                 del temp_elasticity
  168.             elif event.key == pg.K_F5:
  169.                 temp_mass = ball_mass
  170.                 temp_mass += 0.1
  171.                 ball_mass = round(temp_mass, 2)
  172.                 ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True,
  173.                                                            (0, 0, 0))
  174.                 del temp_mass
  175.             elif event.key == pg.K_F6:
  176.                 temp_mass = ball_mass
  177.                 temp_mass -= 0.1
  178.                 ball_mass = round(temp_mass, 2)
  179.                 ballMass_fontRender = ballMass_font.render(f"Масса мячиков: {ball_mass}(F5 or F6)", True,
  180.                                                            (0, 0, 0))
  181.                 del temp_mass
  182.             elif event.key == pg.K_F3:
  183.                 temp_friction = ball_friction
  184.                 temp_friction += 0.1
  185.                 ball_friction = round(temp_friction, 2)
  186.                 ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True,
  187.                                                                    (0, 0, 0))
  188.                 del temp_friction
  189.             elif event.key == pg.K_F4:
  190.                 temp_friction = ball_friction
  191.                 temp_friction -= 0.1
  192.                 ball_friction = round(temp_friction, 2)
  193.                 ballFriction_fontRender = ballFriction_font.render(f"Трение мячиков: {ball_friction}(F3 or F4)", True,
  194.                                                                    (0, 0, 0))
  195.                 del temp_friction
  196.  
  197.     mouseKeys = pg.mouse.get_pressed()
  198.     keyboardKeys = pg.key.get_pressed()
  199.     if mouseKeys[0] and keyboardKeys[K_LSHIFT]:
  200.         createBall(ball_mass, ball_size, pg.mouse.get_pos(), ball_elasticity, ball_friction,
  201.                    [uniform(0, 255) for i in range(4)])
  202.     if mouseKeys[2] and keyboardKeys[K_LSHIFT]:
  203.         createPainterBall(painter_ball_size)
  204.  
  205.     space.step(1 / FPS)
  206.     space.debug_draw(draw_option)
  207.  
  208.     display.blit(painter_ball_fontRender, placePos_painter_ballFont)
  209.     display.blit(ballSize_fontRender, placePos_ballSizeFont)
  210.     display.blit(ballElasticity_fontRender, placePos_ballElasticityFont)
  211.     display.blit(ballMass_fontRender, placePos_ballMassFont)
  212.     display.blit(ballFriction_fontRender, placePos_ballFrictionFont)
  213.  
  214.     display.blit(fps_fontRender, placePos_fps_font)
  215.  
  216.     pg.display.flip()
  217.     clock.tick(FPS)
  218.     fps_fontRender = fps_font.render(f"FPS: {round(clock.get_fps(), 2)}", True, (0, 0, 0))
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement