mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-15 15:42:35 +00:00
Storm Sync
This commit is contained in:
83
lib/game_objects/entities/editor.rb
Normal file
83
lib/game_objects/entities/editor.rb
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
class IMICFPS
|
||||||
|
class Editor < Entity
|
||||||
|
|
||||||
|
attr_accessor :speed
|
||||||
|
attr_reader :bound_model, :first_person_view
|
||||||
|
|
||||||
|
def setup
|
||||||
|
bind_model
|
||||||
|
@speed = 2.5 # meter's per second
|
||||||
|
@running_speed = 5.0 # meter's per second
|
||||||
|
@turn_speed = 50.0
|
||||||
|
@old_speed = @speed
|
||||||
|
@mass = 72 # kg
|
||||||
|
@first_person_view = true
|
||||||
|
@visible = false
|
||||||
|
@drag = 0.9
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
super
|
||||||
|
|
||||||
|
@position += @velocity * window.dt
|
||||||
|
@velocity *= @drag
|
||||||
|
end
|
||||||
|
|
||||||
|
def relative_speed
|
||||||
|
InputMapper.down?(:sprint) ? @running_speed : @speed
|
||||||
|
end
|
||||||
|
|
||||||
|
def relative_y_rotation
|
||||||
|
@orientation.y * -1
|
||||||
|
end
|
||||||
|
|
||||||
|
def forward
|
||||||
|
@velocity.z += Math.cos(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
@velocity.y -= Math.sin(@orientation.x * Math::PI / 180) * relative_speed
|
||||||
|
@velocity.x -= Math.sin(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
end
|
||||||
|
|
||||||
|
def backward
|
||||||
|
@velocity.z -= Math.cos(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
@velocity.x += Math.sin(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
end
|
||||||
|
|
||||||
|
def strife_left
|
||||||
|
@velocity.z += Math.sin(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
@velocity.x += Math.cos(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
end
|
||||||
|
|
||||||
|
def strife_right
|
||||||
|
@velocity.z -= Math.sin(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
@velocity.x -= Math.cos(relative_y_rotation * Math::PI / 180) * relative_speed
|
||||||
|
end
|
||||||
|
|
||||||
|
def turn_left
|
||||||
|
@orientation.y += @turn_speed * delta_time
|
||||||
|
end
|
||||||
|
|
||||||
|
def turn_right
|
||||||
|
@orientation.y -= @turn_speed * delta_time
|
||||||
|
end
|
||||||
|
|
||||||
|
def ascend
|
||||||
|
@velocity.y += 1 * delta_time
|
||||||
|
end
|
||||||
|
alias :jump :ascend
|
||||||
|
|
||||||
|
def descend
|
||||||
|
@velocity.y -= 1 * delta_time
|
||||||
|
end
|
||||||
|
|
||||||
|
def toggle_first_person_view
|
||||||
|
@first_person_view = !@first_person_view
|
||||||
|
@visible = !@first_person_view
|
||||||
|
end
|
||||||
|
|
||||||
|
def turn_180
|
||||||
|
@orientation.y = @orientation.y + 180
|
||||||
|
@orientation.y %= 360
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -2,19 +2,31 @@ class IMICFPS
|
|||||||
class HUD
|
class HUD
|
||||||
class Widget
|
class Widget
|
||||||
include CommonMethods
|
include CommonMethods
|
||||||
attr_reader :options
|
|
||||||
|
|
||||||
|
# Widget margin from screen edge
|
||||||
|
# or how much widget is pushed in
|
||||||
|
def self.margin
|
||||||
|
@@margin ||= 10
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.padding=(n)
|
||||||
|
@@padding = n
|
||||||
|
end
|
||||||
|
|
||||||
|
# Widget element padding
|
||||||
|
def self.padding
|
||||||
|
@@margin ||= 10
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.padding=(n)
|
||||||
|
@@padding = n
|
||||||
|
end
|
||||||
|
|
||||||
|
attr_reader :options
|
||||||
def initialize(options = {})
|
def initialize(options = {})
|
||||||
@options = options
|
@options = options
|
||||||
@player = options[:player]
|
@player = options[:player]
|
||||||
|
|
||||||
# Widget margin from screen edge
|
|
||||||
# or how much widget is pushed in
|
|
||||||
@margin = 10
|
|
||||||
|
|
||||||
# Widget element padding
|
|
||||||
@padding = 10
|
|
||||||
|
|
||||||
setup
|
setup
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ class IMICFPS
|
|||||||
|
|
||||||
def draw
|
def draw
|
||||||
Gosu.draw_rect(
|
Gosu.draw_rect(
|
||||||
@text.x - @padding, @text.y - @padding,
|
@text.x - Widget.padding, @text.y - Widget.padding,
|
||||||
@text.width + @padding * 2, @text.height + @padding * 2,
|
@text.width + Widget.padding * 2, @text.height + Widget.padding * 2,
|
||||||
@background
|
@background
|
||||||
)
|
)
|
||||||
@text.draw
|
@text.draw
|
||||||
@@ -21,8 +21,8 @@ class IMICFPS
|
|||||||
@text.text = "#{random}/999"
|
@text.text = "#{random}/999"
|
||||||
end
|
end
|
||||||
|
|
||||||
@text.x = window.width - (@margin + @text.width + @padding)
|
@text.x = window.width - (Widget.margin + @text.width + Widget.padding)
|
||||||
@text.y = window.height - (@margin + @text.height + @padding)
|
@text.y = window.height - (Widget.margin + @text.height + Widget.padding)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class IMICFPS
|
|||||||
@text = CyberarmEngine::Text.new(
|
@text = CyberarmEngine::Text.new(
|
||||||
"",
|
"",
|
||||||
size: 16,
|
size: 16,
|
||||||
x: @margin, y: @margin, z: 45,
|
x: Widget.margin, y: Widget.margin, z: 45,
|
||||||
shadow_size: 0.5,
|
shadow_size: 0.5,
|
||||||
shadow_alpha: 0,
|
shadow_alpha: 0,
|
||||||
shadow_color: Gosu::Color::WHITE,
|
shadow_color: Gosu::Color::WHITE,
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ class IMICFPS
|
|||||||
def draw
|
def draw
|
||||||
@text.draw
|
@text.draw
|
||||||
fill_quad(
|
fill_quad(
|
||||||
window.width / 2 - @width / 2, @spacer + @margin, # TOP LEFT
|
window.width / 2 - @width / 2, @spacer + Widget.margin, # TOP LEFT
|
||||||
window.width / 2 + @width / 2, @spacer + @margin, # TOP RIGHT
|
window.width / 2 + @width / 2, @spacer + Widget.margin, # TOP RIGHT
|
||||||
window.width / 2 + @width / 2 - @slant, @spacer + @margin + @height, # BOTTOM RIGHT
|
window.width / 2 + @width / 2 - @slant, @spacer + Widget.margin + @height, # BOTTOM RIGHT
|
||||||
window.width / 2 - @width / 2 + @slant, @spacer + @margin + @height, # BOTTOM LEFT
|
window.width / 2 - @width / 2 + @slant, @spacer + Widget.margin + @height, # BOTTOM LEFT
|
||||||
@color
|
@color
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,10 +31,10 @@ class IMICFPS
|
|||||||
|
|
||||||
# Current Health
|
# Current Health
|
||||||
fill_quad(
|
fill_quad(
|
||||||
window.width / 2 - @width / 2, @spacer + @margin, # TOP LEFT
|
window.width / 2 - @width / 2, @spacer + Widget.margin, # TOP LEFT
|
||||||
(window.width / 2 - @width / 2) + @width * @health, @spacer + @margin, # TOP RIGHT
|
(window.width / 2 - @width / 2) + @width * @health, @spacer + Widget.margin, # TOP RIGHT
|
||||||
bottom_right, @spacer + @margin + @height, # BOTTOM RIGHT
|
bottom_right, @spacer + Widget.margin + @height, # BOTTOM RIGHT
|
||||||
window.width / 2 - @width / 2 + @slant, @spacer + @margin + @height, # BOTTOM LEFT
|
window.width / 2 - @width / 2 + @slant, @spacer + Widget.margin + @height, # BOTTOM LEFT
|
||||||
@shield
|
@shield
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@@ -43,7 +43,7 @@ class IMICFPS
|
|||||||
percentage = "#{(@health * 100).round}".rjust(3, "0")
|
percentage = "#{(@health * 100).round}".rjust(3, "0")
|
||||||
@text.text = "[Health #{percentage}%]"
|
@text.text = "[Health #{percentage}%]"
|
||||||
@text.x = window.width / 2 - @text.width / 2
|
@text.x = window.width / 2 - @text.width / 2
|
||||||
@text.y = @spacer + @margin + @height / 2 - @text.height / 2
|
@text.y = @spacer + Widget.margin + @height / 2 - @text.height / 2
|
||||||
|
|
||||||
@health += 0.1 * window.dt
|
@health += 0.1 * window.dt
|
||||||
@health = 0 if @health > 1.0
|
@health = 0 if @health > 1.0
|
||||||
|
|||||||
@@ -8,31 +8,31 @@ class IMICFPS
|
|||||||
|
|
||||||
@text = Text.new("RADAR", size: 18, mode: :add, font: MONOSPACE_FONT)
|
@text = Text.new("RADAR", size: 18, mode: :add, font: MONOSPACE_FONT)
|
||||||
@image = Gosu::Image.new("#{CYBERARM_ENGINE_ROOT_PATH}/assets/textures/default.png", retro: true)
|
@image = Gosu::Image.new("#{CYBERARM_ENGINE_ROOT_PATH}/assets/textures/default.png", retro: true)
|
||||||
@scale = (@size - @padding * 2.0) / @image.width
|
@scale = (@size - Widget.padding * 2.0) / @image.width
|
||||||
end
|
end
|
||||||
|
|
||||||
def draw
|
def draw
|
||||||
Gosu.draw_rect(
|
Gosu.draw_rect(
|
||||||
@margin, window.height - (@size + @margin),
|
Widget.margin, window.height - (@size + Widget.margin),
|
||||||
@size, @size,
|
@size, @size,
|
||||||
@border_color
|
@border_color
|
||||||
)
|
)
|
||||||
|
|
||||||
Gosu.draw_rect(
|
Gosu.draw_rect(
|
||||||
@margin + @padding, window.height - (@size + @margin) + @padding,
|
Widget.margin + Widget.padding, window.height - (@size + Widget.margin) + Widget.padding,
|
||||||
@size - @padding * 2, @size - @padding * 2,
|
@size - Widget.padding * 2, @size - Widget.padding * 2,
|
||||||
@radar_color
|
@radar_color
|
||||||
)
|
)
|
||||||
|
|
||||||
@image.draw(@margin + @padding, window.height - (@size + @margin) + @padding, 46, @scale, @scale, 0x88ffffff)
|
@image.draw(Widget.margin + Widget.padding, window.height - (@size + Widget.margin) + Widget.padding, 46, @scale, @scale, 0x88ffffff)
|
||||||
|
|
||||||
@text.draw
|
@text.draw
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@text.text = "RADAR: X #{@player.position.x.round(1)} Y #{@player.position.y.round(1)} Z #{@player.position.z.round(1)}"
|
@text.text = "RADAR: X #{@player.position.x.round(1)} Y #{@player.position.y.round(1)} Z #{@player.position.z.round(1)}"
|
||||||
@text.x = @margin + @size / 2 - @text.width / 2
|
@text.x = Widget.margin + @size / 2 - @text.width / 2
|
||||||
@text.y = window.height - (@margin + @size + @text.height)
|
@text.y = window.height - (Widget.margin + @size + @text.height)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class IMICFPS
|
|||||||
@text = CyberarmEngine::Text.new(
|
@text = CyberarmEngine::Text.new(
|
||||||
"",
|
"",
|
||||||
size: 16,
|
size: 16,
|
||||||
x: @margin, y: @margin, z: 45,
|
x: Widget.margin, y: Widget.margin, z: 45,
|
||||||
shadow: true,
|
shadow: true,
|
||||||
shadow_size: 0.5,
|
shadow_size: 0.5,
|
||||||
shadow_alpha: 30,
|
shadow_alpha: 30,
|
||||||
@@ -24,7 +24,7 @@ class IMICFPS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@text.x = window.width - (@text.width + @margin)
|
@text.x = window.width - (@text.width + Widget.margin)
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_random_data
|
def generate_random_data
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ class IMICFPS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@text.x = @margin + @size + @padding
|
@text.x = Widget.margin + @size + Widget.padding
|
||||||
@text.y = window.height - (@margin + @text.height)
|
@text.y = window.height - (Widget.margin + @text.height)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -83,18 +83,13 @@ class IMICFPS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.action(key)
|
def self.action(key)
|
||||||
answer = nil
|
@@keymap.select do |action, value|
|
||||||
@@keymap.detect do |action, value|
|
|
||||||
if value.is_a?(Array)
|
if value.is_a?(Array)
|
||||||
answer = action if value.include?(key)
|
action if value.include?(key)
|
||||||
else
|
else
|
||||||
if value == key
|
action if value == key
|
||||||
answer = action
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end.map { |keymap| keymap.first.is_a?(Symbol) ? keymap.first : keymap.first.first }
|
||||||
|
|
||||||
answer
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.reset_keys
|
def self.reset_keys
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ class IMICFPS
|
|||||||
Publisher.new
|
Publisher.new
|
||||||
@map = Map.new( map_parser: @options[:map_parser] )
|
@map = Map.new( map_parser: @options[:map_parser] )
|
||||||
@camera = PerspectiveCamera.new( position: Vector.new, aspect_ratio: window.aspect_ratio )
|
@camera = PerspectiveCamera.new( position: Vector.new, aspect_ratio: window.aspect_ratio )
|
||||||
|
@editor = IMICFPS::Editor.new( manifest: Manifest.new(package: "base", name: "editor") )
|
||||||
|
@camera_controller = CameraController.new(camera: @camera, entity: @editor)
|
||||||
@crosshair = Crosshair.new
|
@crosshair = Crosshair.new
|
||||||
|
|
||||||
@map.setup
|
@map.setup
|
||||||
@@ -24,8 +26,26 @@ class IMICFPS
|
|||||||
def update
|
def update
|
||||||
super
|
super
|
||||||
Publisher.instance.publish(:tick, Gosu.milliseconds - window.delta_time)
|
Publisher.instance.publish(:tick, Gosu.milliseconds - window.delta_time)
|
||||||
|
|
||||||
|
control_editor
|
||||||
|
|
||||||
@map.update
|
@map.update
|
||||||
@camera.update
|
@camera_controller.update
|
||||||
|
end
|
||||||
|
|
||||||
|
def control_editor
|
||||||
|
InputMapper.keys.each do |key, pressed|
|
||||||
|
next unless pressed
|
||||||
|
|
||||||
|
actions = InputMapper.action(key)
|
||||||
|
next unless actions
|
||||||
|
|
||||||
|
actions.each do |action|
|
||||||
|
@editor.send(action) if @editor.respond_to?(action)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@editor.update
|
||||||
end
|
end
|
||||||
|
|
||||||
def button_down(id)
|
def button_down(id)
|
||||||
@@ -39,6 +59,8 @@ class IMICFPS
|
|||||||
InputMapper.keydown(id)
|
InputMapper.keydown(id)
|
||||||
Publisher.instance.publish(:button_down, nil, id)
|
Publisher.instance.publish(:button_down, nil, id)
|
||||||
|
|
||||||
|
@camera_controller.button_down(id)
|
||||||
|
|
||||||
@map.entities.each do |entity|
|
@map.entities.each do |entity|
|
||||||
entity.button_down(id) if defined?(entity.button_down)
|
entity.button_down(id) if defined?(entity.button_down)
|
||||||
end
|
end
|
||||||
@@ -52,7 +74,7 @@ class IMICFPS
|
|||||||
entity.button_up(id) if defined?(entity.button_up)
|
entity.button_up(id) if defined?(entity.button_up)
|
||||||
end
|
end
|
||||||
|
|
||||||
@camera.button_up(id)
|
@camera_controller.button_up(id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user