2015-07-25 4 views
0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что другие люди на этом сайте имели эту ошибку, но это было в разных контекстах, и исправления, похоже, не работают здесь.аргумент должен быть прямым объектом стиля - 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 

ответ

1

Если результат, показанный в исходном коде можно доверять, ваши отладочные операторы показывают, что ни self.rect, ни target.rect являются «стиль Прямоугольник " объекты. Они, кажется, списки, состоящие из прямоугольника, затем 2 целых чисел, как это:

OWN RECT: [<rect(1350, 245, 32, 32)>, 32, 32]) 
TARGET RECT: [<rect(360, 479, 128, 64)>, 128, 64] 

Метод move() отвечает за изменение self.rect от «нормального» прямоугольника в список, как указано выше, но это модифицированный self.rect не будут вести себя как прямой. Возможно, в hitreg() вы должны позвонить hitbox = self.rect[0].

В любом случае, в этом случае я подозреваю, что вывод ваших отладочных инструкций, как показано, неверен. Вероятно, значение для self.rect - это rect (потому что списки не имеют метода colliderect(), но colliderect() действительно называется), и это target.rect, что есть список. target.rect имеет тип enemyShip, но вы не показываете код для этого, поэтому невозможно сказать, что на самом деле происходит там (хотя можно было предположить, что на него был вызван move(), и это self.rect повреждено).

Я предлагаю вам захватить некоторый реальный вывод отладки и добавить это к вашему вопросу. Было бы также полезно, если бы вы могли опубликовать точный код, потому что есть хотя бы одна синтаксическая ошибка, например. в строке:

if self. pos.right > 1400: 

И что делает код enemyShip выглядеть?

+0

Странно pygame, похоже, не возражает против этого пространства в себе. pos.right, никогда не поднимал на этом. Но, спасибо, вы помогли мне идентифицировать проблему, и это было то, что в конце концов у нее есть два интерлера. Это проблема в строке 8 класса gameObject, которая из-за меня предполагает, что self.pos был только координатами и не включал размер, поэтому я добавил их вручную, что означает как target.rect, так и self. rect были списками.Я довольно опытен в python, но не так много в pygame, поэтому я очень ценю вашу помощь: D – TheCatOfWar