微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么pygame很少捕获我的主要输入?

如何解决为什么pygame很少捕获我的主要输入?

我同时在主游戏和测试文件中编写代码。但是,这一直是我移动球员时遇到的问题。我设置了标志来告诉我何时按下键,而pygame在我大多数的按键或释放键上都没有动作。有时会发生,并且我的播放器在屏幕上漂移。我在测试文件中重新编写了代码,并且效果很好!我继续以完全正确的格式将代码复制并粘贴回主游戏中,没有。同样的问题。为什么代码本身可以完美完成,而在主游戏中却不能做到?另外,为什么将播放器添加到Sprite组后仍未定义播放器。

import pygame,sys
from random import randint

pygame.init()
clock = pygame.time.Clock()

#note to self. snek_sprite is the player sprite for the game.
#birb_sprite is the purple boss sprite.

#Declare Variables Here
player_speed = 5
blue_speed = 6
red_speed = 7
purple_speed = 4
yellow_bullet_speed = 7
red_bullet_speed = 8
player_shoot_speed = 5 #shoot speed is shots per second
red_shoot_speed = 4
purple_shoot_speed = 1
yellow_shoot_speed = 10 #Yellow is high,but some will fail. Either 1/2 or 1/3 chance of firing... I'll fine tune it
level = 0
enemies = 0
screen_height = 700
screen_width = 1280
green = (0,255,0)
red = (255,0)
yellow_enemies = pygame.sprite.Group()
player_sprites = pygame.sprite.Group()
red_enemies = []
blue_enemies = []
all_sprites = pygame.sprite.Group()
enemy_bullets = pygame.sprite.Group()
player_rect = pygame.Rect((screen_width//2 - 16,screen_height//2 - 16),(32,32))
enemy_one = pygame.Rect((25,25),32))
enemy_two = pygame.Rect((screen_width//2 - 16,32))
mount = pygame.Rect((0,0),32))

#Lets load in sprites
player_sprite = pygame.image.load("snek_sprite.PNG")
yellow_sprite = pygame.image.load("yellow_sprite.PNG")
purple_sprite = pygame.image.load("purple_sprite.PNG")

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((32,32))
        self.image.blit(player_sprite,mount)
        self.rect = player_rect
        self.x = self.rect.x
        self.y = self.rect.y
        self.x_speed = 0
        self.y_speed = 0
        all_sprites.add(self)
        player_sprites.add(self)

    def get_speed(self):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                self.y_speed = -3
                print("up")
            elif event.key == pygame.K_DOWN:
                self.y_speed = 3
                print("down")
            if event.key == pygame.K_RIGHT:
                self.x_speed = 3
                print("right")
            if event.key == pygame.K_LEFT:
                self.x_speed = -3
                print("left")
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                self.y_speed = 0
                if event.key == pygame.K_UP:
                    print("Up Up")
                else:
                    print("Down Up")
            if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
                self.x_speed = 0
                    
    def movement(self): 
        self.x = self.x + self.x_speed
        self.y = self.y + self.y_speed
        self.rect = pygame.Rect((self.x,self.y),32))
        if self.x < 0:
            self.x = 0
        elif self.x > 1280 - 32:
            self.x = 1280 - 32
        if self.y < 0:
            self.y = 0
        elif self.y > 700 - 32:
            self.y = 700 - 32
        
            
class Yellow_Enemy(pygame.sprite.Sprite):
    def __init__(self,rect):
        global enemies
        super().__init__()
        self.image = pygame.Surface((32,32))
        self.image.blit(yellow_sprite,mount)
        self.rect = rect
        self.x = rect.x
        self.y = rect.y
        enemies = enemies + 1
        all_sprites.add(self)
        yellow_enemies.add(self)

    def shoot(self):
        bullet = Bullet(self)
        all_sprites.add(bullet)
        enemy_bullets.add(bullet)
        for bullet in enemy_bullets:
            bullet.movement()

    def update(self):
        screen.blit(yellow_surface,self.rect)
        
class Bullet(pygame.sprite.Sprite):
    def __init__(self,enemy):
        super().__init__()
        self.image = pygame.Surface((4,4))
        self.image.fill(red)
        self.x = enemy.x + 16
        self.y = enemy.y + 16
        self.x_speed = 3
        self.y_speed = 3
        self.rect = ((self.x,(4,4))
        self.x_direction = randint(-1,1)
        self.y_direction = randint(-1,1)
        self.x_speed = self.x_speed * self.x_direction
        self.y_speed = self.y_speed * self.y_direction

    def movement(self):
        self.x = self.x + self.x_speed
        self.y = self.y + self.y_speed
        self.rect = ((self.x,4))
        if self.x > 1280 or self.x < 0 or self.y > 700 or self.y < 0:
            self.kill()
    

#Creates the screen
screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption("Bullet Hell Game")

def red_movement():
    pass

def blue_movement():
    pass

def purple_movement():
    pass

def is_quit():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

def is_clear():
    global level
    if enemies == 0:
        level = level + 1
        if level == 1:
            start_level_one()
        elif level == 2:
            start_level_two()
        elif level == 3:
            start_level_three()
        elif level == 4:
            start_level_four()
        elif level == 5:
            start_level_five()
        elif level == 6:
            game_win()

def start_level_one():
    global yellow_enemies,player
    yellow_guys = 2
    yellow_spawns = [enemy_one,enemy_two]
    screen.fill(green)
    for enemy in range(yellow_guys):
        yellow_guy = Yellow_Enemy(yellow_spawns[enemy])

player = Player() #I have to redifine the player here for player movement to work. Is that where the issue might be?

while True:
    is_quit()
    screen.fill(green)
    for event in pygame.event.get():
        player.get_speed()
    player.movement()
    for enemy in yellow_enemies:
        enemy.shoot()
    all_sprites.draw(screen)
    red_movement()
    blue_movement()
    purple_movement()
    is_clear()
    pygame.display.flip()
    clock.tick(30)

我知道有很多代码,我表示歉意,但据我所知应该没有任何错误,所以我猜是否有错误可能在任何地方。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。