Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Gamemaker]instance_deactivate in grid

Pagina: 1
Acties:

  • link0007
  • Registratie: Augustus 2006
  • Niet online
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:
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;


  • DRaakje
  • Registratie: Februari 2000
  • Niet online
Gekke vraag, waarom maak je dit? Heb zelf ook wel eens dit geprogrammeerd voor het maken van een challenge op net-force.nl

Hoe dan ook, ik snap niet helemaal hoe je de data bewerkt, maar ik werkte met 2 Arrays. 1 voor de oude generatie en 1 voor de nieuwe (en die wisselen elkaar dan af). Die tekende ik vervolgens.

Eventueel zou je nog een optimalisatie kunnen vinden door alleen de pixels te tekenen die veranderd zijn, en dus gebruik te maken van het vorige gegenereerde plaatje, want bij mij bleek dat dat veel cpu kracht koste.

Waarom wil je trouwens 30 fps halen? Als je het voor de snelheid doet, dan zou ik toch eerder denken aan een wat snellere taal?

[ Voor 24% gewijzigd door DRaakje op 16-10-2007 21:31 ]


  • link0007
  • Registratie: Augustus 2006
  • Niet online
DRaakje schreef op dinsdag 16 oktober 2007 @ 21:18:
Gekke vraag, waarom maak je dit? Heb zelf ook wel eens dit geprogrammeerd voor het maken van een challenge op net-force.nl

Hoe dan ook, ik snap niet helemaal hoe je de data bewerkt, maar ik werkte met 2 Arrays. 1 voor de oude generatie en 1 voor de nieuwe (en die wisselen elkaar dan af). Die tekende ik vervolgens.

Eventueel zou je nog een optimalisatie kunnen vinden door alleen de pixels te tekenen die veranderd zijn, en dus gebruik te maken van het vorige gegenereerde plaatje, want bij mij bleek dat dat veel cpu kracht koste.

Waarom wil je trouwens 30 fps halen? Als je het voor de snelheid doet, dan zou ik toch eerder denken aan een wat snellere taal?
De taal is omdat ik wilde weten of ik Gamemaker nog even goed kan als vroeger (ongeveer anderhalf jaar geleden).
Verder is het ook gewoon een geweldige taal/omgeving om dingen mee te bouwen. Ben ook bezig met Game of life op de GR (ti-83 plus), maar dat gaat nog wel even duren :9~
Ik gebruik dus gewoon sprites (misschien dat ik daar nog surfaces voor ga gebruiken, weet nog niet).

Ik maak het ook deels om tijdens informatica iets te doen te hebben (ik lig nogal.. erh.. een flink niveau voor op de rest :O )

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


  • DRaakje
  • Registratie: Februari 2000
  • Niet online
bedenk me net nog een optimalisatie
- hou een lijst bij van pixels/velden die gekleurd zijn, gebruik deze lijst om te bepalen of je de omgeving van een pixel/veld moet uitlezen. Dit is volgens mij een stuk makkelijker te implementeren als wat je nu aan het doen bent.

  • kunnen
  • Registratie: Februari 2004
  • Niet online
link0007 schreef op dinsdag 16 oktober 2007 @ 21:29:
[...]

Verder is het ook gewoon een geweldige taal/omgeving om dingen mee te bouwen. Ben ook bezig met Game of life op de GR (ti-83 plus), maar dat gaat nog wel even duren :9~
Dit is zeer eenvoudig te doen op de TI: Je neemt twee matrices, één steeds voor de oude en één voor de nieuwe status, en dan check je hokje voor hokje of het aan of uit moet staan. Rinse, repeat. 20 minuten werk.

  • link0007
  • Registratie: Augustus 2006
  • Niet online
Pulsher schreef op dinsdag 16 oktober 2007 @ 21:48:
[...]

Dit is zeer eenvoudig te doen op de TI: Je neemt twee matrices, één steeds voor de oude en één voor de nieuwe status, en dan check je hokje voor hokje of het aan of uit moet staan. Rinse, repeat. 20 minuten werk.
Dat ik matrices moest gebruiken was ik al achter. Kan alleen m'n GR even niet vinden, dus ik heb alleen nog maar pseudo-code in m'n "boekje pienter" staan 8)7

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;

Pagina: 1