Pygame мой вражеский класс исчезает после движения - PullRequest
0 голосов
/ 09 ноября 2018

Код работает нормально, когда вы впервые загружаете игру, там есть два прямоугольника, но когда игрок перемещается, прямоугольник противника исчезает.

EXTENSION Я пытаюсь заставить вражеский класс постоянно двигаться вверх и вниз без необходимости нажимать какие-либо клавиши.

import pygame
import os 
import random 
from pygame.locals import * # Constants
import math
import sys
import random

pygame.init()  

screen=pygame.display.set_mode((1280,720)) #(length,height)
screen_rect=screen.get_rect()
background = pygame.Surface(screen.get_size())
background = pygame.image.load('stage.png').convert()
screen.blit(background, (0, 0))

class Player(pygame.sprite.Sprite):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0,0,128), (50,560,50,25)) #(colour)(x-position,y-position,width,height)
        self.dist = 100

    def draw_rect(self,x,y):    # This is my code which should make the player move
        screen.blit(background, (0, 0)) #If this isn't included then when the rectangle moves it's old positon will still be on the screen
        self.rect = self.rect.move(x*self.dist, y*self.dist); pygame.draw.rect(screen, (0, 0, 128), self.rect)
        pygame.display.update()

    def handle_keys(self): # code to make the character move when the arrow keys are pressed
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
            self.draw_rect(-0.05,0)
        elif keys[K_RIGHT]:
            self.draw_rect(0.05,0)
        elif keys[K_UP]:
            self.draw_rect(0,-0.05)
        elif keys[K_DOWN]:
            self.draw_rect(0,0.05)
        elif keys[K_SPACE]:
            self.draw_rect(0.05,-0.05)
        if self.rect.right > 1280:
            self.rect.right = 1280
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > 720:
            self.rect.bottom = 720
        if self.rect.top < 0:
            self.rect.top = 0

class Enemy(pygame.sprite.Sprite): # the enemy class which works fine
    def __init__(self):
        x = random.randint(50,450)
        self.rect = pygame.draw.rect(screen, (128,0,0), (300,x,50,25))


player = Player()
enemy = Enemy()

def main():  #my main loop 
    running = True
    while running:
        player.handle_keys()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        pygame.display.flip()   #updates the whole screen

if __name__ == '__main__': main()

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы должны очищать экран каждый кадр - вы можете сделать это, стирая фон - и впоследствии рисовать спрайты. Отделите движение от кода чертежа, чтобы спрайты можно было стереть после очистки экрана.

class Player(pygame.sprite.Sprite):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0,0,128), (50,560,50,25))
        self.dist = 100

    # Separate the movement and the drawing.
    def move(self, x, y):
        self.rect = self.rect.move(x*self.dist, y*self.dist)

    def draw(self, screen):
        pygame.draw.rect(screen, (0, 0, 128), self.rect)

    def handle_keys(self):
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
            self.move(-0.05,0)
        elif keys[K_RIGHT]:
            self.move(0.05,0)
        elif keys[K_UP]:
            self.move(0,-0.05)
        elif keys[K_DOWN]:
            self.move(0,0.05)
        elif keys[K_SPACE]:
            self.move(0.05,-0.05)
        if self.rect.right > 1280:
            self.rect.right = 1280
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > 720:
            self.rect.bottom = 720
        if self.rect.top < 0:
            self.rect.top = 0


class Enemy(pygame.sprite.Sprite):

    def __init__(self):
        self.x = random.randint(50,450)  # x is now an attribute.

    def draw(self, screen):
        self.rect = pygame.draw.rect(screen, (128,0,0), (300, self.x, 50, 25))


def main():
    clock = pygame.time.Clock()  # A clock to limit the frame rate.
    player = Player()
    enemy = Enemy()

    running = True
    while running:
        player.handle_keys()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # Clear the screen every frame by blitting the background.
        screen.blit(background, (0, 0))
        # Then draw the enemy and the player.
        enemy.draw(screen)
        player.draw(screen)
        pygame.display.flip()
        clock.tick(60)  # Limit the frame rate to 60 FPS.

Я также рекомендую проверить, как работают группы спрайтов, тогда вы можете избавиться от методов draw и просто вызвать sprite_group.draw(screen), чтобы нарисовать каждый содержащийся спрайт. Вот учебник .

0 голосов
/ 09 ноября 2018

вы рисуете спрайты только тогда, когда класс установлен в __init__()

, вы должны рисовать их каждый цикл в функции main() прямо перед pygame.display.flip()

как сейчас обстоят дела, ни игрок, ни враг не должны отображаться за пределами первого кадра

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