我正在使用Gosu gem进行一些图形编程.问题是,当我创建一个Window时,我的鼠标指针被隐藏了.我可以猜到鼠标在某个时刻的位置,我可以直观地点击,但我的用户可能没有.
如何显示指针?
我正在寻找一个好的图形框架来在Ruby中制作一个漂亮的2D游戏.我做了3个非常简单的测试,看看Gosu和Rubygame之间哪个图形Ruby框架更快.该测试创建1000个"Square"类的实例,使用框架的方法以最简单的方式移动和绘制红色方块.第三个测试是相同的,但在纯OpenGL实现(没有任何框架).结果如下:
PURE OPENGL(使用ruby-opengl)80Fps: 替代文字http://grab.by/JTM
GOSU(使用ruby-opengl + gosu)46Fps: alt text http://grab.by/JTC
RUBYGAME(使用ruby-opengl + rubygame + rsdl)32Fps: alt text http://grab.by/JTw
为什么纯OpenGL测试和Rubygame或Gosu测试之间存在如此大的fps差异?(他们都使用opengl)
那些框架真的可靠还是我应该使用更好的框架?(我不认为自己经历了在纯OpenGL中加载图像声音和字体的整个过程:p)
你怎么看?
我是游戏开发的新手,我认为一起尝试 Gosu、Ruby 和 Chipmunk 会很有趣。到目前为止,我在二维自上而下的场地上有一个球员和一个球,并且它们发生了碰撞。我现在的问题是我希望我的玩家是一个正方形。
我高中时数学很糟糕,那是很多年前的事了。Chipmunk 的文档是这样描述绘制多边形的:
# Create a poly collision shape attached to the given body at
# the given offset with the given vertexes. _verts_ must be an
# Array of CP::Vect with a counterclockwise winding.
def initialize(body, verts, offset); end
Run Code Online (Sandbox Code Playgroud)
我现在有这个代码来获取我的多边形:
verts = Array.new
verts.push(CP::Vec2.new(0,32))
verts.push(CP::Vec2.new(32,32))
verts.push(CP::Vec2.new(32,0))
verts.push(CP::Vec2.new(0,0))
@shape = CP::Shape::Poly.new(@body, verts, CP::Vec2.new(0,0))
Run Code Online (Sandbox Code Playgroud)
这最终给了我一个附加到我的方形 png 上的形状,但看起来好像 0,0 是图像的左上角,而实际的多边形甚至从图像的顶部左侧开始。
所以我认为我应该将“偏移”设置为多边形宽度的一半,但这并没有给我正确的结果。
我确信对于这里的大多数人来说这是基本的。但在游戏开发方面我还处于初级阶段。
有人可以向我解释一下吗?
编辑
这是我截至 2011 年 5 月 28 日的完整代码
我一直无法将 Gosu 库中的文本居中到屏幕的绝对中间。
require 'gosu'
class GameWindow < Gosu::Window
def initialize (width=800, height=600, fullscreen=false)
super
self.caption = 'Hello'
@message = Gosu::Image.from_text(
self, 'HELLO WORLD', Gosu.default_font_name, 45)
end
def draw
@message.draw(377.5,277.5,0)
end
end
window = GameWindow.new
window.show
Run Code Online (Sandbox Code Playgroud)
我的第一种方法是取height
屏幕的 ,减去文本的高度45
,然后除以 2。现在这似乎在垂直对齐时起作用。
然而,水平是一个不同的故事......它似乎是在文本的左上角并将其居中,而不是文本的中间。
有人有这个公式吗?我尝试了很多东西,但只差一点。
Chingu示例看起来像这样:
require 'rubygems'
require 'chingu'
class Game < Chingu::Window
def initialize
super
@player = Player.new
end
end
class Player < Chingu::GameObject
def initialize(options = {})
super(options.merge(:image => Gosu::Image["player.png"])
end
end
Game.new.show
Run Code Online (Sandbox Code Playgroud)
如果我想用线而不是图像绘制Player对象,我将如何进行此操作?
以下代码看似直观,但我无法让它工作!
class Player < Chingu::BasicGameObject
def initialize(options = {})
super
@radius = options[:radius]
@c = Gosu::Color.new(0xffff0000)
end
def draw
$window.draw_rect([@x-1,@y+1,@x+1,@y+1,@x+1,@y-1,@x+1,@y+1],@c,1)
end
end
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
使用 Ruby Gosu,我以这种方式绘制图像:
@background_image.draw(0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
图像比窗口大,有没有办法神奇地调整它的大小以适应窗口?我试图避免硬编码factor_x
和factor_y
.