【发布时间】:2018-12-14 13:53:58
【问题描述】:
我是一名从事学校项目的学生。我的碰撞不起作用,我开始感到沮丧。每当我尝试运行我的游戏时,都会弹出一条错误消息说
“属性错误:类型对象'Ball'没有属性'rect'”。
在我的代码中你会看到我有self.rect = pygame.Rect(self.x, self.y, 100, 100)。我曾尝试使用 get_rect 函数,但这仍然不起作用。如果您对代码有任何提示,请随时添加评论。
import pygame
import random
import os
from pygame import mixer
# accessed: 4/6/18 code:https://github.com/codingandcaring/PYgame/blob/bacaab1bd6ec0c97412a136773dfd634455c3e2f/basketball_game.py
#Music
#Tutorial from computingmrh - https://www.youtube.com/watch?v=lUMSK6LmXCQ used on 5th may 2018
snd_file = 'Game.ogg'
mixer.init()
mixer.music.load(snd_file)
mixer.music.play()
#spirtes
class Ball(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('basketball.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (100, 100))
self.x = x
self.y = y
self.rect = pygame.Rect(self.x, self.y, 100, 100)
self.speed_x = 5
self.speed_y = 5
self.radiusx = 0
self.radiusy = 100
self.mask = pygame.mask.from_surface(self.image)
def update(self, width, height):
self.x += self.speed_x
self.y += self.speed_y
self.rect = pygame.Rect(self.x, self.y, 100, 100)
if self.x + self.radiusx > width:
self.speed_x = 0
if self.y + self.radiusx > height:
self.speed_y = 0
if self.x + self.radiusy > width:
self.speed_x = 0
if self.y + self.radiusy > height:
self.speed_y = 0
if self.x - self.radiusx <= 0:
self.speed_x = 0
if self.y - self.radiusx <= 0:
self.speed_y = 0
def render(self, screen):
screen.blit(self.image, (self.x, self.y))
class Goal(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('goal.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (220, 220))
self.x = x
self.y = y
self.rect = pygame.Rect(self.x, self.y, 220, 220)
def render(self, screen):
screen.blit(self.image, (self.x, self.y))
class Ring(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('ring.png').convert_alpha()
self.image = pygame.transform.scale(self.image, (400, 400))
self.x = x
self.y = y
self.rect = pygame.Rect(self.x, self.y, 400, 400)
self.mask = pygame.mask.from_surface(self.image)
def render(self, screen):
screen.blit(self.image, (self.x, self.y))
class Baddie(pygame.sprite.Sprite):
def __init__(self, x, y, z):
self.image = pygame.image.load().convert_alpha()
self.image = pygame.transform.scale(self.image, (220, 220))
self.rect = self.image.get_rect()
self.x = x
self.y = y
def render(self, screen):
screen.blit(self.image, (self.x, self.y))
def main():
# basics
width = 1200
height = 722
pygame.init()
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Basketball Shootout')
font = pygame.font.Font(None, 25)
#code for the badguys
badtimer=100
badtimer1=0
badguys=[[640,100]]
# Add Variables
court = pygame.image.load('halfcourt.jpg')
court = pygame.transform.scale(court, (1200, 722))
basketball = Ball(50, 50)
goal = Goal(487, 0)
ring = Ring(400,400)
player = Ball
badguyimg1 = pygame.image.load("wpierdol.png")
badguyimg1 = pygame.transform.scale(badguyimg1, (100, 100))
badguyimg2 = pygame.image.load("bad_guy2.gif")
badguyimg2 = pygame.transform.scale(badguyimg2, (100, 100))
badguyimg3 = pygame.image.load("bad_guy3.gif")
badguyimg3 = pygame.transform.scale(badguyimg3, (100, 100))
badlist = [badguyimg1, badguyimg2, badguyimg3]
stop_game = False
#main game logic
while not stop_game:
badtimer -= 1
point = pygame.sprite.collide_mask(player, ring)
if point:
score = score + 1
#Draw the bad guys
if badtimer==0:
badguys.append([1040, random.randint(50,430)])
badtimer=100-(badtimer1*2)
if badtimer1>=35:
badtimer1=35
else:
badtimer1+=5
index=0
for badguy in badguys:
if badguy[0]<-64:
badguys.pop(index)
badguy[0]-=7
index+=1
for event in pygame.event.get():
pressed = pygame.key.get_pressed()
if pressed[pygame.K_UP]:
basketball.y -= 5
basketball.speed_y = -5
elif pressed[pygame.K_DOWN]:
basketball.y += 5
basketball.speed_y = 5
elif pressed[pygame.K_LEFT]:
basketball.x -= 5
basketball.speed_x = -5
elif pressed[pygame.K_RIGHT]:
basketball.x += 5
basketball.speed_x = 5
if event.type == pygame.QUIT:
stop_game = True
# Updating
basketball.update(width, height)
screen.blit(court, (0,0))
text = font.render('Dodge the other team to get to the goal!', True, (0, 0, 0))
screen.blit(text, (430, 630))
goal.render(screen)
basketball.render(screen)
for badguy in badguys:
screen.blit(badguyimg1)
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
main()
【问题讨论】:
-
我建议查看Program Arcade Games chapter 13 了解精灵组的工作原理。
标签: python python-2.7 pygame collision attributeerror