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