Программирование на Python с использованием pygame - PullRequest
0 голосов
/ 06 июля 2018

Мне было просто любопытно, если бы кто-то мог взглянуть на этот код и объяснить мне, почему изображения с ходьбой и вправо не оживляют, а левые ходят?Кроме того, у меня есть набор анимаций для стояния на месте, как вы думаете, что будет лучшим способом реализовать это?Наконец, я пытаюсь справиться с ООП.Это нормально или какие другие критические замечания вы бы предложили?Спасибо.

import pygame

WIDTH = 640
HEIGHT = 480
FPS = 100

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREY = (235, 235, 235)

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

import pygame
import character_tuple_list as tl
from settings import Settings

class Player(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        #Load in our sprite sheet with character data
        player_sheet = pygame.image.load(r'D:\Python Projects\Group Game\Character\Character 50x37.png').convert_alpha()
        self.image = pygame.transform.scale(player_sheet, (50, 37))

        #Get our coordinates or screen and image
        gm_settings = Settings()
        gm_settings.screen_height
        self.rect = self.image.get_rect()

        #Set image in the bottom middle of screen
        self.rect.centerx = 400 #center of rectangle
        self.rect.bottom = 470#pixels up from the bottom

        #Set the speed
        self.speedx = 0

        #Set Direction
        self.left = False
        self.right = False


        self.standing = []
        for image in tl.image_list_standing:
            self.standing.append(player_sheet.subsurface(image))    

        self.walking_right = []
        for image in tl.image_list_right:
            self.walking_right.append(player_sheet.subsurface(image))

        self.walking_left = []
        for inverse in self.walking_right:
            inverse = pygame.transform.flip(inverse, True, False)
            self.walking_left.append(inverse)    


    def update(self):

        gm_settings = Settings()
#        noi, time, current_image = 3,0,0
        pos_x = self.rect.x

        if self.right:
            frame = (pos_x // 30) % len(self.walking_right)
            self.image = self.walking_right[frame]
        if self.left:
            frame = (pos_x // 30) % len(self.walking_left)
            self.image = self.walking_left[frame]
        else:
            self.image = self.standing[0]

        self.speedx = 0 #Need these to make sure
        keystate = pygame.key.get_pressed()


        if keystate[pygame.K_LEFT]:
            self.speedx = -1
            self.left = True
            self.right = False

        elif keystate[pygame.K_RIGHT]:
            self.speedx = 1
            self.left = False
            self.right = True   

        else:
            self.right = False
            self.left = False

        self.rect.x += self.speedx

        #Set Walls for Width and Height
        if self.rect.right > gm_settings.screen_width:
            self.rect.rect = gm_settings.screen_width
        if self.rect.left < 0:
            self.rect.left = 0

all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)


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

    all_sprites.update()
    screen.fill(GREY)
    all_sprites.draw(screen)
    pygame.display.flip()

pygame.quit()# -*- coding: utf-8 -*-

1 Ответ

0 голосов
/ 06 июля 2018

Ваша проблема в условной группе, которую я цитирую ниже:

    if self.right:
        frame = (pos_x // 30) % len(self.walking_right)
        self.image = self.walking_right[frame]
    if self.left:
        frame = (pos_x // 30) % len(self.walking_left)
        self.image = self.walking_left[frame]
    else:
        self.image = self.standing[0]

Смотрите: если персонаж не идет влево (self.left), он будет следовать предложению else, и будет использоваться изображение стоя. Даже если следовать первому предложению if (self.right - True), изображение сбрасывается в положение в этом предложении else.

Просто измените строку if self.left: на elif self.left: - это предотвратит ввод условия else, когда self.right - True.

Сейчас я пропущу комментарии по аспектам ОО, поскольку они будут слишком широкими, но этот код совсем не плохой. Обращает на себя внимание тот факт, что метод update напрямую вызывает get_pressed в Pygame - поскольку одновременно не будет большого количества спрайтов, нуждающихся в вводе с клавиатуры, вы можете создать другой метод "update_movement", который будет принимать вектор возвращается get_pressed в качестве параметра и вызывается явно из основного цикла - это отделит ваш класс от особенностей клавиатуры pygame и даже освободит вашего персонажа от управления машиной или сетью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...