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

проект игры

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.fill((255,255,255))     # fill the background white 
White = (255,255,255)

----------------------------------------------- ----------------------

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
    for e in pygame.event.get():
        if e.type == KEYDOWN:
            key = e.key
            if key == K_LEFT:
                self.draw_rect(-0.5,0)
            elif key == K_RIGHT:
                self.draw_rect(0.5,0)
            elif key == K_UP:
                self.draw_rect(0,-0.5)
            elif key == K_DOWN:
                self.draw_rect(0,0.5)
            elif key == K_SPACE:
                self.draw_rect(2,-3)
            if self.rect.right > 1400:
                self.rect.right = 1400
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.bottom > 500:
                self.rect.bottom = 500
            if self.rect.top < 0:
                self.rect.top = 0




player = Player()

----------------------------------------------- -------------------------

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))  

enemy = Enemy()


pygame.display.flip()   #updates the whole screen

def main():  #my main loop 
    while True:
        player.handle_keys()

    for event in pygame.event.get
        if event.type == pygame.QUIT:
            running = False
if __name__ == '__main__': main()

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

Ext игрок не двигается, когда клавиши со стрелками удерживаются только при нажатии

1 Ответ

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

Вы проверяли события нажатия клавиш в методе handle_keys вашего игрока. Любые события нажатия клавиш регистрируются только один раз до следующего нажатия. Вы хотите использовать pygame.key.get_pressed(), который возвращает указание всех нажатых клавиш в любой данный момент. Я исправил это для вас, а также немного очистил код. Возможно, вы захотите использовать задержку или встроенный класс Pygame Clock для управления частотой кадров. Если вы заметили, мне пришлось изменить ваши движения на очень маленькие цифры (0,05 из 0,5) из-за того, как быстро вы обновляете свои кадры. Добавление в time.sleep() или часы Pygame это исправит.

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.fill((255,255,255))     # fill the background white 
White = (255,255,255)

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(2,-3)
        if self.rect.right > 1400:
            self.rect.right = 1400
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > 500:
            self.rect.bottom = 500
        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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...