webForumDet fria alternativet

Suddproncipen?!

3 svar · 352 visningar · startad av M@rtin

M@rtinMedlem sedan dec. 19992 085 inlägg
#1

Alltid när jag har programmerat spel (enkla spel typ snake, pacman, pong etc.) så har jag suddat det som rör sig men hjälp utav att varje gång spelloopen loopar så ritas saken ut på sin nya position och jag ritar en lika dan sak på den gamla positionen fast med bakgrundsfärgen. Finns det något smartare sätt att göra detta på. Det här sättet gör att det ibland missas små pixlar så att det blir lite "rester" kvar på skärmen :( Det ska funka i alla programmeringsspråk. Eller inte alla men alltså det ska inte vara någon väldigt speciell funktion som bara gäller i det språket.

------------------
//M@rtin

BitstateMedlem sedan nov. 2000432 inlägg
#2

Metoden med att hålla reda på varifrån något objekt kommer och "sudda" bakom är jag väl bekant med och är den enda som fungerar tillfredställande om man bara har riktigt slöa grafikrutiner (som i basic tex, eller om man använder delphi's canvas funktioner, dessa är iochförsig ganska snabba om man använder dem på rätt sätt).

Metoden som används i "riktiga" spel är följande: (observera att detta gäller 2d-spel.)

1, istället för att rita ut direkt på skärmen används en (eller flera) s.k. buffer. Denna buffert är egentligen som en bitmap med samma storlek som skärmen.

Allt ritande sker till bufferten och när man ritat klart ritas bufferten till sist ut på skärmen (detta tar bort eventuellt "flimmer" som du säkert upplevt tidigare)

2, varje fps (dvs typ 25-35 gånger i sekunden) töms buffertern (tex målas helt svart) och allt ritas om från början. Tex börja med bakgrund och lägg sist på eventuella sprites.

När jag mekade med java för ungefär ett år sedan använde jag helt enkelt ett bildobject som buffert, och har för mig att jag skrev över programmets skärmutritningsprocedur till att bara rita buffertobjektet till skärmen.

I delphi brukar jag använda ett TBitmap eller ännu hellre TDIBUltra. (dessa använder jag direkt genom en kombination av asm och att läsa/skriva direkt till minnet.

I Direct X under delphi (med Delphi X) används directsurface som buffert.

Vad man använder i C/C++ har jag ingen aning om, men antagligen är det något liknande.

Teorin är helt enkelt att du skapar en bild lika stor som skärmen och ritar på den (börjar från noll varje gång) och sedan ritar ut denna bild på skärmen.

:)

M@rtinMedlem sedan dec. 19992 085 inlägg
#3

Okej, jag tror jag förstår!
Jag märker att jag inte kan så mycket om sånt här men jag ska försöka testa :)

------------------
//M@rtin

M@rtinMedlem sedan dec. 19992 085 inlägg
#4

Jag får ju inte glömma att tacka ;)
Tack!

------------------
//M@rtin

137 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)