Python100Days研究ノート--- Day10グラフィカル・ユーザー・インターフェースとゲーム開発

GUIベースのTkinterモジュールの
GUIは、グラフィカル・ユーザ・インタフェース、コンピュータを使用する人々のためのグラフィカル・ユーザー・インタフェースの頭文字である不慣れいけない、この必要性は、ここでは繰り返しません。デフォルトのPython GUI開発モジュールは、(Tkinterの中のPython 3の以前のバージョンで命名)Tkinterのある、名前からあなたはそれがTkのとTkに基づいていることがわかりますTclのためのツールキットが最初に設計されたで、後に移植しました他の多くのスクリプト言語には、クロスプラットフォームのGUIコントロールを提供します。あなたが本当になどのPython、wxPythonを、PyQtは、PyGTKのを、使用したGUIアプリケーションを開発する必要がある場合Tkのは確かに最新かつ最良の選択、また特に強力なGUIコントロールは、実際には、GUIアプリケーションの開発は、Pythonではないではない、最善を尽くすモジュールは良い選択です。

Tkinterを基本的にGUIアプリケーションを開発するために使用される次の5つのステップが必要です。

1,导入tkinter模块中我们需要的东西。
2,创建一个顶层窗口对象并用它来承载整个GUI应用。
3,在顶层窗口对象上添加GUI组件。
4,通过代码将这些GUI组件的功能组织起来。
5,进入主事件循环(main loop)

次のコードは、簡単なGUIアプリケーションを作るのTkinter使用する方法を示します。

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()

イベントが発生し続けるので、GUIアプリケーションは、典型的には、イベント駆動型、メインイベントループを入力する理由は、マウスの様々なイベントの発生を監視することで、キーボードであり、イベントを処理するために対応するコードを実行し、注意すべきですしたがって、このようなAサイクルの必要性が起こるのを待っているイベントで実行されています。一方、Tkの三のレイアウトマネージャは、コントロールがレイアウトマネージャによって位置決めすることができる配置コントロールを提供する、3レイアウトマネージャは、次のとおり依頼者(開発者がコントロールのサイズおよび配置を提供します) 、パッカー(コントロールは自動的に適切な位置に充填)及び(表示グリッド座標ベースのコントロールに)グリッドは、ここでは繰り返しません。

使用してpygameのゲーム開発
pygameのダウンロードは、画像、サウンド、ビデオ、イベント、衝突などのサポートが含まれます(例えば、ビデオゲームなど)のマルチメディアアプリケーションの開発用に設計されたオープンソースのPythonモジュールです pygameのは、SDLに基づいており、SDLは、クロスプラットフォームのマルチメディア開発ライブラリです、C言語を使用して、それが広く開発ゲームで使用され、シミュレータ、選手、など。そして、もっとゲームの機能とロジックを懸念であってもよいし、pygameのゲーム開発者がもはや基本となる言語に縛られていませんしましょう。

レッツ・完全シンプルで小さなゲーム、ゲームはと呼ばれるこのゲームを完了するには、当然のことながら、「大きなボール小さなボールを食べる」フォーカスではありません、pygameのは焦点ではありません使用することを学ぶ、最も重要な私たちは、以前のプロセスで使用する方法を理解する必要がありますオブジェクト指向プログラミングを説明し、実世界の問題を解決するために、このプログラミングのアイデアを使用する方法を学びます。

ゲームウィンドウを作ります

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()

描画ウィンドウで
直線、矩形、多角形、円、楕円、円弧など:描画ウィンドウを描画でpygameの機能モジュールによって、あなたは、以下を含むグラフィックスを描画することができます。なお、スクリーン座標系を座標原点は左上隅(0、0)に設定されている、右、前方、前方、y軸ダウンは、設定時間の位置や大きさを表すx軸です、私たちのデフォルトの単位はピクセルです。いわゆるピクセルは、画面上のドットで、あなたはこれらの点を見ることができ、画像を数回すると拡大画像を閲覧するソフトウェアを試すことができます。pygameの色は8ビット(ビット)ので、タプルまたはリストで指定された、すなわち、RGB値、0と255の間の各値を、各原色が使用され、三原色光の表記で表されます表される値は、多くの場合、と言われている24の合計に相当する三色から構成され、「24ビットカラー表現」

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()

画像読み込み中

所望の画像ウィンドウ上に直接ロードした場合、画像pygameの機能は、画像ブロック、以前に再レンダリング画像によって得られたブリットウィンドウオブジェクトのメソッドをロードするために使用することができ、コードを以下に示します。

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()

アニメーション効果を達成し
、それは我々が不慣れではない言葉のアニメーションに来るとき、実際には、アニメーション効果を達成するために、原則自体は非常にシンプルである限り、秒あたりのフレームの一定数が、その後、達成として、連続再生の連続画像ではありませんあなたは、比較的滑らかなアニメーションを作ることができます。あなたは上記のコードはボールを移動したい場合は、ボールの位置は、変数で表され、ウィンドウ全体をリフレッシュするサイクルでボール位置を変更することができます。

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()

衝突検出

通常ゲームは、多くのオブジェクトが表示され、砲弾が航空機を打つように、これらのオブジェクト間の「衝突」は避けられない、などは、箱が地面にヒットしそうであるでしょう。衝突検出は、ゲームの大半における重要な問題は、スプライトのpygameの(アニメーションスプライト)モジュールは、衝突検出のためのサポートを提供し、ここで我々は、機能スプライトモジュールが提供する導入しないを取り扱っている必要がありますされています2つのボールの衝突がないので、検出することはちょうど球の中心からチェックすることはありません2以上の半径とボールを持って、非常に簡単です。より小さなボールを作成するために、我々はマウスの位置の両方のランダムクリックで色、大きさやボールの動きの速さを作成するために、マウスイベントを処理することができ、もちろん、これを行うために、我々は前に学ぶことができますオブジェクト指向の知識は、それを適用します。

from enum import Enum, unique
from math import sqrt
from random import randint

import pygame


@unique
class Color(Enum):
    """颜色"""

    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    GRAY = (242, 242, 242)

    @staticmethod
    def random_color():
        """获得随机颜色"""
        r = randint(0, 255)
        g = randint(0, 255)
        b = randint(0, 255)
        return (r, g, b)


class Ball(object):
    """球"""

    def __init__(self, x, y, radius, sx, sy, color=Color.RED):
        """初始化方法"""
        self.x = x
        self.y = y
        self.radius = radius
        self.sx = sx
        self.sy = sy
        self.color = color
        self.alive = True

    def move(self, screen):
        """移动"""
        self.x += self.sx
        self.y += self.sy
        if self.x - self.radius <= 0 or \
                self.x + self.radius >= screen.get_width():
            self.sx = -self.sx
        if self.y - self.radius <= 0 or \
                self.y + self.radius >= screen.get_height():
            self.sy = -self.sy

    def eat(self, other):
        """吃其他球"""
        if self.alive and other.alive and self != other:
            dx, dy = self.x - other.x, self.y - other.y
            distance = sqrt(dx ** 2 + dy ** 2)
            if distance < self.radius + other.radius \
                    and self.radius > other.radius:
                other.alive = False
                self.radius = self.radius + int(other.radius * 0.146)

    def draw(self, screen):
        """在窗口上绘制球"""
        pygame.draw.circle(screen, self.color,
                           (self.x, self.y), self.radius, 0)

イベント処理は、
イベントオブジェクトのイベントタイププロパティのタイプによって決定することができるイベントループでマウスイベントを処理することができ、その後、プロパティは、マウスクリックのPOS位置によって得ることができます。あなたはそれがこの場所にあるキーボードイベント、およびハンドルマウスイベント同様のアプローチに対処します。

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()

一緒に2つのコードの上に、我々は、それは本当に正確なAのゲームではありません(下図参照)ゲーム「ビッグボールは小さなボールを食べる」が、我々が通過してきたゲームの少しの基本的な知識を行う持っていましたこの例では、この知識は、小さなゲーム開発のあなたのツアーを開始することができますし、あなたに伝えます。実際には、上記のコードの後に​​、そのようなウィンドウを更新し、コードがイベントループに配置されるべきではないまでボールの動きをみましょう、と他の学習が可能これらの事を処理するバックグラウンドスレッドで、知識をマルチスレッド化など、多くの価値のある改善が、ありますこれは、より良い選択です。あなたがより良いユーザーエクスペリエンスを取得したい場合は、我々はまた、ゲーム中にBGMを追加し、pygameのダウンロードのミキサーと音楽モジュールを使用してボールとボールの衝突は、我々は簡単にそれを行うことができ、サウンドを再生することができ、我々は所有することができますこの地域の知識。あなたはすぐにKanlaに行くことができれば実際には、最高のチュートリアルでは、pygameの公式サイトでpygameの詳細を知りたい、英語では何も間違っています。あなたは、3Dゲームを開発したい場合は、3Dゲーム開発者のために関心のある読者はPanda3Dを見たい可能性がある場合、pygameのは、不十分となります。

公開された124元の記事 ウォンの賞賛141 ビュー160 000 +

おすすめ

転載: blog.csdn.net/weixin_36838630/article/details/105206649