Не могу понять, как запустить фоновые сцены в Pygame при изменении "уровней". - PullRequest
0 голосов
/ 08 мая 2020

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

Я не мог понять, как опубликовать весь код без форматирования кошмаров, поэтому я поместил его в github извините, если это противоречит условиям!

Я удалил большую часть диалог, потому что он был очень-очень длинным.

Некоторая предыстория примерно такая же: сначала она была написана как текстовая игра, затем я услышал о pygame, хотел выяснить, как поместить игру в окно . Итак, сначала я создал весь код, который отлично работал даже со звуковыми эффектами / musi c, но затем, после попытки выяснить игру l oop в pygame, я не могу понять, как изменить фоновое изображение.

У меня есть 5 сцен, для которых я хочу 5 изображений, которые меняются, когда я меняю сцену с вводом пользователя. Даже сейчас musi c меняется, но фоновые изображения не меняются после копирования первого в сцене «именования». Я действительно не понимаю, как pygame l oop работает вместе с игровым движком, который у меня есть. Я знаю, что он проходит через pygame l oop, поскольку я тестировал его с помощью печати, но при попытке добавить изображения или сказать, если scene == naming: blit image, это не работает. Я также пробовал помещать изображения в каждую из сцен. Я также попытался поместить изображения в класс под названием background со всеми 5 сценами и изображениями для каждого. Не могу понять.

Любая помощь будет принята с благодарностью! -М

1 Ответ

0 голосов
/ 08 мая 2020

Вот пример того, как использовать сцены. Это не единственный способ сделать это, но я думаю, что это было бы легко использовать / понять. Я также заметил в вашем коде, что вы использовали input(). что раздражает, если вы используете окно, поэтому я также добавил кнопку и ввод текстового поля, который вроде как работает.

import pygame as pg

pg.init() # initialize the pg
win = pg.display.set_mode((1080, 720)) # create the game window
pg.display.set_caption("Puppy Love")
white = (255,255,255)
black = (0,0,0)

clock = pg.time.Clock()
fps = 60


class Scene:
    def __init__(self):
        self.sceneNum = 1

    def Scene_1(self):
        win.fill(white)
        if next_scene_button.draw(): #if clicked button
            self.sceneNum += 1
        name_Box.Draw()
        #anything else you want to draw

    def Scene_2(self):
        win.fill((0,0,255))
        if next_scene_button.draw():
            self.sceneNum = 1
        #...

    def Draw_Scene(self):
        if self.sceneNum == 1:
            self.Scene_1()
        elif self.sceneNum == 2:
            self.Scene_2()


class Button:
    def __init__(self,x,y,w,h,text):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.text = text
        self.font = pg.font.Font(pg.font.match_font("Calibri"),20)

    def draw(self):
        button_clicked = False
        col = (150,150,150)
        if mouse_pos[0] > self.x and mouse_pos[0] < self.x + self.w:
            if mouse_pos[1] > self.y and mouse_pos[1] < self.y + self.h:
                col = (200,200,200)
                if click:
                    button_clicked = True
        pg.draw.rect(win,col,(self.x,self.y,self.w,self.h))
        obj = self.font.render(self.text,True, black)
        win.blit(obj,(self.x + (self.w-obj.get_width())//2,self.y + (self.h-obj.get_height())//2)) #center the text
        return button_clicked #return if the button was clicked or not

class TextBox:

    def __init__(self,x = 0, y = 0, w = 0, h = 0, text = "", background = False, font_size = 30, font = "Calibri", text_colour = (0,0,0)):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.text_colour = text_colour
        self.text = text
        self.background = background
        self.font = pg.font.Font(pg.font.match_font(font),font_size)

    def Add_char(self,key):
        if key == 8:
            self.text = self.text[:-1]
        else:
            char = pg.key.name(key)
            self.text += char

    def Draw(self):
        if self.background:
            pg.draw.rect(win, self.background, (self.x,self.y,self.w,self.h))
        obj = self.font.render(self.text,True,self.text_colour)
        win.blit(obj,(self.x,self.y))

    def Get_pos(self):
        return (self.x,self.y)


name_Box = TextBox(x=100, y=200, w=150, h=40, background=(200,200,200))

Scenes = Scene()
next_scene_button = Button(400,400,100,50,"next scene")

click = False
mouse_pos = [0,0]

running = True
while running:
    clock.tick(fps)
    Scenes.Draw_Scene()


    mouse_pos = pg.mouse.get_pos()
    click = False

    pg.display.update() #no diference between .flip() and .update()
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()
            running = False    
        if event.type == pg.MOUSEBUTTONDOWN:
            click = True
        if event.type == pg.KEYDOWN:
            if Scenes.sceneNum == 1:
                name_Box.Add_char(event.key)

Главное, что нужно вынести из этого, - использовать только один pygame.display.flip(). Надеюсь, вы сможете использовать это для улучшения своей программы

...