def main(): pygame.init() screen = pygame.display.set_mode((xRes, yRes)) pygame.display.set_caption('Roguelike') animationIndex, spriteIndex = 0, 0 clock = pygame.time.Clock() player = Entity(level) loadTextures() loadLevel(tileData, decorationData, level) while True: clock.tick(24) player.isMoving = False player.dx, player.dy = 0, 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: return if keys[K_UP]: player.isMoving = True player.dy = -2 * gameScale if keys[K_DOWN]: player.isMoving = True player.dy = 2 * gameScale if keys[K_LEFT]: player.isFacingRight = False player.isMoving = True player.dx = -2 * gameScale if keys[K_RIGHT]: player.isFacingRight = True player.isMoving = True player.dx = 2 * gameScale if keys[K_z]: player.isCasting = True animationIndex = 0 mouse_pos = pygame.mouse.get_pos( ) # получение координат указателя мыши ## ОБРАБОТКА НАЖАТИЙ КЛАВИАТУРЫ И МЫШИ ## for event in pygame.event.get( ): # добавляем свой функционал в цикл получения сообщений от мыши и клавиатуры if event.type == MOUSEBUTTONDOWN: # если произошло событие - нажатие кнопки мыши #mouse_pos = event.pos # Получаем x,y координаты мыши на экране игры for cur_obj in gameObjectList: # Для всех объектов проверяем попадение курсора мыши в этот объект pos_in_mask = mouse_pos[0] - cur_obj.img_rect.x, mouse_pos[ 1] - cur_obj.img_rect.y # вычисление позиции курсора относительно координат маски прозрачности объекта if cur_obj.img_rect.collidepoint( mouse_pos ) and cur_obj.img_mask.get_at( pos_in_mask ) == 1: # проверяем, находится ли мышь на каком-то объекте, и прозрачен ли пиксель, на котором находится указатель мыши cur_obj_name = 'unnamed' ### имя объекта, по-умолчанию безымянный if 'ObjectName' in cur_obj.obj_props: ### если в словаре есть свойство ИмяОбъекта cur_obj_name = cur_obj.obj_props[ "ObjectName"] ### создаем надпись с этим именем new_text_obj = models.TextObject( [mouse_pos[0], mouse_pos[1]], cur_obj_name, white_color, 1500 ) # Создаем текстовый объект с координатами указателя мыши, текстом, равным имени объекта под мышкой, белым цветом шрифтаwhite_color и временем существования 1500 миллисеукнд new_text_obj.time1 = time.time( ) # в свойство текстового объекта time1 заносим время, когда этот текст создан if pygame.mouse.get_pressed( )[2]: ### если нажата ПРАВАЯ кнопка мыши textObjectList.append( new_text_obj ) # Добавляем новую надпись(текстовый объект) в список всех надписей else: ### если нажата ЛЕВАЯ кнопка мыши, захватываем объект cur_obj.follow_mouse = True # устанавливаем флаг следования за мышкой(захватываем объект мышкой) cur_obj.follow_mouse_offset = [ mouse_pos[0] - cur_obj.pos[0], mouse_pos[1] - cur_obj.pos[1] ] # смещение мышки относительно нулевых координат области объекта break # после первого найденного объекта под мышкой, выходим из цикла, чтобы не появлялось несколько надписей в одном месте elif event.type == pygame.KEYUP: if event.key == pygame.K_e: ### Если на клавитуре нажата клавиша 'e' if World.edit_mode == None: ### Включаеv режим EDIT(Редактирования объектов) mode_text_obj = models.TextObject( [10, 10], "EDIT", white_color, -1, 40) ### создаем надпись слева вверху textObjectList.append( mode_text_obj ) ### Добавляем надпись в список всех текстовых объектов World.edit_mode = textObjectList[len(textObjectList) - 1] else: ### Если режим Редактирования уже включен, textObjectList.remove( World.edit_mode) ### Удаляем надпись World.edit_mode = None ### Отменяем режим Редактирования(EDIT) ## При выключении режима редактирования, выводим в консоль все объекты all_objects_dict = [] ###список со всеми объектами for i in range(len(gameObjectList) - 1): ### Для всех оюъектов в игре cur_obj = gameObjectList[i] ###текущий объект new_obj_dict = { 'obj_props': cur_obj. obj_props, ### все свойства объекта заносим во вложенный словарь 'posX': cur_obj.pos[0], ### Позиция X 'posY': cur_obj.pos[1], ### Позиция Y 'width': cur_obj.img_rect.w, ### Ширина картинки 'height': cur_obj.img_rect.h ### Высота картинки } all_objects_dict.append( new_obj_dict ) ### добавляем новый объект с описанием в список всех объектов json_dump = json.dumps( all_objects_dict ) ### выгружаем описание всех объектов игры в json-формате print(json.dumps( json_dump)) ### выводим полученный json в консоль elif event.key == pygame.K_r: ### Постоянное отображение рамок все объектов if World.show_rects: ### Если включено World.show_rects = False ### выключаем режим else: ### включаем, если отключено World.show_rects = True elif event.type == QUIT: return if animationIndex < 9: animationIndex += 1 else: animationIndex = 0 player.isCasting = False player.isMoving = False if player.isCasting: spriteIndex = 3 elif player.isMoving: spriteIndex = 2 else: spriteIndex = 0 player.image, player.rect = playerTextures[spriteIndex][animationIndex] if not player.isFacingRight: player.image = pygame.transform.flip(player.image, True, False) pX, pY = player.update() for y in range(0, 16): for x in range(0, 16): screen.blit( level.getTileAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getTileAt(x, y).offsetY)) if (level.getDecorationAt(x, y) is not None): screen.blit( level.getDecorationAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getDecorationAt(x, y).offsetY)) if ((x, y - 1) == (pX, pY)): screen.blit( player.image, (player.x + player.offsetX, player.y + player.offsetY)) ## ОТРИСОВКА ОБЪЕКТОВ ## player_pos = (player.x + player.offsetX, player.y + player.offsetY ) #позиция игрока на карте x,y for indx, _ in enumerate( gameObjectList): #в массиве всех созданным нами объектов cur_obj = gameObjectList[indx] if cur_obj.follow_mouse: # Если установлен флаг следования за мышкой (объект взят) if World.edit_mode != None or ( 'CanMove' in cur_obj.obj_props and cur_obj.obj_props['CanMove'] == 'True' ): ### Если включен режим редактирования(EDIT) # получение состояния нажатия всех кнопок мыши if pygame.mouse.get_pressed( )[0]: # проверяем, нажата ли ЛЕВАЯ кнопка мыши newPosX = mouse_pos[0] - cur_obj.follow_mouse_offset[ 0] # высчитываем новую позицию с учетом смещения X-координату newPosY = mouse_pos[1] - cur_obj.follow_mouse_offset[ 1] # Y-координату cur_obj.set_position( [newPosX, newPosY] ) # при зажатой кнопке мыши, переносим объект на текущую позицию мыши else: # если левая кнопка отпущена, бросаем предмет cur_obj.follow_mouse = False # отключаем следование за мышью(бросаем объект) gameObjectList.sort( key=lambda x: x.pos[1] + x.lowestY ) # снова сортируем объекты в правильном порядке по самому нижнему пикселю screen.blit( cur_obj.img, cur_obj.pos ) #рисуем картинку каждого объекта на поверхность игрового экрана if World.show_rects or ( World.edit_mode != None and cur_obj.follow_mouse ): ### Если включен режим Редактирования(EDIT), рисуем прямоугольники, очерчивающие непрозрачную область объекта и прямоугольник для коллизий opq_rect = pygame.Rect( cur_obj.pos[0] + cur_obj.opaq_rect[0], cur_obj.pos[1] + cur_obj.opaq_rect[1], cur_obj.opaq_rect[2], cur_obj.opaq_rect[3] ) ### расчет прямоугольника для отображения на игровом экране pygame.draw.rect(screen, white_color, opq_rect, 1) ### рисуем рамку объекта col_rect = pygame.Rect(cur_obj.pos[0] + cur_obj.coll_rect[0], cur_obj.pos[1] + cur_obj.coll_rect[1], cur_obj.coll_rect[2], cur_obj.coll_rect[3]) pygame.draw.rect( screen, (100, 255, 0), col_rect, 2 ) ### зеленым цветом рисуем область коллизий данного объекта if (player_pos[1] + player.rect[3]) >= ( cur_obj.pos[1] + cur_obj.lowestY ): #если самая нижняя точка игрока объекта выше игрока screen.blit(player.image, player_pos) #рисуем игрока поверх объекта if World.edit_mode != None: ### Если режим EDIT player_rect = pygame.Rect( player_pos[0], player_pos[1], player.rect[2], player.rect[3]) ### Расчитываем прямоугольник вокруг игрока pygame.draw.rect(screen, (0, 0, 255), player_rect, 2) ### рисуем рамку игрока ## ОТРИСОВКА ТЕКСТОВЫХ ОБЪЕКТОВ ## for indx, _ in enumerate( textObjectList ): # перечисляем все надписи(текстовые объекты из их общего списка) text_obj = textObjectList[ indx] # работаем с самим объектом, а не копией, как в случае просто for цикла, чтобы не тратить лишнюю память if text_obj.text_visible == False: # Если в объекте указана невидимость continue # пропускаем этот объект text_surface = pygame.font.SysFont( text_obj.font_name, text_obj.font_size).render( text_obj.text_str, False, text_obj.text_color ) # рисуем текст(создаем поверхность Surface с текстом) screen.blit( text_surface, text_obj.pos ) # накладываем поверхность с нарисованным текстом на поверхность экрана, выводя текст на игровой экран if text_obj.exist_time != -1: # если у надписи указано время существования(exist_time) elapsed = ( time.time() - text_obj.time1 ) * 1000 #проверяем сколько миллисекунд прошло со времени создания надписи if elapsed > text_obj.exist_time: # если прошло больше времени, чем указано во времени существования (exist_time) textObjectList.pop( indx) # удаляем объект из списка надписей pygame.display.flip()
def main(): pygame.init() screen = pygame.display.set_mode((xRes, yRes)) pygame.display.set_caption('Roguelike') animationIndex, spriteIndex = 0, 0 clock = pygame.time.Clock() player = Entity(level) loadTextures() loadLevel(tileData, decorationData, level) while True: clock.tick(24) player.isMoving = False player.dx, player.dy = 0, 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: return if keys[K_UP]: player.isMoving = True player.dy = -2 * gameScale if keys[K_DOWN]: player.isMoving = True player.dy = 2 * gameScale if keys[K_LEFT]: player.isFacingRight = False player.isMoving = True player.dx = -2 * gameScale if keys[K_RIGHT]: player.isFacingRight = True player.isMoving = True player.dx = 2 * gameScale if keys[K_z]: player.isCasting = True animationIndex = 0 for event in pygame.event.get(): if event.type == QUIT: return if animationIndex < 9: animationIndex += 1 else: animationIndex = 0 player.isCasting = False player.isMoving = False if player.isCasting: spriteIndex = 3 elif player.isMoving: spriteIndex = 2 else: spriteIndex = 0 player.image, player.rect = playerTextures[spriteIndex][animationIndex] if not player.isFacingRight: player.image = pygame.transform.flip(player.image, True, False) pX, pY = player.update() for y in range(0, 16): for x in range(0, 16): screen.blit( level.getTileAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getTileAt(x, y).offsetY)) if (level.getDecorationAt(x, y) is not None): screen.blit( level.getDecorationAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getDecorationAt(x, y).offsetY)) if ((x, y - 1) == (pX, pY)): screen.blit( player.image, (player.x + player.offsetX, player.y + player.offsetY)) pygame.display.flip()
def main(): pygame.init() screen = pygame.display.set_mode((xRes, yRes)) pygame.display.set_caption('Roguelike') animationIndex, spriteIndex = 0, 0 clock = pygame.time.Clock() player = Entity(level) loadTextures() loadLevel(tileData, decorationData, level) while True: clock.tick(24) player.isMoving = False player.dx, player.dy = 0, 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: return if keys[K_UP]: player.isMoving = True player.dy = -2 * gameScale if keys[K_DOWN]: player.isMoving = True player.dy = 2 * gameScale if keys[K_LEFT]: player.isFacingRight = False player.isMoving = True player.dx = -2 * gameScale if keys[K_RIGHT]: player.isFacingRight = True player.isMoving = True player.dx = 2 * gameScale if keys[K_z]: player.isCasting = True animationIndex = 0 for event in pygame.event.get(): if event.type == QUIT: return if animationIndex < 9: animationIndex += 1 else: animationIndex = 0 player.isCasting = False player.isMoving = False if player.isCasting: spriteIndex = 3 elif player.isMoving: spriteIndex = 2 else: spriteIndex = 0 player.image, player.rect = playerTextures[spriteIndex][animationIndex] if not player.isFacingRight: player.image = pygame.transform.flip(player.image, True, False) pX, pY = player.update() for y in range(0, 16): for x in range(0, 16): screen.blit(level.getTileAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getTileAt(x, y).offsetY)) if (level.getDecorationAt(x, y) is not None): screen.blit(level.getDecorationAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getDecorationAt(x, y).offsetY)) if ((x, y - 1) == (pX, pY)): screen.blit(player.image, (player.x + player.offsetX, player.y + player.offsetY)) pygame.display.flip()
def main(): pygame.init() screen = pygame.display.set_mode((xRes, yRes)) pygame.display.set_caption('Roguelike') animationIndex, spriteIndex = 0, 0 clock = pygame.time.Clock() player = Entity(level) loadTextures() loadLevel(tileData, decorationData, level) while True: clock.tick(24) player.isMoving = False player.dx, player.dy = 0, 0 keys = pygame.key.get_pressed() if keys[K_ESCAPE]: return if keys[K_UP]: player.isMoving = True player.dy = -2 * gameScale if keys[K_DOWN]: player.isMoving = True player.dy = 2 * gameScale if keys[K_LEFT]: player.isFacingRight = False player.isMoving = True player.dx = -2 * gameScale if keys[K_RIGHT]: player.isFacingRight = True player.isMoving = True player.dx = 2 * gameScale if keys[K_z]: player.isCasting = True animationIndex = 0 for event in pygame.event.get(): if event.type == QUIT: return if animationIndex < 9: animationIndex += 1 else: animationIndex = 0 player.isCasting = False player.isMoving = False if player.isCasting: spriteIndex = 3 elif player.isMoving: spriteIndex = 2 else: spriteIndex = 0 player.image, player.rect = playerTextures[spriteIndex][animationIndex] if not player.isFacingRight: player.image = pygame.transform.flip(player.image, True, False) pX, pY = player.update() for y in range(0, 16): for x in range(0, 16): screen.blit( level.getTileAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getTileAt(x, y).offsetY)) if (level.getDecorationAt(x, y) is not None): screen.blit( level.getDecorationAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getDecorationAt(x, y).offsetY)) if ((x, y - 1) == (pX, pY)): screen.blit( player.image, (player.x + player.offsetX, player.y + player.offsetY)) playerPos = (player.x + player.offsetX, player.y + player.offsetY ) #позиция игрока на карте x,y for indx, _ in enumerate( gameObjectList): #в массиве всех созданным нами объектов curObj = gameObjectList[indx] screen.blit( curObj.img, curObj.pos ) #рисуем картинку каждого объекта на поверхность игрового экрана if (playerPos[1] + player.rect[3]) >= ( curObj.pos[1] + curObj.lowestY ): #если самая нижняя точка игрока объекта выше игрока screen.blit(player.image, playerPos) #рисуем игрока поверх объекта pygame.display.flip()
def main(): pygame.init() screen = pygame.display.set_mode((xRes, yRes)) pygame.display.set_caption('Roguelike') animationIndex, spriteIndex = 0, 0 clock = pygame.time.Clock() player = Entity(level) loadTextures() loadLevel(tileData, decorationData, level) while True: clock.tick(24) player.isMoving = False player.dx, player.dy = 0, 0 mouse_pressed1, mouse_pressed2, mouse_pressed3 = pygame.mouse.get_pressed( ) ### получаем состояние нажатых на мышке кнопок keys = pygame.key.get_pressed() if keys[K_ESCAPE]: return if keys[K_UP]: player.isMoving = True player.dy = -2 * gameScale if keys[K_DOWN]: player.isMoving = True player.dy = 2 * gameScale if keys[K_LEFT]: player.isFacingRight = False player.isMoving = True player.dx = -2 * gameScale if keys[K_RIGHT]: player.isFacingRight = True player.isMoving = True player.dx = 2 * gameScale if keys[K_z]: player.isCasting = True animationIndex = 0 #### ОБРАБОТКА НАЖАТИЙ КЛАВИАТУРЫ И МЫШИ #### for event in pygame.event.get( ): ### добавляем свой функционал в цикл получения сообщений от мыши и клавиатуры if event.type == MOUSEBUTTONDOWN: ### если произошло событие - нажатие кнопки мыши mouse_pos = event.pos ### Получаем x,y координаты мыши на экране игры for curObj in gameObjectList: ### Для всех объектов проверяем попадение курсора мыши в этот объект pos_in_mask = mouse_pos[0] - curObj.img_rect.x, mouse_pos[ 1] - curObj.img_rect.y ### вычисление позиции курсора относительно координат маски прозрачности объекта if curObj.img_rect.collidepoint( mouse_pos ) and curObj.img_mask.get_at( pos_in_mask ) == 1: ### проверяем, находится ли мышь на каком-то объекте, и прозрачен ли пиксель, на котором находится указатель мыши new_time_obj = models.textObj( [mouse_pos[0], mouse_pos[1]], curObj.objName, (255, 255, 255), 1500 ) ### Создаем текстовый объект с координатами указателя мыши, текстом, равным имени объекта под мышкой, белым цветом шрифта(255,255,255) и временем существования 1500 миллисеукнд new_time_obj.time1 = time.time( ) ### в свойство текстового объекта time1 заносим время, когда этот текст создан textObjectList.append( new_time_obj ) ### Добавляем новую надпись(текстовый объект) в список всех надписей break ### после первого найденного объекта под мышью, выходим из цикла, чтобы не появлялось несколько надписей в одном месте elif event.type == QUIT: return if animationIndex < 9: animationIndex += 1 else: animationIndex = 0 player.isCasting = False player.isMoving = False if player.isCasting: spriteIndex = 3 elif player.isMoving: spriteIndex = 2 else: spriteIndex = 0 player.image, player.rect = playerTextures[spriteIndex][animationIndex] if not player.isFacingRight: player.image = pygame.transform.flip(player.image, True, False) pX, pY = player.update() for y in range(0, 16): for x in range(0, 16): screen.blit( level.getTileAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getTileAt(x, y).offsetY)) if (level.getDecorationAt(x, y) is not None): screen.blit( level.getDecorationAt(x, y).image, (x * 16 * gameScale, y * 16 * gameScale + level.getDecorationAt(x, y).offsetY)) if ((x, y - 1) == (pX, pY)): screen.blit( player.image, (player.x + player.offsetX, player.y + player.offsetY)) #### ОТРИСОВКА ОБЪЕКТОВ #### playerPos = (player.x + player.offsetX, player.y + player.offsetY ) #позиция игрока на карте x,y for indx, _ in enumerate( gameObjectList): #в массиве всех созданным нами объектов curObj = gameObjectList[indx] screen.blit( curObj.img, curObj.pos ) #рисуем картинку каждого объекта на поверхность игрового экрана if (playerPos[1] + player.rect[3]) >= ( curObj.pos[1] + curObj.lowestY ): #если самая нижняя точка игрока объекта выше игрока screen.blit(player.image, playerPos) #рисуем игрока поверх объекта #### ОТРИСОВКА ТЕКСТА #### for indx, _ in enumerate( textObjectList ): ### перечисляем все надписи(текстовые объекты из их общего списка) textObj = textObjectList[ indx] ### работаем с самим объектом, а не копией, как в случае просто for цикла, чтобы не тратить лишнюю память if textObj.textVisible == False: ### Если в объекте указана невидимость continue ### пропускаем этот объект textSurf = pygame.font.SysFont( textObj.fontName, textObj.fontSize).render( textObj.text_str, False, textObj.text_color ) ### рисуем текст(создаем поверхность Surface с текстом) screen.blit( textSurf, textObj.pos ) ### накладываем поверхность с нарисованным текстом на поверхность экрана, выводя текст на игровой экран if textObj.exist_time != -1: ### если у надписи указано время существования(exist_time) elapsed = ( time.time() - textObj.time1 ) * 1000 ###проверяем сколько миллисекунд прошло со времени создания надписи if elapsed > textObj.exist_time: ### если прошло больше времени, чем указано во времени существования (exist_time) textObjectList.pop( indx) ### удаляем объект из списка надписей pygame.display.flip()