在课堂上使用碰撞表 [英] Use collidelist in class

查看:57
本文介绍了在课堂上使用碰撞表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个创建矩形并将其放入列表的类.我不希望它们发生碰撞,所以我使用collistlist,但是它不起作用.矩形仍在碰撞.

I have created a class to create rectangles and put them in a list . I don't want them to collide so I use collidelist but it isn't working.rectangles are still colliding .

我还希望矩形在碰到特定点时向下移动并更改x位置,

I also want rectangles to move down and change x position when hit a specific point ,

我可以这样做,但是我不确定这是否会阻止collidelist工作

I can do that but I am not sure if it is preventing collidelist from working

查看下面的代码以获得更多说明.

Look the code below for more clarification.

import pygame
import random
from pygame.locals import *
import time 
pygame.init()
a = 255,255,255
b = 0,0,0
c = 80,255,0
d = 0,125,125
r1 = (b,c,d)
r = random.choice(r1)
p_x = 500
p_y = 1399
width = 500
height = 1890

display = pygame.display.set_mode((width,height))
title = pygame.display.set_caption("Game")
clock = pygame.time.Clock()

run = False
exit_game = False

x = random.randrange(10,900)
y = random.randrange(10,900)

sy = 10
w = random.randrange(40,90)
h = random.randrange(40,90)

rectangles =[]

class Rectangle:
    def __init__(self ,color ,x,y,w,h):
        self.c = color
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.rect =pygame.Rect(self.x ,self.y ,self.w ,self.h)
        
    def draw(self):
        pygame.draw.rect(display , self.c ,(self.x ,self.y ,self.w,self.h))
        
        self.y += sy
        if self.y > height:
                self.y = -25
                self.x = random.randint(10,900)
                return self.rect
        return self.rect
                
        
    
                
            
            


for count in range(5):
    r_c = random.randint(0,255) , random.randint(0,255) , random.randint(0,255) 
    
    r_x = random.randint(10,900)
    r_y = random.randint(10,79)
    r_w = random.randint(60,100) 
    r_h = random.randint(40,80) 
    
    
    rectangle = Rectangle(r_c ,r_x,r_y,r_w,r_h)
    rectangles.append(rectangle)

    
    
    
    

while not run:
    display.fill(a)
    p =pygame.draw.rect(display,c,(p_x ,p_y ,56,56))
    
    

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit_game = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                p_x -= 60
            if event.key == pygame.K_p:
                p_x += 60
                
    for rectangle in rectangles:
        if rectangle.rect.collidelist(rectangles) > -1:     
            rectangle.draw()

        

    
    pygame.display.update()
    clock.tick(60)
    

pygame.quit()
quit()
    

推荐答案

pygame.Rect 对象和 pygame.Rect 对象列表.从类中删除属性 .x .y .w .h ,但是添加一个新的方法更新:

collidelist() evaluates the collisions between a singe pygame.Rect object and a list of pygame.Rect objects. Remove the attributes .x, .y, .w and .h from the class, but add an new method update:

class Rectangle:
    def __init__(self, color, x, y, w, h):
        self.c = color
        self.rect = pygame.Rect(x, y, w, h)
    def update(self):
        self.rect.y += sy
        if self.rect.y > height:
            self.rect.y = -25
            self.rect.x = random.randint(10,900)
    def draw(self):
        pygame.draw.rect(display, self.c, self.rect)

在进行碰撞测试之前,您必须生成一个 pygame.Rect 对象的列表.由于每个矩形都在列表中,因此碰撞测试将始终至少找到一个矩形(本身).使用 collidelistall() 并检查碰撞矩形的数量是否小于2:

Before the collision test you have to generate a list of pygame.Rect objects. Since each rectangle is in the list, the collision test will always find at leas one rectangle (itself). Use collidelistall() and test if the number of colliding rectangles is less than 2:

while not run:
    # [...]

    for rectangle in rectangles:
        rectangle.update()
        rectlist = [r.rect for r in rectangles]
        if len(rectangle.rect.collidelistall(rectlist)) < 2:     
            rectangle.draw()


无论如何,我建议创建不相交的矩形.初始化时:


Anyway, I recommend to create rectangles, which are not intersecting. At initialization:

rectangles = []        
rectlist = []           
for count in range(5):
    r_c = random.randint(0,255) , random.randint(0,255) , random.randint(0,255) 
    
    create_new = True
    while create_new:
        r_x = random.randint(10,900)
        r_y = random.randint(10,79)
        r_w = random.randint(60,100) 
        r_h = random.randint(40,80) 
        rectangle = Rectangle(r_c, r_x,r_y,r_w,r_h)
        create_new = rectangle.rect.collidelist(rectlist) > -1
    
    rectangles.append(rectangle)
    rectlist.append(rectangle.rect)

在类 Rectangle 的方法 update 中:

class Rectangle:
    # [...]

    def update(self, rectangles):
        self.rect.y += sy
        if self.rect.y > height:
            rectlist = [r.rect for r in rectangles if r != self]
            self.rect.y = -25
            self.rect.x = random.randint(10,900)
            while self.rect.collidelist(rectlist) > -1:
                self.rect.x = random.randint(10,900)


完整示例:


Complete Example:

import pygame
import random
from pygame.locals import *
import time 
pygame.init()
a = 255,255,255
b = 0,0,0
c = 80,255,0
d = 0,125,125
r1 = (b,c,d)
r = random.choice(r1)
p_x = 500
p_y = 1399
width = 500
height = 1890

display = pygame.display.set_mode((width,height))
title = pygame.display.set_caption("Game")
clock = pygame.time.Clock()

run = False
exit_game = False

sy = 10

class Rectangle:
    def __init__(self, color, x, y, w, h):
        self.c = color
        self.rect = pygame.Rect(x, y, w, h)

    def update(self, rectangles):
        self.rect.y += sy
        if self.rect.y > height:
            rectlist = [r.rect for r in rectangles if r != self]
            self.rect.y = -25
            self.rect.x = random.randint(10,900)
            while self.rect.collidelist(rectlist) > -1:
                self.rect.x = random.randint(10,900)
    
    def draw(self):
        pygame.draw.rect(display, self.c, self.rect)

rectangles = []        
rectlist = []           
for count in range(5):
    r_c = random.randint(0,255) , random.randint(0,255) , random.randint(0,255) 
    
    create_new = True
    while create_new:
        r_x = random.randint(10,900)
        r_y = random.randint(10,79)
        r_w = random.randint(60,100) 
        r_h = random.randint(40,80) 
        rectangle = Rectangle(r_c, r_x,r_y,r_w,r_h)
        create_new = rectangle.rect.collidelist(rectlist) > -1
    
    rectangles.append(rectangle)
    rectlist.append(rectangle.rect)

while not run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit_game = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                p_x -= 60
            if event.key == pygame.K_p:
                p_x += 60
                
    for rectangle in rectangles[:]:
        rectangle.update(rectangles)
    
    display.fill(a)
    p = pygame.draw.rect(display,c,(p_x ,p_y ,56,56))
    for rectangle in rectangles:
        rectangle.draw()
    pygame.display.update()
    clock.tick(60)
    
pygame.quit()
quit()

这篇关于在课堂上使用碰撞表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆