广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pygame实现弹球游戏流程
  • 792
分享到

pygame实现弹球游戏流程

Pygame弹球游戏Pygame弹珠游戏Python弹球游戏 2023-01-17 09:01:32 792人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、事件二、复习碰撞精灵三、画出球杆并击打小球一、事件 鼠标事件: pygame.mouse.get_pos():获取鼠标当前点的坐标 pygame.mouse.get_pres

一、事件

鼠标事件:

pygame.mouse.get_pos():获取鼠标当前点的坐标

pygame.mouse.get_pressed()[0]:获取鼠标左键是否为点击

二、复习碰撞精灵

1、首先是3个球在窗口上移动的最基础的版本:

import pygame, sys
class MyBall(pygame.sprite.Sprite):
    def __init__(self, point, speed):
        self.image = pygame.image.load("beach_ball.png")
        self.rect = self.image.get_rect()
        self.rect.left = point[0]
        self.rect.top = point[1]
        self.speed = speed
    def move(self):
        self.rect = self.rect.move(self.speed)
        screen.blit(self.image, self.rect)
pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
balls = []
for i in range(3):
    ball = MyBall([180+i*180, 200], [8, 8])
    balls.append(ball)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    screen.fill([255, 255, 255])
    for i in range(len(balls)):
        balls[i].move()
    pygame.display.flip()
    pygame.time.delay(20)

这三个球有一个缺点,一旦移动到窗口外,就移不回来了,因此,我们要在移动时,进行窗口边沿的判断

2、增加上下左右边框的判断

这样当球试图超出边界时,将对应方向的速度取反,使得重新回到窗口中来:

    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.right > width:  # 新增右边框判断
            self.speed[0] = -abs(self.speed[0])
        if self.rect.left < 0:  # 新增左边框判断
            self.speed[0] = abs(self.speed[0])
        if self.rect.bottom > height:  # 新增下边框判断
            self.speed[1] = -abs(self.speed[1])
        if self.rect.top < 0:  # 新增上边框判断
            self.speed[1] = abs(self.speed[1])
        screen.blit(self.image, self.rect)

进行到这一步,我们发现小球碰到一起时没有发生碰撞事件,即碰到一起的小球没有互相撤退,这时碰撞检测就使用起来了:

通过pygame.sprite.spritecollide我们可以检测当前小球与别的小球是否发生碰撞,如果发生碰撞,就将小球当前速度取反

3、碰撞处理

1)碰撞后的处理

    def crash(self, balls): 
        balls.remove(self)  # 将自身从碰撞组中删除
        if pygame.sprite.spritecollide(self, balls, False): # 检测碰撞发生,将自身的速度取反
            self.speed[0] = -self.speed[0]
            self.speed[1] = -self.speed[1]

2)针对小球两两组合进行碰撞处理:

    for i in range(len(balls)):
        for j in range(len(balls)):
            if i == j:
                continue
            balls[i].crash([balls[i], balls[j]])

这样小球互相碰到就会向相反的方向弹去。

三、画出球杆并击打小球

我们可以设想当小球停止下来后才好进行击打小球的动作,因此,可以针对小球做一个减速处理

然后当小球的x,y方向的速度都低于1时即认为小球静止了

1、减速逻辑

    def dec_speed(self):
        """减速"""
        self.speed[0] *= 0.995
        self.speed[1] *= 0.995

2、画出球杆

当小球静时后,我们需要画出一个球杆,画法为小球中心点到当前鼠标的位置画一条线段:

    def wait_hit(self):
        if abs(self.speed[0]) > 1 or abs(self.speed[1]) > 1:  # 在运动状态,退出,注意需要用abs,原因是速度有正和负
            pass
        else:
            pos = pygame.mouse.get_pos()    # 获取鼠标坐标
            pygame.draw.line(screen, [255, 0, 0], self.rect.center, pos, 5) # 画出小球到鼠标的红线
            if pygame.mouse.get_pressed()[0]:   # 按下鼠标左键
                self.speed[0] = 0.1 * (self.rect.center[0] - pos[0])    # 给小球初始速度
                self.speed[1] = 0.1 * (self.rect.center[1] - pos[1])

然后加上调用:

    for i in range(len(balls)):
        if i == 0:
            balls[i].wait_hit() # 只有0号小球静止时画出球杆
        balls[i].move()
        balls[i].dec_speed()    # 减速,使得小球最终静止下来

至此,一开始3个小球都会运动,运动过程中碰到一起也会发生碰撞反弹,随着时间推移,小球越来越慢,最终停下来,然后在0号球处画出了红线,点击鼠标左键,小球会向红线的相反方向移动,就是存在一个问题,当小球碰到静止的小球时,静止的小球不会动

3、碰撞发生后,当发现自身没有速度,使用对方的速度

    def crash(self, groups):
        groups.remove(self)  # 将自身从碰撞组中删除
        if pygame.sprite.spritecollide(self, groups, False):  # 检测碰撞发生,将自身的速度取反
            if abs(self.speed[0]) > 1:  # 运动状态用自身的反速度
                self.speed[0] = -self.speed[0]
            else:
                self.speed[0] = -groups[0].speed[0] # 静止状态,用对方的反速度
            if abs(self.speed[1]) > 1:
                self.speed[1] = -self.speed[1]
            else:
                self.speed[1] = -groups[0].speed[1]

至此一个简单的弹球游戏就结束了

附完整源代码:

import pygame, sys
class MyBall(pygame.sprite.Sprite):
    def __init__(self, point, speed):
        self.image = pygame.image.load("beach_ball.png")
        self.rect = self.image.get_rect()
        self.rect.left = point[0]
        self.rect.top = point[1]
        self.speed = speed
    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.right > width:  # 新增右边框判断
            self.speed[0] = -abs(self.speed[0])
        if self.rect.left < 0:  # 新增左边框判断
            self.speed[0] = abs(self.speed[0])
        if self.rect.bottom > height:  # 新增下边框判断
            self.speed[1] = -abs(self.speed[1])
        if self.rect.top < 0:  # 新增上边框判断
            self.speed[1] = abs(self.speed[1])
        screen.blit(self.image, self.rect)
    def crash(self, groups):
        groups.remove(self)  # 将自身从碰撞组中删除
        if pygame.sprite.spritecollide(self, groups, False):  # 检测碰撞发生,将自身的速度取反
            if abs(self.speed[0]) > 1:  # 运动状态用自身的反速度
                self.speed[0] = -self.speed[0]
            else:
                self.speed[0] = -groups[0].speed[0] # 静止状态,用对方的反速度
            if abs(self.speed[1]) > 1:
                self.speed[1] = -self.speed[1]
            else:
                self.speed[1] = -groups[0].speed[1]
    def dec_speed(self):
        """减速"""
        self.speed[0] *= 0.995
        self.speed[1] *= 0.995
    def wait_hit(self):
        if abs(self.speed[0]) > 1 or abs(self.speed[1]) > 1:  # 在运动状态,退出,注意需要用abs,原因是速度有正和负
            pass
        else:
            pos = pygame.mouse.get_pos()    # 获取鼠标坐标
            pygame.draw.line(screen, [255, 0, 0], self.rect.center, pos, 5) # 画出小球到鼠标的红线
            if pygame.mouse.get_pressed()[0]:   # 按下鼠标左键
                self.speed[0] = 0.1 * (self.rect.center[0] - pos[0])    # 给小球初始速度
                self.speed[1] = 0.1 * (self.rect.center[1] - pos[1])
pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
balls = []
for i in range(3):
    ball = MyBall([180 + i * 180, 200], [8, 8])
    balls.append(ball)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    screen.fill([255, 255, 255])
    for i in range(len(balls)):
        if i == 0:
            balls[i].wait_hit() # 只有0号小球静止时画出球杆
        balls[i].move()
        balls[i].dec_speed()    # 减速,使得小球最终静止下来
    for i in range(len(balls)):
        for j in range(len(balls)):
            if i == j:
                continue
            balls[i].crash([balls[i], balls[j]])
    pygame.display.flip()
    pygame.time.delay(10)

到此这篇关于pygame实现弹球游戏流程的文章就介绍到这了,更多相关pygame弹球游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: pygame实现弹球游戏流程

本文链接: https://www.lsjlt.com/news/177940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pygame实现弹球游戏流程
    目录一、事件二、复习碰撞精灵三、画出球杆并击打小球一、事件 鼠标事件: pygame.mouse.get_pos():获取鼠标当前点的坐标 pygame.mouse.get_pres...
    99+
    2023-01-17
    Pygame弹球游戏 Pygame弹珠游戏 Python弹球游戏
  • Pygame如何实现反弹球小游戏
    这篇文章主要为大家展示了“Pygame如何实现反弹球小游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Pygame如何实现反弹球小游戏”这篇文章吧。一、准备中1)游戏规则比平常的乒乓球更简单,...
    99+
    2023-06-29
  • Pygame实现简易版趣味小游戏之反弹球
    目录导语一、准备中1)游戏规则2)素材准备3)环境安装二、敲代码1)配置文件2)设置球的反弹、移动规则3)设置球拍电脑的移动等4)设置游戏开始界面5)定义游戏结束页面6)运行游戏De...
    99+
    2022-11-13
  • jQuery实现弹弹球小游戏
    本文实例为大家分享了jQuery实现弹弹球小游戏的具体代码,供大家参考,具体内容如下 效果展示: CSS样式: #box { width: 600px; ...
    99+
    2022-11-12
  • java实现弹球小游戏
    GUI实现弹球小游戏,供大家参考,具体内容如下 先看一下游戏效果图。 一个简单的Demo。也比较简单,新手试着做一做完善改进。 源代码 import Com.Style.Fo...
    99+
    2022-11-12
  • Python+Pygame实现趣味足球游戏
    目录导语一、环境安装 二、代码展示三、效果展示1)加载界面2)开始游戏界面3)开始游戏​4)游戏运行导语 ​足球运动有着“世界第一运动”的美称,还是...
    99+
    2022-11-13
  • pygame实现滑块接小球游戏
    用pygame做一个滑块接小球的游戏,供大家参考,具体内容如下 先上图 游戏很简单也很弱智,主要用到了pygame画圆,画方块,随机数等,可以锻炼基本的鼠标控制,游戏设计思维,简单...
    99+
    2022-11-12
  • Pygame实战之实现扎气球游戏
    目录导语正文一、准备中二、代码演示三、效果展示导语 ​前几天,有人私信小编: 说陪女朋友在小广场上面逛街玩儿扎气球:结果一个都没扎破,扎心了老铁。 女朋友都要离家出走了~让我给想想办...
    99+
    2022-11-12
  • 微信小程序实现弹球游戏
    本文实例为大家分享了微信小程序实现弹球游戏的具体代码,供大家参考,具体内容如下 实验内容: 小球按照随机的角度直线运动,如果碰到四壁则反弹。你们不需要做游戏计时、设置小球及背景颜色等...
    99+
    2022-11-13
  • python中的pygame实现接球小游戏
    目录一、介绍模块1、Pygame和sys模块2、random模块二、相关功能1、窗口尺寸改变2、键盘控制挡板3、鼠标控制4、挡板接住小球并得分5、小球未接住小球6、小球移动7、显示分...
    99+
    2022-11-10
  • Pygame是如何实现扎气球游戏
    这期内容当中小编将会给大家带来有关Pygame是如何实现扎气球游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。正文下面的扎气球小游戏原型就是路边的扎气球的游戏撒,基于Pygame做的!就准备好射的箭、不...
    99+
    2023-06-22
  • html5实现弹跳球小游戏
    这篇文章主要介绍“html5实现弹跳球小游戏”,在日常操作中,相信很多人在html5实现弹跳球小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5实现弹跳球小游戏”...
    99+
    2022-10-19
  • 用python实现弹球小游戏
    目录一、弹球游戏代码 二、程序结果 总结一、弹球游戏代码  下文是tkinter的应用实例,实现弹球游戏,通过<--和-->件移动平板接球。...
    99+
    2022-11-13
  • Python+Pygame实现接小弹珠游戏
    目录游戏介绍效果展示游戏代码项目资源游戏介绍 小学生都不一定会晚的游戏,用挡板接住会反弹的小球,随着次数的增多,速度变快,分数增多。 效果展示 游戏代码 import pygame...
    99+
    2022-12-27
    Python Pygame接弹珠游戏 Python Pygame接弹珠 Python Pygame 游戏 Python 接弹珠
  • 怎么用jQuery实现弹弹球小游戏
    本篇内容介绍了“怎么用jQuery实现弹弹球小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了jQuery实现弹弹球小...
    99+
    2023-06-20
  • python实现简单反弹球游戏
    python简单游戏-反弹球,供大家参考,具体内容如下 tkinter实现,直接贴上代码 from tkinter import* import time import rand...
    99+
    2022-11-12
  • Unity实现弹球打砖块游戏
    本文实例为大家分享了Unity实现弹球打砖块游戏的具体代码,供大家参考,具体内容如下 创作界面记录 摄像机 所需脚本 1射线shexian using System.Collect...
    99+
    2022-11-13
  • javaScript实现网页版的弹球游戏
    利用javeScript对象以及方法实现的网页弹球游戏,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> ...
    99+
    2022-11-12
  • C++实现简易的弹球小游戏
    本文实例为大家分享了C++实现弹球小游戏的具体代码,供大家参考,具体内容如下 操作说明:键盘A和D键控制左右移动,让球不要落下。 #include <graphics.h&...
    99+
    2022-11-12
  • C语言游戏项目球球大作战实现流程
    目录项目代码 1、结构体2、初始化3、绘制函数 4、玩家控制函数 5、吃食物函数6、电脑移动函数7、主函数总结序 时间在流去,我们在长大 嗨,这里是狐狸...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作