ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что другие люди на этом сайте имели эту ошибку, но это было в разных контекстах, и исправления, похоже, не работают здесь.аргумент должен быть прямым объектом стиля - Pygame
Hey stackoverflow, В основном я делаю игру в боковых космических захватчиках, где ваш корабль следует за Y-позицией мыши, но остается слева, а затем стреляет в пулю. Враги появляются случайно справа и лететь влево, а объекты удаляются, как только они кажутся на стороне экрана. Это все работает отлично, но когда я попытался осуществить обнаружение столкновений, чтобы увидеть, когда выстрел поражает врага, я получаю ошибку:
TypeError: Argument must be rect style object.
Это указывает на линию «вернуть hitbox.colliderect (target.rect)» , Чтобы попытаться разобраться в том, что вызвало это, я сделал несколько строк «print» под ним, чтобы увидеть, что «target.rect» был (и был ли он правильным объектом), и он выглядел точно так же, как и собственный прямоугольник, поэтому я полностью потерял, почему коллайдер не принимает его.
Я написал почти все, извините, если это оскорбление вашего интеллекта, но это должно облегчить ситуацию.
Класс, который вызывает проблемы:
class gameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image, self.rect = load_image("shot.dsf", -1) #Loads the image and creates rectange
self.pos = image.get_rect().move(0, height)
def move(self):
self.pos = self.pos.move(self.speed, 0) #Moves along
self.rect = [self.pos, 32, 32] #Updates the position of the rectange. Without it the rectangle just stays in the top left corner but the image moves
if self. pos.right > 1400: #Checks if shot goes offscreen
objects.remove(self) #Removes it
def hitreg(self,target):
hitbox = self.rect #Creates hitbox of it's own rectangle
return hitbox.colliderect(target.rect) #SHOULD return true if hitbox collides with the rect of target, however it returns the error
print("OWN RECT: ",self.rect) #Debug purposes, returns ('OWN RECT: [<rect(1350, 245, 32, 32)>, 32, 32])
print("TARGET RECT: ",target.rect) #Debug purposes, returns ('TARGET RECT: [<rect(360, 479, 128, 64)>, 128, 64])
Main Loop
r.drawFrame() #Renders Frame
while running:
sleep(0.0166) #Make sure it only renders at most 60fps
rand = rnd(10,20) #Generates random number from 10 to 20
pos = pygame.mouse.get_pos() #Gets mouse position
for event in pygame.event.get():
if event.type == MOUSEBUTTONUP: #Prevents hang
None
if event.type == MOUSEBUTTONDOWN: #Creates shot if mousebuttondown, at mouse height with random speed
o = gameObject(shot, pos[1], rand)
objects.append(o)
if rnd(1,120) == 60: #Randomely Spawns Enemy Ships
s = enemyShip(enemya, rnd(10,890), rand) #enemya is filename
ships.append(s)
for o in objects: #For each shot
for s in ships: #For each enemy ship
if o.hitreg(s): #Calls hitreg function, s being the target
s.takedamage()
score = score + 10 #Increases score
r.drawFrame() #Renders Frame
Странно pygame, похоже, не возражает против этого пространства в себе. pos.right, никогда не поднимал на этом. Но, спасибо, вы помогли мне идентифицировать проблему, и это было то, что в конце концов у нее есть два интерлера. Это проблема в строке 8 класса gameObject, которая из-за меня предполагает, что self.pos был только координатами и не включал размер, поэтому я добавил их вручную, что означает как target.rect, так и self. rect были списками.Я довольно опытен в python, но не так много в pygame, поэтому я очень ценю вашу помощь: D – TheCatOfWar