Beispiel #1
0
    def move_to_animation(self,
                          obj_id,
                          from_x=None,
                          from_y=None,
                          from_material=None,
                          to_x=None,
                          to_y=None,
                          to_material=None,
                          times=0.1,
                          frame=10):
        """今の場所から、layer[y][x]に向かって移動するアニメーションを行います。

        timesの時間をかけて、frame回描画します。

        """
        # まずレイヤ内の座標に変換する。
        from_x, from_y = parse_xy(from_x, from_y, from_material)
        to_x, to_y = parse_xy(to_x, to_y, to_material)

        current_x = from_x * settings.CELL_WIDTH
        current_y = from_y * settings.CELL_HEIGHT
        target_x = to_x * settings.CELL_WIDTH
        target_y = to_y * settings.CELL_HEIGHT
        diff_x = target_x - current_x
        diff_y = target_y - current_y
        step_x = diff_x / frame
        step_y = diff_y / frame
        for i in range(1, frame + 1):
            self.canvas.coords(obj_id, current_x + step_x * i,
                               current_y + step_y * i)
            self.canvas.update_idletasks()
            self.canvas.after(int(times / frame * 1000))
            self.canvas.lift(obj_id)
Beispiel #2
0
    def simple_damage_line(self,
                           x=None,
                           y=None,
                           material=None,
                           width=2,
                           fill='red',
                           times=0.1):
        """キャラの右上から左下にかけて、線をつける。

        x, yはlayer内の座標です。

        """
        x, y = parse_xy(x, y, material)
        damage_line = self.canvas.create_line(
            x * settings.CELL_WIDTH + settings.CELL_WIDTH,  # セルの幅も加えることを忘れずに
            y * settings.CELL_HEIGHT,
            x * settings.CELL_WIDTH,
            y * settings.CELL_HEIGHT +
            settings.CELL_HEIGHT,  # セルの高さも加えることを忘れずに
            width=width,
            fill=fill,
        )
        self.canvas.update_idletasks()  # すぐに描画する
        # デフォルトでは、0.1秒後にダメージ線を消す
        self.canvas.after(int(times * 1000))
        self.canvas.delete(damage_line)
Beispiel #3
0
 def get_materials(self, x=None,  y=None, material=None):
     """その座標の3マテリアルを返す。"""
     x, y = parse_xy(x, y, material)
     tile = self.tile_layer[y][x]
     obj = self.object_layer[y][x]
     items = self.item_layer[y][x]
     return tile, obj, items
Beispiel #4
0
    def move_camera(self, x=None, y=None, material=None):
        """ターゲットにピントを合わせる。

        実際は、キャンバス内をスクロールしているだけです。
        super().__init__(scrollregion=(0, 0, 1000, 1000)...としている場合、
        内部的には仮想的なサイズとして1000pxをCanvasは持っており、スクロールできるようになります。
        yview_movetoには、割合を渡す必要があり、0.0から1.0までの範囲です。

        1.0ならば1000px部分までスクロール、0.5ならば500px部分までスクロール、のように動作します。

        """
        x, y = parse_xy(x, y, material)

        # 単純にtarget.y / self.tile_layer.y_lengthのようにすると、キャラクターが一番上や左に配置されるようにスクロールされる
        # 5セル分の表示ならば、更に上を2つ空けるほうが見栄えがよくなります。
        # DISPLAY_Y_NUM//2 とすると、5セルなら上に2つ空けて、7セルなら上に3つ空けて、といった具合になります。
        fractal_x = (x-settings.DISPLAY_X_NUM//2) / self.tile_layer.x_length
        fractal_y = (y-settings.DISPLAY_Y_NUM//2) / self.tile_layer.y_length
        self.xview_moveto(fractal_x)
        self.yview_moveto(fractal_y)
Beispiel #5
0
 def simple_move(self, obj_id, x=None, y=None, material=None):
     """layer[y][x]にキャラクターを移動する、ショートカットメソッドです。"""
     x, y = parse_xy(x, y, material)
     self.canvas.coords(obj_id, x * settings.CELL_WIDTH,
                        y * settings.CELL_HEIGHT)