首页 > 解决方案 > 我看不到子弹图像

问题描述

我想创建自己的游戏来使用强化学习,我创建了这段代码。但是当我按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

然后我开始编码它的工作,但我看不到子弹图像。有趣的是没有产生错误。有人可以帮帮我吗。我对此很陌生。感谢您的关注。

标签: pythonpygame

解决方案


子弹没有被绘制到屏幕上,因为Sprite对象只sprite.imagesprite.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 )  

        [...]

推荐阅读