Teknologian jakaminen

python graafinen käyttöliittymä ja peli kehitys_day010

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

GUI perustuu tkinter-moduuliin

GUI on lyhenne sanoista Graphical User Interface. Jokaisen tietokonetta käyttäneen tulee tuntea graafinen käyttöliittymä, joten tässä ei tarvitse mennä yksityiskohtiin. Pythonin oletuskäyttöliittymän kehitysmoduuli on tkinter (Python 3:a edeltävissä versioissa nimetty Tk-työkaluun, joka on alunperin suunniteltu Tcl:lle). kielet, se tarjoaa monialustaisia ​​GUI-ohjaimia. Tk ei tietenkään ole uusin ja paras valinta, eikä siinä ole erityisen tehokkaita GUI-säätimiä. Itse asiassa GUI-sovellusten kehittäminen ei ole sitä, missä Python on paras. PyQt, PyGTK jne. Moduulit ovat hyvä valinta.

Periaatteessa tkinterin käyttö GUI-sovellusten kehittämiseen vaatii seuraavat 5 vaihetta:

  1. Tuo mitä tarvitsemme tkinter-moduulissa.
  2. Luo ylimmän tason ikkunaobjekti ja käytä sitä koko GUI-sovelluksen isännöimiseen.
  3. Lisää GUI-komponentteja ylimmän tason ikkunaobjektiin.
  4. Näiden GUI-komponenttien toiminnot on järjestetty koodin avulla.
  5. Syötä päätapahtumasilmukka (pääsilmukka).

Seuraava koodi näyttää kuinka tkinteriä käytetään yksinkertaisen graafisen käyttöliittymän tekemiseen.

import tkinter
import tkinter.messagebox


def main():
    flag = True

    # 修改标签上的文字
    def change_label_text():
        nonlocal flag
        flag = not flag
        color, msg = ('red', 'Hello, world!')
            if flag else ('blue', 'Goodbye, world!')
        label.config(text=msg, fg=color)

    # 确认退出
    def confirm_to_quit():
        if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
            top.quit()

    # 创建顶层窗口
    top = tkinter.Tk()
    # 设置窗口大小
    top.geometry('240x160')
    # 设置窗口标题
    top.title('小游戏')
    # 创建标签对象并添加到顶层窗口
    label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
    label.pack(expand=1)
    # 创建一个装按钮的容器
    panel = tkinter.Frame(top)
    # 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
    button1 = tkinter.Button(panel, text='修改', command=change_label_text)
    button1.pack(side='left')
    button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
    button2.pack(side='right')
    panel.pack(side='bottom')
    # 开启主事件循环
    tkinter.mainloop()


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

On huomattava, että GUI-sovellukset ovat yleensä tapahtumaohjattuja. Syy päätapahtumasilmukalle on seurata erilaisten tapahtumien, kuten hiiren ja näppäimistön, esiintymistä ja suorittaa vastaava koodi tapahtumien käsittelemiseksi, koska tapahtumia esiintyy edelleen. Joten tällaisen silmukan on oltava käynnissä koko ajan odottamassa seuraavaa tapahtumaa. Toisaalta Tk tarjoaa kolme asettelun hallintaa ohjaimien sijoittamista varten. Nämä kolme asettelunhallintaa ovat:Placer(Kehittäjä ilmoittaa säätimen koon ja sijainnin),Packer(täytä säätimet automaattisesti sopiviin paikkoihin) jaGrid(Aseta ruudukkokoordinaatteihin perustuvat ohjaimet), joita ei kuvata tässä.

Pelikehitys Pygamella

Pygame on avoimen lähdekoodin Python-moduuli, jota käytetään erityisesti multimediasovellusten (kuten videopelien) kehittämiseen ja joka sisältää tuen kuville, äänille, videoille, tapahtumille, törmäyksille jne. Pygame on rakennettu SDL:lle, joka on joukko C-kielellä toteutettuja cross-platform multimediakehityskirjastoja ja jota käytetään laajasti pelien, simulaattoreiden, pelaajien jne. Pygamen avulla pelinkehittäjät eivät enää sido taustalla olevaa kieltä ja voivat keskittyä enemmän pelin toimintoihin ja logiikkaan.

Viimeistetään nyt yksinkertainen peli Opi käyttämään prosessin edellisiä vaiheita ja opi käyttämään tätä ohjelmointiideaa tosielämän ongelmien ratkaisemiseen.

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Piirrä ikkunaan

Voit piirtää ikkunaan piirtomoduulin toiminnolla pygamessa. Grafiikoita, joita voidaan piirtää, ovat: viivat, suorakulmiot, polygonit, ympyrät, ellipsit, kaaret jne. On huomattava, että näytön koordinaattijärjestelmä asettaa näytön vasemman yläkulman koordinaattien origoksi (0, 0 oikealla on x-akselin positiivinen suunta ja alaspäin on y- positiivinen suunta). akseli Kun ilmaistaan ​​sijaintia tai asetuskokoa, oletusyksikkömme ovat pikseleitä. Ns. pikseli on piste näytöllä. Voit yrittää suurentaa kuvaa useita kertoja nähdäksesi nämä kohdat. Pygamen värien esitystapa käyttää kolmen päävärin esitystapaa, eli värin RGB-arvo määritetään monissa tai luettelossa. Jokainen arvo on välillä 0 - 255, koska jokainen pääväri käyttää 8-bittistä (bittiä). Arvon esittämiseksi kolme väriä vastaavat yhteensä 24 bittiä, jota kutsutaan usein "24-bittiseksi väriesitukseksi".

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
    screen.fill((242, 242, 242))
    # 绘制一个圆(参数分别是: 屏幕, 颜色, 圆心位置, 半径, 0表示填充圆)
    pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
    # 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
    pygame.display.flip()
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Lataa kuva

Jos sinun on ladattava kuva suoraan ikkunaan, voit käyttää pygamen kuvamoduulin toimintoa kuvan lataamiseen ja sen jälkeen renderöidä kuvan aiemmin hankitun ikkunaobjektin blit-menetelmällä. Koodi on seuraava.

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
    screen.fill((255, 255, 255))
    # 通过指定的文件名加载图像
    ball_image = pygame.image.load('./res/ball.png')
    # 在窗口上渲染图像
    screen.blit(ball_image, (50, 50))
    # 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
    pygame.display.flip()
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Saavuta animaatiotehosteita

Mitä tulee sanaan animaatio, se on kaikille tuttu. Itse asiassa animaatiotehosteiden saavuttamisen periaate on toistaa jatkuvasti epäjatkuvia kuvia, kunhan saavutetaan tietty määrä kuvia. sitten se voidaan tehdä. Tuota tasaisempi animaatiotehoste. Jos haluat yllä olevan koodin pallon liikkuvan, voit käyttää muuttujaa kuvaamaan pallon sijaintia, muokata pallon sijaintia silmukassa ja päivittää sitten koko ikkunan.

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 定义变量来表示小球在屏幕上的位置
    x, y = 50, 50
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((255, 255, 255))
        pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
        pygame.display.flip()
        # 每隔50毫秒就改变小球的位置再刷新窗口
        pygame.time.delay(50)
        x, y = x + 5, y + 5


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Vaikutusten tarkistus

Yleensä pelissä on monia esineitä, ja "törmäys" näiden kohteiden välillä on väistämätön, kuten tykinkuula osuu lentokoneeseen, laatikko osuu maahan jne. Törmäysten havaitseminen on ratkaiseva ongelma, joka on ratkaistava useimmissa peleissä. Pygamen sprite-moduuli tukee törmäysten havaitsemista, koska se on todella yksinkertainen tunnistaa, törmäävätkö kaksi pientä palloa. Sinun tarvitsee vain tarkistaa, onko pallojen keskipisteiden välinen etäisyys pienempi kuin kahden pallon säteiden summa. Jotta voimme luoda lisää pieniä palloja, voimme käsitellä hiiren tapahtumia ja luoda pieniä palloja, joissa on satunnaisia ​​​​värejä, kokoja ja liikkumisnopeuksia hiiren napsautuskohdassa. Tietenkin voimme tehdä tämän käyttämällä sitä, mitä olemme oppineet ennen Applyä oliosuuntautunut tieto.

tapahtuman käsittely

Hiiritapahtumat voidaan käsitellä tapahtumasilmukassa Tapahtuman tyyppi voidaan määrittää tapahtumaobjektin type-attribuutilla ja hiiren napsautuksen sijainti pos-attribuutilla. Jos haluat käsitellä näppäimistötapahtumia, tämä on myös oikea paikka. Menetelmä on samanlainen kuin hiiren tapahtumien käsittely.

def main():
    # 定义用来装所有球的容器
    balls = []
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            # 处理鼠标事件的代码
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                # 获得点击鼠标的位置
                x, y = event.pos
                radius = randint(10, 100)
                sx, sy = randint(-10, 10), randint(-10, 10)
                color = Color.random_color()
                # 在点击鼠标的位置创建一个球(大小、速度和颜色随机)
                ball = Ball(x, y, radius, sx, sy, color)
                # 将球添加到列表容器中
                balls.append(ball)
        screen.fill((255, 255, 255))
        # 取出容器中的球 如果没被吃掉就绘制 被吃掉了就移除
        for ball in balls:
            if ball.alive:
                ball.draw(screen)
            else:
                balls.remove(ball)
        pygame.display.flip()
        # 每隔50毫秒就改变球的位置再刷新窗口
        pygame.time.delay(50)
        for ball in balls:
            ball.move(screen)
            # 检查球有没有吃到其他的球
            for other in balls:
                ball.eat(other)


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Yllä olevat kaksi koodinpätkää yhdistämällä olemme saaneet valmiiksi "iso pallo syö pienen pallon" -pelin (kuten alla olevasta kuvasta näkyy, se ei ole peli, mutta olemme läpäisseet a. tekemisen perustiedot). Pieni peli Tämä esimerkki kertoo kaikille, että tämän tiedon avulla voit aloittaa minipelin kehitysmatkan. Itse asiassa yllä olevassa koodissa on monia parantamisen arvoisia alueita. Esimerkiksi ikkunan virkistys- ja pallonsiirtokoodia ei kannata sijoittaa monisäikeisen tiedon oppimisen jälkeen taustaketju näiden asioiden hoitamiseen on parempi valinta. Jos haluamme saada paremman käyttökokemuksen, voimme myös lisätä peliin taustamusiikkia ja toistaa äänitehosteita pallon törmääessä Pygamen mikseri- ja musiikkimoduuleilla Tämä. Itse asiassa, jos haluat tietää enemmän pygamesta, paras opetusohjelma on pygamen virallinen verkkosivusto. Jos sinulla ei ole ongelmia englannin kanssa, voit mennä katsomaan. Jos haluat kehittää 3D-pelejä, pygame näyttää riittämättömältä Lukijat, jotka ovat kiinnostuneita 3D-pelien kehittämisestä, saattavat haluta katsoa Panda3D:tä.