mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-08 05:34:58 +00:00
A lot of FPS agnosticism, added def lerp
This commit is contained in:
@@ -309,17 +309,16 @@ class TilePuzzleScene
|
||||
if anim
|
||||
@sprites["cursor"].visible = false
|
||||
@sprites["tile#{@heldtile}"].z = 1
|
||||
oldAngle = @sprites["tile#{@heldtile}"].angle
|
||||
rotateTime = Graphics.frame_rate / 4
|
||||
angleDiff = 90.0 / rotateTime
|
||||
rotateTime.times do
|
||||
@sprites["tile#{@heldtile}"].angle -= angleDiff
|
||||
old_angle = @sprites["tile#{@heldtile}"].angle
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
@sprites["tile#{@heldtile}"].angle = lerp(old_angle, old_angle - 90, 0.25, timer_start, System.uptime)
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@heldtile}"].angle == old_angle - 90
|
||||
end
|
||||
@sprites["tile#{@heldtile}"].z = 0
|
||||
@sprites["tile#{@heldtile}"].angle = oldAngle - 90
|
||||
@sprites["cursor"].visible = true if !pbCheckWin
|
||||
end
|
||||
@angles[@heldtile] -= 1
|
||||
@@ -329,24 +328,23 @@ class TilePuzzleScene
|
||||
group = pbGetNearTiles(pos)
|
||||
if anim
|
||||
@sprites["cursor"].visible = false
|
||||
oldAngles = []
|
||||
old_angles = []
|
||||
group.each do |i|
|
||||
@sprites["tile#{@tiles[i]}"].z = 1
|
||||
oldAngles[i] = @sprites["tile#{@tiles[i]}"].angle
|
||||
old_angles.push(@sprites["tile#{@tiles[i]}"].angle)
|
||||
end
|
||||
rotateTime = Graphics.frame_rate / 4
|
||||
angleDiff = 90.0 / rotateTime
|
||||
rotateTime.times do
|
||||
group.each do |i|
|
||||
@sprites["tile#{@tiles[i]}"].angle -= angleDiff
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
group.each_with_index do |idx, i|
|
||||
@sprites["tile#{@tiles[idx]}"].angle = lerp(old_angles[i], old_angles[i] - 90, 0.25, timer_start, System.uptime)
|
||||
end
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@tiles[group[0]]}"].angle == old_angles[0] - 90
|
||||
end
|
||||
group.each do |i|
|
||||
@sprites["tile#{@tiles[i]}"].z = 0
|
||||
@sprites["tile#{@tiles[i]}"].angle = oldAngles[i] - 90
|
||||
end
|
||||
@sprites["cursor"].visible = true if !pbCheckWin
|
||||
end
|
||||
@@ -374,26 +372,33 @@ class TilePuzzleScene
|
||||
movetile = pbMoveCursor(cursor, dir)
|
||||
@sprites["cursor"].visible = false
|
||||
@sprites["tile#{@tiles[cursor]}"].z = 1
|
||||
swapTime = Graphics.frame_rate * 3 / 10
|
||||
duration = 0.3
|
||||
timer_start = System.uptime
|
||||
if [2, 8].include?(dir) # Swap vertically
|
||||
distancePerFrame = (@tileheight.to_f / swapTime).ceil
|
||||
start_sprite_pos = @sprites["tile#{@tiles[movetile]}"].y
|
||||
start_cursor_pos = @sprites["tile#{@tiles[cursor]}"].y
|
||||
dist = (dir / 4).floor - 1
|
||||
swapTime.times do
|
||||
@sprites["tile#{@tiles[movetile]}"].y += dist * distancePerFrame
|
||||
@sprites["tile#{@tiles[cursor]}"].y -= dist * distancePerFrame
|
||||
loop do
|
||||
delta_y = lerp(0, @tileheight * dist, duration, timer_start, System.uptime)
|
||||
@sprites["tile#{@tiles[movetile]}"].y = start_sprite_pos + delta_y
|
||||
@sprites["tile#{@tiles[cursor]}"].y = start_cursor_pos - delta_y
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@tiles[movetile]}"].y == start_sprite_pos + @tileheight * dist
|
||||
end
|
||||
else # Swap horizontally
|
||||
distancePerFrame = (@tilewidth.to_f / swapTime).ceil
|
||||
start_sprite_pos = @sprites["tile#{@tiles[movetile]}"].x
|
||||
start_cursor_pos = @sprites["tile#{@tiles[cursor]}"].x
|
||||
dist = dir - 5
|
||||
swapTime.times do
|
||||
@sprites["tile#{@tiles[movetile]}"].x -= dist * distancePerFrame
|
||||
@sprites["tile#{@tiles[cursor]}"].x += dist * distancePerFrame
|
||||
loop do
|
||||
delta_x = lerp(0, @tilewidth * dist, duration, timer_start, System.uptime)
|
||||
@sprites["tile#{@tiles[movetile]}"].x = start_sprite_pos - delta_x
|
||||
@sprites["tile#{@tiles[cursor]}"].x = start_cursor_pos + delta_x
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@tiles[movetile]}"].x == start_sprite_pos - @tilewidth * dist
|
||||
end
|
||||
end
|
||||
@tiles[cursor], @tiles[movetile] = @tiles[movetile], @tiles[cursor]
|
||||
@@ -428,35 +433,42 @@ class TilePuzzleScene
|
||||
end
|
||||
end
|
||||
# Shift tiles
|
||||
fadeTime = Graphics.frame_rate * 4 / 10
|
||||
fadeDiff = (255.0 / fadeTime).ceil
|
||||
fade_duration = 0.4
|
||||
if anim
|
||||
@sprites["cursor"].visible = false
|
||||
fadeTime.times do
|
||||
@sprites["tile#{@tiles[tiles[tiles.length - 1]]}"].opacity -= fadeDiff
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
end_tile = @sprites["tile#{@tiles[tiles[tiles.length - 1]]}"]
|
||||
end_tile.opacity = lerp(255, 0, fade_duration, timer_start, System.uptime)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if end_tile.opacity == 0
|
||||
end
|
||||
shiftTime = Graphics.frame_rate * 3 / 10
|
||||
duration = 0.3
|
||||
timer_start = System.uptime
|
||||
if [2, 8].include?(dir)
|
||||
distancePerFrame = (@tileheight.to_f / shiftTime).ceil
|
||||
shiftTime.times do
|
||||
tiles.each do |i|
|
||||
@sprites["tile#{@tiles[i]}"].y -= dist * distancePerFrame
|
||||
start_pos = []
|
||||
tiles.each { |i| start_pos.push(@sprites["tile#{@tiles[i]}"].y) }
|
||||
loop do
|
||||
tiles.each_with_index do |idx, i|
|
||||
@sprites["tile#{@tiles[idx]}"].y = lerp(start_pos[i], start_pos[i] - @tileheight * dist, duration, timer_start, System.uptime)
|
||||
end
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@tiles[tiles[0]]}"].y == start_pos[0] - @tileheight * dist
|
||||
end
|
||||
else
|
||||
distancePerFrame = (@tilewidth.to_f / shiftTime).ceil
|
||||
shiftTime.times do
|
||||
tiles.each do |i|
|
||||
@sprites["tile#{@tiles[i]}"].x += dist * distancePerFrame
|
||||
start_pos = []
|
||||
tiles.each { |i| start_pos.push(@sprites["tile#{@tiles[i]}"].x) }
|
||||
loop do
|
||||
tiles.each_with_index do |idx, i|
|
||||
@sprites["tile#{@tiles[idx]}"].x = lerp(start_pos[i], start_pos[i] + @tilewidth * dist, duration, timer_start, System.uptime)
|
||||
end
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if @sprites["tile#{@tiles[tiles[0]]}"].x == start_pos[0] + @tilewidth * dist
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -469,10 +481,13 @@ class TilePuzzleScene
|
||||
end
|
||||
if anim
|
||||
update
|
||||
fadeTime.times do
|
||||
@sprites["tile#{@tiles[tiles[0]]}"].opacity += fadeDiff
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
end_tile = @sprites["tile#{@tiles[tiles[0]]}"]
|
||||
end_tile.opacity = lerp(0, 255, fade_duration, timer_start, System.uptime)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if end_tile.opacity == 255
|
||||
end
|
||||
@sprites["cursor"].selected = false
|
||||
@sprites["cursor"].visible = true if !pbCheckWin
|
||||
@@ -509,15 +524,15 @@ class TilePuzzleScene
|
||||
Rect.new(@tilewidth * (@boardwidth - 1), @tileheight * (@boardheight - 1),
|
||||
@tilewidth, @tileheight))
|
||||
extratile.opacity = 0
|
||||
appearTime = Graphics.frame_rate * 8 / 10
|
||||
opacityDiff = (255.0 / appearTime).ceil
|
||||
appearTime.times do
|
||||
extratile.opacity += opacityDiff
|
||||
timer_start = System.uptime
|
||||
loop do
|
||||
extratile.opacity = lerp(0, 255, 0.8, timer_start, System.uptime)
|
||||
Graphics.update
|
||||
Input.update
|
||||
break if extratile.opacity >= 255
|
||||
end
|
||||
else
|
||||
pbWait(Graphics.frame_rate / 2)
|
||||
pbWait(0.5)
|
||||
end
|
||||
loop do
|
||||
Graphics.update
|
||||
|
||||
Reference in New Issue
Block a user