pygame碰撞检测

最近在学Pygame,花一段时间做了一个异常简陋版的"打砖块".

这次重点说一下困扰我比较长时间的碰撞检测(个人太菜..).

按照网上教程比较普遍的方法(也可能是我没看见别的),碰撞检测依次计算移动物体与被碰撞物体各个边之间坐标是否相交.例如下列代码,检测小球与窗口的碰撞:

def baffleJudge(self):
        ‘‘‘
        与墙壁之间的碰撞判断
        ‘‘‘
        if self.vector.x > WINDOW_X - self.image.get_width():
            self.vector.x = WINDOW_X - self.image.get_width()
        elif self.vector.x < 0:
            self.vector.x = 0

计算小球的x值是否大于(小于)两侧边际的坐标.

可是,因为这种方法由于需要加减各种数值,很容易多加一个少减一个,出现乱七八糟的错误.所以我想了一种相对简便些的方法(后来看空间解析的书知道是变量的加减).

原理很简单:

检测A,B两个矩形(图片均为矩形)是否碰撞,只要检测两个矩形x轴集合之间,y轴的集合之间是否相交即可,也就是:(Xa1:Xa2) 与(Xb1:Xb2)之间, (Ya1:Ya2)与(Yb1:Yb2)之间是否相交.

代码如下:

 1 def xy(self):
 2         ‘‘‘
 3         x1:上,x2:下
 4         y1:左,y2:右
 5         :return:
 6         ‘‘‘
 7         x1 = int(self.vector.x)
 8         x2 = int(x1 + self.width)
 9         y1 = int(self.vector.y)
10         y2 = int(y1 + self.height)
11         return(range(x1,x2+1),range(y1,y2+1))
12
13     def cross(self, a, b):
14         ‘‘‘
15         判断两个集合是否相交
16         :return:相交返回True
17         ‘‘‘
18         for each in a:
19             if each in b:
20                 return True
21         return False
22
23     def impactJudge(self, objects):
24         ‘‘‘
25         碰撞测试
26         :param objects:
27         :return:
28         True:碰撞成立
29         ‘‘‘
30         self.listX,self.listY = self.xy()
31
32         if(self.cross(self.listX, objects.listX) and    #两物体x轴集合相交
33            self.cross(self.listY, objects.listY)):      #两物体y轴集合相交
34             return True
35         else:
36             return False

impactJudge()小球类的方法,object则为与小球相撞的物体.若检测两组集合均相交则证明两图形碰撞成立.           大概就是这样,如果有错误请不吝赐教

PS:最近看一本书上讲到通过绘制蒙版,进而通过颜色来检测碰撞的,准备试验一下.

时间: 2024-08-05 04:44:23

pygame碰撞检测的相关文章

2015/11/7用Python写游戏,pygame入门(7):碰撞检测

我们已经完成了飞机大战的大部分东西,但是游戏还是没有办法正式开玩,因为子弹并不能打掉飞机.只有完成了这一个工作,游戏才算基本成型. 今天的内容就非常简单了,就是做到这个碰撞检测,以及控制好子弹和飞机的消失.pygame里的sprite模块里有碰撞检测部分,但是,我们这里自己动手实现一个碰撞检测的函数. 检测碰撞的方法很简单,就是子弹的位置在飞机图片的内部.由于子弹和飞机的速度比较快,所以不需要非常精确地判别. 我们认为,如果子弹的坐标(b.x, b.y)在飞机的图片范围内,也就是(e.x, e,

Pygame - Python游戏编程入门(4)

前言 一段时间没有敲代码,感觉忘得好快!!今天我们继续完成前面的任务,不知道大家有木有发现之前的飞机撞到敌人是不会爆炸的,这很不符合规律,今天我们加入这个小功能,玩家飞机坠毁并产生动画.(°∀°)? 正片开始~ 1. 判断飞机是否坠毁 关于碰撞检测,我们在上一节的内容中就作了简单介绍了,这一节中我们使用一个新函数,用于判断玩家是否被敌机击中: pygame.sprite.spritecollide()——检测sprite与group之间的碰撞 spritecollide(sprite, grou

【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵模块,冲突检测相关的知识. 一.Sprite模块.sprite对象 在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵.但是这个类的功能比较少,因此我们新建一个类对其继承,在sprite类的基础上丰富,以方便我们的使用. 首先来了解一下如何使用spr

pygame 打飞机实现

设置了两个子弹 和敌机两个类 很容易实现  直接上代码吧   实现效果如图  原谅我傻逼的画风 1 #coding:utf-8 2 import pygame 3 import random 4 from sys import exit 5 class Bullet: 6 def __init__(self): 7 self.x=0 8 self.y=-1 9 self.image=pygame.image.load("bullet.png").convert_alpha() 10 s

Pygame - Python游戏编程入门(3)

前言 在上一节我们完成了对玩家飞机的基本操作,这一节我们就来创造出敌人了(°∀°)?~目标有三个,第一个是在屏幕上绘制出敌机,第二个是判断子弹是否击中了敌人,第三个是对被击中的敌人作后续的处理.明白方向后就可以开始了! 正片开始~ 1. 绘制敌机 随机是游戏中一个很重要的元素,不可预测的机制为游戏带来了更丰富的体验.这次我们要在程序中加入随机数,两行代码: # 导入random库中的randint函数 from random import randint # 返回一个整数N, a<=N<=b

Pygame - Python游戏编程入门(2)

前言 前几天我们做出了一个可控制的飞机,今天我们来做一些小改进,这是代码的一些小改进,却是我们小游戏的一大改进啊~(╯°口°)╯(┴—┴ 然后再引进另外一个主题,pygame.sprite,精灵模块,那它究竟又有什么用呢? 正片开始~ 1. 对主循环的优化 记得我们的上一个版本吗?我们在主循环中不断地绘制背景和飞机,这样的做法其实很消耗cpu资源的,但在这种现象在我们的demo中并不明显,这是为什么呢?我想主要原因应该是我们使用了update()函数(部分刷新,surface与surface之间

基于pygame的一个小游戏

class GameStats(): """跟踪游戏的统计信息""" #def __int__(self, ai_settings): def __init__(self, ai_settings): """初始化统计信息""" self.ai_settings = ai_settings self.reset_stats() # 让游戏 处于非活动状态 self.game_active

Python和Pygame游戏开发 pdf

Python和Pygame游戏开发 目录 第1章 安装Python和Pygame 11.1 预备知识 11.2 下载和安装Python 11.3 Windows下的安装说明 11.4 Mac OS X上的安装说明 21.5 Ubuntu和Linux上的安装说明 21.6 启动Python 21.7 安装Pygame 31.8 如何阅读本书 41.9 特色的程序 41.10 下载图形文件和声音文件 41.11 行号和空格 41.12 图书中的文本折行 51.13 在线检查代码 51.14 配套网站

python学习pygame

基本库导入 import pygameimport sysfrom pygame.locals import * 初始化 pygame.init() 窗口标题 pygame.display.set_caption("初次见面多多关照") 窗口显示设置 screen = pygame.display.set_mode(size, RESIZABLE) resizable可选参数,设定窗口能否拖动变形 screen = pygame.display.set_mode((1680, 1050