【Python】マッチ棒クイズ開発 Part6

こんにちは、にわこまです。

今回は、マッチ棒を動かすための関数を作成します。動かすだけでも3つの関数が必要になります。「掴んだとき」、「動かしているとき」、「離したとき」の3つの関数です。1つでも欠けると正しく動作しないため一気に3つ作成します。

 

誤字脱字や分からない点がございましたらご連絡お願いいたします!

メールまたはTwitterのDMまで!!

 

 

 

スポンサードサーチ


マッチ棒を動かすための3つの関数

前述した通りマッチ棒を動かすには「掴んだとき」「動かしているとき」「離したとき」の3つの関数が必要となります。

「掴んだとき」とは、クリックされたことを検知するということです。処理はクリックされた状態を保つことです。

「動かしているとき」とは、クリックされている位置を取得するということです。処理は過去に取得した位置から現在取得した位置の差分を計算し、表示位置を更新することです。

「離したとき」とは、マウスが離されたことを検知するということです。処理はクリックされた状態を解除することです。

 

 

コードの提示

マッチ棒を動かすための3つの関数のソースコードを以下に示します。

import kivy
kivy.require("2.0.0")

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.graphics import Color, Rectangle, Ellipse


class MatchStickWidget(Widget):
    def __init__(self, ms_w, **kwargs):
        super(MatchStickWidget, self).__init__(**kwargs)
        self.size = [0, 0]
        self.past_pos = (0, 0)  # Added
        self.ms_w = ms_w
        # Stick
        self.posStick = [self.x+self.ms_w*0.2, self.y]
        self.sizeStick = [self.ms_w * 0.6, self.ms_w * 5.6]
        # Powder
        self.posPowder = [self.x, self.y+self.ms_w*5.2]
        self.sizePowder = [self.ms_w, self.ms_w*1.6]
        with self.canvas:
            Color(rgb=[0.96, 0.87, 0.7])
            self.stick = Rectangle(pos=self.posStick, size=self.sizeStick)
            Color(rgb=[0.8, 0.1, 0])
            self.powder = Ellipse(pos=self.posPowder, size=self.sizePowder)
        self.bind(pos=self.drawMS)
    def on_touch_down(self, touch, *args):
        if(self.collide_point(*touch.pos)):
            touch.grab(self)
            self.past_pos = touch.pos
            return True
        return False
    def on_touch_up(self, touch, *args):
        if(touch.grab_current is self):
            touch.ungrab(self)
            return True
        return False
    def on_touch_move(self, touch, *args):
        if(touch.grab_current is self):
            self.x += touch.x - self.past_pos[0]
            self.y += touch.y - self.past_pos[1]
            self.past_pos = touch.pos
            return True
        return False
    def drawMS(self, *args):
        # 省略

class RootWidget(FloatLayout):
    # 省略

class MatchStickQuizApp(App):
    def build(self):
        root = RootWidget()
        root.add_widget(MatchStickWidget(25, pos=[100, 100]))
        after_obj = MatchStickWidget(25, pos=[200, 100])
        after_obj.canvas.children[3].rgb = [0.12, 0.56, 1]
        root.add_widget(after_obj)
        return root

if __name__ == '__main__':
    MatchStickQuizApp().run()
    pass

  

上記のコードは以下からダウンロードできます。

  

 

コードの解説

14行目の「past_pos」は、過去の表示位置を保持するための変数です。初期値として0を代入しています。

 

 

28行目から33行目の「on_touch_down関数」は、「掴んだとき」の関数です。

引数は「touch」が必須となります。touchはクリックされた位置などが代入されている変数です。

 

29行目の「if文」は、「collide_point(*touch.pos)」によってクリックされた位置がそのウィジェットの範囲内であるかを判別する条件式です。

範囲内であれば30行目、31行目、32行目の処理を行います。

 

30行目の「grab(self)」は、自分自身を掴んでいます。

31行目の「past_pos」には、touch.pos(クリックした位置)が代入されます。先述した過去に取得した位置にあたります。

32行目の「return文」は、Trueを返しています。

 

33行目の「return文」は、Falseを返しています。

  

 

34行目から38行目の「on_touch_up関数」は、「離したとき」の関数です。

引数は「touch」が必須となります。touchはマウスが離された位置などが代入されている変数です。

 

35行目の「if文」は、現在掴んでいるオブジェクトが自分自身であるかどうかを判別する条件式です。

現在掴んでいるオブジェクトが自分自身であれば、36行目、37行目をの処理を行います。

 

36行目の「ungrab(self)」は、掴んでいるオブジェクトを離します。

37行目の「return文」は、Trueを返しています。

 

38行目の「return文」は、Falseを返しています。

 

 

39行目から45行目の「on_touch_move関数」は、「動かしているとき」の関数です。

引数は「touch」が必須となります。touchは現在のマウスの位置などが代入されている変数です。

 

40行目の「if文」は、現在掴んでいるオブジェクトが自分自身であるかどうかを判別する条件式です。

現在掴んでいるオブジェクトが自分自身であれば、41行目、42行目、43行目、44行目をの処理を行います。

 

41行目と42行目はそれぞれx軸とy軸の過去の位置と現在の位置の差分を計算しています。さらに、その差分を現在の位置に加算し、表示位置の更新を行っています。

 

43行目の「past_pos」は、現在のマウスの位置が代入される変数です。

 

44行目の「return文」は、Trueを返しています。

 

45行目の「return文」は、Falseを返しています。

 

 

動作確認1

コードを保存したらコマンドプロンプトを開き、ファイルを保存したフォルダまで移動します。移動したら、以下のコマンドを入力し実行します。

python matchstickquiz.py

 

以下のように表示されます。

  

  

青色のマッチ棒より右かつ上の範囲をクリックし、マウスを動かしてみてください。右かつ上とは、以下の画像の薄い青色の範囲です。

 

青色のマッチ棒を動くことを確認できましたら動作確認1完了です。

 

 

スポンサードサーチ


動作確認2

コードを保存したらコマンドプロンプトを開き、ファイルを保存したフォルダまで移動します。移動したら、以下のコマンドを入力し実行します。

python matchstickquiz.py

 

以下のように表示されます。

 

赤色のマッチ棒より右かつ上、さらに青色のマッチ棒より左の範囲をクリックし、マウスを動かしてみてください。右かつ上、さらに青色のマッチ棒より左とは、以下の画像の薄い赤色の範囲です。

 

赤色のマッチ棒が動くことを確認できたら動作確認2の完了です。

  

 

動作確認3

コードを保存したらコマンドプロンプトを開き、ファイルを保存したフォルダまで移動します。移動したら、以下のコマンドを入力し実行します。

python matchstickquiz.py

  

以下のように表示されます。

 

赤色のマッチ棒を青色のマッチ棒より右側に持ってきます。 

 

マウスを一回離して、サイド赤色のマッチ棒を動かそうとすると青色のマッチ棒が動くことを確認します。

 

描画順序の関係で赤色のマッチ棒を動かすことができません。

動かすことができない原因は、後に追加されたオブジェクトが前面に表示されるということと当たり判定がマッチ棒の右かつ上の範囲全てであるということです。

  

 

スポンサードサーチ


まとめ

今回は、マッチ棒を動かすための3つの関数を作成しました。具体的に言うと「掴んだとき」「動かしているとき」「離したとき」の3つの関数を作成しました。

動作確認3では、当たり判定が不十分であるため意図しない動作が発生するということを確認しました。

 

次回Part7では、回転に関する関数を作成します。ダブルタップしたら45度回転するといった関数やその他の計算を行います。

当たり判定に関する関数の作成はPart8で行います。

 

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ