[ALG] Platform game maken

Pagina: 1
Acties:

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik wil na mijn snake project graag een soort super mario bros. maken.
Dit doe ik in c# i.c.m. Managed DirectX9.0 (met Directdraw hoogstwaarschijnlijk)
Volgens mij moet dit niet te ingewikkeld zijn dus ga ik het maar gewoon proberen.

Maar voordat ik eraan begin wil ik graag wat weten over hoe dingen gedaan worden.

Hoe sla ik posities van de speler en enemy's op? Met een x en y coordinaat? Doe ik dat relatief op het scherm of absoluut op de map? ik neem aan absoluut op de map? en deze laat ik dan alleen lopen op het moment dat ze 'onscreen' zijn ivm performance? of zou het niet uitmaken alles te laten bewegen, dus ook wat niet op dat moment zichtbaar is op het scherm?

Hoe sla ik enemy's en spelers op? in een jagged array op deze manier:?
code:
1
2
3
4
5
6
7
8
9
10
11
12
0->x
   y
   enemytype
1->x
   y
   enemytype
2->x
   y
   enemytype
3->x
   y
   enemytype
Of is dit niet zo slim om zo te doen?

Moet ik alleen de dingen die op het scherm staan laten renderen of gelijk heel de map? als dat alleen scherm is: Hoe kijk ik wat ik moet tekenen en wat dus binnen het scherm valt?

Hoe ga ik collision detect uitvoeren op objecten? Gewoon kijken of het bewegende iets kan moven? dus: x=49 Direction=right en op 50 een obstakel. kan niet dus Direction = Left of None?

Ik ben redelijk beginner in dit soort dingen en ik wil het wel gelijk goed doen.
Alvast bedankt voor de hulp :) .

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:48

TeeDee

CQB 241

Weet niet veel van Game development af, maar MS is bezig met de grondbeginselen op Coding4Fun. Misschien staan er tips tussen.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

My humble opinion follows:
Mischa_NL schreef op donderdag 28 april 2005 @ 16:15:
Hoe sla ik posities van de speler en enemy's op? Met een x en y coordinaat? Doe ik dat relatief op het scherm of absoluut op de map? ik neem aan absoluut op de map?
Dat is wel gebruikelijk, en ook het nuttigste. Waar je nog even op moet letten is welk punt op je sprite de X en Y voorstellen (is dat linksboven, of middenboven, of middenonder, of überhaupt het midden?). Dat kan nogal wat voordelen hebben bij het berekenen van bepaalde dingen. Bijvoorbeeld, aangezien je een platform wilt gaan maken, lijkt middenonder me wel een nuttige keus, om de volgende redenen:
• Platform-collission is makkelijk te bepalen: y == platformtop, ipv. y + height == platformtop
• Als je grappen wilt uithalen met het schalen van sprites, en je houdt de middenonder positie gelijk, dan groeit je mannetje automatisch naar boven, in plaats van naar beneden (waardoor je weer de y coordinaat zou moeten compenseren)

Wat het beste is is nogal afhankelijk van wat je er mee wilt doen. Van de andere kant is het geen ramp als je "verkeerd" kiest, want je kunt met een optellinkje of aftrekkinkje erbij altijd nog alle kanten op.

[/quote]
en deze laat ik dan alleen lopen op het moment dat ze 'onscreen' zijn ivm performance? of zou het niet uitmaken alles te laten bewegen, dus ook wat niet op dat moment zichtbaar is op het scherm?
[/]

Over het algemeen is de tekenactie het intensiefst/het duurst.

Dat betekent dat je alle objecten in je wereld wel kan laten "ticken" (dus iets laten doen per frame, of per tijdseenheid die jij wilt), maar ze niet allemaal kan of wilt tekenen. Per frame REKEN je dus elk object door, maar je TEKENT alleen wat op het scherm is.

Overigens is het nog een keuze of je het spel strak frame-based wilt maken. Als je het spel het best wilt laten lopen op elke computersnelheid is het het beste om dat niet te doen. Je kunt daarbij het beste je acties in tijd uitdrukken (bijvoorbeeld voor een sprite: in 3 seconden 50 pixels naar rechts).
Daarna ga je frames tekenen zo snel als je kan. Het resultaat is dat op een snelle computer de animatie er vloeiend uitziet, op een langzame computer haperend, en dat hij op allebei de computers even snel klaar is.
Hoe sla ik enemy's en spelers op? in een jagged array op deze manier:?
Ik weet niet wat een jagged array is, maar een lijst lijkt me wel een redelijk standaard datatype. En of je die nu implementeert met een array of met linked lists zal verder een worst zijn.

Eigenlijk is dat niet helemaal waar, want het gaat nu om een spelletje, en performance is wel degelijk belangrijk. Een double-linked list is misschien de beste keus, vanwege O(1) insert en delete operaties; met een array krijg je een probleem met gaten als je elementen gaat verwijderen. C# kan dit allemaal voor je verbergen maar het is goed er even rekening mee te houden.
Moet ik alleen de dingen die op het scherm staan laten renderen of gelijk heel de map? als dat alleen scherm is: Hoe kijk ik wat ik moet tekenen en wat dus binnen het scherm valt?
Daar hadden we het al over gehad. Waar je het niet over gehad hebt, is hoe je de map wilt representeren. Met tiles, denk ik?

En berekenen wat binnen de map valt is tamelijk triviaal. Alle objecten (sprites, tiles, whatever) die aan de volgende eisen voldoen moeten getekend worden:

code:
1
obj_right >= viewport_left AND obj_left <= viewport_right AND obj_bottom >= viewport_top AND obj_top <= viewport_bottom
Hoe ga ik collision detect uitvoeren op objecten? Gewoon kijken of het bewegende iets kan moven? dus: x=49 Direction=right en op 50 een obstakel. kan niet dus Direction = Left of None?
Ik snap niet precies wat je hier bedoelt. Maar je wilt zoiets als:

code:
1
2
  SPRITE: Ik wil 10 pixels naar rechts!
  COLDET: Ik heb je 3 pixels verplaatst want toen was er collision


En hoe je dat gaat berekenen is weer een heel ander verhaal... bounding circles zijn het makkelijkste, maar dat werkt alleen als je objecten ook rond zijn (of grotendeels), anders ziet het er raar uit. Bounding rectangles en die elkaar laten snijden is het meest gebruikelijk bij platform spellen. Per-pixel collision detection op de sprites is ook een alternatief maar dat wordt wel heel erg duur (maar wel het nauwkeurigste dat je het kan krijgen).