from NetworkManager import NetworkManager from time import sleep if __name__ == '__main__': nm = NetworkManager(NetworkManager.MODE_CLIENT_SERVER, NetworkManager.ROLL_CLIENT, '127.0.0.1', 50007) nm.client_open() nm.transmit_data(NetworkManager.DST_SERVER, "HELLO WORLD") while True: sleep(1)
class Client: INIT_GAME = 10 ASSOCIATING = 20 GAME_MODE = 30 def __init__(self, config, window) : # ゲーム内データの生成 self.config = config self.window = window self.own_data = {} self.game_state = self.INIT_GAME # 各インスタンスの生成 self.net = NM(NM.MODE_CLIENT_SERVER, NM.ROLL_CLIENT, '127.0.0.1', 50007) self.keyinput = KeyInput(self.window) self.action = ClientAction(self.keyinput) self.player = '' def update(self): if self.game_state == self.INIT_GAME: thread = threading.Thread(target=self.net.client_open(), daemon=False) thread.start() self.game_state = self.ASSOCIATING elif self.game_state == self.ASSOCIATING: received_data = self.net.receive_data() # SERVER_ASSOCIATION_RESPONSE メッセージが受信できているならば if Event.SERVER_ASSOCIATION_RESPONSE in [d.get('msg') for d in received_data]: for r in received_data: if r['msg'] == Event.SERVER_ASSOCIATION_RESPONSE: self.player = Player(r['dst']) self.player.set_received_data(r['payload']) print(r['payload']) self.game_state = self.GAME_MODE break else: self.net.transmit_data(NM.DST_SERVER, Event.CLIENT_ASSOCIATION_REQUEST) elif self.game_state == self.GAME_MODE: received_data = self.net.receive_data() self.update_model(received_data) else: print(f'[LOG] Invelid state happened: {self.game_state}') def check_transmit_data(self, data): if 'move_flag' not in data: exit() def update_model(self, received_data): # アップデート順番は大事 self.keyinput.update() for r in received_data: self.player.set_received_data(r['payload']) transmit_data = self.action.update() self.check_transmit_data(transmit_data) transmit_data['player_id'] = self.player.player_id # あえてActionの外でつける(いたずら阻止) self.net.transmit_data(NM.DST_SERVER, Event.CLIENT_SEND_GAMEDATA, transmit_data) def update_view(self): self.view.update() # 1000/FPS_VIEW ミリ秒間隔で再実行 self.window.after(int(1000//VIEW_FPS), self.update_view)