首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想知道为什么我的球员和我的气球,都是精灵,当我移动播放器时口吃

我想知道为什么我的球员和我的气球,都是精灵,当我移动播放器时口吃
EN

Stack Overflow用户
提问于 2020-12-08 22:50:19
回答 1查看 39关注 0票数 2

每当我使用WASD键(这是我的运动控制)时,我的帧就会下降,游戏基本上就会停止。它应该使水球移动,但当我停止运动时,水球也会移动。他们都是精灵。我可能把他们搞混了,因为有两个精灵家族。

main.py:

代码语言:javascript
复制
import pygame
from player import Player
from projectile import WaterBaloon

# Start the game
pygame.init()
game_width = 1000
game_height = 650
screen = pygame.display.set_mode((game_width, game_height))
clock = pygame.time.Clock()
running = True

bg_image = pygame.image.load("../assets/BG_Sand.png")

#make all the sprite groups
playerGroup = pygame.sprite.Group()
projectilesGroup = pygame.sprite.Group()

#put every sprite class in a group
Player.containers = playerGroup
WaterBaloon.containers = projectilesGroup
#tell the sprites where they are gonna be drawn at
mr_player = Player(screen, game_width/2, game_height/2)

# ***************** Loop Land Below *****************
# Everything under 'while running' will be repeated over and over again
while running:
    # Makes the game stop if the player clicks the X or presses esc
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False
            
        #player input that detects keys (to move)       
        keys = pygame.key.get_pressed()
        if keys[pygame.K_d]:
            mr_player.move(1, 0)
        if keys[pygame.K_a]:
            mr_player.move(-1, 0)
        if keys[pygame.K_w]:
            mr_player.move(0, -1)
        if keys[pygame.K_s]:
            mr_player.move(0, 1)
        if pygame.mouse.get_pressed()[0]:
            mr_player.shoot()
#blit the bg image
        screen.blit((bg_image),(0, 0))
#update the player
        mr_player.update()
#update all the projectiles
        for projectile in projectilesGroup:
            projectile.update()
            
        # Tell pygame to update the screen
        pygame.display.flip()
        clock.tick(60)
        pygame.display.set_caption("ATTACK OF THE ROBOTS fps: " + str(clock.get_fps()))

player.py:

代码语言:javascript
复制
import pygame
import toolbox
import projectile
#Players Brain
class Player(pygame.sprite.Sprite):
#player constructor function
    def __init__(self, screen, x, y):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.screen = screen
        self.x = x
        self.y = y
        self.image = pygame.image.load("../assets/player_03.png")
        #rectangle for player sprite
        self.rect = self.image.get_rect()
        self.rect.center = (self.x, self.y)
        #end of rectangle for player sprite
        self.speed = 8
        self.angle = 0
        
    #player update function
    def update(self):
        self.rect.center = (self.x, self.y)

        mouse_x, mouse_y = pygame.mouse.get_pos()
        self.angle = toolbox.angleBetweenPoints(self.x, self.y, mouse_x, mouse_y)
            
        #get the rotated version of player
        image_to_draw, image_rect = toolbox.getRotatedImage(self.image, self.rect, self.angle)
        
        
        self.screen.blit(image_to_draw, image_rect)
        
    #tells the computer how to make the player move
    def move(self, x_movement, y_movement):
        self.x += self.speed * x_movement
        self.y += self.speed * y_movement

#shoot function to make a WaterBaloon
    def shoot(self):
        projectile.WaterBaloon(self.screen, self.x, self.y, self.angle)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 23:32:45

每帧只处理一个事件。这是因为您已经将您所做的所有操作都放在了事件处理循环的框架内。当您开始以更高的速率获取事件(例如键压事件和发布事件)时,可能会出现故障。如果事件尚未全部处理,则程序可能无法正确更新屏幕。

您可能希望主循环只执行for event in pygame.event.get():循环中的事件处理。其他一切都应该由一个级别不缩进,以便在处理所有挂起的事件之后,在外部的while running:循环中运行。

试着做这样的事情:

代码语言:javascript
复制
while running:
    # Makes the game stop if the player clicks the X or presses esc
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False
            
    #player input that detects keys (to move)    # unindent here (and all the lines below)
    keys = pygame.key.get_pressed()
    ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65208077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档