簡體   English   中英

無法在pygame中移動捕手角色

[英]Can't move catcher character in pygame

嘗試制作一款讓我的接球手接住棒球的游戲。 如果棒球被接住,屏幕頂部會隨機出現一個新棒球。 做出更改后,我似乎無法移動捕手。 游戲是通過python和pygame制作的。

捕捉.py

import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from catcher import Catcher
from baseball import Baseball
import game_functions as gf

def run_game():
    """Initializes the game, screen, and settings."""
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Catch")

    catcher = Group()
    baseball = Group()

    while True:
        gf.check_events(catcher)
        gf.update_catcher(ai_settings, screen, catcher)
        gf.update_baseball(ai_settings, screen, catcher, baseball)
        gf.update_screen(ai_settings, screen, catcher, baseball)

run_game()

棒球.py

import pygame
from pygame.sprite import Sprite

class Baseball(Sprite):
    """A class to represent a baseball."""

    def __init__(self, ai_settings, screen):
        super().__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        # Load the baseball image and set its rect attribute.
        self.image = pygame.image.load('images/baseball.bmp')
        self.rect = self.image.get_rect()

        # Start each new baseball at a random position at the top of the screen.
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height 

        # Store the alien's exact position.
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def blitme(self):
        """Draw the baseball at tis current location."""
        self.screen.blit(self.image, self.rect)

    def update(self):
        """Dropping the baseball."""
        self.y += self.ai_settings.baseball_drop_speed
        self.rect.y = self.y

捕手.py

import pygame
from pygame.sprite import Sprite

class Catcher(Sprite):

    def __init__(self, ai_settings, screen):
        """Initialize the catcher and set its starting position."""
        super().__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        # Load the catcher image and get its rect.
        self.image = pygame.image.load('images/catcher.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        # Start each new catcher at the bottom center of the screen.
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        # Store a decimal value for the catcher's center.
        self.center = float(self.rect.centerx)

        # Movement flags
        self.moving_right = False
        self.moving_left = False

    def update(self, ai_settings, screen):
        """Update the catcher's position baed on the movement flag."""
        # Update the catcher's center value, not the rect.
        if self.moving_right and self.rect.right <= self.screen_rect.right:
            self.center += self.ai_settings.catcher_speed_factor
        if self.moving_left and self.rect.left >= 0:
            self.center -= self.ai_settings.catcher_speed_factor

        # Update rect object from self.center.
        self.rect.centerx = self.center

    def blitme(self):
        """Draw the catcher at its current location."""
        self.screen.blit(self.image, self.rect)

游戲函數.py

import sys
import pygame

from baseball import Baseball
from catcher import Catcher
from random import randint

def check_keydown_events(event, catcher):
    """Respond to keypresses."""
    if event.key == pygame.K_RIGHT:
        catcher.moving_right = True
    elif event.key == pygame.K_LEFT:
        catcher.moving_left = True
    elif event.key == pygame.K_q:
        sys.exit()

def check_keyup_events(event, catcher):
    """Respond to key releases."""
    if event.key == pygame.K_RIGHT:
        catcher.moving_right = False
    elif event.key == pygame.K_LEFT:
        catcher.moving_left = False

def check_events(catcher):
    """Respond to keypresses and mouse events."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, catcher)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event, catcher)

def update_screen(ai_settings, screen, catcher, baseball):
    """Update images on the screen and flip to the new screen."""
    # Redraw the screen during each pass through the loop.
    screen.fill(ai_settings.bg_color)
    catcher.draw(screen)
    baseball.draw(screen)
    # Make the most recently drawn screen visible.
    pygame.display.flip()

def update_baseball(ai_settings, screen, catcher, baseball):
    """Update the positions of the baseball and detect collisions."""
    screen_rect = screen.get_rect()
    baseball.update()
    if len(baseball) == 0:
        new_ball = Baseball(ai_settings, screen)
        new_ball.x = randint(new_ball.rect.width, screen_rect.right - new_ball.rect.width)
        new_ball.rect.x = new_ball.x
        new_ball.y = new_ball.rect.height
        new_ball.rect.y = new_ball.y
        baseball.add(new_ball)
    collisions = pygame.sprite.groupcollide(baseball, catcher, True, False)

def update_catcher(ai_settings, screen, catcher):
    screen_rect = screen.get_rect()
    catcher.update(ai_settings, screen)
    if len(catcher) == 0:
        new_catcher = Catcher(ai_settings, screen)
        new_catcher.center = screen_rect.centerx
        new_catcher.rect.centerx = new_catcher.center
        new_catcher.rect.bottom = screen_rect.bottom
        catcher.add(new_catcher)

設置.py

import pygame

class Settings():
    """Class to store settings."""

    def __init__(self):
        """Initializes the game's settings."""
        # Screen settings.
        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (255, 255, 255)

        # Ship settings.
        self.catcher_speed_factor = 1.5

        # Baseball settings.
        self.baseball_drop_speed = float(1 / 2)

問題是catcherGroup而不是Catcher(Sprite)的實例:

 catcher = Group() while True: check_events(catcher)

這導致屬性moving_rightmoving_left分別設置為check_keyup_events中的Group對象check_keydown_events

您必須更改Group中對象的屬性:

def check_keydown_events(event, catcher):
    """Respond to keypresses."""
    if event.key == pygame.K_RIGHT:
        for c in catcher:
            c.moving_right = True
    elif event.key == pygame.K_LEFT:
        for c in catcher:
            c.moving_left = True
    elif event.key == pygame.K_q:
        sys.exit()

def check_keyup_events(event, catcher):
    """Respond to key releases."""
    if event.key == pygame.K_RIGHT:
        for c in catcher:
            c.moving_right = False
    elif event.key == pygame.K_LEFT:
        for c in catcher:
            c.moving_left = False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM