PDA

Volledige versie bekijken : vol laten lopen van een vlak


tricky
%Europe/Berlin %774 %2005, 18:35
Hoi mensen,

Ik zou graag een vak vol laten lopen met vierkantjes van 10x10, deze vierkantjes heb ik de naam box gegeven. Nu zou ik graag dat ze van links naar rechts een vierkant maken.

Ik heb hiervoor deze code gemaakt die volgens mij erg omslachtig is:
_root.box.duplicateMovieClip("boxx"+count, count);

if(0 < count)
{
if(count < 100)
{
_root["boxx"+count]._y = 200;
_root["boxx"+count]._x = 200 + count;
}
}
if(100 < count)
{
if(count < 200)
{
_root["boxx"+count]._y = 210;
_root["boxx"+count]._x = 100 + count;
}
}
if(200 < count)
{
if(count < 300)
{
_root["boxx"+count]._y = 220;
_root["boxx"+count]._x = count;
}
}
if(300 < count)
{
if(count < 400)
{
_root["boxx"+count]._y = 230;
_root["boxx"+count]._x = count - 100;
}
}


gotoAndPlay(2);


in frame 2 wordt count opgehoogd met 1

Dit scriptje maakt een een vierkant van 4 rijen elk 10 breed.

Nu heb ik de volgende vragen:

Hoe kan ik de snelheid van zoiets bepalen framerate op 100 frame/sec zetten lijkt me niet echt de juiste oplossing??

Is er miss een makkelijkere manier om dit zelfde resultaat te krijgen??

Graag zou ik ook een vak willen laten vullen met deze zelfde vierkantjes alleen dan ipv van een patroon deze random laten opkomen. Echter als ik random() gebruik krijg ik echt random getallen. Is er miss een functie als je die gebruikt bv random(10) de ene keer
dit doet
0561238794
en de andere keer dit
3869405712

Dus eigenlijk de waarden die hij random genereerd maar 1 keer voor laat komen.

Hopelijk is het een beetje duidelijk allemaal, iig alvast hartelijk dank voor jullie hulp :D

tricky
%Europe/Berlin %790 %2005, 18:58
Oops, verkeerd geplaats, graag verplaatsen naar "Flash Actionscript"

SaphuA
%Europe/Berlin %911 %2005, 21:53
Hallo,
Wat ik zou doen is met tiles werken, ik heb een simpel voorbeeldje voor je in elkaar gezet. Als je meer info wilt moet je zelf wat duidelijker zijn met wat je precies wilt.

var d = 0; // Depth van MC's
var tw = 20; // Breedte van tile
var th = 40; // Hoogte van tile
var mw = 12; // Aantal tiles in de breedte
var mh = 6; //Aantal tiles in de hoogte
var y = 0; // Y-positie
var x = 0; // X-positie
this.onEnterFrame = function() {
var t = this.createEmptyMovieClip("s_"+y+"_"+x, ++d); // Aanmaken nieuwe tile
t.beginFill(0x9933FF); // Maken van een tile
t.lineStyle(1, 0x000000);
t.lineTo(tw, 0);
t.lineTo(tw, th);
t.lineTo(0, th);
t.lineTo(0, 0);
t.endFill();
t._x = x*tw; // X-Positie
t._y = y*th; // Y-Positie
x++; // X-Positie verhogen
y += x == mw; // Y-Positie verhogen, waneer aan het eind van de regel
x = x%mw; // X-Positie resetten, waneer aan het eind van de regel
if (y == mh) { // Kijken waneer we de laatste tile geplaatst hebben
delete onEnterFrame; // OnEnterFrame verwijderen
}
};

c0redump
%Europe/Berlin %461 %2005, 11:04
en voor je random getallenlijst zou je zoiets kunnen doen:

ar_1 = new Array(0,1,2,3,4,5,6,7,8,9);
ar_2 = new Array(10);

for(i=0; i<ar_2.length; i++) {
rand = Math.floor(Math.random()*(ar_2.length-i));
ar_2[i] = ar_1[rand];
ar_1.splice(rand, 1);
}
trace("Je random getallen: "+ar_2);


ik vul hier dus een array met de getallen die je wilt gebruiken, als t er meer dan 10 zijn zou je ook een variabele kunnen maken met het aantal en die array in een loopje kunnen laten vullen ofzo, vervolgens kies ik een element uit die array, stop m in je nog lege array en verwijder m uit de oorspronkelijke array zodat ie niet nog een keer gekozen kan worden...

er zijn meer wegen die naar Rome leiden, maar dit is er 1 :)

SaphuA
%Europe/Berlin %470 %2005, 11:17
Je hebt hier niet eens een array voor nodig, je pakt een random plaatst (x,y) en kijkt of er al een tile staat, als dat zo is pak je gewoon random weer een andere plaatst todat er een plekje vrij is.

var d = 0;
var tw = 20;
var th = 40;
var mw = 12;
var mh = 6;
//--
var x;
var y;
var c = 0;
this.onEnterFrame = function() {
x = random(mw);
y = random(mh);
while (_root["s_"+y+"_"+x]) {
x = random(mw);
y = random(mh);
}
var t = this.createEmptyMovieClip("s_"+y+"_"+x, ++d);
t.beginFill(0x9933FF);
t.lineStyle(1, 0x000000);
t.lineTo(tw, 0);
t.lineTo(tw, th);
t.lineTo(0, th);
t.lineTo(0, 0);
t.endFill();
t._x = x*tw;
t._y = y*th;
if (++c == mw*mh) {
delete onEnterFrame;
}
};

c0redump
%Europe/Berlin %505 %2005, 12:07
...
x = random(mw);
y = random(mh);
while (_root["s_"+y+"_"+x]) {
x = random(mw);
y = random(mh);
}
...

dat kan idd ook, maar in een "worse case" kan dit natuurlijk wel een lange loop worden...

dit is ook wel een leuke methode trouwens:

function sortRand () {
if (random(2) == 0) return -1;
else return 1;
}

ar_1 = new Array(0,1,2,3,4,5,6,7,8,9);
ar_1.sort(sortRand);

trace(ar_1);


of deze:

function sortRand () {
if (random(3) % 2 == 0) return -1;
else return 1;
}

ar_1 = new Array(0,1,2,3,4,5,6,7,8,9);
ar_1.sort(sortRand);

trace(ar_1);

zo zorg je dat de kans op eerst de even getallen 2/3 is, en de oneven 1/3...hierdoor heb je dus een kleine kans dat er 2 vakken naast elkaar gevuld worden. Dit lijkt volgens mij meer random, omdat je meer gaten tussen de tiles krijgt die later random opgevuld worden.

tricky
%Europe/Berlin %761 %2005, 18:16
Beste coredump & saphua,

Hartelijk dank voor jullie snelle reactie.

Persoonlijk denk ik dat een array niet echt de beste optie is voor mijn doeleind. Ik wil soms ook grotere vlakken vullen met misschien wel kleinere vakjes.


var d = 0; // var declareren d met waarde 0
var tw = 20; // tile width
var th = 40; // tile height
var mw = 12; // max width
var mh = 6; // max height
//--
var x; // var declareren voor de x as
var y; // var declareren voor de y as
var c = 0; // var declareren voor de c met waarde 0
this.onEnterFrame = function() { // deze functie wordt uitgevoerd bij het "enteren van het frame"
x = random(mw); // random getal voor x binnen mw
y = random(mh); // random getal voor y binnen mh
while (_root["s_"+y+"_"+x]) { // dit volg ik niet helemaal waar komt die s_ vandaan?
x = random(mw);
y = random(mh);
}
var t = this.createEmptyMovieClip("s_"+y+"_"+x, ++d);
t.beginFill(0x9933FF); // begin vullen van
t.lineStyle(1, 0x000000); //lijn dikte + kleur
t.lineTo(tw, 0); //lengte lijn
t.lineTo(tw, th); //lengte lijn
t.lineTo(0, th); //lengte lijn
t.lineTo(0, 0); //lengte lijn
t.endFill(); // sluit vullen
t._x = x*tw; // waarom wordt deze precies maal tw gedaan?
t._y = y*th; // waarom wordt deze precies maal tw gedaan?
if (++c == mw*mh) { //dit kan ik ook niet helemaal volgen ++c is iets anders als c++ neem ik aan.
delete onEnterFrame;
}
};


Dit is inderdaad wat ik zoek. Alleen zou ik dan graag willen dat die hokjes blijven staan en als die volledig gevuld is stopt. Zelf heb ik kennis van C++ programeren en een klein beetje van php en flash. Ik heb even voor mezelf commentaar achter de code gezet alleen niet alles is nog duidelijk voor me. Zou het fijn vinden als je die even zou kunnen uitleggen.

Alvast bedankt!!

SaphuA
%Europe/Berlin %811 %2005, 19:29
De hokjes blijven toch staan? Wat bedoel je precies?

Voor de uitleg:
var c = 0;
Count, een variable die het aantal vakjes op het veld bijhoud.

while (_root["s_"+y+"_"+x]) {
x = random(mw);
y = random(mh);
}
Als een MC wordt aangemaakt, krijgt hij een naam die gelijk staat aan zijn positie. Waneer we dus een nieuwe MC aanmaken, moeten we eerst kijken of er op deze positie niet al een MC staat. Dit controleren we dus door te kijken of er een MC bestaat die de naam heeft van de volgende positie. Zolans dit waar is (while) veranderen we de x en y, totdat we op een lege ruimte aankomen.
Deze loop kijkt of de MC s_y_x al bestaat.

if (++c == mw*mh) {
delete onEnterFrame;
}
Die ++c doet niets anders dat 1 bij de variable c optellen. Aangezien de if-method elk frame wordt aangeroepen, wordt c dus ook elk frame verhoogt. Waneer er dus is opgeteld, wordt er gekeken of het aantal tiles gelijk is aan onze breedte en hoogte van de 'map'. Als dit zo is, kunnen we stoppen en dus de onEnterFrame verwijderen. Deze code kun je dus ook zo schrijven:
++c;
if (c == mw*mh) {
delete onEnterFrame;
}

~Sph

Edit:
c0redump, je moet de kracht van de Flashplayer niet zo onderschatten :)
Deze while-loop veroorzaakt niet zoveel problemen, aangezien Flash dit toch wel zeker enkele honderden keren kan herhalen zonder zichtbare vertragingen. Een vertraging is pas merkbaar waneer je met meer dan 50x50 tiles gaat werken, maar dat lijkt me nogal onwaarschijnlijk. Maar mocht dit wel zo zijn dan is jou methode zeer geschikt.

Edit: Deze nog over het hoofd gezien |)
t._x = x*tw;
t._y = y*th;
Waneer we een x en y positie hebben gevonden, kunnen we de MC gaan plaatsen. Probleem is alleen dat deze posities relatief zijn. Een x-positie van 3, betekend niet dat hij op _x:3 moet komen. Hij moet juist 3 maal de breedte van de tiles verder, dus x*tw;

tricky
%Europe/Berlin %882 %2005, 21:11
Hoi Saphua, bedankt voor je antwoordt

Ik weet wat ik fout deed ik zodat de hokjes niet bleven staan. Ik had 2 frames ipv van 1 dus resette hij zichzelf steeds.

++C ophogen met 1, ik ben c++ gewend en daar gebruiken ze ook c++ om op te hogen.

Maar ik kan hier al een heel stuk verder mee, super (y)

SaphuA
%Europe/Berlin %657 %2005, 15:46
Hey kan allebij, en waneer je hem buiten de if zet maakt het ook niet uit.
In zomige gevallen maakt het echter wel uit. Waneer je ++c gebruikt, zal Flash eerst c verhoven, alvorens de if uit te voeren. Waneer je c++ gebruikt, zal Flash eerst de if uitvoeren, en daarna c verhogen. Hier een voorbeeldje:
var c = 6;
if (++c == 7) {
trace("c");
}
var d = 6;
if (d++ == 7) {
trace("d");
}