teeworlds_network/examples/08_gui_snapshot.rb
2024-01-20 22:37:18 +08:00

78 lines
1.5 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# frozen_string_literal: true
require 'gosu'
require_relative '../lib/teeworlds_client'
class Entitiy
attr_reader :x, :y
def initialize(attr = {})
@x = attr[:x]
@y = attr[:y]
end
end
class Tee < Entitiy
attr_reader :w, :h
def initialize(attr = {})
@w = 32
@h = 32
super
end
end
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 500
class Gui < Gosu::Window
def initialize
super(WINDOW_WIDTH, WINDOW_HEIGHT)
self.caption = 'ruby teeworlds client'
@client = TeeworldsClient.new
@client.connect('localhost', 8303, detach: true)
@tees = {}
@background_image = Gosu::Image.new(img('jungle.png'))
@tee_image = Gosu::Image.new(img('default.png'))
end
def img(path)
File.join(File.dirname(__FILE__), 'img/', path)
end
def update
@client.on_snapshot do |_, snap|
@tees = {}
snap.items.each do |item|
next unless item.instance_of?(NetObj::Character)
player = item.to_h
@tees[player[:id]] = Tee.new(player)
end
end
end
def center_around_tee(tee)
wc = WINDOW_WIDTH / 2
hc = WINDOW_HEIGHT / 2
x = -tee.x + wc
y = -tee.y + hc
Entitiy.new(x:, y:)
end
def draw
@background_image.draw(0, 0, 0)
return if @tees.empty?
own_tee = @tees[@client.local_client_id]
own_tee = @tees.first.last if own_tee.nil?
offset = center_around_tee(own_tee)
@tees.each_value do |tee|
@tee_image.draw(tee.x + offset.x, tee.y + offset.y)
end
end
end
Gui.new.show