python - 我看不到子弹图像
问题描述
我想创建自己的游戏来使用强化学习,我创建了这段代码。但是当我按space栏时,我看不到子弹。
任何人都可以帮忙吗?感谢您的关注我的代码是这样的:
import pygame
import random
WIDTH = 800
HEIGHT = 600
首先我想创建我的播放器,但我也想在我的播放器类上创建我的子弹图像,这就是我这样做的原因:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('warship.png').convert()
self.image2 = pygame.image.load('bullet.png').convert()
self.rect = self.image.get_rect()
self.bullet_rect = self.image2.get_rect()
self.bullet_rect.centerx = self.rect.centerx
self.bullet_rect.y = self.rect.y
self.bullet_rect_speedy = 0
self.rect.centerx = WIDTH/2
self.rect.bottom = HEIGHT - 50
self.speedx = 0
然后我想将我的播放器和子弹一起移动:
def update(self):
self.speedx = 0
self.bullet_rect_speedy = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -4
elif keystate[pygame.K_RIGHT]:
self.speedx = 4
elif keystate[pygame.K_SPACE]:
self.bullet_rect_speedy = -10
else:
self.speedx = 0
self.rect.x += self.speedx
self.bullet_rect.y += self.bullet_rect_speedy
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
if self.bullet_rect.y <= 0:
self.bullet_rect.y = self.rect.y
def getCoordinates(self):
return (self.rect.x,self.rect.y)
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
background = pygame.image.load('yeni_resim.jpg')
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('spaceship.png')
pygame.display.set_icon(icon)
all_sprite = pygame.sprite.Group()
player = Player()
all_sprite.add(player)
running = True
while running:
screen.blit(background,(0,0))
all_sprite.update()
all_sprite.draw(screen)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
break
然后我开始编码它的工作,但我看不到子弹图像。有趣的是没有产生错误。有人可以帮帮我吗。我对此很陌生。感谢您的关注。
解决方案
子弹没有被绘制到屏幕上,因为Sprite
对象只sprite.image
在sprite.rect
. 球员形象在Player.image
,子弹在Player.image2
。Pygame.Sprite 对此一无所知image2
,因此忽略了它。
你可以实现你自己Player.draw()
的 blits 两个图像。但最好的解决方案是将项目符号分离到它自己的类中:
class Bullet(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__( self )
self.image = pygame.image.load('bullet.png').convert()
self.rect = self.image.get_rect()
self.rect.center = ( x, y )
self.velocity = 1
def update( self ):
x, y = self.rect.center # get current position
y -= self.velocity # move up (negative-Y is up)
if ( y < 0 ):
self.kill() # went off top of screen
else:
self.rect.center = ( x, y )
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('warship.png').convert()
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH/2
self.rect.bottom = HEIGHT - 50
self.speedx = 0
def update(self):
self.speedx = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -4
elif keystate[pygame.K_RIGHT]:
self.speedx = 4
elif keystate[pygame.K_SPACE]:
# Create a new bullet just above the player
global all_bullets_group
x, y = self.rect.center
new_bullet = Bullet( x, y-5 )
all_bullets_group.add( new_bullet )
[...]
推荐阅读
- python - 访问数组中的数组元素
- javascript - 是否可以添加一个功能以单击展开和/或折叠所有手风琴?
- javascript - JS报错:为什么系统找不到我的js文件
- javascript - Array from firebase database call logs correct data but length shows 0
- kubernetes - 如何将 k3s 的入口移动到另一个端口
- audio - 如何在 ESP32 上使用 MicroPython 录制音频?
- javascript - 通过“Uppy”上传带有 HTML 表单的文件
- java - 我试图了解子字符串调用在这段代码中是如何工作的?
- java - 单击标记时无法调用我的自定义信息窗口
- php - SQL 查询:1 列的多个参数