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

 更新时间:2023年1月6日 14:47  点击:49 作者: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

相关文章

  • Python astype(np.float)函数使用方法解析

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

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

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • Go语言压缩和解压缩tar.gz文件的方法

    这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
  • python-for x in range的用法(注意要点、细节)

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

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • python中使用np.delete()的实例方法

    在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
  • python 计算方位角实例(根据两点的坐标计算)

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

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

    这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20
  • 使用Python的pencolor函数实现渐变色功能

    这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
  • Python导入数值型Excel数据并生成矩阵操作

    这篇文章主要介绍了Python导入数值型Excel数据并生成矩阵操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-09
  • 解读python基于netconf协议获取网元的数据

    大多数企业都需要网络支撑企业的ICT运行,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,如下就以华为的NE40E网元为例,说明如何通过python基于netconf协议实现对于网元配置数据的获取。...2021-05-18
  • python实现学生通讯录管理系统

    这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
  • Python爬虫基础之selenium库的用法总结

    今天带大家来学习selenium库的使用方法及相关知识总结,文中非常详细的介绍了selenium库,对正在学习python的小伙伴很有帮助,需要的朋友可以参考下...2021-05-25
  • 解决python 两个时间戳相减出现结果错误的问题

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

    这篇文章主要介绍了Python 字典一个键对应多个值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-29
  • Python3使用Selenium获取session和token方法详解

    这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17