- Jonathan Jensen
- Gard Alhaug
Denne frivillige oppgaven ble gitt i Nettverksprogramming IDATT2104 i 2025 vår for de studentene som ville ha bedre karakter enn C i nettverksprogrammering-delen av faget. Oppgaven gikk ut på å lage en netcode demo, helst i et lavnivå programmeringsspråk. Vi brukte Rust og SDL for å demonstrere. Det ble anbefalt å implementere prediction, reconciliation og interpolation.
- Nettverksfunksjonalitet
- Kommunikasjon via UDP.
serdeogserde_jsonblir brukt for serialisering og deserialisering av klient-server kommunikasjon.
- Kommunikasjon via UDP.
- Spillserver
- En server med justerbar tick rate. Støtter opp til 6 spillere, bare begrensa av antall forhåndsdefinerte farger en spiller kan ha. Dette kan utvides i
PLAYER_COLORS-konstantet som ligger irender.rs.
- En server med justerbar tick rate. Støtter opp til 6 spillere, bare begrensa av antall forhåndsdefinerte farger en spiller kan ha. Dette kan utvides i
- Spillklient
- Prediction
- Spillers posisjon og fart forutsees på klientsiden med server som endelig autoritet.
- Reconciliation
- Spillers posisjon og fart blir samstemt med serveren basert på siste felles anerkjente spillerinput og posisjon.
- Interpolation
- Andre spillere blir lineært interpolert mellom posisjoner basert på serveren sin tick rate. Denne blir anslått av klienten basert på tiden siden den forrige mottatte oppdateringen.
- Prediction
- Spill-logikk
- Tyngdekraft er implementert.
- Spillere har akselerasjon istedet for å direkte sette fart. Dette gir mer naturlig bevegsele.
- Kollisjon med plattformer.
- Hopping og vegg-hopping er implementert.
- Server sin tick rate bestemmer bare hvor ofte spill-state sendes ut, men spiller-logikk og fysikk bestemmes bare av hvor mange udp-pakker som sendes fra klienten til serveren. Dette gjør det mulig å speed-hacke om man senker verdien av egen
DELTA_TIMEfør man kompilerer prosjektet. - Kunne implementert luftmotstand og gameplay for å gjøre demoen litt mer interessant.
- Om en spiller har koblet til, fjernes aldri den spilleren fra spillet selv om den lukker vinduet sitt og slutter å sende UDP-pakker.
SDL2 - Lavnivå C grafikkbibliotek for å vise spillet og ta spiller-input.
serde - Bibliotek for å serialisere og deserialisere Rust-datastrukturer til et felles format som server og klient kan bruke.
serde_json - Implementerer det spesifikke formatet som serde-serialiserte dataen blir omgjort til og fra.
For å klone repoet kjøres:
git clone https://github.com/Isotope-235/netcode.git
IP og port til serveren kan konfigureres med konstantene HOST og PORT i src/server.rs
De følgende instruksene trengs ikke dersom en bare vil kjøre prosjektet. De er bare for installasjon hos en eventuell sluttbruker.
For å bygge binærfilen bruker man cargo build --release. Merk at når programmet kjøres må assets-mappen og ALLE SDL2-dll og -lib-filene ligge ved siden av binærfilen.
For å kjøre binærfilen som server, bruk ./<filnavn> --server. For å kjøre som klient, bare bruk ./<filnavn>.
For å kjøre serveren brukes:
cargo run --release -- server
For å kjøre en klient brukes:
cargo run --release
+ — Øk tick rate
- — Senk tick rate
W — Hopp
A — Venstre
D — Høyre
P — Prediction (toggle)
R — Reconciliation (toggle)
I — Interpolation (toggle)
+ — Øk simulert ping
- — Senk simulert ping
En kan kjøre tester ved bruk av:
cargo test
Tester for en gitt implementasjon ligger i samme fil som implementasjonen.
For eksempel ligger testene for Vec2-typen i math.rs, samme fil som Vec2 ligger i.