python - 弹丸不会变成图像错误如何修复?
问题描述
我在这里有我的射弹类,当我尝试将其转换为图像时,它不起作用,我为什么尝试做这个 V
class projectile(object):
def __init__(self,x,y,radius,color):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.toxic = pygame.image.load("toxic.png")
self.speed = 10
def draw(self,win):
pygame.draw.circle(win, self.color, (self.x,self.y), self.radius)
window.blit(win, self.color, (self.x,self.y), self.radius)
我也试过这个
window.blit(self.toxics, (self.color, (self.x,self.y)), self.radius)
我收到此错误,不知道如何解决
File "C:\Users\Habib\Desktop\PYTHONGGAME\py.py", line 58, in draw
window.blit(self.toxics, (self.color, (self.x,self.y)), self.radius)
TypeError: invalid destination position for blit
我的完整代码
import pygame
pygame.init()
window = pygame.display.set_mode((500,500))
pygame.display.set_caption("Game")
plat = pygame.image.load("gt.png")
coinss = pygame.image.load("coin_gold.png")
slash1 = pygame.image.load("slash.png")
lefts = [pygame.image.load("Sprite-0001.png"),
pygame.image.load("Sprite-0002.png"),
pygame.image.load("Sprite-0003.png"),
pygame.image.load("Sprite-0004.png"),
pygame.image.load("Sprite-0005.png"),
pygame.image.load("Sprite-0006.png"),
pygame.image.load("Sprite-0007.png"),
pygame.image.load("Sprite-0008.png"),
pygame.image.load("Sprite-0009.png")
]
toxics = pygame.image.load("toxic.png")
stand = pygame.image.load("stands.png")
rights = [pygame.image.load("Sprite-50.png"),
pygame.image.load("Sprite-51.png"),
pygame.image.load("Sprite-52.png"),
pygame.image.load("Sprite-53.png"),
pygame.image.load("Sprite-54.png"),
pygame.image.load("Sprite-55.png"),
pygame.image.load("Sprite-56.png"),
pygame.image.load("Sprite-57.png"),
pygame.image.load("Sprite-58.png")
]
right = [
pygame.image.load("enemy.png"),
pygame.image.load("enemys1.png"),
pygame.image.load("enemys2.png"),
pygame.image.load("enemys3.png"),
pygame.image.load("enemys4.png"),
pygame.image.load("enemys5.png")
]
class projectile(object):
def __init__(self,x,y,radius,color):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.toxics = pygame.image.load("toxic.png")
self.speed = 10
def draw(self,win):
window.blit(window, self.color, (self.x,self.y), self.radius)
# the enemy
class enes:
def __init__(self,x,y,width,height,end):
self.right = [
pygame.image.load("enemy.png"),
pygame.image.load("enemys1.png"),
pygame.image.load("enemys2.png"),
pygame.image.load("enemys3.png"),
pygame.image.load("enemys4.png"),
pygame.image.load("enemys5.png")]
self.right = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.right]
self.x = x
self.y = y
self.height = height
self.path = [x,end]
self.walkCount = 0
self.walk_so = 0
self.so_walk = 0
self.speed = 3
def draw(self,window):
self.move()
if self.walkCount + 1 >= 33:
self.walkCount = 0
if self.speed > 0:
window.blit(self.right[self.so_walk//3], (self.x,self.y))
self.walkCount += 1
else:
window.blit(self.right[self.so_walk//3],(self.x,self.y))
self.walkCount += 1
def move(self):
if self.speed > 0:
if self.x < self.path[1] + self.speed:
self.x += self.speed
else:
self.speed = self.speed * -1
self.x += self.speed
self.walkCount = 0
else:
if self.x > self.path[0] - self.speed:
self.x += self.speed
else:
self.speed = self.speed * -1
self.x += self.speed
self.walkCount = 0
def hitbox(self):
print('hit')
goblin = enes(100,280,64,64,200)
goby = [goblin]
# color for enems
green = (63, 190, 22)
enems1 = enes(350,259,50,50, green)
florida = [enems1]
# player class
class player:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.speed = 5
self.isJump = False
self.JumpCount = 10
self.fall = 0
#hit box
self.hitbox = (self.x + 20, self.y, 28, 60)
self.stand = pygame.image.load("stands.png")
self.lefts = [
pygame.image.load("Sprite-0001.png"),
pygame.image.load("Sprite-0002.png"),
pygame.image.load("Sprite-0003.png"),
pygame.image.load("Sprite-0004.png"),
pygame.image.load("Sprite-0005.png"),
pygame.image.load("Sprite-0006.png"),
pygame.image.load("Sprite-0007.png"),
pygame.image.load("Sprite-0008.png"),
pygame.image.load("Sprite-0009.png")
]
self.rights = [
pygame.image.load("Sprite-50.png"),
pygame.image.load("Sprite-51.png"),
pygame.image.load("Sprite-52.png"),
pygame.image.load("Sprite-53.png"),
pygame.image.load("Sprite-54.png"),
pygame.image.load("Sprite-55.png"),
pygame.image.load("Sprite-56.png"),
pygame.image.load("Sprite-57.png"),
pygame.image.load("Sprite-58.png")
]
self.rights = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.rights]
self.lefts = [pygame.transform.scale(image,(image.get_width()*4,image.get_height()*4)) for image in self.lefts]
self.stand = pygame.transform.scale(self.stand,(self.stand.get_width()*4,self.stand.get_height()*4))
self.bo_index = 0
self.start_time = pygame.time.get_ticks()
self.anim_fps = 400
self.anim_index = 0
self.stans_index = 0
self.direction = "right"
self.direction = "left"
self.direction = "standing"
self.rect = pygame.rect = pygame.Rect(self.x,self.y,width, height)
def draw(self):
self.rect.topleft = (self.x,self.y)
if self.direction == "left":
player_image = self.lefts[self.anim_index]
self.anim_index += 1
if self.anim_index == len(self.lefts):
self.anim_index = 0
elif self.direction == "right":
player_image = self.rights[self.anim_index]
self.anim_index += 1
if self.anim_index == len(self.rights):
self.anim_index = 0
else:
player_image = self.stand
player_rect = player_image.get_rect(center = self.rect.center)
player_rect.centerx += 10 # 10 is just an example
player_rect.centery += -20 # 15 is just an example
window.blit(player_image, player_rect)
# platforms
class platform:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.plat = pygame.image.load("gt.png")
self.rect = pygame.Rect(x,y,plat.get_width(), plat.get_height())
self.plat = pygame.transform.scale(self.plat,(self.plat.get_width()//2,self.plat.get_height()//2))
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.plat,self.rect)
# Coins
class coin:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.coinss = pygame.image.load("coin_gold.png")
self.rect = pygame.Rect(x,y,coinss.get_width(), coinss.get_height())
self.plat = pygame.transform.scale(self.coinss,(self.coinss.get_width()//2,self.coinss.get_height()//2))
self.color = color
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.coinss,self.rect)
# Floor
class floor:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
pygame.draw.rect(window,self.color,self.rect)
font = pygame.font.Font('freesansbold.ttf', 30)
score = 0
text = font.render('Gold = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100, 40)
# enemy
Sfont = pygame.font.Font('freesansbold.ttf', 30)
Kills = 0
Stext = Sfont.render('Kills = ' + str(score), True, (255,255,255))
textRectS = Stext.get_rect()
textRectS.center = (400, 100)
# fps
FPS = 60
clock = pygame.time.Clock()
# colors
Green = (63, 190, 22)
Blue = (22, 190, 175)
white = (240, 240, 240)
# define the enemy player coin classes
playerman = player(150,350,30,30, Blue)
enemy1 = platform(150,390,190,10, Green)
enemy2 = platform(300,310,190,10, Green)
enemy3 = platform(80,260,190,10, Green)
enemy4 = platform(250,180,190,10, Green)
enemy5 = platform(490,120,190,10, Green)
enemy6 = platform(-50,100,190,10, Green)
enemy7 = platform(180,50,190,10, Green)
platforms = [enemy1,enemy2,enemy3,enemy4,enemy5,enemy6,enemy7]
# coin class
coin1 = coin(180,320,150,150, Green)
coin2 = coin(350,250,50,50, Green)
coin3 = coin(150,200,50,50, Green)
Coins_list = [coin1,coin2,coin3]
# floor class
floor1 = floor(-1000,490,9999,50, white)
flories = [floor1]
# shoot the enmey loop
shootLoop = 0
if shootLoop > 0:
shootLoop += 1
if shootLoop > 3:
shootLoop = 0
#main loop
bullets = []
runninggame = True
while runninggame:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
runninggame = False
if playerman.y < 250:
playerman.y += 1
for platform in platforms:
platform.y += playerman.speed
for coin in Coins_list:
coin.y += playerman.speed
for floor in flories:
floor.y += playerman.speed
for enes in goby:
enes.y += playerman.speed
if playerman.y > 450:
playerman.y -= playerman.fall
for platform in platforms:
platform.y -= playerman.fall
for coin in Coins_list:
coin.y -= playerman.fall
for floor in flories:
floor.y -= playerman.fall
for enes in goby:
enes.y -= playerman.fall
keys = pygame.key.get_pressed()
playerman.direction = "standing"
if keys[pygame.K_a] and shootLoop == 0:
for bullet in bullets:
if bullet.x < 500 and bullet.x > 0:
bullet.x += bullet.speed
else:
bullets.pop(bullets.index(bullet))
if len(bullets) < 2:
bullets.append(projectile(round(playerman.x+playerman.width//2), round(playerman.y + playerman.height//2), 6, (0,0,0)))
if keys[pygame.K_d] and shootLoop == 0:
for bullet in bullets:
if bullet.x < 500 and bullet.x > 0:
bullet.x -= bullet.speed
else:
bullets.pop(bullets.index(bullet))
if len(bullets) < 2:
bullets.append(projectile(round(playerman.x+playerman.width//2), round(playerman.y + playerman.height//2), 6, (0,0,0)))
if keys[pygame.K_LEFT]:
playerman.direction = "right"
playerman.x -= playerman.speed
if playerman.x < 100:
playerman.x += playerman.speed
for platform in platforms:
platform.x += playerman.speed
for coin in Coins_list:
coin.x += playerman.speed
for enes in goby:
enes.x += playerman.speed
if keys[pygame.K_RIGHT]:
playerman.direction = "left"
playerman.x += playerman.speed
if playerman.x > 400:
playerman.x -= playerman.speed
for platform in platforms:
platform.x -= playerman.speed
for coin in Coins_list:
coin.x -= playerman.speed
for enes in goby:
enes.x -= playerman.speed
if not playerman.isJump:
playerman.y += playerman.fall
playerman.fall += 1
playerman.isJump = False
collide = False
for platform in platforms:
if playerman.rect.colliderect(platform.rect):
collide = True
playerman.isJump = False
playerman.y = platform.rect.top - playerman.height + 1
if playerman.rect.right > platform.rect.left and playerman.rect.left < platform.rect.left - playerman.width:
playerman.x = platform.rect.left - playerman.width
if playerman.rect.left < platform.rect.right and playerman.rect.right > platform.rect.right + playerman.width:
playerman.x = platform.rect.right
for i in range(len(Coins_list)-1,-1,-1):
if playerman.rect.colliderect(Coins_list[i].rect):
del Coins_list[i]
score += 1
text = font.render('Score = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100, 40)
for floor in flories:
if playerman.rect.colliderect(floor.rect):
collide = True
playerman.isJump = False
playerman.y = floor.rect.top - playerman.height + 1
if playerman.rect.right > floor.rect.left and playerman.rect.left < floor.rect.left - playerman.width:
playerman.x = floor.rect.left - playerman.width
if playerman.rect.left < floor.rect.right and playerman.rect.right > floor.rect.right + playerman.width:
playerman.x = floor.rect.right
if playerman.rect.bottom >= 490:
collide = True
playerman.isJump = False
playerman.JumpCount = 10
playerman.y = 490 - playerman.height
if collide:
if keys[pygame.K_UP]:
playerman.isJump = True
playerman.fall = 0
else:
if playerman.JumpCount > 0:
playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.3
playerman.JumpCount -= 1
else:
playerman.JumpCount = 10
playerman.isJump = False
window.fill((74, 107, 104))
goblin.draw(window)
window.blit(Stext,textRectS)
for bullet in bullets:
bullet.draw(window)
window.blit(text,textRect)
for platform in platforms:
platform.draw()
for coin in Coins_list:
coin.draw()
playerman.draw()
for floor in flories:
floor.draw()
pygame.display.update()
pygame.quit()
解决方案
基本上你的电话blit()
有错误的论点。
从手册:
pygame.Surface.blit
将一个图像绘制到另一个
blit(source, dest, area=None, special_flags=0) -> Rect在此 Surface 上绘制源 Surface。可以使用 dest 参数定位平局。Dest 可以是表示源左上角的坐标对。一个 Rect 也可以作为目标传递,矩形的左上角将用作 blit 的位置。目标矩形的大小不会影响 blit。
最好将坐标保存在 pygameRect
中,并将它们用于 blit 目的地。
class projectile(object):
def __init__(self, x, y):
self.toxic = pygame.image.load("toxic.png")
self.rect = self.toxic.get_rect()
self.rect.topleft = ( x, y )
self.speed = 10
def draw(self, window):
window.blit( self.toxic, self.rect )
def moveTo(self, x, y):
self.rect.topleft = ( x, y )
推荐阅读
- javascript - 如何使用 HTML5 datetime-local 输入禁用上一个日期?
- node.js - npm 没有安装在正确的目录中
- xcode - 如何修复错误“您无权写入文件“_malloc.h”所在的文件夹。” 在 Xcode 中?
- c++ - 使用 >= 或值 - 1?
- nsis - NSIS 安装程序:错误:名为“INSTALL_LIB_INET”的函数已存在
- mysql - 如果一行中满足条件,如何从查询中排除多个结果
- django - 为两种不同的用户类型(客户、供应商)扩展抽象用户模型
- r - 调整以便正确生成表格
- reactjs - 空检查后对象可能为“空”
- reactjs - 使用 react router dom v6 保护路由 渲染没有返回任何内容