Created
June 12, 2020 08:02
-
-
Save makevoid/57fd90fb9cba23c68fd0fdd0c5492574 to your computer and use it in GitHub Desktop.
DragonRuby platformer attempt - first mockup of the game
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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