我的 While 循环在我的 pygame 的 python 代码中无法正常运行

问题描述 投票:0回答:1

我正在我的游戏中创建一个平滑闪避运动的功能。我有一个可以在另一个文件中工作的函数,但在我的主游戏文件中 while 循环不起作用。我在循环之前和之后添加了一个打印函数,两者都被打印,但是循环中的那个不循环。它打印一次,然后就完成了。该函数应该按照增量移动玩家。我怎样才能让我的循环真正按预期运行?

这是我的功能

    def dodge_multiple_dir(self, x_increment, y_increment, clock):        
        print("Hello World")
        while True:
            clock += speed_of_game_movement
            new_clock = round(clock / increment_for_every)
            if clock <= max_time:
                if new_clock * increment_for_every == clock:
                    print("Debug")
                    self.movement["left"] = False
                    self.movement["right"] = False
                    self.movement["up"] = False
                    self.movement["down"] = False
                    self.vel_x += x_increment
                    self.vel_y += y_increment

            else:
                break
            
            print("Loop")
            return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]
        return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]

这是主要代码,仅供参考,有图像,但我有一个 github 存储库,您可以从中获取代码。 https://github.com/DarthMooMancer/StackOverflow

import pygame
from pygame import mixer
import math
from os import path
from settings import *
import sys

def init():
    pygame.mixer.pre_init(44100, -16, 2, 512)
    mixer.init()
    pygame.init()
    win = pygame.display.set_mode((ScreenWidth, ScreenHeight), vsync=1)
    pygame.display.set_caption("Gloombound")
    clock = pygame.time.Clock()
    font = pygame.font.Font('freesansbold.ttf', font_size[0])
    pixel_font = pygame.font.Font('Minecraft.ttf', font_size[1])
    
    return win, clock, font, pixel_font

def load_data(map_file):
    global map_data
    map_data = []
    game_folder = path.dirname(__file__)
    img_folder = path.join(game_folder, 'img')
    map_folder = path.join(game_folder, "maps")
    sound_folder = path.join(game_folder, "sounds")
    with open(path.join(map_folder, map_file), 'rt') as f:
        for line in f:
            map_data.append(line.strip())     
            
    return img_folder, sound_folder

def draw_text(text, font, color, surface, pos):
    textobj = font.render(text, 1, color)
    surface.blit(textobj, pos)

win, clock, font, pixel_font = init()
            
current_map = 'map.txt'
previous_map = ""
default_slider_pos = 500
img_folder, sound_folder = load_data(current_map)

# Load Images
play_img = pygame.transform.scale(pygame.image.load(path.join(img_folder,'play_button.png')), button_size).convert_alpha()
play_img_alt = pygame.transform.scale(pygame.image.load(path.join(img_folder,'play_button_alt.png')), button_size).convert_alpha()
quit_img = pygame.transform.scale(pygame.image.load(path.join(img_folder,'quit_button.png')), button_size).convert_alpha()
quit_img_alt = pygame.transform.scale(pygame.image.load(path.join(img_folder,'quit_button_alt.png')), button_size).convert_alpha()
continue_img = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'continue_button.png')), pause_button_size).convert_alpha()
continue_img_alt = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'continue_button_alt.png')), pause_button_size).convert_alpha()
main_menu = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'main_menu_button.png')), pause_button_size).convert_alpha()
main_menu_alt = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'main_menu_button_alt.png')), pause_button_size).convert_alpha()
settings_img = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'settings_button.png')), pause_button_size).convert_alpha()
settings_img_alt = pygame.transform.scale(pygame.image.load(path.join(img_folder, 'settings_button_alt.png')), pause_button_size).convert_alpha()

# Load Sounds
player_hit = pygame.mixer.Sound(path.join(sound_folder, "player_hit.wav"))
player_mainclock = 0
global_volume = 99
new_volume = 10
mainclock = 0
max_time = 80
distance = 0
increment = 13
speed_of_game_movement = 3
increment_for_every = 5

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.groups = sprite_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = pygame.Surface((TILESIZE, TILESIZE))
        self.image.fill((40, 132, 200))
        self.rect = self.image.get_rect(topleft=(300, 400))
        self.vel_x = 0
        self.vel_y = 0
        self.mainclock = 0
        self.current_time = (self.mainclock / 100) / 10
        self.health = PLAYER_HEALTH
        self.movement = {"up": False, "down": False, "left": False, "right": False, "dodge": False}
        self.test_point_topleft = (self.rect.x, self.rect.y)
        self.test_point_topright = (self.rect.x + TILESIZE, self.rect.y)
        self.test_point_bottomleft = (self.rect.x, self.rect.y + TILESIZE)
        self.test_point_bottomright = (self.rect.x + TILESIZE, self.rect.y + TILESIZE)
        
        # Update player initial position
        for row, tiles in enumerate(map_data):
            for col, tile in enumerate(tiles):
                if tile == 'e':
                    self.rect.topleft = (col * TILESIZE, row * TILESIZE)
   
    def reset_movement(self):
        self.vel_x = 0
        self.vel_y = 0
        self.movement = {"up": False, "down": False, "left": False, "right": False, "dodge": False}

    def check_map_change(self, current_map, map_data, prev_map):
        tile_x = self.rect.centerx // TILESIZE
        tile_y = self.rect.centery // TILESIZE

        # Check if player has collided with 'P' to switch to map2
        if current_map == "map.txt" and map_data[tile_y][tile_x] == "P":
            prev_map = current_map
            current_map = g.switch_map("map2.txt", "E")
            
        if current_map == 'map2.txt' and self.rect.x < 10 and map_data[tile_y][tile_x] == "P":
            prev_map = current_map
            current_map = g.switch_map("map.txt", "E")
            
        if current_map == 'map2.txt' and map_data[tile_y][tile_x] == "Q":
            prev_map = current_map
            current_map = g.switch_map("map3.txt", "E")
            
        if current_map == 'map3.txt' and map_data[tile_y][tile_x] == "P":
            prev_map = current_map
            current_map = g.switch_map('map2.txt', "R")

        return current_map
    
    def event_handler(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                self.movement["up"] = True
            if event.key == pygame.K_DOWN:
                self.movement["down"] = True
            if event.key == pygame.K_LEFT:
                self.movement["left"] = True
            if event.key == pygame.K_RIGHT:
                self.movement["right"] = True
            if event.key == pygame.K_z:
                self.movement["dodge"] = True

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                self.movement["up"] = False
                self.vel_y = 0
            if event.key == pygame.K_DOWN:
                self.movement["down"] = False
                self.vel_y = 0
            if event.key == pygame.K_LEFT:
                self.movement["left"] = False
                self.vel_x = 0
            if event.key == pygame.K_RIGHT:
                self.movement["right"] = False
                self.vel_x = 0
            if event.key == pygame.K_z:
                self.movement["dodge"] = False 
            
    def draw_player_stats(self, surf, x, y, pct, color, max_stat, half_stat):
        pct = max(pct, 0)
        BAR_LENGTH = 100
        BAR_HEIGHT = 20
        fill = pct * BAR_LENGTH
        outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)
        fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
        if pct > max_stat:
            col = GREEN
        elif pct > half_stat:
            col = YELLOW
        else:
            col = RED
        pygame.draw.rect(surf, col, fill_rect)
        pygame.draw.rect(surf, color, outline_rect, 2)
    
    def draw_cirle(self):
        return pygame.draw.circle(win, WHITE, (self.rect.x + TILESIZE // 2, self.rect.y + TILESIZE // 2), TILESIZE, 2)
    
    def radius_check_point(self, test_point):
        if enemy.point_in_circle(*test_point):
            pygame.draw.circle(win, (255, 255, 255), (test_point), 5)
        else:
            pygame.draw.circle(win, (255, 255, 255), (test_point), 5)
    
    def dodge_multiple_dir(self, x_increment, y_increment, clock):        
        print("Hello World")
        while True:
            clock += speed_of_game_movement
            new_clock = round(clock / increment_for_every)
            if clock <= max_time:
                if new_clock * increment_for_every == clock:
                    print("Debug")
                    self.movement["left"] = False
                    self.movement["right"] = False
                    self.movement["up"] = False
                    self.movement["down"] = False
                    self.vel_x += x_increment
                    self.vel_y += y_increment

            else:
                break
            
            print("Loop")
            return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]
        return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]
    def update(self):
        self.test_point_topleft = (self.rect.x, self.rect.y)
        self.test_point_topright = (self.rect.x + TILESIZE, self.rect.y)
        self.test_point_bottomleft = (self.rect.x, self.rect.y + TILESIZE)
        self.test_point_bottomright = (self.rect.x + TILESIZE, self.rect.y + TILESIZE)
        
        if ((self.mainclock / 100) / 10) >= 1:
            self.mainclock += 0
            
        else:
            self.mainclock += 1.6
        self.current_time = (self.mainclock / 100) / 100
        
        self.draw_player_stats(win, 150, 740, (self.mainclock / 100) / 10, BLACK, 1, .5)
        self.draw_player_stats(win, 40, 740, self.health / PLAYER_HEALTH, BLACK, .6, .3)
        self.draw_cirle()

        self.radius_check_point(self.test_point_bottomleft)
        self.radius_check_point(self.test_point_bottomright)
        self.radius_check_point(self.test_point_topleft)
        self.radius_check_point(self.test_point_topright)
        
        self.rect.clamp_ip(0, 0, ScreenWidth, ScreenHeight) 

        self.rect.x += self.vel_x
        self.collision_sprites = pygame.sprite.spritecollide(self, walls, False)
        for sprite in self.collision_sprites:
            if self.vel_x > 0:  # Moving right
                self.rect.right = sprite.rect.left

            elif self.vel_x < 0:  # Moving left
                self.rect.left = sprite.rect.right

        self.rect.y += self.vel_y
        self.collision_sprites = pygame.sprite.spritecollide(self, walls, False)
        for sprite in self.collision_sprites:
            if self.vel_y > 0:  # Moving down
                self.rect.bottom = sprite.rect.top
            elif self.vel_y < 0:  # Moving up
                self.rect.top = sprite.rect.bottom
        
        # Movement
        if self.movement["up"]:
            self.vel_y = -PLAYER_SPEED
        if self.movement["down"]: 
            self.vel_y = PLAYER_SPEED
        if self.movement["left"]: 
            self.vel_x = -PLAYER_SPEED
        if self.movement["right"]: 
            self.vel_x = PLAYER_SPEED

        if self.movement["dodge"]:
        # Dodge Functionality 
            if self.current_time < .1:
                self.movement["dodge"] = False

            elif self.current_time >= .1:
                self.mainclock = 0

                if self.movement["up"]:
                    self.dodge_multiple_dir(0, -increment, mainclock)
                if self.movement["down"]:
                    self.vel_y = DODGE_DISTANCE
                if self.movement["left"]:
                    self.vel_x = -DODGE_DISTANCE
                if self.movement["right"]:
                    self.vel_x = DODGE_DISTANCE        
                    
class Wall(pygame.sprite.Sprite):
    def __init__(self, x, y, map_data):
        pygame.sprite.Sprite.__init__(self, walls, sprite_group)
        self.image = pygame.Surface((TILESIZE, TILESIZE))
        self.image.fill(BLUE)
        self.rect = pygame.Rect((x * TILESIZE, y * TILESIZE), (TILESIZE, TILESIZE))
        self.x =  x
        self.y = y

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.groups = sprite_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = pygame.Surface((TILESIZE, TILESIZE))
        self.image.fill((200, 132, 12))
        self.rect = self.image.get_rect(center=(ScreenWidth // 2 + 40, ScreenHeight // 2 + 80))
        self.health = MOB_HEALTH
        self.speed = MOB_SPEED
        self.vel_x = 0
        self.vel_y = 0
        self.center = (self.rect.centerx, self.rect.centery)  # Center of the enemy
        self.radius = 200
        self.circle_color = (255, 0, 0)  # Red color for the circle

    def point_in_circle(self, x, y):
        return math.sqrt((x - self.center[0]) ** 2 + (y - self.center[1]) ** 2) <= self.radius

    def calculate_distance(self, player):
        dx = player.rect.centerx - self.rect.centerx
        dy = player.rect.centery - self.rect.centery
        distance = math.hypot(dx, dy)
        return distance, dx, dy

    def update(self):
        distance, dx, dy = self.calculate_distance(player)

        self.vel_x = 0
        self.vel_y = 0

        player_center_x, player_center_y = player.rect.centerx, player.rect.centery
        enemy_center_x, enemy_center_y = self.rect.centerx, self.rect.centery

        distance_to_player = math.hypot(player_center_x - enemy_center_x, player_center_y - enemy_center_y)

        # Handle collision with walls
        self.rect.clamp_ip(0, 0, ScreenWidth, ScreenHeight)

        # Draw the circle only when the player is within a certain distance
        if distance < 1000:  # Adjust the distance threshold as needed
            pygame.draw.circle(win, self.circle_color, (self.rect.centerx, self.rect.centery), self.radius, 2)

        # Check if the player is inside the enemy's circle
        if distance_to_player <= self.radius:
            # Move towards the player if the player is inside the circle
            self.vel_x += self.speed * dx / distance
            self.vel_y += self.speed * dy / distance
        
        else:
            # Implement idle movement behavior (move up and down slowly)
            if pygame.time.get_ticks() % 2000 < 1000:  # Change direction every 2 seconds
                self.vel_y = 1  # Move down slowly
                
            else:
                self.vel_y = -1  # Move up slowly

        # Handle collision with the player
        collision = pygame.sprite.spritecollideany(self, sprite_group)
        if collision and isinstance(collision, Player):
            collision.health -= 10
            dx = self.rect.centerx - collision.rect.centerx
            dy = self.rect.centery - collision.rect.centery
            distance = math.hypot(dx, dy)
            if distance != 0:
                # Knock back player in the opposite direction
                pygame.mixer.Sound.play(player_hit)
                collision.rect.x -= 30 * dx / distance
                collision.rect.y -= 30 * dy / distance

        # Horizontal movement
        self.rect.x += self.vel_x
        collision_sprites = pygame.sprite.spritecollide(self, walls, False)
        for sprite in collision_sprites:
            if self.vel_x > 0:  # Moving right
                self.rect.right = sprite.rect.left
            elif self.vel_x < 0:  # Moving left
                self.rect.left = sprite.rect.right

        # Vertical movement
        self.rect.y += self.vel_y
        collision_sprites = pygame.sprite.spritecollide(self, walls, False)
        for sprite in collision_sprites:
            if self.vel_y > 0:  # Moving down
                self.rect.bottom = sprite.rect.top
            elif self.vel_y < 0:  # Moving up
                self.rect.top = sprite.rect.bottom
                        
class Button(pygame.sprite.Sprite):
    def __init__(self, screen, img, img_alt, x, y, group, command=None, command_args=None, debug=None, collision_offset=(0, 0)):
        super().__init__()
        self.groups = group
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = img
        self.image_get = img
        self.image_alt = img_alt
        self.command = command
        self.command_args = command_args
        self.x = x
        self.y = y
        self.screen = screen
        self.debug = debug
        self.rect = self.image.get_rect()
        self.mx, self.my = pygame.mouse.get_pos()

        # Create collision rect with offset from image rect
        self.collision_offset = collision_offset
        self.collision_rect = pygame.Rect(x + collision_offset[0], y + collision_offset[1], self.rect.width - 2*collision_offset[0], self.rect.height - 2*collision_offset[1])

    def collision(self):
        self.mx, self.my = pygame.mouse.get_pos()
        if self.collision_rect.collidepoint((self.mx, self.my)):
            self.image = self.image_alt
            if pygame.mouse.get_pressed()[0]:
                if callable(self.command):
                    self.command(*self.command_args)
        else:
            self.image = self.image_get

    def Debug(self, screen):
        if self.debug:
            screen.blit(self.image, self.rect)
            pygame.draw.rect(screen, pygame.Color("white"), self.collision_rect, 2)
            
    def update(self):
        self.mx, self.my = pygame.mouse.get_pos()
        self.rect.topleft = (self.x, self.y)
        
        # Move collision rect with same offset from image rect
        self.collision_rect.topleft = (self.x + self.collision_offset[0], self.y + self.collision_offset[1])
        self.collision_rect.width = self.rect.width - 2*self.collision_offset[0]
        self.collision_rect.height = self.rect.height - 2*self.collision_offset[1]
        
        self.collision()
        self.Debug(self.screen)

class Slider(pygame.sprite.Sprite):
    def __init__(self, x, y, color, min_volume, max_volume):
        super().__init__()
        self.size = [50, 50]
        self.image = pygame.Surface((self.size[0], self.size[1]))
        self.image.fill(color)
        self.rect = self.image.get_rect(topleft=(x, y))
        self.min_volume = min_volume
        self.max_volume = max_volume
        self.new_volume = 0
        self.step_size = 40  # Increment by 10
        self.snap_positions = [i for i in range(0, ScreenWidth, self.step_size)]
        self.percentage = 0.0
        self.current_snap_index = len(self.snap_positions) // 2  # Start at the middle position
        self.dragging = False

    def update(self):
        global new_volume, default_slider_pos, slider_volume
        mx, my = pygame.mouse.get_pos()

        if pygame.mouse.get_pressed()[0]:
            if self.rect.collidepoint((mx, my)):  # Check if mouse is over the slider
                self.dragging = True
                
            else:
                self.dragging = False

        if self.dragging:
            # Determine the nearest snap position to the current mouse position
            nearest_position_index = min(range(len(self.snap_positions)), key=lambda i: abs(self.snap_positions[i] - mx))
            self.current_snap_index = nearest_position_index

            # Update the slider position based on the nearest snap position
            self.rect.x = self.snap_positions[self.current_snap_index]

            # Calculate volume based on slider position
            self.percentage = self.current_snap_index / (len(self.snap_positions) - 1)
            new_volume = int(self.percentage * (self.max_volume - self.min_volume)) + self.min_volume
            mixer.music.set_volume(new_volume / 100)
            default_slider_pos = new_volume * 10

            if self.rect.x <= 100:
                self.rect.x = 100

            if self.rect.x >= ScreenWidth - 150:
                self.rect.x = ScreenWidth - 150
                
            return new_volume

        if pygame.mouse.get_pressed()[0] == 0:
            self.dragging = False

        if float(self.percentage) >= 1.0:
            decimal_part = 0.99
        else:
            decimal_part = (float(self.percentage) * 100) % 100

        # Print the volume as it changesdefault_slider_pos
        print(f"Current volume: {int(float(self.percentage) * 100)}.{int(decimal_part)}%")
        print(default_slider_pos)
        
        # Set global volume variable
        slider_volume = new_volume

        return new_volume, slider_volume, default_slider_pos

class Line(pygame.sprite.Sprite):
    def __init__(self, sprites):
        super().__init__()
        self.groups = sprites
        pygame.sprite.Sprite.__init__(self, self.groups)

    def draw(self, screen, x, y, width, height, col):
        rect = (x, y, width, height)
        pygame.draw.rect = (screen, col, rect)

class Box(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
    
    def draw(self, screen, color, x, y, width, height):
        box_rect = (x, y, width, height)
        pygame.draw.rect(screen, pygame.Color(color), box_rect)

class Background(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)  #call Sprite initializer
        self.image = pygame.transform.scale(pygame.image.load(path.join(img_folder, image_file)), (ScreenWidth, ScreenHeight)).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

sprite_group = pygame.sprite.Group()
walls = pygame.sprite.Group()
button_sprite = pygame.sprite.Group()
pause_button_sprite = pygame.sprite.Group()
settings_sprite = pygame.sprite.Group()

BackGround = Background('background.png', [0,0])
slider_image = pygame.Surface((200, 20))
slider_image.fill((50, 50, 50))
slider = Slider(default_slider_pos, 50, WHITE, 0, 100)
slider_volume = slider.new_volume

def draw_objects():
    for row, tiles in enumerate(map_data):
        for col, tile in enumerate(tiles):
            if tile == '1':
                Wall(col, row, map_data)
                  
player = Player()
enemy = Enemy()
wall = Wall(0, 0, None)
box = Box()
    
class Game:
    def __init__(self):
        super().__init__()
        
    def switch_map(self, new_map, symbol):
        global current_map, player, walls, enemy, player_mainclock
        player_mainclock = player.mainclock
        current_map = new_map
        load_data(current_map)
        sprite_group.empty()
        player = Player()
        walls.empty()
        enemy = Enemy()

        # Restore player's mainclock time
        player.mainclock = player_mainclock

        # Update player initial position
        for row, tiles in enumerate(map_data):
            for col, tile in enumerate(tiles):
                if tile == symbol:
                    player.rect.topleft = (col * TILESIZE, row * TILESIZE)

        return current_map, draw_objects()

    def reset_game_state(self):
        global playing, current_map, player, walls, enemy, sprite_group
        playing = False
        current_map = 'map.txt'
        sprite_group.empty()
        player = Player()
        walls.empty()
        enemy = Enemy()
        self.main()
    
    def back_to_pause(self):
        global settings
        settings = False
        
        return settings
        
    def main(self):
        Button(win, play_img, play_img_alt, 25, 675, button_sprite, self.play, (), collision_offset=(10, 30))
        Button(win, quit_img, quit_img_alt, 900, 675, button_sprite, exit, (), collision_offset=(10, 30))
        pygame.mixer.music.load(path.join(sound_folder, "main_menu_background.wav"))
        pygame.mixer.music.play(-1)
        while True:
            clock.tick(FPS // 2)
            win.blit(BackGround.image, BackGround.rect)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                        
            draw_text("GloomBound", pixel_font, WHITE, win, (275, 50))
            
            button_sprite.draw(win)         
            button_sprite.update()
            
            pygame.display.update()
    
    def play(self):
        global playing, slider_volume
        playing = True # Set playing to True before starting game loop
        draw_objects()
        pygame.mixer.music.load(path.join(sound_folder, "play_menu_background.wav"))
        pygame.mixer.music.play(-1)
        while playing:
            clock.tick(FPS)
            win.fill((BGCOLOR))
                
            for event in pygame.event.get():
                player.event_handler(event)
                if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    self.pause()
                    playing = False
                
                if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
                    g.switch_map(current_map, "e")
            
            player.check_map_change(current_map, map_data, previous_map)
            sprite_group.draw(win)
            sprite_group.update()
            pygame.mixer.music.set_volume(slider_volume / 100)
            pygame.display.update()
    
    def pause(self):
        global pause
        pause = True
        player.reset_movement()
        
        Button(win, continue_img, continue_img_alt, (ScreenWidth / 2) - (button_size[0]), 200, pause_button_sprite, self.play, (), collision_offset=(0, 70))
        Button(win, settings_img, settings_img_alt, (ScreenWidth / 2) - (button_size[0]), 300, pause_button_sprite, self.settings, (), collision_offset=(0, 70))
        Button(win, main_menu, main_menu_alt, (ScreenWidth / 2) - (button_size[0]), 400, pause_button_sprite, self.reset_game_state, (), collision_offset=(0, 70))
        
        while pause:
            win.fill(BGCOLOR)
            clock.tick(FPS)
            
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                    
            pause_button_sprite.draw(win)
            pause_button_sprite.update()
            
            pygame.display.update()
        
    def settings(self):
        global settings, new_volume
        settings = True
        Button(win, continue_img, continue_img_alt, (ScreenWidth / 2) - (button_size[0]), 200, settings_sprite, self.back_to_pause, (), collision_offset=(0, 70))
        
        while settings:
            win.fill(BGCOLOR)
            clock.tick(FPS)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            slider.new_volume = slider.update()

            # Move the Slider
            if pygame.mouse.get_pressed()[0]:
                mx, my = pygame.mouse.get_pos()
                if slider.rect.collidepoint((mx, my)):
                    slider.rect.centerx = mx
            
            # Draw the Slider
            up_pix_font = pygame.font.Font("Minecraft.ttf", font_size[0])
            draw_text("Master volume", up_pix_font, GREEN, win, (ScreenWidth // 2 - 100, 15))
            box.draw(win, WHITE, 100, 75, 824, 3)

            win.blit(slider.image, slider.rect)
            settings_sprite.draw(win)
            settings_sprite.update()
            pygame.display.update()
    
    def run(self):
        self.main()

g = Game()
g.run()

python pygame
1个回答
-1
投票

您在该帖子中的相关代码是:

    def dodge_multiple_dir(self, x_increment, y_increment, clock):        
        print("Hello World")
        while True:
            clock += speed_of_game_movement
            new_clock = round(clock / increment_for_every)
            if clock <= max_time:
                if new_clock * increment_for_every == clock:
                    print("Debug")
                    self.movement["left"] = False
                    self.movement["right"] = False
                    self.movement["up"] = False
                    self.movement["down"] = False
                    self.vel_x += x_increment
                    self.vel_y += y_increment
            else:
                break
            
            print("Loop")
            return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]
        return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]

dodge_multiple_dir()
时,它会通过
clock
0
。那么,会发生什么...

打印

print("Hello World")
然后进入循环。

在循环内,

clock
变为3,然后new_clock四舍五入为1。

您输入第一个 if 条件,因为时钟小于

max_time
,但不要输入第二个条件
5 <> 3

然后你就脱离了嵌套的 if 语句然后

print("Loop")
return self.movement["left"], self.movement["right"], self.movement["up"], self.movement["down"]

也许你想在 print() 之后立即取出

return

© www.soinside.com 2019 - 2024. All rights reserved.