summaryrefslogtreecommitdiffhomepage
path: root/src/systems/systems.rb
blob: 824856ecf64acc9a2405805babe53653ee065315 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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 * Rl.frame_time 
      velocity_cmp.y = [velocity_cmp.y,
                        (movement_cmp.max_speed + movement_cmp.deceleration) * Rl.frame_time].min
    end
    if Rl.key_down? 83 # DOWN S
      velocity_cmp.y -= movement_cmp.acceleration * Rl.frame_time 
      velocity_cmp.y = [velocity_cmp.y,
                        (-movement_cmp.max_speed - movement_cmp.deceleration) * Rl.frame_time].max
    end
    if Rl.key_down? 65 # LEFT A
      velocity_cmp.x += movement_cmp.acceleration * Rl.frame_time 
      velocity_cmp.x = [velocity_cmp.x,
                        (movement_cmp.max_speed + movement_cmp.deceleration) * Rl.frame_time].min
    end
    if Rl.key_down? 68 # RIGHT D
      velocity_cmp.x -= movement_cmp.acceleration * Rl.frame_time 
      velocity_cmp.x = [velocity_cmp.x,
                        (-movement_cmp.max_speed - movement_cmp.deceleration) * Rl.frame_time].max
    end
    if velocity_cmp.x > (movement_cmp.deceleration * Rl.frame_time)
      velocity_cmp.x -= movement_cmp.deceleration * Rl.frame_time
    elsif velocity_cmp.x <  (-movement_cmp.deceleration * Rl.frame_time)
      velocity_cmp.x += movement_cmp.deceleration * Rl.frame_time
    else
      velocity_cmp.x = 0
    end
    if velocity_cmp.y > (movement_cmp.deceleration * Rl.frame_time)
      velocity_cmp.y -= movement_cmp.deceleration * Rl.frame_time
    elsif velocity_cmp.y <  (-movement_cmp.deceleration * Rl.frame_time)
      velocity_cmp.y += movement_cmp.deceleration * Rl.frame_time
    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
      position_component.y += velocity_cmp.y
    end
  end,
  FECS::Sys.new('ApplyPositionToSprite') do
    FECS::Cmp::Position.each do |position_cmp|
      sprite = position_cmp.entity.component[FECS::Cmp::Sprite]
      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]
    max_speed = (movement.max_speed + movement.deceleration) * Rl.frame_time

    Rl.draw_text(text: "x vel: #{"%.3f" % player_accel}", x: 500, y: 0, font_size: 30, color: BLACK)
    Rl.draw_text(text: "x max: #{"%.3f" % max_speed}", x: 500, y: 30, font_size: 30, color: BLACK)
  end,
  FECS::Sys.new('Render') do
    FECS::Cmp::Sprite.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
  end,
)

FelECS::Order.sort(
  FECS::Sys::PlayerInput,
  FECS::Sys::Movement,
  FECS::Sys::ApplyPositionToSprite,
  FECS::Sys::Render,
)