Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pygame中使用vector2。与窗框碰撞并将球限制在矩形区域_Python_Vector_Pygame_Collision Detection - Fatal编程技术网

Python 在pygame中使用vector2。与窗框碰撞并将球限制在矩形区域

Python 在pygame中使用vector2。与窗框碰撞并将球限制在矩形区域,python,vector,pygame,collision-detection,Python,Vector,Pygame,Collision Detection,嘿,我正在尝试用pyame创建一个突破克隆,我使用了 self.course(180 - self.course) % 360 为了弹起球拍的球,我查看了vector 2类,但是我不知道如何使用它转换我的ball类。如果有人能指引我正确的方向 这是我想用vector2转换的代码 import pygame import math class Ball(pygame.sprite.Sprite): course = 130 def __init__(self):

嘿,我正在尝试用pyame创建一个突破克隆,我使用了

self.course(180 - self.course) % 360
为了弹起球拍的球,我查看了vector 2类,但是我不知道如何使用它转换我的ball类。如果有人能指引我正确的方向

这是我想用vector2转换的代码

import pygame
import math

class Ball(pygame.sprite.Sprite):

    course = 130

    def __init__(self):
        # Calling the parent class (Sprite)
        pygame.sprite.Sprite.__init__(self)

        # Creating the ball and load the ball image
        self.image = pygame.image.load("ball.png").convert()
        self.rect = self.image.get_rect()
        self.rect.x = 0
        self.rect.y = 270

    # Creating a bounce function to make the ball bounce of surfaces.
    def bounce(self, diff):
        self.course = (180 - self.course) % 360
        self.course -= diff

    # Create the function that will update the ball.
    def update(self):
        course_radianse = math.radians(self.course)
        self.rect.x += 10 * math.sin(course_radianse)
        self.rect.y -= 10 * math.cos(course_radianse)
        self.rect.x = self.rect.x
        self.rect.y = self.rect.y

        # Check if ball goes past top
        if self.rect.y <= 0:
            self.bounce(0)
            self.rect.y = 1

        # Check if ball goes past left side
        if self.rect.x <= 0:
            self.course = (360 - self.course) % 360
            self.rect.x = 1

        # Check if ball goes past right side
        if self.rect.x >= 800:
            self.course = (360 - self.course) % 360
            self.rect.x = 800 - 1

        if self.rect.y > 600:
            return True
        else:
            return False
导入pygame
输入数学
班级舞会(pygame.sprite.sprite):
课程=130
定义初始化(自):
#调用父类(Sprite)
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
#创建球并加载球图像
self.image=pygame.image.load(“ball.png”).convert()
self.rect=self.image.get_rect()
self.rect.x=0
自校正y=270
#创建反弹函数以使球在曲面上反弹。
def反弹(自身、差异):
self.course=(180-self.course)%360
自航向-=diff
#创建将更新球的函数。
def更新(自我):
course\u radianse=数学弧度(self.course)
self.rect.x+=10*math.sin(当然)
self.rect.y-=10*math.cos(课程)
self.rect.x=self.rect.x
self.rect.y=self.rect.y
#检查球是否越过顶部
如果自校正y 600:
返回真值
其他:
返回错误

矢量定义了方向和数量。必须将向量添加到球的位置。不幸的是,
pygame.Rect
只存储整数,因此对象的位置也必须存储在a中。您需要1个向量来表示对象的位置,第二个向量用于表示方向。每次位置更改时,必须由取整位置设置
.rect
属性。 如果对象撞击曲面,则球会被反射()到曲面上

最简单的例子:

导入pygame
随机输入
班级舞会(pygame.sprite.sprite):
定义初始值(自、起始、速度、起始):
super()。\uuuu init\uuuuu()
self.pos=pygame.math.Vector2(startpos)
自速度=速度
self.dir=pygame.math.Vector2(startdir.normalize())
self.image=pygame.image.load(“ball.png”).convert_alpha()
self.rect=self.image.get_rect(中心=(圆形(self.pos.x),圆形(self.pos.y)))
def反射(自身,NV):
self.dir=self.dir.reflect(pygame.math.Vector2(NV))
def更新(自我):
self.pos+=self.dir*self.velocity
自正中心=圆形(自正位置x),圆形(自正位置y)
pygame.init()
window=pygame.display.set_模式((500500))
clock=pygame.time.clock()
all_groups=pygame.sprite.Group()
开始,速度,方向=(250250),5,(random.random(),random.random())
球=球(开始、速度、方向)
所有组。添加(球)
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
所有_组。更新()
如果ball.rect.left=400:
球反射(-1,0))
如果ball.rect.top=400:
球反射((0,-1))
窗口填充(0)
pygame.draw.rect(窗口,(255,0,0),(100100300300),1)
所有组。绘制(窗口)
pygame.display.flip()

假设您有一组块:

block_group=pygame.sprite.group()
检测
块组
的碰撞。一旦检测到碰撞(),
将球反射到块上:

block\u hit=pygame.sprite.spritecollide(球,block\u组,False)
如果block_命中:
bl=block_hit[0]。rect.left-ball.rect.width/4
br=block_hit[0]。rect.right+ball.rect.width/4
如果bl
您希望通过使用它实现什么?我希望避免使用cos和sin,以熟悉pygame中vector2的使用。我相信我需要使用vector2声明我的所有对象,但我不熟悉这个过程。希望这能回答你的问题