Hallo,
Ik ben bezig met het programmeren van Conway's game of life.
Nu had ik hem eerst even snel op een 20*20 grid gemaakt, waar elke cel eerst in een frame bekeek hoeveel buren hij had, en het frame erna veranderingen toepaste.
Daarna wilde ik dit in een 60*40 doen.
Hiervoor heb ik uit snelheid en eenvoud gekozen om een datastructure grid te maken. Hierin bewaarde ik de rij en kolom, en de waarde '1' of '0', bevolkt resp. onbevolkt. Dan liet ik elke cel voor de datastructure waardes om hem heen kijken hoeveel er aan stonden (de waardes optellen).
Echter nu is dit op +- 2400 cellen nog te zwaar om 30 keer per seconde te doen.
Daarom bedacht ik eerst gewoon een simpele regel: als er in een gebied van 2 pixels om de cel géén buren waren, hoefde hij hier niet meer voor te kijken tot er dan wel weer buren waren. Alhoewel dit enige snelheidswinst geeft, is het nog lang niet genoeg (hij loopt immers nog steeds voor elke cel af of hij buren heeft, alleen kijkt hij niet hoeveel en waar).
Toen bedacht ik dat ik 6 gebieden kon maken in het grid, van 20*20. Deze zou dan kijken voor bewoonde cellen tot 2 cellen buiten het gebied van 20*20 die hij zou deactiveren of activeren.
Heel simpel gezegd, en het lukt ook min of meer, maar er blijven steeds gekke dingen misgaan.
Ik heb zo het gevoel dat er iets mis is met mijn gedachtegang over het grid, maar ik kan niet bedenken wat:
het 320 slaat terug op dat elke cel 16 pixels groot is. De oorsprong van elke cel ligt linksboven.
Als ik in plaats van instance_deactivate bijvoorbeeld visible=true gebruik (en dan een sprite instel van 320*320 pixels), dan werkt het foutloos. Je zit in welke sector de actie zich afspeelt.
Maar met instance_deactivate gaat het fout. Soms werkt het, soms niet.. Wat er mis is snap ik echt niet.
Hier wat screenshots:
elke cel apart laten checken of hij nodig is
6 gebieden instellen en kijken of een gebied nodig is én elke cel apart laten bepalen
Dit zijn natuurlijk 'debug' graphics (rode cellen zijn niet nodig, grijs vlak is de ondergrond wanneer objecten gedeactiveerd worden).
Waarom krijg ik bij de tweede afbeelding zo'n raar resultaat?
Ik ben bezig met het programmeren van Conway's game of life.
Nu had ik hem eerst even snel op een 20*20 grid gemaakt, waar elke cel eerst in een frame bekeek hoeveel buren hij had, en het frame erna veranderingen toepaste.
Daarna wilde ik dit in een 60*40 doen.
Hiervoor heb ik uit snelheid en eenvoud gekozen om een datastructure grid te maken. Hierin bewaarde ik de rij en kolom, en de waarde '1' of '0', bevolkt resp. onbevolkt. Dan liet ik elke cel voor de datastructure waardes om hem heen kijken hoeveel er aan stonden (de waardes optellen).
Echter nu is dit op +- 2400 cellen nog te zwaar om 30 keer per seconde te doen.
Daarom bedacht ik eerst gewoon een simpele regel: als er in een gebied van 2 pixels om de cel géén buren waren, hoefde hij hier niet meer voor te kijken tot er dan wel weer buren waren. Alhoewel dit enige snelheidswinst geeft, is het nog lang niet genoeg (hij loopt immers nog steeds voor elke cel af of hij buren heeft, alleen kijkt hij niet hoeveel en waar).
Toen bedacht ik dat ik 6 gebieden kon maken in het grid, van 20*20. Deze zou dan kijken voor bewoonde cellen tot 2 cellen buiten het gebied van 20*20 die hij zou deactiveren of activeren.
Heel simpel gezegd, en het lukt ook min of meer, maar er blijven steeds gekke dingen misgaan.
Ik heb zo het gevoel dat er iets mis is met mijn gedachtegang over het grid, maar ik kan niet bedenken wat:
code:
1
2
3
4
5
6
7
8
9
| if not ds_grid_value_exists(global.ds,id.col-2,id.row-2,id.col+22,id.row+22,1)
{
instance_deactivate_region(x,y,x+320,y+320,true,true);
}
if ds_grid_value_exists(global.ds,id.col-2,id.row-2,id.col+22,id.row+22,1)
{
instance_activate_region(x,y,x+320,y+320,true);
} |
het 320 slaat terug op dat elke cel 16 pixels groot is. De oorsprong van elke cel ligt linksboven.
Als ik in plaats van instance_deactivate bijvoorbeeld visible=true gebruik (en dan een sprite instel van 320*320 pixels), dan werkt het foutloos. Je zit in welke sector de actie zich afspeelt.
Maar met instance_deactivate gaat het fout. Soms werkt het, soms niet.. Wat er mis is snap ik echt niet.
Hier wat screenshots:
elke cel apart laten checken of hij nodig is
6 gebieden instellen en kijken of een gebied nodig is én elke cel apart laten bepalen
Dit zijn natuurlijk 'debug' graphics (rode cellen zijn niet nodig, grijs vlak is de ondergrond wanneer objecten gedeactiveerd worden).
Waarom krijg ik bij de tweede afbeelding zo'n raar resultaat?
IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;