有没有办法使用 Gosu 无限期地使用光标滚动地图

Posted

技术标签:

【中文标题】有没有办法使用 Gosu 无限期地使用光标滚动地图【英文标题】:Is there a way to use the cursor to scroll through a map indefinitely using Gosu 【发布时间】:2019-11-21 04:38:11 【问题描述】:

我正在使用 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 每秒运行 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 中的循环更新或绘制会导致程序崩溃。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我想出了一个办法。

def initialize

        super WIDTH, HEIGHT, :fullscreen => false

        self.caption = "Ecosystem Beta"
        @map = Map.new("c:/users/12035/.atom/Ecosystem/eco_map.txt", :tileable => true)
        @cursor = Gosu::Image.new("c:/users/12035/.atom/media/cursor.png")

        @camera_x = 0
        @camera_y = 0

    end

   def update 

       if self.mouse_y > (HEIGHT * 0.67) # if mouse is in lower 3rd of screen
          @camera_y = [@camera_y += 10, 740].min # scrolls to a max of 740 pixels 

       elsif self.mouse_y < (HEIGHT * 0.33)
           @camera_y = [@camera_y -= 10, 0].max # will not scroll past the begginining of the map
       end    
   end






【讨论】:

以上是关于有没有办法使用 Gosu 无限期地使用光标滚动地图的主要内容,如果未能解决你的问题,请参考以下文章

在文本字段中输入时,有没有办法触发浏览器默认的“滚动到光标”行为?

百度地图 怎么清除测距?

使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法

使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法

当光标在右列上方时如何滚动左列?

无限滚动时防止滚动条跳跃