经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python利用物理引擎Pymunk编写一个解压小游戏
来源:jb51  时间:2023/1/6 8:52:35  对本文有异议

用鼠标创建小球,一个蹦来蹦去的解压小游戏…… 

本次需要的外置包:pygame,pymunk,cmd运行该命令安装:

  1. pip install pygame
  2. pip install pymunk

首先,导入

  1. import pymunk
  2. import pygame
  3. from pygame.locals import *
  4. import sys
  5. import random as rd

结合pygame,创建若干障碍,并设置重力、弹跳力等参数 

  1. class Demo:
  2. WIDTH=800
  3. HEIGHT=800
  4. def __init__(self):
  5. pygame.init()
  6. self.screen=pygame.display.set_mode((self.WIDTH,self.HEIGHT))
  7. pygame.display.set_caption("BALLS!")
  8. self.balls=[]
  9. self.space=pymunk.Space()
  10. self.space.gravity=(0,280)
  11. self.elasticity=0.9
  12. self.segment_1_pos=((0,self.HEIGHT-125),(self.WIDTH,self.HEIGHT-65))
  13. self.segment_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  14. self.segment_1_shape=pymunk.Segment(self.segment_1_body,self.segment_1_pos[0],self.segment_1_pos[1],10)
  15. self.segment_1_shape.elasticity=self.elasticity
  16. self.space.add(self.segment_1_body,self.segment_1_shape)
  17. self.segment_2_pos=((0,self.HEIGHT-500),(150,self.HEIGHT-400))
  18. self.segment_2_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  19. self.segment_2_shape=pymunk.Segment(self.segment_2_body,self.segment_2_pos[0],self.segment_2_pos[1],10)
  20. self.segment_2_shape.elasticity=self.elasticity
  21. self.space.add(self.segment_2_body,self.segment_2_shape)
  22. self.segment_3_pos=((self.WIDTH,self.HEIGHT-500),(self.WIDTH-150,self.HEIGHT-400))
  23. self.segment_3_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  24. self.segment_3_shape=pymunk.Segment(self.segment_3_body,self.segment_3_pos[0],self.segment_3_pos[1],10)
  25. self.segment_3_shape.elasticity=self.elasticity
  26. self.space.add(self.segment_3_body,self.segment_3_shape)
  27. self.circle_1_pos=(self.WIDTH/2,self.HEIGHT/2)
  28. self.circle_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  29. self.circle_1_shape=pymunk.Circle(self.circle_1_body,30,self.circle_1_pos)
  30. self.circle_1_shape.elasticity=self.elasticity
  31. self.space.add(self.circle_1_body,self.circle_1_shape)

写一个自动创建新球的函数 

  1. def newBall(self,x,y,r):
  2. body=pymunk.Body(1,100,body_type=pymunk.Body.DYNAMIC)
  3. body.position=x,y
  4. shape=pymunk.Circle(body,r)
  5. shape.elasticity=self.elasticity
  6. self.space.add(body,shape)
  7. self.balls.append((shape,r))

事件监听 

  1. def listen(self):
  2. for event in pygame.event.get():
  3. if event.type==QUIT:
  4. sys.exit()
  5. if event.type==MOUSEBUTTONDOWN:
  6. self.newBall(*pygame.mouse.get_pos(),rd.randint(5,10))

绘制并检测物体跳出边界并删除

  1. def draw(self):
  2. self.screen.fill((255,255,255))
  3. pygame.draw.line(self.screen,(0,0,0),self.segment_1_pos[0],self.segment_1_pos[1],10)
  4. pygame.draw.line(self.screen,(0,0,0),self.segment_2_pos[0],self.segment_2_pos[1],10)
  5. pygame.draw.line(self.screen,(0,0,0),self.segment_3_pos[0],self.segment_3_pos[1],10)
  6. pygame.draw.circle(self.screen,(0,0,0),self.circle_1_pos,30)
  7. for ball,r in self.balls:
  8. pygame.draw.circle(self.screen,(255,0,0),(ball.body.position.x,ball.body.position.y),r)
  9. c=0
  10. while c<len(self.balls) and len(self.balls):
  11. x,y=self.balls[c][0].body.position
  12. if x<0 or x>self.WIDTH or y>self.HEIGHT:
  13. self.space.remove(self.balls[c][0])
  14. self.balls.pop(c)
  15. c-=1
  16. c+=1

主循环 

  1. def run(self):
  2. while True:
  3. self.listen()
  4. self.draw()
  5. self.space.step(0.001)
  6. pygame.display.update()

启动

  1. if __name__ == '__main__':
  2. demo=Demo()
  3. demo.run()

最终代码

  1. import pymunk
  2. import pygame
  3. from pygame.locals import *
  4. import sys
  5. import random as rd
  6. class Demo:
  7. WIDTH=800
  8. HEIGHT=800
  9. def __init__(self):
  10. pygame.init()
  11. self.screen=pygame.display.set_mode((self.WIDTH,self.HEIGHT))
  12. pygame.display.set_caption("BALLS!")
  13. self.balls=[]
  14. self.space=pymunk.Space()
  15. self.space.gravity=(0,280)
  16. self.elasticity=0.9
  17. self.segment_1_pos=((0,self.HEIGHT-125),(self.WIDTH,self.HEIGHT-65))
  18. self.segment_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  19. self.segment_1_shape=pymunk.Segment(self.segment_1_body,self.segment_1_pos[0],self.segment_1_pos[1],10)
  20. self.segment_1_shape.elasticity=self.elasticity
  21. self.space.add(self.segment_1_body,self.segment_1_shape)
  22. self.segment_2_pos=((0,self.HEIGHT-500),(150,self.HEIGHT-400))
  23. self.segment_2_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  24. self.segment_2_shape=pymunk.Segment(self.segment_2_body,self.segment_2_pos[0],self.segment_2_pos[1],10)
  25. self.segment_2_shape.elasticity=self.elasticity
  26. self.space.add(self.segment_2_body,self.segment_2_shape)
  27. self.segment_3_pos=((self.WIDTH,self.HEIGHT-500),(self.WIDTH-150,self.HEIGHT-400))
  28. self.segment_3_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  29. self.segment_3_shape=pymunk.Segment(self.segment_3_body,self.segment_3_pos[0],self.segment_3_pos[1],10)
  30. self.segment_3_shape.elasticity=self.elasticity
  31. self.space.add(self.segment_3_body,self.segment_3_shape)
  32. self.circle_1_pos=(self.WIDTH/2,self.HEIGHT/2)
  33. self.circle_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
  34. self.circle_1_shape=pymunk.Circle(self.circle_1_body,30,self.circle_1_pos)
  35. self.circle_1_shape.elasticity=self.elasticity
  36. self.space.add(self.circle_1_body,self.circle_1_shape)
  37. def newBall(self,x,y,r):
  38. body=pymunk.Body(1,100,body_type=pymunk.Body.DYNAMIC)
  39. body.position=x,y
  40. shape=pymunk.Circle(body,r)
  41. shape.elasticity=self.elasticity
  42. self.space.add(body,shape)
  43. self.balls.append((shape,r))
  44. def listen(self):
  45. for event in pygame.event.get():
  46. if event.type==QUIT:
  47. sys.exit()
  48. if event.type==MOUSEBUTTONDOWN:
  49. self.newBall(*pygame.mouse.get_pos(),rd.randint(5,10))
  50. def draw(self):
  51. self.screen.fill((255,255,255))
  52. pygame.draw.line(self.screen,(0,0,0),self.segment_1_pos[0],self.segment_1_pos[1],10)
  53. pygame.draw.line(self.screen,(0,0,0),self.segment_2_pos[0],self.segment_2_pos[1],10)
  54. pygame.draw.line(self.screen,(0,0,0),self.segment_3_pos[0],self.segment_3_pos[1],10)
  55. pygame.draw.circle(self.screen,(0,0,0),self.circle_1_pos,30)
  56. for ball,r in self.balls:
  57. pygame.draw.circle(self.screen,(255,0,0),(ball.body.position.x,ball.body.position.y),r)
  58. c=0
  59. while c<len(self.balls) and len(self.balls):
  60. x,y=self.balls[c][0].body.position
  61. if x<0 or x>self.WIDTH or y>self.HEIGHT:
  62. self.space.remove(self.balls[c][0])
  63. self.balls.pop(c)
  64. c-=1
  65. c+=1
  66. def run(self):
  67. while True:
  68. self.listen()
  69. self.draw()
  70. self.space.step(0.001)
  71. pygame.display.update()
  72. if __name__ == '__main__':
  73. demo=Demo()
  74. demo.run()

现在,启动程序,移动你的鼠标,点击鼠标创建一个个不同大小的球吧!

(p.s. 滑动滚轮也可以哟~~~)

到此这篇关于Python利用物理引擎Pymunk编写一个解压小游戏的文章就介绍到这了,更多相关Python Pymunk解压游戏内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号