Python利用物理引擎Pymunk编写一个解压小游戏

 更新时间:2023年1月6日 14:47  点击:292 作者:Leleprogrammer

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

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

pip install pygame
pip install pymunk

首先,导入

import pymunk
import pygame
from pygame.locals import *
import sys
import random as rd

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

class Demo:
    WIDTH=800
    HEIGHT=800
    def __init__(self):
        pygame.init()
        self.screen=pygame.display.set_mode((self.WIDTH,self.HEIGHT))
        pygame.display.set_caption("BALLS!")
        self.balls=[]
        self.space=pymunk.Space()
        self.space.gravity=(0,280)
        self.elasticity=0.9
        self.segment_1_pos=((0,self.HEIGHT-125),(self.WIDTH,self.HEIGHT-65))
        self.segment_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_1_shape=pymunk.Segment(self.segment_1_body,self.segment_1_pos[0],self.segment_1_pos[1],10)
        self.segment_1_shape.elasticity=self.elasticity
        self.space.add(self.segment_1_body,self.segment_1_shape)
        self.segment_2_pos=((0,self.HEIGHT-500),(150,self.HEIGHT-400))
        self.segment_2_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_2_shape=pymunk.Segment(self.segment_2_body,self.segment_2_pos[0],self.segment_2_pos[1],10)
        self.segment_2_shape.elasticity=self.elasticity
        self.space.add(self.segment_2_body,self.segment_2_shape)
        self.segment_3_pos=((self.WIDTH,self.HEIGHT-500),(self.WIDTH-150,self.HEIGHT-400))
        self.segment_3_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_3_shape=pymunk.Segment(self.segment_3_body,self.segment_3_pos[0],self.segment_3_pos[1],10)
        self.segment_3_shape.elasticity=self.elasticity
        self.space.add(self.segment_3_body,self.segment_3_shape)
        self.circle_1_pos=(self.WIDTH/2,self.HEIGHT/2)
        self.circle_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.circle_1_shape=pymunk.Circle(self.circle_1_body,30,self.circle_1_pos)
        self.circle_1_shape.elasticity=self.elasticity
        self.space.add(self.circle_1_body,self.circle_1_shape)

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

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

事件监听 

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

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

    def draw(self):
        self.screen.fill((255,255,255))
        pygame.draw.line(self.screen,(0,0,0),self.segment_1_pos[0],self.segment_1_pos[1],10)
        pygame.draw.line(self.screen,(0,0,0),self.segment_2_pos[0],self.segment_2_pos[1],10)
        pygame.draw.line(self.screen,(0,0,0),self.segment_3_pos[0],self.segment_3_pos[1],10)
        pygame.draw.circle(self.screen,(0,0,0),self.circle_1_pos,30)
        for ball,r in self.balls:
            pygame.draw.circle(self.screen,(255,0,0),(ball.body.position.x,ball.body.position.y),r)
        c=0
        while c<len(self.balls) and len(self.balls):
            x,y=self.balls[c][0].body.position
            if x<0 or x>self.WIDTH or y>self.HEIGHT:
                self.space.remove(self.balls[c][0])
                self.balls.pop(c)
                c-=1
            c+=1

主循环 

    def run(self):
        while True:
            self.listen()
            self.draw()
            self.space.step(0.001)
            pygame.display.update()

启动

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

最终代码

import pymunk
import pygame
from pygame.locals import *
import sys
import random as rd
 
class Demo:
    WIDTH=800
    HEIGHT=800
    def __init__(self):
        pygame.init()
        self.screen=pygame.display.set_mode((self.WIDTH,self.HEIGHT))
        pygame.display.set_caption("BALLS!")
        self.balls=[]
        self.space=pymunk.Space()
        self.space.gravity=(0,280)
        self.elasticity=0.9
        self.segment_1_pos=((0,self.HEIGHT-125),(self.WIDTH,self.HEIGHT-65))
        self.segment_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_1_shape=pymunk.Segment(self.segment_1_body,self.segment_1_pos[0],self.segment_1_pos[1],10)
        self.segment_1_shape.elasticity=self.elasticity
        self.space.add(self.segment_1_body,self.segment_1_shape)
        self.segment_2_pos=((0,self.HEIGHT-500),(150,self.HEIGHT-400))
        self.segment_2_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_2_shape=pymunk.Segment(self.segment_2_body,self.segment_2_pos[0],self.segment_2_pos[1],10)
        self.segment_2_shape.elasticity=self.elasticity
        self.space.add(self.segment_2_body,self.segment_2_shape)
        self.segment_3_pos=((self.WIDTH,self.HEIGHT-500),(self.WIDTH-150,self.HEIGHT-400))
        self.segment_3_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.segment_3_shape=pymunk.Segment(self.segment_3_body,self.segment_3_pos[0],self.segment_3_pos[1],10)
        self.segment_3_shape.elasticity=self.elasticity
        self.space.add(self.segment_3_body,self.segment_3_shape)
        self.circle_1_pos=(self.WIDTH/2,self.HEIGHT/2)
        self.circle_1_body=pymunk.Body(body_type=pymunk.Body.STATIC)
        self.circle_1_shape=pymunk.Circle(self.circle_1_body,30,self.circle_1_pos)
        self.circle_1_shape.elasticity=self.elasticity
        self.space.add(self.circle_1_body,self.circle_1_shape)
 
    def newBall(self,x,y,r):
        body=pymunk.Body(1,100,body_type=pymunk.Body.DYNAMIC)
        body.position=x,y
        shape=pymunk.Circle(body,r)
        shape.elasticity=self.elasticity
        self.space.add(body,shape)
        self.balls.append((shape,r))
 
    def listen(self):
        for event in pygame.event.get():
            if event.type==QUIT:
                sys.exit()
            if event.type==MOUSEBUTTONDOWN:
                self.newBall(*pygame.mouse.get_pos(),rd.randint(5,10))
 
    def draw(self):
        self.screen.fill((255,255,255))
        pygame.draw.line(self.screen,(0,0,0),self.segment_1_pos[0],self.segment_1_pos[1],10)
        pygame.draw.line(self.screen,(0,0,0),self.segment_2_pos[0],self.segment_2_pos[1],10)
        pygame.draw.line(self.screen,(0,0,0),self.segment_3_pos[0],self.segment_3_pos[1],10)
        pygame.draw.circle(self.screen,(0,0,0),self.circle_1_pos,30)
        for ball,r in self.balls:
            pygame.draw.circle(self.screen,(255,0,0),(ball.body.position.x,ball.body.position.y),r)
        c=0
        while c<len(self.balls) and len(self.balls):
            x,y=self.balls[c][0].body.position
            if x<0 or x>self.WIDTH or y>self.HEIGHT:
                self.space.remove(self.balls[c][0])
                self.balls.pop(c)
                c-=1
            c+=1
 
    def run(self):
        while True:
            self.listen()
            self.draw()
            self.space.step(0.001)
            pygame.display.update()
 
if __name__ == '__main__':
    demo=Demo()
    demo.run()

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

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

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

原文出处:https://blog.csdn.net/leleprogrammer/article/details/1284009

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python实现b站直播自动发送弹幕功能

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • Go语言压缩和解压缩tar.gz文件的方法

    这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
  • python 计算方位角实例(根据两点的坐标计算)

    今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • python实现双色球随机选号

    这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
  • python中使用np.delete()的实例方法

    在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
  • 使用Python的pencolor函数实现渐变色功能

    这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
  • python自动化办公操作PPT的实现

    这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • Python getsizeof()和getsize()区分详解

    这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20
  • PyTorch一小时掌握之迁移学习篇

    这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
  • python实现学生通讯录管理系统

    这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
  • 解决python 两个时间戳相减出现结果错误的问题

    这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12