为什么我会收到错误消息? Pygame 块
Why am I getting an error? Pygame blits
import sys, pygame, math, random
pygame.init()
size = width, height = 1000,720
x = 0
y = 0
house1x = 500
house1y = 360
house2x = 1470
house2y = 360
rock1x = -100
rock1y = 300
scrollx = 0
scrolly = 0
screen = pygame.display.set_mode(size, pygame.DOUBLEBUF)
counter = 0
playercollideRect = pygame.rect.Rect((0, 0), (75, 25))
house1collideRect = pygame.rect.Rect((0, 0), (870, 605))
house2collideRect = pygame.rect.Rect((0, 0), (870, 605))
rock1collideRect = pygame.rect.Rect((0, 0), (140, 100))
collision = False
lastkey = 'down'
animationdirection = 'down'
playerimage = pygame.image.load("img/player/player0.png").convert_alpha()
playerimagerect = playerimage.get_rect()
house1image = pygame.image.load("img/structures/house1.png").convert_alpha()
house1imagerect = house1image.get_rect()
house2image = pygame.image.load("img/structures/house2.png").convert_alpha()
house2imagerect = house2image.get_rect()
rock1image = pygame.image.load("img/objects/rock1.png").convert_alpha()
rock1imagerect = rock1image.get_rect()
clock = pygame.time.Clock()
screencolor = 0, 155, 20
gamefont = pygame.font.SysFont("arial", 30)
playeranimationdown = ['img/player/player1.png','img/player/player0.png','img/player/player2.png','img/player/player0.png']
playeranimationup = ['img/player/playerback1.png','img/player/playerback0.png','img/player/playerback2.png','img/player/playerback0.png']
playeranimationleft = ['img/player/playerleft1.png','img/player/playerleft0.png','img/player/playerleft2.png','img/player/playerleft0.png']
playeranimationright = ['img/player/playerright1.png','img/player/playerright0.png','img/player/playerright2.png','img/player/playerright0.png']
pygame.mixer.music.load('audio/music/ambient.mp3')
pygame.mixer.music.set_endevent(pygame.constants.USEREVENT)
pygame.mixer.music.play()
pygame.display.set_caption('Game')
pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP])
colliders = [house1collideRect, house2collideRect, rock1collideRect]
blitrects = [house1imagerect, house2imagerect, rock1imagerect]
blitimages = [house1image, house2image, rock1image]
blitypositions = [rock1y, house1y, house2y]
while 1:
clock.tick(500)
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
if y > 720-75-100:
y = 720-75-100
scrolly -= 1
if y < 0+75+100:
y = 0+75+100
scrolly += 1
if x > 1000-37-100:
x=1000-37-100
scrollx -=1
if x < 0+37+100:
x = 0+37+100
scrollx +=1
for collider in colliders:
if playercollideRect.colliderect(collider):
if lastkey == 'left':
x += 1
if lastkey == 'right':
x -= 1
if lastkey == 'up':
y += 1
if lastkey == 'down':
y -= 1
collision = True
else:
collision = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP] or keys[pygame.K_DOWN] or keys[pygame.K_LEFT] or keys[pygame.K_RIGHT]:
if keys[pygame.K_UP]:
y -= 1
if not collision == True:
playerimage = pygame.image.load(playeranimationup[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'up'
elif keys[pygame.K_DOWN]:
y += 1
if not collision == True:
playerimage = pygame.image.load(playeranimationdown[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'down'
elif keys[pygame.K_RIGHT]:
x += 1
if not collision == True:
playerimage = pygame.image.load(playeranimationright[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'right'
elif keys[pygame.K_LEFT]:
x -= 1
if not collision == True:
playerimage = pygame.image.load(playeranimationleft[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'left'
playerimagerect.centerx = x
playerimagerect.centery = y
house1imagerect.centerx = house1x+scrollx
house1imagerect.centery = house1y+scrolly
house2imagerect.centerx = house2x+scrollx
house2imagerect.centery = house2y+scrolly
playercollideRect.midbottom = playerimagerect.midbottom
house1collideRect.midbottom = house1imagerect.midbottom
house2collideRect.midbottom = house2imagerect.midbottom
rock1collideRect.midbottom = rock1imagerect.midbottom
realx = x-scrollx
realy = y-scrolly
for image, imagerect, imageypos in blitimages, blitrects, blitypositions:
if realy < imageypos:
screen.blit(playerimage, playerimagerect)
screen.blit(image, imagerect)
if realy > imageypos:
screen.blit(image, imagerect)
screen.blit(playerimage, playerimagerect)
if realy == imageypos:
screen.blit(image, imagerect)
screen.blit(playerimage, playerimagerect)
label = gamefont.render(str('FPS: '+str(clock.get_fps())), 1, (255,255,0))
screen.blit(label, (50, 50))
pygame.display.flip()
screen.fill(screencolor)
这是我正在处理的一个小项目的代码,但由于某种原因我收到了这个错误:
File "C:\Users\Isaac\Desktop\python kick\game\game.py", line 186, in <module>
screen.blit(image, imagerect)
TypeError: invalid destination position for blit
对我的问题有什么见解吗?我一直在测试和搜索很长一段时间。
应该是 screen.blit(image, (x coordinate, y coordinate))
您传递的是矩形而不是坐标。如果您想在矩形中使用坐标,它们是 self.rect.x
和 self.rect.y
.
import sys, pygame, math, random
pygame.init()
size = width, height = 1000,720
x = 0
y = 0
house1x = 500
house1y = 360
house2x = 1470
house2y = 360
rock1x = -100
rock1y = 300
scrollx = 0
scrolly = 0
screen = pygame.display.set_mode(size, pygame.DOUBLEBUF)
counter = 0
playercollideRect = pygame.rect.Rect((0, 0), (75, 25))
house1collideRect = pygame.rect.Rect((0, 0), (870, 605))
house2collideRect = pygame.rect.Rect((0, 0), (870, 605))
rock1collideRect = pygame.rect.Rect((0, 0), (140, 100))
collision = False
lastkey = 'down'
animationdirection = 'down'
playerimage = pygame.image.load("img/player/player0.png").convert_alpha()
playerimagerect = playerimage.get_rect()
house1image = pygame.image.load("img/structures/house1.png").convert_alpha()
house1imagerect = house1image.get_rect()
house2image = pygame.image.load("img/structures/house2.png").convert_alpha()
house2imagerect = house2image.get_rect()
rock1image = pygame.image.load("img/objects/rock1.png").convert_alpha()
rock1imagerect = rock1image.get_rect()
clock = pygame.time.Clock()
screencolor = 0, 155, 20
gamefont = pygame.font.SysFont("arial", 30)
playeranimationdown = ['img/player/player1.png','img/player/player0.png','img/player/player2.png','img/player/player0.png']
playeranimationup = ['img/player/playerback1.png','img/player/playerback0.png','img/player/playerback2.png','img/player/playerback0.png']
playeranimationleft = ['img/player/playerleft1.png','img/player/playerleft0.png','img/player/playerleft2.png','img/player/playerleft0.png']
playeranimationright = ['img/player/playerright1.png','img/player/playerright0.png','img/player/playerright2.png','img/player/playerright0.png']
pygame.mixer.music.load('audio/music/ambient.mp3')
pygame.mixer.music.set_endevent(pygame.constants.USEREVENT)
pygame.mixer.music.play()
pygame.display.set_caption('Game')
pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP])
colliders = [house1collideRect, house2collideRect, rock1collideRect]
blitrects = [house1imagerect, house2imagerect, rock1imagerect]
blitimages = [house1image, house2image, rock1image]
blitypositions = [rock1y, house1y, house2y]
while 1:
clock.tick(500)
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
if y > 720-75-100:
y = 720-75-100
scrolly -= 1
if y < 0+75+100:
y = 0+75+100
scrolly += 1
if x > 1000-37-100:
x=1000-37-100
scrollx -=1
if x < 0+37+100:
x = 0+37+100
scrollx +=1
for collider in colliders:
if playercollideRect.colliderect(collider):
if lastkey == 'left':
x += 1
if lastkey == 'right':
x -= 1
if lastkey == 'up':
y += 1
if lastkey == 'down':
y -= 1
collision = True
else:
collision = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP] or keys[pygame.K_DOWN] or keys[pygame.K_LEFT] or keys[pygame.K_RIGHT]:
if keys[pygame.K_UP]:
y -= 1
if not collision == True:
playerimage = pygame.image.load(playeranimationup[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'up'
elif keys[pygame.K_DOWN]:
y += 1
if not collision == True:
playerimage = pygame.image.load(playeranimationdown[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'down'
elif keys[pygame.K_RIGHT]:
x += 1
if not collision == True:
playerimage = pygame.image.load(playeranimationright[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'right'
elif keys[pygame.K_LEFT]:
x -= 1
if not collision == True:
playerimage = pygame.image.load(playeranimationleft[int(math.floor(counter/50))]).convert_alpha()
counter = (counter + 1) % 200
lastkey = 'left'
playerimagerect.centerx = x
playerimagerect.centery = y
house1imagerect.centerx = house1x+scrollx
house1imagerect.centery = house1y+scrolly
house2imagerect.centerx = house2x+scrollx
house2imagerect.centery = house2y+scrolly
playercollideRect.midbottom = playerimagerect.midbottom
house1collideRect.midbottom = house1imagerect.midbottom
house2collideRect.midbottom = house2imagerect.midbottom
rock1collideRect.midbottom = rock1imagerect.midbottom
realx = x-scrollx
realy = y-scrolly
for image, imagerect, imageypos in blitimages, blitrects, blitypositions:
if realy < imageypos:
screen.blit(playerimage, playerimagerect)
screen.blit(image, imagerect)
if realy > imageypos:
screen.blit(image, imagerect)
screen.blit(playerimage, playerimagerect)
if realy == imageypos:
screen.blit(image, imagerect)
screen.blit(playerimage, playerimagerect)
label = gamefont.render(str('FPS: '+str(clock.get_fps())), 1, (255,255,0))
screen.blit(label, (50, 50))
pygame.display.flip()
screen.fill(screencolor)
这是我正在处理的一个小项目的代码,但由于某种原因我收到了这个错误:
File "C:\Users\Isaac\Desktop\python kick\game\game.py", line 186, in <module>
screen.blit(image, imagerect)
TypeError: invalid destination position for blit
对我的问题有什么见解吗?我一直在测试和搜索很长一段时间。
应该是 screen.blit(image, (x coordinate, y coordinate))
您传递的是矩形而不是坐标。如果您想在矩形中使用坐标,它们是 self.rect.x
和 self.rect.y
.