mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-15 15:42:35 +00:00
Renamed objects/ to game_objects/ removed redundant entities, added Map loader and test map, made LoadingState use Map for entity asset loading.
This commit is contained in:
174
lib/game_objects/entities/player.rb
Normal file
174
lib/game_objects/entities/player.rb
Normal file
@@ -0,0 +1,174 @@
|
||||
require "etc"
|
||||
|
||||
class IMICFPS
|
||||
class Player < Entity
|
||||
|
||||
attr_accessor :speed
|
||||
attr_reader :name, :bound_model, :first_person_view
|
||||
|
||||
def setup
|
||||
bind_model("base", "biped")
|
||||
@collision = :dynamic
|
||||
|
||||
@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.6
|
||||
|
||||
@devisor = 500.0
|
||||
@name_image = Gosu::Image.from_text("#{Etc.getlogin}", 100, font: "Consolas", align: :center)
|
||||
# @name_image.save("temp.png")
|
||||
@name_tex = @name_image.gl_tex_info
|
||||
array_of_pixels = @name_image.to_blob
|
||||
|
||||
tex_names_buf = ' ' * 8
|
||||
glGenTextures(1, tex_names_buf)
|
||||
@name_texture_id = tex_names_buf.unpack('L2').first
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, @name_texture_id)
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, @name_image.width, @name_image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, array_of_pixels)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
||||
glGenerateMipmap(GL_TEXTURE_2D)
|
||||
end
|
||||
|
||||
def draw_nameplate
|
||||
_width = (@name_image.width / @devisor) / 2
|
||||
_height = (@name_image.height / @devisor)
|
||||
_y = 2#normalize_bounding_box(model.bounding_box).max_y+0.05
|
||||
glPushMatrix
|
||||
glRotatef(180, 0, 1, 0)
|
||||
glDisable(GL_LIGHTING)
|
||||
glEnable(GL_COLOR_MATERIAL)
|
||||
glEnable(GL_TEXTURE_2D)
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable(GL_BLEND)
|
||||
glBindTexture(GL_TEXTURE_2D, @name_texture_id)
|
||||
glBegin(GL_TRIANGLES)
|
||||
glColor3f(1.0,1.0,1.0)
|
||||
# TOP LEFT
|
||||
glTexCoord2f(0, 0)
|
||||
glVertex3f(0-_width,_y+_height,0)
|
||||
|
||||
# TOP RIGHT
|
||||
glTexCoord2f(1, 0)
|
||||
glVertex3f(0+_width, _y+_height,0)
|
||||
|
||||
# BOTTOM LEFT
|
||||
glTexCoord2f(0, 1)
|
||||
glVertex3f(0-_width,_y,0)
|
||||
|
||||
# BOTTOM LEFT
|
||||
glTexCoord2f(0, 1)
|
||||
glVertex3f(0-_width,_y,0)
|
||||
|
||||
# BOTTOM RIGHT
|
||||
glTexCoord2f(1, 1)
|
||||
glVertex3f(0+_width, _y,0)
|
||||
|
||||
# TOP RIGHT
|
||||
glTexCoord2f(1, 0)
|
||||
glVertex3f(0+_width,_y+_height,0)
|
||||
glEnd
|
||||
# glDisable(GL_BLEND)
|
||||
glDisable(GL_TEXTURE_2D)
|
||||
glEnable(GL_LIGHTING)
|
||||
glPopMatrix
|
||||
end
|
||||
|
||||
def draw
|
||||
if !@first_person_view
|
||||
super
|
||||
draw_nameplate
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
# Do not handle movement if mouse is not captured
|
||||
return if @camera && !@camera.mouse_captured
|
||||
|
||||
if @_time_in_air
|
||||
air_time = (Gosu.milliseconds - @_time_in_air) / 1000.0
|
||||
@velocity.y -= IMICFPS::GRAVITY * air_time * delta_time
|
||||
end
|
||||
|
||||
super
|
||||
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.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
|
||||
puts "CALLED"
|
||||
@orientation.y += @turn_speed * delta_time
|
||||
end
|
||||
|
||||
def turn_right
|
||||
@orientation.y -= @turn_speed * delta_time
|
||||
end
|
||||
|
||||
def jump
|
||||
if InputMapper.down?(:jump) && !@jumping
|
||||
@jumping = true
|
||||
@_time_in_air = Gosu.milliseconds
|
||||
|
||||
elsif !@jumping
|
||||
@falling = true
|
||||
@_time_in_air ||= Gosu.milliseconds # FIXME
|
||||
else
|
||||
if @jumping && @velocity.y <= 0
|
||||
@falling = false
|
||||
@jumping = false
|
||||
end
|
||||
end
|
||||
|
||||
if @jumping && !@falling
|
||||
if InputMapper.down?(:jump)
|
||||
@velocity.y = 1.5
|
||||
@falling = true
|
||||
end
|
||||
end
|
||||
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
|
||||
Reference in New Issue
Block a user