Не отображается объект на игровой области
Я новичок в python, но уже знаю основы. Решил создать игру на Pygame и тут произошла такая вещь: У меня есть окно window, на котором изображена игровая область screen. Мне надо что бы на window отображались screen, info_string, string_hero, string_zet. В свою очередь на string_hero будет отображаться hero, на string_zet - zet.
'''Создание окна'''
window = pygame.display.set_mode((400, 400))
'''Создание холста'''
screen = pygame.Surface((400, 400)) # создаем игровую область
'''Строка состояния'''
info_string = pygame.Surface((400, 30))
string_zet = pygame.Surface((390, 50))
string_hero = pygame.Surface((390, 175))
class Sprite:
def __init__(self, xpos, ypos, filename):
self.x = xpos
self.y = ypos
self.bitmap = pygame.image.load(filename)
def render(self):
screen.blit(self.bitmap, (self.x, self.y))
def render_z(self):
string_zet.blit(self.bitmap, (self.x, self.y))
def render_h(self):
string_hero.blit(self.bitmap, (self.x, self.y))
'''Описание героя'''
hero = Sprite(100, 100, 'D:/Python/Game/Платформер/Sprait.png')
'''Описане цели'''
zet = Sprite(10, 0, 'D:/Python/Game/Платформер/png.png')
zet.right = False
zet.step = 1
В основном цикле:
"""Заливка"""
screen.fill((50, 50, 50))
info_string.fill((45, 80, 60))
string_zet.fill((128, 128, 128))
string_hero.fill((128, 128, 128))
...
"""Отрисовка объектов"""
strela.render()
hero.render_h()
zet.render_z()
'''Отображение холста на экран и тд.'''
window.blit(screen, (0, 0)) # отрисовываем на окне игровую область
window.blit(info_string, (0, 0))
window.blit(string_zet, (5, 35))
window.blit(string_hero, (5, 220))
pygame.display.flip() # обновление событий на экране
pygame.time.delay(5) # скорость цикла
На string_zet zet отображается. А hero на string_hero либо при одних и тех же координатах отображается и сразу пропадает, либо вообще не отображается. Задумка такая, что я создаю области движения цели и объекта. Тут я понял, что координаты отображения съехали. Цель я с горем пополам сделал, а героя-объекта не видно.
Я пробовал сделать картинку с фоном, якобы это области, но произошло какое-то смешение цветов, и я откинул этот вариант из возможных.
Вот весь код полностью:
import pygame
pygame.init()
'''Создание окна'''
window = pygame.display.set_mode((400, 400)) # просто создаем окно
pygame.display.set_caption(('АБЩХДА'))
'''Создание холста'''
screen = pygame.Surface((400, 400)) # создаем игровую область
'''Строка состояния'''
info_string = pygame.Surface((400, 30))
string_zet = pygame.Surface((390, 50))
string_hero = pygame.Surface((390, 175))
class Sprite:
def __init__(self, xpos, ypos, filename):
self.x = xpos
self.y = ypos
self.bitmap = pygame.image.load(filename)
def render(self):
screen.blit(self.bitmap, (self.x, self.y))
def render_z(self):
string_zet.blit(self.bitmap, (self.x, self.y))
def render_h(self):
string_hero.blit(self.bitmap, (self.x, self.y))
def Interesct(x1, x2, y1, y2, db1, db2):
if ((x1 > x2 - db1) and (x1 < x2 + db2) and
(y1 > y2 - db1) and (y1 < y2 + db2)):
return 1
else:
return 0
'''Штифты'''
pygame.font.init()
font = pygame.font.SysFont('Comic Sans MS', 24, True)
font2 = pygame.font.SysFont('Comic Sans MS', 24, True)
font3 = pygame.font.SysFont('Berlin Sans FB Demi', 34, True)
'''Описание героя'''
hero = Sprite(100, 100, 'D:/Python/Game/Платформер/Sprait.png')
# hero.up = True
'''Описане цели'''
zet = Sprite(10, 0, 'D:/Python/Game/Платформер/png.png')
zet.right = False
zet.step = 1
'''Описание стрелы'''
strela = Sprite(-10, 350, 'D:/Python/Game/Платформер/Iron.png')
strela.push = False
run = True
pygame.key.set_repeat(1, 1) # Покажем, что нажатие клавиши надо дублировать, пока она нажата
'''1 аргумент - задержка перед первым дублированием'''
''' 2 аргемент - задержка перед остальными'''
enumerator = 0
arrow_colour = 254
while run:
'''Обработка событий'''
for e in pygame.event.get():
if e.type == pygame.QUIT:
run = False
'''Событие - нажатие клавиш'''
if e.type == pygame.KEYDOWN:
'''Перемещение героя '''
if e.key == pygame.K_LEFT:
if hero.x > 5:
hero.x -= 1
if e.key == pygame.K_RIGHT:
if hero.x < 345:
hero.x += 1
if e.key == pygame.K_DOWN:
if hero.y < 350:
hero.y += 1
if e.key == pygame.K_UP:
if hero.y > 200:
hero.y -= 1
'''Запуск стрелы'''
if e.key == pygame.K_SPACE:
if strela.push == False:
strela.x = hero.x + 25
strela.y = hero.y
strela.push = True
'''Событие - пережвижение мыши'''
if e.type == pygame.MOUSEMOTION:
pygame.mouse.set_visible(False)
n = pygame.mouse.get_pos()
if n[0] > 10 and n[0] < 350:
hero.x = n[0]
if n[1] > 200 and n[1] < 350:
hero.y = n[1]
'''Событие - нажатие кнопок мыши'''
if e.type == pygame.MOUSEBUTTONDOWN:
if e.button == 1:
if strela.push == False:
strela.x = hero.x + 25
strela.y = hero.y
strela.push = True
"""Заливка"""
screen.fill((50, 50, 50))
info_string.fill((45, 80, 60))
string_zet.fill((128, 128, 128))
string_hero.fill((128, 128, 128))
'''Изменение цвета надписи'''
arrow_colour += 1
if arrow_colour == 255:
arrow_colour = 100
"""Передвижение цели"""
if zet.right == True:
zet.x -= zet.step
if zet.x <= 0:
zet.right = False
else:
zet.x += zet.step
if zet.x >= 350:
zet.right = True
'''Перемещение стрелы'''
if strela.y < 0:
strela.push = False
enumerator -= 1
if strela.push == False:
strela.x = -10
strela.y = 350
else:
strela.y -= 1
'''Столкновение стрелы и цели'''
if Interesct(strela.x, zet.x, strela.y, zet.y, 15, 50) == True:
strela.push = False
zet.step += 0.2
enumerator += 1
# if Interesct(zet.x, hero.x, zet.y, hero.y) == True:
# hero.up = False
# zet.up = True
"""Отрисовка объектов"""
strela.render()
hero.render_h()
zet.render_z()
'''Отображение штифта на экран'''
info_string.blit(font.render('Speed: ' + str(zet.step), 1, (210, 120, 200)), (255, -2))
info_string.blit(font2.render('Score: ' + str(enumerator), 1, (210, 120, 200)), (10, -2))
info_string.blit(font.render('ARROW', 0, (arrow_colour, 97, 27)), (140, 0))
'''Отображение холста на экран и тд.'''
window.blit(screen, (0, 0)) # отрисовываем на окне игровую область
window.blit(info_string, (0, 0))
window.blit(string_zet, (5, 35))
window.blit(string_hero, (5, 220))
pygame.display.flip() # обновление событий на экране
pygame.time.delay(5) # скорость цикла
Блок кода с передвижением стрелы, цели и героя я пока что не трогал, тк даже не знаю, где мой герой.