Вот код сервера и код клиента:
Код: Выделить всё
import json
import pygame # Main module for the game
import pyautogui # For slightly enhancing control sensitivity
import sys # For console control
import socket # Socket for network communication
import threading # For multithreading
import math
pygame.init() # Initialize Pygame
pygame.display.set_caption('SERVER') # Set window title
height = 960 # Window height
width = 1200 # Window width
screen = pygame.display.set_mode((width, height))
class Bullet:
def __init__(self, img, x, y, dx, dy, w, h, damage, team):
self.__img = img
self.__x = x
self.__y = y
self.__dx = dx
self.__dy = dy
self.__w = w
self.__h = h
self.__damage = damage
self.__team = team
def getdamage(self):
return self.__damage
def getteam(self):
return self.__team
def getrect(self):
nrect = pygame.Rect(0, 0, self.__w, self.__h)
nrect.center = (self.__x, self.__y)
return nrect
def getpos(self):
return (self.__x, self.__y)
def move(self):
self.__x += self.__dx
self.__y += self.__dy
def show(self):
newRect = self.getrect()
screen.blit(self.__img, newRect)
enemy_img = pygame.image.load('char.png')
enemy_img = pygame.transform.flip(enemy_img, True, False)
bulletimg = pygame.image.load('a_bullet.png')
bulletw = bulletimg.get_size()[0]
bulleth = bulletimg.get_size()[1]
imgw = enemy_img.get_size()[0]
imgh = enemy_img.get_size()[1]
bulletlist = []
enex = 0
eney = imgh
playersize = imgw / 2
playerspeed = 3
enexdirec = 0
eneydirec = 0
playerxdirec = 0
playerydirec = 0
playerHp = 100
eneHp = 100
def getPlayerrect(pos):
nrect = pygame.Rect(0, 0, imgw, imgh)
nrect.center = (pos[0], pos[1])
return nrect
def consoles():
global enexdirec, eneydirec
global eneHp, playerHp
while True:
msg = client.recv(1024)
if not msg:
break # Connection closed
decoded_msg = msg.decode() # Decode message to string
if decoded_msg == 'up':
eneydirec = -1
if decoded_msg == 'down':
eneydirec = 1
if decoded_msg == 'left':
enexdirec = -1
if decoded_msg == 'right':
enexdirec = 1
if decoded_msg == 'endx':
enexdirec = 0
if decoded_msg == 'endy':
eneydirec = 0
if decoded_msg == 'damaged':
playerHp -= 10
if playerHp ma:
return ma
elif x < mi:
return mi
return x
def calcvector(sp, fp):
direcx = fp[0] - sp[0]
direcy = fp[1] - sp[1]
l = math.sqrt(direcx**2 + direcy**2)
if l == 0:
return (1, 0)
else:
return (direcx / l, direcy / l)
def GameMain():
global playerHp, eneHp
global enex, eney
global playerxdirec, playerydirec
fps = pygame.time.Clock()
img = pygame.image.load('char.png') # Load player image
imgh = img.get_size()[1]
imgw = img.get_size()[0]
x = 0
y = imgh
while True:
screen.fill((255, 255, 255))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:#send bullet data to client
T = pygame.mouse.get_pos()
direcvec = calcvector((x, y), T)
speed = 8
newB = Bullet(bulletimg, x, y, direcvec[0] * speed, direcvec[1] * speed, 10, 10, 10, 'M')
bulletlist.append(newB)
bullet_data = json.dumps({
'type': 'bullet',
'x': x,
'y': y,
'dx': direcvec[0] * speed,
'dy': direcvec[1] * speed,
'width': 10,
'height': 10,
'damage': 10
})
client.sendall(bullet_data.encode())
keys = pygame.key.get_pressed()
if not(keys[pygame.K_a] ^ keys[pygame.K_d]):
playerxdirec = 0
msg = "endx"
client.sendall(msg.encode())
elif keys[pygame.K_a]:
playerxdirec = -1
msg = "left"
client.sendall(msg.encode())
elif keys[pygame.K_d]:
playerxdirec = 1
msg = "right"
client.sendall(msg.encode())
if not(keys[pygame.K_w] ^ keys[pygame.K_s]):
playerydirec = 0
msg = "endy"
client.sendall(msg.encode())
elif keys[pygame.K_w]:
playerydirec = -1
msg = "up"
client.sendall(msg.encode())
elif keys[pygame.K_s]:
playerydirec = 1
msg = "down"
client.sendall(msg.encode())
for i in bulletlist:
i.move()
bulpos = i.getpos()
if bulpos[0] > width or bulpos[0] < 0 or bulpos[1] < 0 or bulpos[1] > height:
bulletlist.remove(i)
continue
else:
i.show()
if i.getrect().colliderect(getPlayerrect((x, y))) and i.getteam() == 'E':
bulletlist.remove(i)
playerHp -= 10
msg = json.dumps({
'type': 'hp_update',
'hp': eneHp,
'eneHp': playerHp
})
print('er')
client.sendall(msg.encode())
continue
if i.getrect().colliderect(getPlayerrect((enex, eney))) and i.getteam() == 'M':
bulletlist.remove(i)
eneHp -= 10
msg = json.dumps({
'type': 'hp_update',
'hp': eneHp,
'eneHp': playerHp
})
print('su')
client.sendall(msg.encode())
continue
if eneHp height:
bulletlist.remove(i)
continue
else:
i.show()
if i.getrect().colliderect(getPlayerrect((x, y))) and i.getteam() == 'E':
bulletlist.remove(i)
continue
if i.getrect().colliderect(getPlayerrect((enex, eney))) and i.getteam() == 'M':
bulletlist.remove(i)
continue
if playerHp
Подробнее здесь: [url]https://stackoverflow.com/questions/79168442/pygame-multiplayer-jsondecodeerror[/url]