Почему PyGame отслеживает изображение?

Я пытаюсь разработать простую игру на питоне, используя pygame и IDLE. Со вчерашнего дня я просматривал множество источников, чтобы узнать о языке (и о программировании в целом), даже при этом я столкнулся с некоторыми проблемами и непониманием того, как все это работает. Итак, если кто-нибудь может посоветовать мне, как действовать (или указать мне какой-нибудь хороший учебный материал), я был бы очень признателен.

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

import pygame

def main():


pygame.init()


logo = pygame.image.load("coolblack.jpg")
pygame.display.set_icon(logo)
pygame.display.set_caption("Battleship")


screenWidth = 800
screenHeight = 600
screen = pygame.display.set_mode((screenWidth, screenHeight))


bgd_image = pygame.image.load("grid.png")
#--------------------------------------------------------------------
#the image named 'image' should be above 'bgd_image' but below 'cv9'
#in fact, everything should be above bgd_image, especially 'cv9'
#--------------------------------------------------------------------
image = pygame.image.load("coolblack.jpg")
cv9 = pygame.image.load("ussessexcv9.gif").convert_alpha()


xposCv9 = 400
yposCv9 = 510


step_xCv9 = 1
step_yCv9 = 1


screen.blit(bgd_image, (0,0))
screen.blit(image, (400,300))
screen.blit(cv9, (xposCv9, yposCv9))


pygame.display.flip()
clock = pygame.time.Clock()
running = True

#---------------------------------------------
#I've got a pretty good idea (sort of) about
#what is happening in the section
#below this point, however it seems that
#the image 'cv9' creates a trail of itself
#every time it moves, so how could I make it 
#so that it doesn't do so?
#---------------------------------------------
while running:

    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
    if xposCv9>screenWidth-64 or xposCv9<0:
        step_xCv9 = -step_xCv9
    if yposCv9>screenHeight-64 or yposCv9<0:
        step_yCv9 = -step_yCv9
    xposCv9 += step_xCv9
    yposCv9 += step_yCv9
    screen.blit(cv9, (xposCv9, yposCv9))
    pygame.display.flip()
    clock.tick(60)


if __name__=="__main__":
    main()

person Moshi    schedule 24.02.2013    source источник


Ответы (1)


Принцип работы pygame заключается в том, что он имеет внутреннее представление экрана, который вы обновляете. Итак, все начинается полностью черным, затем вы делаете свой первый «блит». Это обновит внутреннее представление. Затем, когда вы вызываете «pygame.display.flip», он показывает это представление на экране. Тем не менее, это не очистит представление автоматически до черного цвета для следующего кадра. Итак, на следующем кадре вы снова блитите (скажем, чуть левее), а первый блит остается, создавая ваш «след».

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

BLACK = (0,0,0)
....
screen.blit(cv9, (xposCv9, yposCv9))
pygame.display.flip()
clock.tick(60)
screen.fill(BLACK) # Add this to "clear" the screen.

Обратите внимание, что если вы выбрали этот путь, это означает, что вам нужно будет перерисовывать ВСЕ элементы в каждом отдельном кадре (а не только те, которые изменились с момента последнего кадра).

Кстати, если вам интересно, есть веская причина, по которой кадр не очищается автоматически в конце. В некоторых случаях может быть быстрее обновить только те части экрана, которые обновляются. Это может привести к увеличению производительности в некоторых приложениях. Однако, вероятно, лучше всего начать с очистки экрана, как показано в примере выше.

person Mark Hildreth    schedule 24.02.2013
comment
Большое спасибо, это очень помогло мне! - person Moshi; 24.02.2013