Skip to content

Instantly share code, notes, and snippets.

@makevoid
Created June 12, 2020 08:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save makevoid/57fd90fb9cba23c68fd0fdd0c5492574 to your computer and use it in GitHub Desktop.
Save makevoid/57fd90fb9cba23c68fd0fdd0c5492574 to your computer and use it in GitHub Desktop.
DragonRuby platformer attempt - first mockup of the game
class World
# PADDING = 10
end
class Player
GUN_HEIGHT = 45
end
class Projectile
SPEED = 4
MAX_NUMBER = 8 # stop shooting, adds a "synthetic reload time" to the game
end
class Viewport
WIDTH = 1280
HEIGHT = 720
end
class Color
# main colors
GROUND = [130, 80, 100] # maroon
PLAYER = [120, 150, 150] # teal
PLAYER_HEAD = [140, 170, 170] # teal (ligther)
# standard colors
RED = [200, 128, 128]
BLUE = [128, 128, 200]
GREEN = [128, 200, 128]
WHITE = [200, 200, 200]
GREY = [128, 128, 128]
BLACK = [20, 20, 20 ]
end
class Platformer
attr_gtk
def generate_ground
[
[0, 0, 1300, 200] << Color::GROUND
]
end
def player
[100, 230, 60, 120] << Color::PLAYER
end
def player_head
[80, 290, 40, 40] << Color::PLAYER_HEAD
end
def defaults
# player
state.player ||= player
state.player_head ||= player_head
state.player_facing ||= :left
# emitters
state.projectiles ||= []
# world
state.time ||= Time.now
state.tiles ||= generate_ground
# timers
state.projectile_shoot_at ||= Time.now
end
X_ADD = -> (state, x) {
state[0] += x
state
}
X_SUB = -> (state, x) {
state[0] -= x
state
}
TIME_DELTA = -> (seconds_diff) {
Time.now + seconds_diff
}
SHOOT_PROJECTILE = -> (state) {
return if state.projectiles.size > Projectile::MAX_NUMBER
return if TIME_DELTA.(-0.2) < state.projectile_shoot_at
delta_x = state.player_facing == :left ? -85 : 15
player_center = state.player[2] + delta_x
projectile = [ state.player[0]+player_center, state.player[1]+Player::GUN_HEIGHT, 10, 10 ] << Color::BLACK << { entity: :projectile, direction: state.player_facing }
state.projectile_shoot_at = Time.now
state.projectiles << projectile
}
def flip_player_head(side)
flip_player_head_to side if side != state.player_facing
state.player_facing = side
end
def flip_player_head_to(side)
x_move = side == :left ? X_SUB : X_ADD
x_move.(state.player_head, state.player[2]) # width
end
def animate_projectile(projectile)
meta = projectile[7]
speed = Projectile::SPEED
if meta[:direction] == :left
projectile[0] -= speed
else
projectile[0] += speed
end
remove_projectile projectile if outside_viewport? projectile
projectile
end
def remove_projectile(projectile)
state.projectiles -= [projectile]
end
def outside_viewport?(projectile)
x = projectile[0]
x < 0 || x > Viewport::WIDTH
end
def input
return if inputs.click
player_movement_speed = 2.5
kb = inputs.keyboard
if kb.key_down.left
flip_player_head :left
X_SUB.(state.player, player_movement_speed)
X_SUB.(state.player_head, player_movement_speed)
end
if kb.key_held.left
X_SUB.(state.player, player_movement_speed*2)
X_SUB.(state.player_head, player_movement_speed*2)
end
if kb.key_down.right
flip_player_head :right
X_ADD.(state.player, player_movement_speed)
X_ADD.(state.player_head, player_movement_speed)
end
if kb.key_held.right
X_ADD.(state.player, player_movement_speed*2)
X_ADD.(state.player_head, player_movement_speed*2)
end
if kb.key_down.space
SHOOT_PROJECTILE.(state)
end
end
def tick
defaults
input
render
end
def render_ground(outs)
outs.solids << state.tiles.map(&:to_a)
end
def render_player(outs)
outs.solids << [ state.player, state.player_head ]
end
def render_projectiles(outs)
outs.solids << state.projectiles
end
def animate_projectiles(outs)
state.projectiles.each do |projectile|
animate_projectile projectile
end
end
def render
outs = args.outputs
render_ground outs
render_player outs
render_projectiles outs
animate_projectiles outs
# render_enemies # TODO
end
end
def main!
GAME = Platformer.new
def tick args
GAME.args = args
GAME.tick
end
$gtk.reset
end
main!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment