-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
176 lines (151 loc) · 6.3 KB
/
Copy pathclient.py
File metadata and controls
176 lines (151 loc) · 6.3 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
168
169
170
171
172
173
174
175
176
# python
#
# Multiplayer Networking Game
#
import pygame
from pygame import *
import src.sprite as sprite
import src.visual as visual
import src.screen_settings as screen_settings
from src.log import log
import src.texture as texture
import src.settings as settings
import src.tile as tile
import src.object as obj
from src.player import Player
from src.texture import TextureAssets
from src.app_interaction import DiscordRPC
import src.net as net
import threading
import server
import socket
class Game:
objects = False # set to False as there are no objects yet
tiles = False
active_area = False,
is_playing = True
tick_timer = 0
def animate(self):
if self.objects != False:
for i in range(len(self.objects)):
if texture.is_anim(self.objects[i].sprite.texture):
self.objects[i].sprite.texture.tick += 1 # step the tick
if self.objects[i].sprite.texture.tick >= self.objects[i].sprite.texture.delay[self.objects[i].sprite.texture.current]:
self.objects[i].sprite.texture.step()
self.objects[i].sprite.texture.tick = 0
if self.tiles != False:
for i in range(len(self.tiles)):
self.tiles[i].animation.tick += 1 # step the tick
if self.tiles[i].animation.tick >= self.tiles[i].animation.delay[self.tiles[i].animation.current]:
self.tiles[i].animation.step()
self.tiles[i].animation.tick = 0
def tick(self, dtime, tick_time):
self.animate(self)
def get_sprites(self):
sprites = []
if self.tiles != False:
for i in range(len(self.tiles)):
ts = sprite.Sprite(self.tiles[i].image())
ts.rect = self.tiles[i].rect
sprites.append(ts)
for i in range(len(self.objects)):
sprites.append(self.objects[i].sprite)
return sprites
def get_local_player(self):
for i in range(len(self.objects)):
o = self.objects[i]
if o.id and o.id == "LocalPlayer":
return i, o
#def delta(self, value, dtime):
# return value / 10 * dtime
def handle_tick(dtime):
if Game.tick_timer > 100:
log(str(int(Game.tick_timer/50)) + " ticks were dropped", "Warning")
Game.tick_timer = 0; # timer has fallen behind at least 2 ticks, drop all the ticks
if Game.tick_timer >= 50:
Game.tick(Game, dtime, Game.tick_timer)
Game.tick_timer -= 50
def begin(screen, ip="127.0.0.1", port=2048):
pygame.display.set_caption(screen_settings.DisplayParams.titles.game)
screen.fill(visual.Colors.darkgrey)
textobj = visual.create_text("Connecting to Server...", Vector2(screen_settings.DisplayParams.center[0], screen_settings.DisplayParams.center[1]), 48)
text_sprite = sprite.Sprite(textobj[0])
text_sprite.rect = textobj[1]
screen.blit(text_sprite.image(), text_sprite.rect)
pygame.display.flip()
client = None
if ip != None and port != None:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client_id = client.connect((ip, port))
client.sendall(net.pack(net.Network.Headers.DEBUG_MESSAGE, ["Hello from client".encode("utf-8")]))
except:
log(f"Could not connect to server {ip}", "Error")
continue_application = True
try:
#run_menu_when_done = game.Game.play(game.Game, screen, client)
clock = pygame.time.Clock()
pygame.display.set_caption(screen_settings.DisplayParams.titles.game)
log("Starting Game")
Game.is_playing = True
# temporarily just add a player sprite to the list and open the test map
player = Player(sprite.Sprite(TextureAssets.player("front").image(), 0), "LocalPlayer")
Game.objects = list([player])
Game.tiles = tile.open_tmap_from_area("test")
dtime = 0
while Game.is_playing is True:
dtime = clock.tick(settings.Settings.fps)
Game.tick_timer += dtime
for event in pygame.event.get():
if event.type == pygame.QUIT:
log("Quitting Game")
continue_application = False
Game.is_playing = False
obj.removeDeadObjects(Game.objects)
lpi, lpo = Game.get_local_player(Game)
#elif event.type == pygame.KEYDOWN:
#Keys.processPressed(Keys, pygame.key.get_pressed())
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
Game.objects[lpi].move(Vector2(0, -10))
elif keys[pygame.K_s]:
Game.objects[lpi].move(Vector2(0, 10))
if keys[pygame.K_a]:
Game.objects[lpi].move(Vector2(-10, 0))
elif keys[pygame.K_d]:
Game.objects[lpi].move(Vector2(10, 0))
Game.objects[lpi].update(dtime)
handle_tick(dtime)
#print("frame: " + str(dtime))
#print(Game.tick_timer)
screen_settings.draw_window(screen, Game.get_sprites(Game))
log("Game Finished")
except error as e:
log(e, "Error")
return continue_application
def begin_singleplayer(screen, port):
log("Joining singleplayer game")
DiscordRPC.set(DiscordRPC, "In Game", "Playing Singleplayer")
# start server
#sst = threading.Thread(None, server.start, "SINGLEPLAYER_SERVER", (port, 1, True, 1, True), {}, False) # None, func, name, args, kwargs, daemon
#sst.start()
try:
cont = begin(screen, "127.0.0.1", port)
except error as e:
log(e, "Error")
#sst.join() # wait for server to stop
return cont
def begin_multiplayer(screen, addr, port):
log("Joining multiplayer game")
DiscordRPC.set(DiscordRPC, "In Game", "Playing Multiplayer")
cont = True
try:
cont = begin(screen, addr, port)
except error as e:
log(e, "Error")
return cont
def main(): # allow the client to be started directly without having to call begin() and pass in the screen
screen = pygame.display.set_mode(screen_settings.DisplayParams.size)
begin_singleplayer(screen, None)
if __name__ == "__main__": # start the client if it is being run from command line, otherwise it is likely being run by import
main()