本帖最后由 KB.Driver 于 2019-6-16 20:13 编辑
瞎写的玩意,感觉有不少问题,不太追求完美就自己改改参数凑合着用吧
Velocity = Struct.new(:x, :y) class Sprite #-------------------------------------------------------------------------- # ● 设置跳跃 # x_inc - X坐标增量 # y_inc - Y坐标增量 # duration - 总体时间 # top_inc - 跳跃高度(可选) #-------------------------------------------------------------------------- def set_jump(x_inc, y_inc, duration, top_inc = [y_inc, 0].max + 20) new_x = self.x + x_inc new_y = self.y - y_inc top_y = self.y - top_inc set_jump_xy(new_x, new_y, top_y, duration) end def set_jump_xy(new_x, new_y, top_y, duration) raise "set_jump: top_y should not be smaller than new_y" if top_y > new_y t = duration / 2 ay = 2 * (top_y - self.y).abs / (t * t).to_f vx = (new_x - self.x) / t.to_f vy = (top_y - self.y).abs / t.to_f + 0.5 * ay * t @v = Velocity.new(vx, vy) @ay = ay @t = 0 @new_x, @new_y, @top_y = new_x, new_y, top_y @real_x, @real_y = self.x, self.y @duration = duration @jump_state = :up end def update_jump return if !jumping? @real_x += @v.x @real_y -= @v.y @v.y -= @ay if @jump_state == :up @real_y = [@real_y, @top_y].max if @v.y <= 0 || @real_y == @top_y #@v.y = 0 @jump_state = :down end else # down @real_y = [@real_y, @new_y].min end self.x, self.y = @real_x, @real_y if @t == @duration || self.y == @new_y clear_jump else @t += 1 end end def clear_jump @v = nil @ay = nil @t = nil @new_x = @new_y = @top_y = nil @real_x = @real_y = nil @duration = nil @jump_state = nil end def jumping? !@jump_state.nil? end end
Velocity = Struct.new(:x, :y)
class Sprite
#--------------------------------------------------------------------------
# ● 设置跳跃
# x_inc - X坐标增量
# y_inc - Y坐标增量
# duration - 总体时间
# top_inc - 跳跃高度(可选)
#--------------------------------------------------------------------------
def set_jump(x_inc, y_inc, duration, top_inc = [y_inc, 0].max + 20)
new_x = self.x + x_inc
new_y = self.y - y_inc
top_y = self.y - top_inc
set_jump_xy(new_x, new_y, top_y, duration)
end
def set_jump_xy(new_x, new_y, top_y, duration)
raise "set_jump: top_y should not be smaller than new_y" if top_y > new_y
t = duration / 2
ay = 2 * (top_y - self.y).abs / (t * t).to_f
vx = (new_x - self.x) / t.to_f
vy = (top_y - self.y).abs / t.to_f + 0.5 * ay * t
@v = Velocity.new(vx, vy)
@ay = ay
@t = 0
@new_x, @new_y, @top_y = new_x, new_y, top_y
@real_x, @real_y = self.x, self.y
@duration = duration
@jump_state = :up
end
def update_jump
return if !jumping?
@real_x += @v.x
@real_y -= @v.y
@v.y -= @ay
if @jump_state == :up
@real_y = [@real_y, @top_y].max
if @v.y <= 0 || @real_y == @top_y
#@v.y = 0
@jump_state = :down
end
else # down
@real_y = [@real_y, @new_y].min
end
self.x, self.y = @real_x, @real_y
if @t == @duration || self.y == @new_y
clear_jump
else
@t += 1
end
end
def clear_jump
@v = nil
@ay = nil
@t = nil
@new_x = @new_y = @top_y = nil
@real_x = @real_y = nil
@duration = nil
@jump_state = nil
end
def jumping?
!@jump_state.nil?
end
end
Sprite#update_jump没有写进Sprite#update里面,需要你在对应场景的update中添加
一个使用范例(插入Main以上)
sprite = Sprite.new sprite.bitmap = Bitmap.new("Graphics/Characters/001-Fighter01") sprite.src_rect.set(0, 0, sprite.bitmap.width / 4, sprite.bitmap.height / 4) sprite.x = 640 / 2 sprite.y = 480 / 2 sprite.set_jump(50, 50, 30) while sprite.jumping? do sprite.update_jump Graphics.update end sprite.set_jump(-50, -50, 30) while sprite.jumping? do sprite.update_jump Graphics.update end
sprite = Sprite.new
sprite.bitmap = Bitmap.new("Graphics/Characters/001-Fighter01")
sprite.src_rect.set(0, 0, sprite.bitmap.width / 4, sprite.bitmap.height / 4)
sprite.x = 640 / 2
sprite.y = 480 / 2
sprite.set_jump(50, 50, 30)
while sprite.jumping? do
sprite.update_jump
Graphics.update
end
sprite.set_jump(-50, -50, 30)
while sprite.jumping? do
sprite.update_jump
Graphics.update
end
gif:
|