Перемещение объекта без необходимости перерисовывать то, что находится под ним. Pygame - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь сделать окно, которое отображает информацию об объектах и ​​может перемещаться. Играйте в щелчок и смотрите, что происходит в игре, чтобы в фоновом режиме ничего не происходило, пока вы перемещаете это информационное поле. Я пытаюсь найти способ не перерисовывать все элементы фона, пока я перемещаю этот блок. Есть ли способ сделать это, или мне нужно продолжать обновлять то, что позади. Я как бы новичок в pygame, но пробовал pygame.surface.Surface, но я думаю, что использовал его неправильно, и это не сработало.

Спасибо: D

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вы можете передавать параметры в функцию pygame.display.update (), чтобы обновлять только определенную часть экрана: Как передать прямоугольник в pygame.display.update () для обновления указанного c площадь окна?

1 голос
/ 19 июня 2020

Если вы хотите изменить положение спрайта на экране, думаю, вам нужно будет перерисовывать его каждый кадр. Убедитесь, что у вас есть функция, которая обрабатывает только перерисовку.


Это функция redrawGameWindow в моей игре:

def redrawGameWindow():
    Screen.fill((0,0,0))
    for s in stars:
            s.draw(Screen)

    if Switch == 1:
        Screen.blit(game_title, game_title_rect)
        new_game_button.draw(Screen)
        settings_button.draw(Screen)
        credits_button.draw(Screen)

    elif Switch == 2:
        if boss_fight:
            Screen.blit(boss_health, boss_health_rect)
        for b in bullets:
            b.draw(Screen)
        for b in enemy_bullets:
            b.draw(Screen)
        for e in enemies:
            e.draw(Screen)
        player.draw(Screen)
        Screen.blit(health, (15, int(health_text_y)))
        Screen.blit(health_fleet, (15, int(health_fleet_text_y)))

    elif Switch == 3:
        Screen.blit(game_over_text, game_over_text_rect)
        restart_button.draw(Screen)

    elif Switch == 4:
        player.draw(Screen)
        Screen.blit(health, (15, int(health_text_y)))
        Screen.blit(health_fleet, (15, int(health_fleet_text_y)))
        Screen.blit(summary_text_money, summary_text_money_rect)

    elif Switch == 5:

        if switch_settings == 0:
            Screen.blit(settings_text, settings_text_rect)
            audio_settings_button.draw(Screen)
            keybind_settings_button.draw(Screen)
            back_settings_button.draw(Screen)

        elif switch_settings == 1:
            Screen.blit(audio_settings_text, audio_settings_text_rect)
            Screen.blit(music_volume_text_1, music_volume_text_1_rect)
            Screen.blit(music_volume_text_2, music_volume_text_2_rect)
            Screen.blit(sfx_volume_text_1, sfx_volume_text_1_rect)
            Screen.blit(sfx_volume_text_2, sfx_volume_text_2_rect)
            music_volume_up_button.draw(Screen)
            music_volume_down_button.draw(Screen)
            sfx_volume_up_button.draw(Screen)
            sfx_volume_down_button.draw(Screen)
            back_settings_button.draw(Screen)

        elif switch_settings == 2:
            Screen.blit(keybind_settings_text, keybind_settings_text_rect)
            back_settings_button.draw(Screen)
            for button in keybind_settings_button_list:
                button.draw(Screen)
            if keybind_change_title:
                pygame.draw.rect(Screen, (70,70,70), (0, resolution[1]//2-40, resolution[0], 80))
                Screen.blit(key_change_text, key_change_text_rect)

    elif Switch == 6:
        Screen.blit(credits_text, credits_text_rect)
        Screen.blit(credits_text_1, credits_text_1_rect)
        Screen.blit(credits_text_2, credits_text_2_rect)
        Screen.blit(credits_text_3, credits_text_3_rect)
        back_settings_button.draw(Screen)

    elif Switch == 7:
        Screen.blit(pause_text, pause_text_rect)
        resume_button.draw(Screen)
        settings_button.draw(Screen)

    elif Switch == 8:
        shop_1.draw(Screen)
        player.draw(Screen)
        if show_shop_button:
            shop_button.draw(Screen)
        if show_next_level_button:
            next_level_button.draw(Screen)

    elif Switch == 9:
        current_shop_item = shop_items[item_index]

        Screen.fill((50,50,50))
        pygame.draw.rect(Screen, (30,30,30), (0, 60, resolution[0], resolution[1] - 285))
        back_button.draw(Screen)
        next_button.draw(Screen)
        previous_button.draw(Screen)
        buy_button.draw(Screen)

        current_shop_item.draw()

    pygame.display.update()

Она довольно длинная, но не вообще влияют на производительность игры. Не беспокойтесь о необходимости перерисовывать все в каждом кадре, если только это не ДЕЙСТВИТЕЛЬНО много всего. их в вашу программу, таким образом они все будут оптимизированы, и ваша программа будет работать намного быстрее. Пример:

bg_11 = pygame.image.load("sprites/backgrounds/bg_11.png").convert()

player_s = pygame.image.load("sprites/characters/player.png").convert_alpha()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...