Gosu (Ruby バージョン 2.5.5) を使用して最初のゲームを作成しています。マップを作成しましたが、カーソルによるスクロールを実装したいと考えています。Gosu の例「Cptn Ruby」をガイドとして使用すると、ある程度成功しました。
これが私がこれまでに持っているものです。
def update
# map.width is the number of background tiles in each row and map.height is the number of tiles in
# each column. Each tile is 14x14 pixels.
@camera_x = [[self.mouse_x - (WIDTH / 2), 0].max, @map.width * 14 - WIDTH].min
@camera_y = [[self.mouse_y - (HEIGHT / 2), 0].max, @map.height * 14 - HEIGHT].min
end
def draw
@cursor.draw(self.mouse_x, self.mouse_y, 100, scale_x = 0.65, scale_y = 0.65)
Gosu.translate(-@camera_x, -@camera_y) {@map.draw}
end
これはスクロールしますが、最大ポイントまでしかスクロールしません。カーソルが画面の下部に到達すると、camera_y の値は 239 より大きくなりません (同じ問題が camera_x にも当てはまります)。次のように値に 2 を掛けることで、スクロール距離を増やすことができます。
@camera_y = [[(self.mouse_y - (HEIGHT / 2) * 2, 0].max, @map.height * 14 - HEIGHT].min
ただし、このアプローチでさらにスクロールすると、まだ停止します。マウスが画面の下 (または横) にある間、連続してスクロールしたいと思います。gosu::update は 1 秒あたり 60 回実行されるため、なぜまだこれを行っていないのか、私は混乱しています。カーソルが正しい場所にある場合、実行するたびに @camera_y および/または @camera_x 変数に追加されると思っていましたが、そうではありません。
私もこれを試しました:
if self.mouse_y > (HEIGHT * 0.67) # if mouse is in lower 3rd of screen
@camera_y += 10
end
これは、スクロールを連続的にではなく、10 ピクセルだけ移動するだけです。
これはループで簡単に実行できましたが、Gosu の更新または描画でループが発生すると、プログラムがクラッシュすることがわかりました。
何かご意見は?