-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathmain.rb
More file actions
167 lines (135 loc) · 4.06 KB
/
Copy pathmain.rb
File metadata and controls
167 lines (135 loc) · 4.06 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# Encoding: UTF-8
require 'rubygems'
require 'gosu'
require 'celluloid/current'
require 'celluloid/io'
require 'socket'
require 'securerandom'
require_relative 'models/bomberman'
require_relative 'models/map'
class Client
include Celluloid::IO
def initialize(server, port)
begin
@socket = TCPSocket.new(server, port)
rescue
$error_message = "Cannot find game server."
end
end
def send_message(message)
@socket.write(message) if @socket
end
def read_message
@socket.readpartial(4096) if @socket
end
end
class GameWindow < Gosu::Window
def initialize(server, port, uuid)
# Mapa
@map = Map.new("map1")
super @map.get_width, @map.get_heigth
@client = Client.new(server, port)
self.caption = "Bomberman Game"
# Bomberman
@player = Bomberman.new(self, uuid, 65, 65)
@player.stay(320, 240)
# @player.velocity = 3
# Variáveis para troca de informações
@others_players = Hash.new # Demais jogadores
@messages = Array.new # Fila para troca de mensagens
end
# Game methods
def update
@player.stopped
button_listener
queue_execute
end
def queue_execute
add_to_message_queue('player', @player.to_socket_send)
send_queue
read_socket
end
# Game handle connections
# add a message to the queue to send to the server
def add_to_message_queue(msg_type, socket_send_message)
#message = [msg_type] # Cria o array de mensagens
# Verifica todos os objetos em comum e partilha entre os jogadores
# [:uuid, :x, :y, :direction].each do |instance|
# # Pega cada instancia do objeto e adiciona na mensagem
# end
@messages.push << "#{msg_type}|#{socket_send_message}"
p " Messages Push --> #{msg_type}|#{socket_send_message}"
end
def send_queue
# Envia para o socket as mensagens coletadas
@messages.each do |message|
# p "This message from client to socket: #{message}"
@client.send_message "#{message}\n"
p "send queue: #{message}"
end
@messages.clear
end
def read_socket
# Faz a leitura de mensagens do servidor
if msg = @client.read_message
array_data = msg.split("\n")
p "read socket: #{array_data}"
#p "READED from socket #{array_data}"
array_data.each do |row|
attributes = row.split("|")
self.method("socket_method_"+attributes[0]).call attributes
end
end
end
def socket_method_player socket_data
uuid = socket_data[1]
unless @player.uuid == uuid
@others_players[uuid] ||= Bomberman.new(self, socket_data[1], socket_data[2], socket_data[3], socket_data[4])
method = socket_data[5]
p "Main - metodo chamado -->#{method}"
@others_players[uuid].method(method.to_s).call
end
end
def button_listener
if Gosu::button_down? Gosu::KbSpace
@player.plant_bomb
end
if Gosu::button_down? Gosu::KbUp
if @map.can_move_to @player.x, @player.y-1
@player.move(:up)
end
elsif Gosu::button_down? Gosu::KbDown
if @map.can_move_to @player.x, @player.y+1
@player.move(:down)
end
elsif Gosu::button_down? Gosu::KbLeft
if @map.can_move_to @player.x-1, @player.y
@player.move(:left)
end
elsif Gosu::button_down? Gosu::KbRight
if @map.can_move_to @player.x+1, @player.y
@player.move(:right)
end
end
end
def draw
@player.draw
bombs = @player.bomb_manager.planted_bombs
bombs.each { |bomb| bomb.draw }
@map.draw
# Dispara os jogadores da rede e as suas bombas
@others_players.each_value do |bomberman|
bomberman.draw
bomb_player = bomberman.bomb_manager.planted_bombs
bomb_player.each { |bomb| bomb.draw }
end
end
def button_down(id)
if id == Gosu::KbEscape
close
end
end
end
# A variavel NAVESHIP_ARENA_PORT_5532_TCP_ADDR vem do link do docker, que pode ser visto com bin/docker_run
server, port = ARGV[0] || ENV['SD_BOMBERMAN_ARENA_PORT_5532_TCP_ADDR'], ARGV[1] || 5532
GameWindow.new(server, port, SecureRandom.uuid).show if __FILE__ == $0