”Hit Detection” eller kollisions opdagelse er en vital del af ethvert spil. Det gælder både når du spiller single-player og helt afgjort når du spiller multi-player. Der er ikke den store forskel, selvom multi-player hit detection giver nogle særlige udfordringer. Inden vi kommer så lagt så lad os kigge på hvad Hit Detection egentlig er.
Hit Detection er at opdage om to emner, eller objekter, kolliderer, eller rammer hinanden, i et spil. Det benyttes i næsten alle former for spil, selv det helt gamle Pong, hvor du spillede tennis. Her flytter du et bat op og ned. Prikken der repræsenterer bolden bevæger sig mod din side og når den nærmer sig baglinjen skal spillet afgøre om bolden rammer battet eller ryger forbi. Det er en forholdsvis enkel operation når der er tale om to simple geometriske figurer, en cirkel og et rektangel. Hvis du har andre former f.eks. en bil eller en person, så er den geometriske form noget vanskeligere at regne på. Derfor laves der omkring det objekt man gerne vil beregne om bliver ramt, en Hit Box.
Hit Box (kollision kasse) er en, eller flere, kasser der repræsenterer områder af objektet der kan rammes. Det omtales ofte som én kasse, som i de gode gamle Mario dage. I dag er der som ofte mange flere, for at give tilstrækkelig variation i spillet. Spiller du fodbold, kampsport eller andre spil hvor det kræver at der er kontakt (kollision) mellem dig og en anden spiller, så er de enkelte hit boxe også tildelt en funktion. Det kan, som i Street Fighter, være en hit box der kan angribe, en som kan rammes og en der forsvarer. De forskellige kasser skifter alt efter hvordan du bevæger din figur.
Som du kan se på billedet så registreres der et hit, altså at du er ramt, når angrebs kassen (rød) overlapper mål kassen (blå). På venstre side er det en forbier mens det på højre side er en kollision, altså et Hit. Hvis du forsvarer hvis der være en ekstra farve kasse der repræsenterer et område hvor en kollision svarer til at du har blokeret et angreb. Princippet er det samme for alle former for spil hvor noget eller nogen kan blive ramt. Fodbold, kampsport, shootere, bilspil, rollespil, platformsspil ja faktisk så har langt de fleste spil en eller anden form for hit box med hit detection. Selv skak hvor du skal detekterer om der findes en brik på det felt du flytter til.
Hvis det virkelig ikke er mere vanskeligt, hvorfor brokker alle spillere sig så over at Hit Detection i f.eks. en shooter er dårlig. Ja nu kommer så det svære, nemlig at finde en god metode i multi-player spil.
Hvis du i et spil nøjagtigt skal kunne afgøre om noget er ramt eller ej, så kræver det eksakt viden om hvor alle objekter på et givent tidspunkt befinder sig. Dette kaldes for Game State. Der er kun ét sted hvor Game State er kendt og det er på serveren.
Hvis du har læst om servere og lag i de to foregående sommerskoler, så er det naturligt at også denne beregning foretages på serveren. Serveren foretager jo alle andre beregninger omkring Game State, og sender resultatet til spillerne. Der er jo så lige den udfordring med Lag eller non-dedikerede servere som vil give nogle spillere en fordel. Specielt på non-dedikerede servere vil der være store fordele for Hosten. Derfor vælger nogle spil at lave Client Side Hit Detection. Det betyder at hver spillers egen maskine afgør om der bliver ramt eller ej. Resultatet sendes så til serveren, der opdaterer Game State og sender resultatet til alle spillere. Denne metode anvendes f.eks. af Battlefield.
Det giver selvfølgelig en række udfordringer. Hvad nu hvis der er så meget forsinkelse mellem spillerne og serveren at du f.eks. når at trække hovedet tilbage for at undgå at blive skudt? Ja det er faktisk for sent, fordi når modstanderen har skudt og hans maskine har beregnet at du er ramt, så kommer den information på et tidspunkt til serveren, som registrerer at du er død. Det oplever du som at du sidder i dækning og bliver dræbt. Eller endnu værre: at du løber forbi en åbning og bliver dræbt sekunder senere hvor du er i dækning. Hvad gør man så ved det?
Ja, hvis man ønsker at lave Client Side Hit Detection så kan man også anvende Ekstrapolation. Det betyder at din maskine (klienten) matematisk forsøger at gætte sig frem til hvor du vil være placeret. Så i tilfældet med at du løb forbi en åbning, så vil der udover din aktuelle position også være information om i hvilken retning og med hvilken hastighed du bevæger dig. Når der så bliver skudt, vil der i beregning af Hit Detection blive taget hensyn til din bevægelse. Derfor kunne du i dette tilfælde overleve. Ulempen ved Ekstrapolation er at det kræver overførsel af mere data til den enkelte spiller, samtidig med at det forudsætter at data flyder kontinuerligt, altså med en konstant hastighed. Hvis der er Lag, er der typisk også Jitter, som er elektroniske klumper i data strømmen. Derfor kan serveren enten være nødsaget til at accepterer ændringer af Game State der ikke passer med det faktiske eller at trumfe de Game State ændringer der laves på klient siden. Dermed kan du opleve at du får et Hit hvor serveren trumfer dig og dermed ikke tildeler dig et kill i oversigten. Client Side Hit Detection kan gøre udfordringer med multi-player endnu værre.
I stedet for at benytte ekstrapolation på klienten så kan nogle ting løses på serveren med Interpolation. Det betyder at serveren sender Game State information til spillerne med en forsinkelse. Den buffer, eller gemmer, information om spillere for at kompenserer for Lag og Jitter. Idéen er at Game State information så fylder i en jævn strøm. Skulle en klient miste data vil det være nødvendigt at fryse billedet til der kommer ny data og så arbejde fra det punkt. Selvom alle metoder løser et problem, så skaber det mindst lige så mange nye.
Nogle spil vælger mere alternative metoder. F.eks. anvender Call of Duty Black Ops II en række forskelige metoder for at sikre den arcade shooter stil som spillet er blevet populært på. Det er lige fra Auto Aim, hvor spillet automatisk trækker sigtet ind mod Hit Boxen, til den mere specielle nemlig at udvide Hit Boxene når du bevæger dig, så du bliver lettere at ramme.
Jeg har endnu ikke oplevet en metode der kan afhjælpe den forsinkelse (Lag) og den variation i datastrømme (Jitter) der findes gennem Internettet ved multi-player. Det som giver den mest ensartede oplevelse er stadig dedikerede servere hvor serveren alene beregner Game State.
Næste gang ser vi på Cloud Gaming og samler op på det der ikke lige passede andre steder.
Sommerskole 1: Hvad er DRM? Og hvorfor anvendes al-ways on DRM?
Sommerskole 2: Hvad er multiplayer servere. Hvordan virker de?
Sommerskole 3: Hvad betyder lag? Og hvordan opleves det?