pygame我的玩家在移动时会让一切消失

2024-04-19 10:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

项目游戏

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仅当按下箭头键时,播放机不移动


Tags: thekeyrectimportselfeventgetif
1条回答
网友
1楼 · 发布于 2024-04-19 10:37:21

您正在检查播放机的handle_keys方法中的按键事件。任何keydown事件只注册一次,直到下一个keydup。您希望使用pygame.key.get_pressed(),它返回在任何给定时刻按下的所有键的dict。我已经为您修复了它以及清理了一点代码。您可能需要考虑使用delay或pygame的内置Clock类来控制帧速率。如果你注意到了,我不得不把你的动作改成非常小的数字(0.05从0.5改成0.05),因为你更新帧的速度太快了。加入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()

相关问题 更多 >