Tips för att få till perspektiv rätt vid utritning av kortleken på skärmen
Halloj!
Jag håller på att lära mig libbet Pygame och håller på att skriva en primitiv variant av det klassiska kortspelet skitgubbe. Eftersom jag gör allting direkt i Python skriver jag även front-end för hand, inklusive hur och var korten ska ritas ut.
Just nu experimenterar jag med utritning av den uppochnedvända kortleken, ur vilken man drar korten i spelet. Varje gång spelets state uppdateras på serversidan skickas en lista med låtsaskort till varje klient, och denna lista innehåller lika många låtsaskort som det finns äkta kort i den riktiga kortleken. På klientsidan skapar jag sedan en area och en yta för kortleken, och blittar (ritar ut) varje kort på den här ytan.
För att försöka ge leken lite djup har jag försökt skapa en liten offset för varje kort som ritas ut på ytan, så att det ska se ut som om det ligger flera kort på varandra. Nedan följer en bild på hur det ser ut just nu:
Problemet är att perspektivet blir fel. Alla andra kort ses rakt uppifrån, medan det ser ut som att man ser kortleken ur ett annars perspektiv. Det ser alltså inte så snyggt ut. Ett kort har dimensionerna 100 x 140.
Metoden jag använder i nuläget för detta följer nedan:
def update_deck(self, deck: list):
if len(deck) < self.prev_deck_len:
tot_offset = (1 / 16) * len(deck) * (len(deck) + 1)
self.deck_surface = pygame.Surface((100 + tot_offset, 140 + tot_offset), pygame.SRCALPHA)
self.deck_area = pygame.Rect(0, 0, 100 + tot_offset, 140 + tot_offset)
for i, card in enumerate(deck):
g_card = GraphicalCard.from_simple_card(card, (-100, 100))
x_offset = (i / 8)
y_offset = -(i / 8)
self.deck_surface.blit(g_card.image(), (x_offset, y_offset))
self.prev_deck_len = len(deck)
Varje kort blittas en åttondels pixel till höger och en åttondels pixel uppåt jämfört med det föregående kortet.
Storleken på lekens area och ytan allting blittas på bestäms av hur många kort som finns, för att säkerställa att ytan inte är mindre eller större än den ska vara och för att kanterna på korten inte ska försvinna. tot_offset beräknas alltså enligt:
tot_offset
där betecknar antalet kort i leken.
Har ni några bra tips på hur man kan få till perspektivet ordentligt här? Allting ses som sagt uppifrån men det känns som att det borde gå att införa lite djup på det här sättet.
Om vi tänker oss att vi tittar uppifrån, men från center av spelytan, så kommer perspektivet på kortleken bli ganska rimligt om du placerar den i övre högra hörnet :)
Hmm, ja det kanske hade sett bra ut om man bara är en eller två spelare. Saken är den (och det borde jag ha nämnt tidigare) att upp till fyra spelare kan köra samtidigt, som runt ett bord, och varje spelare har sin hand till höger om de sex korten framför sig, så det är att föredra att ha leken någonstans närmare mitten och ganska nära "korthögen". (vill undvika problem med att händerna överlappar med leken osv...)
Jag har ingen känsla för konst eller perspektiv alls så jag har svårt att föreställa mig hur jag kan tweaka mina offsets för att det ska se bra ut nära mitten.
Har du några kloka förslag? Kanske minska offseten i -led?
Antingen kör du på offset och då får ett perspektiv på det, eller skippar offset och ser bordet helt uppifrån. Jag håller med om att det blir snyggare att ha offset för att få en liten känsla av hur många kort som finns i högen.
Det finns ett sätt att få ett djup i kortleken och ändå se bordet helt uppifrån kom jag på nu. Det du kan göra är att låtsas att det finns en ljuskälla utanför bild (denna måste ha ett perspektiv, dvs komma från någon riktning som inte är direkt ovanifrån). Sedan kan du göra en skugga av kortleken. Behåll samma kod som nu men ändra färg på offseten. Kan inte lova att det blir snyggt, men du kan alltid testa!
Tillägg: 4 jul 2025 00:09
I stillbild kanske inte skuggan ser så bra ut, men allt eftersom det dras kort från högen kommer skuggan röra på sig och förhoppningsvis ge lite mer liv i spelplanen
Tack för förslaget, ska testa att implementera detta imorgon och återkomma! :D
Jag tittade på hur de har gjort i Microsoft Solitaire för lite insipiration och de verkar ha samma problem som jag:
Det ser ut som om kortleken existerar lite i sin egen värld haha...
Jag brukar tolka sådana bilder som att de är ritade på det gammalegyptiska sättet, alltså visar vad man vet finns där, inte hur det ser ut (som t.ex. människor med två ögon sedda i profil).
Eller också att man har spritt ut korten en smula i leken så att man ser att de är flera.