【Pyxel】2地点を一定の時間で移動する

はじめに

今作成しているゲームで、2地点を毎回一定の時間で移動したくなったため作成しました。

現在の地点から、クリックした地点を目指して、間を一定の時間で移動します。

import pyxel


class App:
    def __init__(self):
        pyxel.init(160, 120, title="move_constant_time")
        pyxel.mouse(True)
        self.x = 0
        self.y = 0
        self.dx = 0
        self.dy = 0
        self.target_x = 0
        self.target_y = 0
        self.move_frame = 15
        pyxel.run(self.update, self.draw)

    def move_constant_time(self, x, y, dx, dy, target_x, target_y, move_frame):
        """
        一定の時間で移動する
        x, y: 現在の座標
        dx, dy: 移動距離
        target_x, target_y: 目的地の座標
        time: 移動時間
        """
        # ボタンを押したタイミングで移動速度を設定する
        if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT):
            dx = (target_x - x) / move_frame
            dy = (target_y - y) / move_frame
        
        # 次の座標
        next_x = x + dx
        next_y = y + dy
    
        # Xがターゲットを超えたら止める(クランプ)
        if (dx >= 0 and next_x >= target_x) or (dx <= 0 and next_x <= target_x):
            next_x = target_x
    
        # Yがターゲットを超えたら止める(クランプ)
        if (dy >= 0 and next_y >= target_y) or (dy <= 0 and next_y <= target_y):
            next_y = target_y
    
        x = next_x
        y = next_y
    
        return x, y, dx, dy

    def update(self):

        # クリックした場所を移動座標にセットする
        if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT):
            self.target_x, self.target_y = pyxel.mouse_x, pyxel.mouse_y

        # 一定の時間で移動
        self.x, self.y, self.dx, self.dy = self.move_constant_time(self.x, self.y, self.dx, self.dy, self.target_x, self.target_y, self.move_frame)

    def draw(self):
        pyxel.cls(0)
        pyxel.circ(self.x, self.y, 3, 6)
        
        pyxel.pset(self.target_x, self.target_y, 10)

App()

動作確認

pyxel code makerで動作確認できるようにしています。
ぜひご確認を↓
pyxel code maker