velocity packet
This commit is contained in:
parent
5be9f94e07
commit
d3060a1f28
4 changed files with 103 additions and 127 deletions
68
README.md
68
README.md
|
@ -1,3 +1,69 @@
|
||||||
# cubicjs
|
# cubicjs
|
||||||
|
|
||||||
https://meex.lol/cubic/
|
сайт: https://meex.lol/cubic/
|
||||||
|
|
||||||
|
## протокол
|
||||||
|
|
||||||
|
работает через вебсокеты \
|
||||||
|
дефолтный порт 8000
|
||||||
|
|
||||||
|
булевые значения пишутся как 0 и 1 \
|
||||||
|
в нике не должны быть пробелы \
|
||||||
|
установка - добавление / изменение
|
||||||
|
|
||||||
|
чтобы подключиться к серверу, \
|
||||||
|
нужно отправить пакет J, затем \
|
||||||
|
все пакеты произвольные
|
||||||
|
|
||||||
|
### формат пакетов
|
||||||
|
первый символ - тип пакета \
|
||||||
|
остальное - данные пакета, параметры через \n (перенос строки) \
|
||||||
|
пример пакета отправки мира:
|
||||||
|
```
|
||||||
|
"WB10,0,1,normal,#fff\nP1name,0,1,0,0,#d00"
|
||||||
|
🠅└─┬───────────────┘ └┬────────────────┘
|
||||||
|
тип параметр (блок) параметр (игрок)
|
||||||
|
```
|
||||||
|
|
||||||
|
### список пакетов
|
||||||
|
{данные} - типа это какието данные так обозначаю, скобки не надо \
|
||||||
|
[C] - айди пакета
|
||||||
|
|
||||||
|
**клиент отправляет:**
|
||||||
|
```
|
||||||
|
заход игрока [J]: {ник_игрока}
|
||||||
|
отправить velocity [V]: {vel_x}, {vel_y}
|
||||||
|
установить блок [P]: {x}, {y}, {тип}
|
||||||
|
сломать блок [D]: {x}, {y}
|
||||||
|
нажатие кнопки (список кнопок ниже) [K]: {кнопка}, {нажата ли}
|
||||||
|
отправить сообщение [M]: {сообщение}
|
||||||
|
```
|
||||||
|
|
||||||
|
**сервер отправляет:**
|
||||||
|
```
|
||||||
|
кикнуть игрока с ошибкой [K]: {ошибка}
|
||||||
|
установить цвета игроку [C]: {цвет}
|
||||||
|
установить ник игрока [N]: {ник}
|
||||||
|
установить позицию игрока [P]: {x}, {y}
|
||||||
|
установить velocity игрока [V]: {x}, {y}
|
||||||
|
установить walk speed игрока [S]: "W", {скорость}
|
||||||
|
установить jump speed игрока [S]: "J", {скорость}
|
||||||
|
установить gravity speed игрока [S]: "G", {скорость}
|
||||||
|
отправить мир [W]: {изм. мира}, {изм. мира}, ...
|
||||||
|
отправить все типы блоков: [B]: {тип_1}, ..., {тип_9}
|
||||||
|
отправить сообщение [M]: {сообщение}, {сообщение}, ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**список кнопок которые может отправить игрок через отдельный пакет:**
|
||||||
|
```
|
||||||
|
["KeyR", "KeyW", "KeyE", "KeyQ", "KeyS", "KeyZ", "KeyX", "KeyC"
|
||||||
|
"Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5",
|
||||||
|
"Numpad6", "Numpad7", "Numpad8", "Numpad9", "Numpad0",
|
||||||
|
"ShiftLeft", "ControlLeft", "Enter", "F1", "F2"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**формат изменения мира:** \
|
||||||
|
установка блока: "B1{x},{y},{collides},{type},{color}" \
|
||||||
|
установка игрока: "P1{name},{x},{y},{vel_x},{vel_y},{color}"\
|
||||||
|
удаление блока: "B0{x},{y}" \
|
||||||
|
удаление игрока: "P0{name}"
|
68
index.html
68
index.html
|
@ -42,7 +42,6 @@
|
||||||
<span id="server-error" style="color: red;margin: 5px 0;display: inline-block;"></span><br>
|
<span id="server-error" style="color: red;margin: 5px 0;display: inline-block;"></span><br>
|
||||||
<button id="connect-server">поддключт к серваа</button><br>
|
<button id="connect-server">поддключт к серваа</button><br>
|
||||||
|
|
||||||
|
|
||||||
<div class="margin-25"></div>
|
<div class="margin-25"></div>
|
||||||
|
|
||||||
<canvas width="640" height="480" id="game"></canvas>
|
<canvas width="640" height="480" id="game"></canvas>
|
||||||
|
@ -69,75 +68,12 @@
|
||||||
меню отладки на F3
|
меню отладки на F3
|
||||||
ресетнуться на кнопку R
|
ресетнуться на кнопку R
|
||||||
открыть чат кнопка T
|
открыть чат кнопка T
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<div class="margin-25"></div>
|
<div class="margin-25"></div>
|
||||||
|
|
||||||
<h3>протокол сервачный:</h3>
|
<a href="https://github.com/MeexReay/cubicjs">репозиторий гитхаб</a>
|
||||||
|
<a href="README.md">протокол сервера</a>
|
||||||
<pre>
|
|
||||||
работает через вебсокеты
|
|
||||||
дефолтный порт 8000
|
|
||||||
|
|
||||||
булевые значения пишутся как 0 и 1
|
|
||||||
в нике не должны быть пробелы
|
|
||||||
установка - добавление / изменение
|
|
||||||
|
|
||||||
формат пакетов:
|
|
||||||
первый символ - тип пакета
|
|
||||||
остальное - данные пакета, параметры через \n (перенос строки)
|
|
||||||
пример пакета отправки мира:
|
|
||||||
"WB10,0,1,normal,#fff\nP1name,0,1,0,0,#d00"
|
|
||||||
🠅└─┬───────────────┘ └┬────────────────┘
|
|
||||||
тип параметр (блок) параметр (игрок)
|
|
||||||
|
|
||||||
|
|
||||||
список пакетов:
|
|
||||||
{данные} - типа это какието данные так обозначаю, скобки не надо
|
|
||||||
[C] - айди пакета
|
|
||||||
|
|
||||||
клиент отправляет:
|
|
||||||
заход игрока [J]: {ник_игрока}
|
|
||||||
прыжок выкл (controls_jump = false) [C]: "J", "0"
|
|
||||||
прыжок вкл (controls_jump = true) [C]: "J", "1"
|
|
||||||
идти выкл (controls_x = 0) [C]: "W", "0"
|
|
||||||
идти левее (controls_x = -1) [C]: "W", "1"
|
|
||||||
идти правее (controls_x = 1) [C]: "W", "2"
|
|
||||||
установить блок [P]: {x}, {y}, {тип}
|
|
||||||
сломать блок [D]: {x}, {y}
|
|
||||||
нажатие кнопки (список кнопок ниже) [K]: {кнопка}, {нажата ли}
|
|
||||||
отправить сообщение [M]: {сообщение}
|
|
||||||
корректировка движения [R]: {рандомное айди}
|
|
||||||
|
|
||||||
сервер отправляет:
|
|
||||||
кикнуть игрока с ошибкой [K]: {ошибка}
|
|
||||||
установить цвета игроку [C]: {цвет}
|
|
||||||
установить ник игрока [N]: {ник}
|
|
||||||
установить позицию игрока [P]: {x}, {y}
|
|
||||||
установить velocity игрока [V]: {x}, {y}
|
|
||||||
установить walk speed игрока [S]: "W", {скорость}
|
|
||||||
установить jump speed игрока [S]: "J", {скорость}
|
|
||||||
установить gravity speed игрока [S]: "G", {скорость}
|
|
||||||
отправить мир [W]: {изм. мира}, {изм. мира}, ...
|
|
||||||
отправить все типы блоков: [B]: {тип_1}, ..., {тип_9}
|
|
||||||
отправить сообщение [M]: {сообщение}, {сообщение}, ...
|
|
||||||
корректировка движения [R]: {рандомное айди}, {время}, {vel_x}, {vel_y}, {x}, {y}
|
|
||||||
|
|
||||||
список кнопок которые может отправить игрок через отдельный пакет:
|
|
||||||
["KeyR", "KeyW", "KeyE", "KeyQ", "KeyS", "KeyZ", "KeyX", "KeyC"
|
|
||||||
"Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5",
|
|
||||||
"Numpad6", "Numpad7", "Numpad8", "Numpad9", "Numpad0",
|
|
||||||
"ShiftLeft", "ControlLeft", "Enter", "F1", "F2"]
|
|
||||||
|
|
||||||
формат изменения мира:
|
|
||||||
установка блока: "B1{x},{y},{collides},{type},{color}"
|
|
||||||
установка игрока: "P1{name},{x},{y},{vel_x},{vel_y},{color}"
|
|
||||||
удаление блока: "B0{x},{y}"
|
|
||||||
удаление игрока: "P0{name}"
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<a href="server.py">готовая реализация сервера на Python</a>
|
<a href="server.py">готовая реализация сервера на Python</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
40
script.js
40
script.js
|
@ -325,14 +325,11 @@ class MainPlayer extends Player {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (key == "KeyD") {
|
if (key == "KeyD") {
|
||||||
this.send_packet("C","W","2")
|
this.controls_x = 1
|
||||||
setTimeout(() => { this.controls_x = 1 }, this.ping)
|
|
||||||
} else if (key == "KeyA") {
|
} else if (key == "KeyA") {
|
||||||
this.send_packet("C","W","1")
|
this.controls_x = -1
|
||||||
setTimeout(() => { this.controls_x = -1 }, this.ping)
|
|
||||||
} else if (key == "Space") {
|
} else if (key == "Space") {
|
||||||
this.send_packet("C","J","1")
|
this.controls_jump = true
|
||||||
setTimeout(() => { this.controls_jump = true }, this.ping)
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
return false
|
return false
|
||||||
} else if (key == "KeyR") {
|
} else if (key == "KeyR") {
|
||||||
|
@ -369,11 +366,9 @@ class MainPlayer extends Player {
|
||||||
|
|
||||||
if ((key == "KeyD" && this.controls_x == 1)
|
if ((key == "KeyD" && this.controls_x == 1)
|
||||||
|| (key == "KeyA" && this.controls_x == -1)) {
|
|| (key == "KeyA" && this.controls_x == -1)) {
|
||||||
this.send_packet("C","W","0")
|
this.controls_x = 0
|
||||||
setTimeout(() => { this.controls_x = 0 }, this.ping)
|
|
||||||
} else if (key == "Space" && this.controls_jump) {
|
} else if (key == "Space" && this.controls_jump) {
|
||||||
this.send_packet("C","J","0")
|
this.controls_jump = false
|
||||||
setTimeout(() => { this.controls_jump = false }, this.ping)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allowed_key_to_send.includes(key)) {
|
if (allowed_key_to_send.includes(key)) {
|
||||||
|
@ -435,16 +430,6 @@ class MainPlayer extends Player {
|
||||||
chatMessages.unshift(...packet_data)
|
chatMessages.unshift(...packet_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet_id == "R") {
|
|
||||||
let ping = parseFloat(packet_data[1]) - parseFloat(packet_data[0])
|
|
||||||
if (player.ping == -1) player.ping = ping
|
|
||||||
else player.ping = (player.ping + ping) / 2
|
|
||||||
player.velocity_x = parseFloat(packet_data[2])
|
|
||||||
player.velocity_y = parseFloat(packet_data[3])
|
|
||||||
player.x = parseFloat(packet_data[4])
|
|
||||||
player.y = parseFloat(packet_data[5])
|
|
||||||
}
|
|
||||||
|
|
||||||
if (packet_id == "P") {
|
if (packet_id == "P") {
|
||||||
let x = parseFloat(packet_data[0])
|
let x = parseFloat(packet_data[0])
|
||||||
let y = parseFloat(packet_data[1])
|
let y = parseFloat(packet_data[1])
|
||||||
|
@ -540,13 +525,22 @@ class MainPlayer extends Player {
|
||||||
this.socket.send(id+params.join("\n"))
|
this.socket.send(id+params.join("\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
send_velocity_packet(x, y) {
|
||||||
|
if (x != 0 || y != 0) return
|
||||||
|
this.send_packet("V", x, y)
|
||||||
|
}
|
||||||
|
|
||||||
tick() {
|
tick() {
|
||||||
super.tick(false)
|
super.tick(false)
|
||||||
|
|
||||||
this.velocity_x += this.controls_x * this.walk_speed
|
let vel_x = this.controls_x * this.walk_speed
|
||||||
|
let vel_y = 0
|
||||||
|
|
||||||
|
this.velocity_x += vel_x
|
||||||
|
|
||||||
if (this.controls_jump && this.on_ground) {
|
if (this.controls_jump && this.on_ground) {
|
||||||
this.velocity_y += this.jump_speed
|
vel_y = this.jump_speed
|
||||||
|
this.velocity_y += vel_y
|
||||||
this.on_ground = false
|
this.on_ground = false
|
||||||
} else {
|
} else {
|
||||||
this.velocity_y -= this.gravity_speed
|
this.velocity_y -= this.gravity_speed
|
||||||
|
@ -556,7 +550,7 @@ class MainPlayer extends Player {
|
||||||
|
|
||||||
ticksAlive++
|
ticksAlive++
|
||||||
|
|
||||||
this.send_packet("R",Date.now())
|
this.send_velocity_packet(vel_x, vel_y)
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
54
server.py
54
server.py
|
@ -121,12 +121,7 @@ class Player(Block):
|
||||||
self.vel_x = round(self.vel_x * 100) / 100
|
self.vel_x = round(self.vel_x * 100) / 100
|
||||||
self.vel_y = round(self.vel_y * 100) / 100
|
self.vel_y = round(self.vel_y * 100) / 100
|
||||||
|
|
||||||
self.vel_x += self.controls_x * self.walk_speed
|
if not self.on_ground:
|
||||||
|
|
||||||
if self.controls_jump and self.on_ground:
|
|
||||||
self.vel_y += self.jump_speed
|
|
||||||
self.on_ground = False
|
|
||||||
else:
|
|
||||||
self.vel_y -= self.gravity_speed
|
self.vel_y -= self.gravity_speed
|
||||||
|
|
||||||
await self.collide()
|
await self.collide()
|
||||||
|
@ -169,12 +164,12 @@ class Player(Block):
|
||||||
# pass
|
# pass
|
||||||
|
|
||||||
async def render(self):
|
async def render(self):
|
||||||
self.vel_x *= 0.5
|
# self.vel_x *= 0.5
|
||||||
self.vel_y *= 0.5
|
# self.vel_y *= 0.5
|
||||||
self.x += self.vel_x
|
# self.x += self.vel_x
|
||||||
self.y += self.vel_y
|
# self.y += self.vel_y
|
||||||
# await self.setVel(self.vel_x * 0.5, self.vel_y * 0.5)
|
await self.setVel(self.vel_x * 0.5, self.vel_y * 0.5)
|
||||||
# await self.setPos(self.x + self.vel_x, self.y + self.vel_y)
|
await self.setPos(self.x + self.vel_x, self.y + self.vel_y)
|
||||||
return self.vel_x != 0 or self.vel_y != 0
|
return self.vel_x != 0 or self.vel_y != 0
|
||||||
|
|
||||||
def toStatement(self, add=True):
|
def toStatement(self, add=True):
|
||||||
|
@ -236,19 +231,16 @@ async def handler(websocket: ServerConnection):
|
||||||
while True:
|
while True:
|
||||||
packet_id, packet_data = await readPacket(websocket)
|
packet_id, packet_data = await readPacket(websocket)
|
||||||
|
|
||||||
if packet_id == "C":
|
if packet_id == "V":
|
||||||
if packet_data[0] == "W":
|
vel_x, vel_y = float(packet_data[0]), float(packet_data[1])
|
||||||
if packet_data[1] == "0":
|
vel_x = max(min(vel_x, player.walk_speed), -player.walk_speed)
|
||||||
player.controls_x = 0
|
vel_y = max(min(vel_x, player.jump_speed), 0)
|
||||||
if packet_data[1] == "1":
|
|
||||||
player.controls_x = -1
|
player.vel_x += vel_x
|
||||||
if packet_data[1] == "2":
|
|
||||||
player.controls_x = 1
|
if player.on_ground:
|
||||||
if packet_data[0] == "J":
|
player.vel_y += vel_y
|
||||||
if packet_data[1] == "0":
|
player.on_ground = False
|
||||||
player.controls_jump = False
|
|
||||||
if packet_data[1] == "1":
|
|
||||||
player.controls_jump = True
|
|
||||||
|
|
||||||
if packet_id == "K":
|
if packet_id == "K":
|
||||||
key,pressed = packet_data
|
key,pressed = packet_data
|
||||||
|
@ -271,18 +263,6 @@ async def handler(websocket: ServerConnection):
|
||||||
|
|
||||||
print(message)
|
print(message)
|
||||||
|
|
||||||
if packet_id == "R":
|
|
||||||
rid = packet_data[0]
|
|
||||||
|
|
||||||
await writePacket(websocket, "R", [
|
|
||||||
rid,
|
|
||||||
str(current_milli_time()),
|
|
||||||
str(player.vel_x),
|
|
||||||
str(player.vel_y),
|
|
||||||
str(player.x),
|
|
||||||
str(player.y)
|
|
||||||
])
|
|
||||||
|
|
||||||
if packet_id == "D":
|
if packet_id == "D":
|
||||||
x,y = packet_data
|
x,y = packet_data
|
||||||
x,y = int(x),int(y)
|
x,y = int(x),int(y)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue