diff options
| -rw-r--r-- | main.rb | 4 | ||||
| -rw-r--r-- | src/helper.rb | 42 | ||||
| -rw-r--r-- | src/logic.rb | 155 |
3 files changed, 199 insertions, 2 deletions
@@ -1,5 +1,5 @@ require 'src/init.rb' -require 'src/components/player.rb' -require 'src/systems/systems.rb' +require 'src/helper.rb' +require 'src/logic.rb' require 'src/loop.rb' diff --git a/src/helper.rb b/src/helper.rb new file mode 100644 index 0000000..b925c12 --- /dev/null +++ b/src/helper.rb @@ -0,0 +1,42 @@ +# different states +# each state has a set of frames +# each state remembers what frame it was set it +# each frame has a rectangle for rendering, and a rectangle for a hitbox +class Tileset + attr_accessor :texture + attr_writer :frames + + def initialize(*source_rects, texture:) + source_rects.each do |rect| + self.frames.push rect + end + + self.texture = texture + end + + def rect + self.frames[self.frame.to_i] + end + + def frame + @frame ||= 0 + end + + def frame=(var) + return @frame = 0 if frames.length.zero? + @frame = (var % frames.length) + end + + def step(amount = 1) + self.frame += amount + end + + def step_back(amount = 1) + self.frame -= amount + end + + def frames + @frames ||= [] + end + +end diff --git a/src/logic.rb b/src/logic.rb new file mode 100644 index 0000000..f582f23 --- /dev/null +++ b/src/logic.rb @@ -0,0 +1,155 @@ +FECS::Cmp.new('Player') +FECS::Cmp.new('Velocity', x: 0, y: 0) +FECS::Cmp.new('Position', x: 0, y: 0) +FECS::Cmp.new('Movement', deceleration: 3, acceleration: 8, max_speed: 15) +FECS::Cmp.new('Sprite', + :texture, + :origin, + :source_rect, + :dest_rect, + :rotation, + :tint) +FECS::Cmp.new('SpriteSheet', + :origin, + :tileset, + :dest_rect, + :rotation, + :tint) +FECS::Cmp.new('Hp', value: 0) + +lancelot = Tileset.new(texture: Rl::Texture.new('./assets/lancelot_.png')) + +8.times do |x| + lancelot.frames.push Rl::Rectangle.new((24 * x), 0, 24, 24) +end + + +@player = FECS::Ent.new( + FECS::Cmp::Player.new, + FECS::Cmp::Position.new, + FECS::Cmp::Velocity.new, + #FECS::Cmp::Sprite.new( + # texture: Rl::Texture.new('./assets/lancelot_.png'), + # source_rect: Rl::Rectangle.new(0,0,24,24), + # dest_rect: Rl::Rectangle.new(0,0,48,48), + # origin: Rl::Vector2.new(0,0), + # tint: Rl::Color.new(255,255,255,255), + # rotation: 0 + #), + FECS::Cmp::SpriteSheet.new( + tileset: lancelot, + dest_rect: Rl::Rectangle.new(0,0,48,48), + origin: Rl::Vector2.new(0,0), + tint: Rl::Color.new(255,255,255,255), + rotation: 0 + ), + FECS::Cmp::Movement.new( + deceleration: 2.25, + acceleration: 3, + max_speed: 300, + ), +) + + + +FECS::Stg.add(FECS::Scn.new('Play')) + +FECS::Scn::Play.add( + FECS::Sys.new('PlayerInput') do + ent = FECS::Cmp::Player.first.entity + velocity_cmp = ent.component[FECS::Cmp::Velocity] + #velocity_cmp.x = 0 + #velocity_cmp.y = 0 + movement_cmp = ent.component[FECS::Cmp::Movement] + if Rl.key_down? 87 # UP W + velocity_cmp.y += movement_cmp.acceleration + velocity_cmp.y = [velocity_cmp.y, + (movement_cmp.max_speed + movement_cmp.deceleration)].min + end + if Rl.key_down? 83 # DOWN S + velocity_cmp.y -= movement_cmp.acceleration + velocity_cmp.y = [velocity_cmp.y, + (-movement_cmp.max_speed - movement_cmp.deceleration)].max + end + if Rl.key_down? 65 # LEFT A + velocity_cmp.x += movement_cmp.acceleration + velocity_cmp.x = [velocity_cmp.x, + (movement_cmp.max_speed + movement_cmp.deceleration)].min + end + if Rl.key_down? 68 # RIGHT D + velocity_cmp.x -= movement_cmp.acceleration + velocity_cmp.x = [velocity_cmp.x, + (-movement_cmp.max_speed - movement_cmp.deceleration)].max + end + if velocity_cmp.x > (movement_cmp.deceleration) + velocity_cmp.x -= movement_cmp.deceleration + elsif velocity_cmp.x < (-movement_cmp.deceleration) + velocity_cmp.x += movement_cmp.deceleration + else + velocity_cmp.x = 0 + end + if velocity_cmp.y > (movement_cmp.deceleration) + velocity_cmp.y -= movement_cmp.deceleration + elsif velocity_cmp.y < (-movement_cmp.deceleration) + velocity_cmp.y += movement_cmp.deceleration + else + velocity_cmp.y = 0 + end + end, + FECS::Sys.new('Movement') do + FECS::Cmp::Velocity.each do |velocity_cmp| + ent = velocity_cmp.entity + position_component = ent.component[FECS::Cmp::Position] + movement_cmp = ent.component[FECS::Cmp::Movement] + + position_component.x += velocity_cmp.x * Rl.frame_time + position_component.y += velocity_cmp.y * Rl.frame_time + end + end, + FECS::Sys.new('ApplyPositionToSprite') do + FECS::Cmp::Position.each do |position_cmp| + sprite = position_cmp.entity.component[FECS::Cmp::SpriteSheet] + sprite.tileset.step(4 * Rl.frame_time) + if sprite + sprite.origin.x = position_cmp.x + sprite.origin.y = position_cmp.y + end + end + end, + FECS::Sys.new('ShowSpeed') do + player = FECS::Cmp::Player.first.entity + player_accel = player.component[FECS::Cmp::Velocity].x + movement = player.component[FECS::Cmp::Movement] + frame = player.component[FECS::Cmp::SpriteSheet].tileset.frame + max_speed = (movement.max_speed) + + Rl.draw_text(text: "x vel: #{"%.1f" % player_accel}", x: 500, y: 0, font_size: 30, color: BLACK) + Rl.draw_text(text: "x max: #{"%.1f" % max_speed}", x: 500, y: 30, font_size: 30, color: BLACK) + Rl.draw_text(text: "animation frame: #{"%.2f" % frame}", x: 500, y: 60, font_size: 30, color: BLACK) + end, + FECS::Sys.new('Render') do + #FECS::Cmp::SpriteSheet.each do |sprite_cmp| + # Rl.draw_texture_pro(texture: sprite_cmp.texture, + # origin: sprite_cmp.origin, + # source_rect: sprite_cmp.source_rect, + # dest_rect: sprite_cmp.dest_rect, + # tint: sprite_cmp.tint, + # rotation: sprite_cmp.rotation) + #end + FECS::Cmp::SpriteSheet.each do |sprite_cmp| + Rl.draw_texture_pro(texture: sprite_cmp.tileset.texture, + origin: sprite_cmp.origin, + source_rect: sprite_cmp.tileset.rect, + dest_rect: sprite_cmp.dest_rect, + tint: sprite_cmp.tint, + rotation: sprite_cmp.rotation) + end + end, +) + +FelECS::Order.sort( + FECS::Sys::PlayerInput, + FECS::Sys::Movement, + FECS::Sys::ApplyPositionToSprite, + FECS::Sys::Render, +) |
