简体   繁体   English

Pygame 在 python

[英]Pygame in python

My game was working before I added lines 7 and 8. what happened in the game was the red sprites that fall down the screen would hit the main character sprite which is green and the game would stop just as I need it to.在我添加第 7 行和第 8 行之前,我的游戏正在运行。游戏中发生的事情是从屏幕上掉下来的红色精灵会撞到绿色的主角精灵,游戏会在我需要的时候停止。

import pygame
import random

from os import path
img_dir = path.join(path.dirname(__file__),'PNG')

background = pygame.image.load(path.join(img_dir,'Space-Background.png')).convert()
background_rect = background.get_rect()

WIDTH = 480
HEIGHT = 600
FPS = 60

WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)


pygame.init()
pygame.mixer.init()

screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    
    def __init__(self):
        
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50,40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT-10
        
        self.speedx = 0
        
    def update(self):
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -5
        if keystate[pygame.K_RIGHT]:
            self.speedx = 5
            
        self.rect.x += self.speedx
        
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
            
    def shoot(self):
        bullet = Bullet(self.rect.centrex,self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)
            
class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30,40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        
        self.rect.x = random.randrange(0, WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100,-40)
        self.speedy = random.randrange(1,8)
        
    def update(self):
        self.rect.y += self.speedy
        
        if self.rect.top > HEIGHT +10:
            self.rect.x = random.randrange(0, WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100,-40)
            self.speedy = random.randrange(1,8)

class Bullet(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10,20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centrex = x
        self.speedy = -10
    def update(self):
        self.rect.y += self.speedy
        
        if self.rect.bottom < 0:
            self.kill()

# player_img = pygame.image.load(path.join(img_dir,"spaceShips_003.png")).convert()
# bullet_img = pygame.image.load(path.join(img_dir,"spaceMissile_006.png")).convert()
# mob_img = pygame.image.load(path.join(img_dir,"SpaceMeteor_004.png")).convert()

all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()

player = Player()

for i in range(8):
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)
    
all_sprites.add(player)

running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()
    all_sprites.update()
    
    hits = pygame.sprite.groupcollide(mobs,bullets,True,True)
    for hit in hits:
         m = Mob()
         all_sprites.add(m)

    hits = pygame.sprite.spritecollide(player,mobs,False)
    
    if hits:
        running = False
        
    screen.fill(BLACK)
#    screen.split(background.background_rect)
    all_sprites.draw(screen)
    pygame.display.flip()
        
            
pygame.quit()

After I added the two lines for the images there was an error message.在我为图像添加两行之后,出现了一条错误消息。 I am not sure what happened and I need some help fixing it.我不确定发生了什么,我需要一些帮助来修复它。

>>> %Run trial.py
pygame 2.1.2 (SDL 2.0.18, Python 3.7.9)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "C:\Users\Mish Mash\Documents\School File\trial.py", line 7, in <module>
    background = pygame.image.load(path.join(img_dir,'Space-Background.png')).convert()
pygame.error: cannot convert without pygame.display initialized

The meaning of the following error: pygame.error: cannot convert without pygame.display initialized is that you are trying to use a method of pygame.display (the convert method) without initializing pygame first. The meaning of the following error: pygame.error: cannot convert without pygame.display initialized is that you are trying to use a method of pygame.display (the convert method) without initializing pygame first. To fix this, simply move pygame.init() to below the import statements.要解决此问题,只需将pygame.init()移至导入语句下方。

Code代码

import pygame
import random

from os import path

pygame.init()
pygame.mixer.init()

img_dir = path.join(path.dirname(__file__), 'PNG')

background = pygame.image.load(path.join(img_dir, 'Space-Background.png')).convert()
background_rect = background.get_rect()

WIDTH = 480
HEIGHT = 600
FPS = 60

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()


class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10

        self.speedx = 0

    def update(self):
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -5
        if keystate[pygame.K_RIGHT]:
            self.speedx = 5

        self.rect.x += self.speedx

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    def shoot(self):
        bullet = Bullet(self.rect.centrex, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)


class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()

        self.rect.x = random.randrange(0, WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 8)

    def update(self):
        self.rect.y += self.speedy

        if self.rect.top > HEIGHT + 10:
            self.rect.x = random.randrange(0, WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centrex = x
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy

        if self.rect.bottom < 0:
            self.kill()


# player_img = pygame.image.load(path.join(img_dir,"spaceShips_003.png")).convert()
# bullet_img = pygame.image.load(path.join(img_dir,"spaceMissile_006.png")).convert()
# mob_img = pygame.image.load(path.join(img_dir,"SpaceMeteor_004.png")).convert()

all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()

player = Player()

for i in range(8):
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

all_sprites.add(player)

running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()
    all_sprites.update()

    hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
    for hit in hits:
        m = Mob()
        all_sprites.add(m)

    hits = pygame.sprite.spritecollide(player, mobs, False)

    if hits:
        running = False

    screen.fill(BLACK)
    #    screen.split(background.background_rect)
    all_sprites.draw(screen)
    pygame.display.flip()

pygame.quit()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM