Volledige versie bekijken : 2 random getallen behalve allebei 0
theFlashWizard
%Europe/Berlin %150 %2005, 04:36
hoi mensjes..
der lukt ff iets niet en ik heb et idee dat het eigenlijk ergens wel simpel op te losse is..
kijk:
http://members.lycos.nl/tut1/uploadbestanden/vbraster.gif
ik wil dat er een aantal random posities in 1 van die vakken wordt gemaakt behalve in de middelste..
dit omdat het middelste het beeld is en ik alles helemaal verspreid buiten het beeld wil..
het moet dus 2x n random betal geven (-1/0/1)maar het mag nooit bijde 0 zijn..
het systeem dat ik had bedacht werkt helaas niet want het geeft alleen random posities in de vakken in de hoeken:
for(i=0;i<A;i++){
mc = holder["mc"+i]
if(makeRandom(1,2) == 1){
mc.endX = 0-makeRandom(mc._width/2+2,250)
}else{
mc.endX = 200+makeRandom(mc._width/2+2,250)
}
if(makeRandom(1,2) == 1){
mc.endY = 0-makeRandom(mc._height/2+2,200)
}else{
mc.endY = 175+makeRandom(mc._height/2+2,200)
}
}
hebben jullie mshn nog ideetjes of ervaring hiermee?
alvast bedankt!
theFlashWizard
%Europe/Berlin %182 %2005, 05:23
owke.. nu dit bedacht:
pos_ar = [[-1,-1],[0,-1],[1,-1],
[-1,0],[1,0],
[-1,1],[0,1],[1,1]]
for(i=0;i<A;i++){
posR = pos_ar[makeRandom(0,pos_ar.length)]
mc = holder["mc"+i]
//X:
if(posR[0] == -1){
mc.endX = 0-makeRandom(mc._width/2+2,250)
}else if(posR[0] == 0){
mc.endX = makeRandom(mc._width/2+2,250)
}else{
mc.endX = 200+makeRandom(mc._width/2+2,250)
}
//Y:
if(posR[1] == -1){
mc.endY = 0-makeRandom(mc._height/2+2,200)
}else if(posR[1] == 0){
mc.endY = makeRandom(mc._height/2+2,250)
}else{
mc.endY = 175+makeRandom(mc._height/2+2,200)
}
}
maar of dit nou n simpele methode is.. vind hem eigenlijk te moeilijk geworde.. :$
weten jullie n kortere/makkelijkere? :$
nogmaals alvast bedankt!
Roenes
%Europe/Berlin %453 %2005, 11:53
function chooseRandom()
{
var x = Math.round(Math.random() * 2) - 1;
var y = Math.round(Math.random() * 2) - 1;
if(x == 0 && y == 0) chooseRandom();
else
{
//Jouw plaatsings code
}
}
Dauntless
%Europe/Berlin %476 %2005, 12:25
function chooseRandom()
{
var x = Math.round(Math.random() * 2) - 1;
var y = Math.round(Math.random() * 2) - 1;
if(x == 0 && y == 0) chooseRandom();
else
{
//Jouw plaatsings code
}
}
Da's mooi! :)
Hier nog een manier:
function chooseRandom() {
do {
var x = Math.round(Math.random()*2)-1;
var y = Math.round(Math.random()*2)-1;
} while (x == 0 && y == 0);
//hier je code;
}
theFlashWizard
%Europe/Berlin %597 %2005, 15:20
thnx dudes.. :)
ik had ook wel aan zoiets gedacht maar vond het eigenlijk niet netjes om alle randoms iedere x opnieuw te laten maken totdat er geen 2x 0 uitkwam.. hoeweinig dat dan ook gebeurt..
Roenes
%Europe/Berlin %638 %2005, 16:19
thnx dudes.. :)
ik had ook wel aan zoiets gedacht maar vond het eigenlijk niet netjes om alle randoms iedere x opnieuw te laten maken totdat er geen 2x 0 uitkwam.. hoeweinig dat dan ook gebeurt..Dit is juist netjes omdat je maar 1 mogelijkheid hoeft af te vangen en niet 8 zoals in jouw scriptje ;)
theFlashWizard
%Europe/Berlin %686 %2005, 17:28
ik denk dat ik je maar gelijk moet geven.. tis idd een stuk simpeler om nog n x 2 randoms te maken n x dan dat hij zo'n script moet doorlopen als ik had gemaakt.. :$
maja.. Twas redelijk laat toen ik eraan zat.. :P
Dauntless
%Europe/Berlin %692 %2005, 17:36
ik denk dat ik je maar gelijk moet geven.. tis idd een stuk simpeler om nog n x 2 randoms te maken n x dan dat hij zo'n script moet doorlopen als ik had gemaakt.. :$
maja.. Twas redelijk laat toen ik eraan zat.. :P
Dit is btw de eerste keer ooit dat ik do{}while gebruik :D
Opzich zou ik eigenlijk ook eerder voor Roenes oplossing gaan :).
theFlashWizard
%Europe/Berlin %702 %2005, 17:51
hmm waarom eigenlijk? het lijkt me voor flash moeilijker om een functie steeds opnieuw op te moeten starten dan dat het is om ene do while uit te breiden..
Roenes
%Europe/Berlin %714 %2005, 18:09
Valt wel mee hoor. Of flash nou een functie aanroept of een whilelus maakt niet zo heel veel uit. De reden dat ik hier niet voor een lus zou gaan omdat de kans dat zowel x als y 0 zijn heel klein is. Dit kun je dan beter ff checken met een if ipv een lus gebruiken die 1x doorlopen wordt.
Maar dit is volgens mij meer persoonlijke voorkeur dan regel :)
theFlashWizard
%Europe/Berlin %723 %2005, 18:21
hmm.. nou het zal je verbazen hoevaak het gebeurt als je het voor de grap in een onRelease ofzo ff zet..
maar mijn voorkeur gaat uit naar jou methode omdat dat compacter is en je de rest van de functie niet nog n "niveau" dieper moet neerzetten in die else..
nu moet ik deze uitkomsten alleen nog verwerken op ene handigere manier in 2 random coordinaten.. X en Y..
mshn nog tips? niet dat ik er niet zelf aan bezig ben hoor trouwens..
Dauntless
%Europe/Berlin %728 %2005, 18:28
nu moet ik deze uitkomsten alleen nog verwerken op ene handigere manier in 2 random coordinaten.. X en Y..
mshn nog tips? niet dat ik er niet zelf aan bezig ben hoor trouwens..
Kan je dat eens anders verwoorden? Ik snap het niet :I.
En het nadeel van de while loop is dat je daar al een infinite loop kan gaan hebben, terwijl het bij Roenes meer eenvoudig is om te debuggen.
theFlashWizard
%Europe/Berlin %739 %2005, 18:45
em.. je bedoelt dat het, als je het maakt, en je een foutje maakt, het eerder veel erger is?
em.. ik heb de bedoeling ervan al in de 1ste en 2de post neergezet.. snapte je die ook niet? :$ dat is trouwens ook de reden dat ik nu 2 if constructies nodig had..
Dauntless
%Europe/Berlin %757 %2005, 19:10
em.. je bedoelt dat het, als je het maakt, en je een foutje maakt, het eerder veel erger is?
Dan kan flash gaan crashen, anders heb je gewoon undefined...
Ok, ik hoop dat je dit bedoelde: (ik heb het wel met 0-1-2 gedaan ipv -1 - 0 - 1)
function chooseRandom() {
do {
var x = Math.floor(Math.random()*rows);
var y = Math.floor(Math.random()*colums);
} while (x == 1 && y == 1);
var minX:Number = x * blockWidth;
var minY:Number = y * blockHeight;
var maxX:Number = (x + 1) * blockWidth;
var maxY:Number = (y + 1) * blockHeight;
var finalX:Number = Math.round(Math.random()*(maxX-minX)+minX);
var finalY:Number = Math.round(Math.random()*(maxY-minY)+minY);
var mc:MovieClip = root.attachMovie("myMc", "myMc"+depth, depth++);
mc._x = finalX;
mc._y = finalY;
}
var rows:Number = 3;
var colums:Number = 3;
var stageWidth:Number = 550;
var stageHeight:Number = 400;
var blockWidth:Number = stageWidth / 3;
var blockHeight:Number = stageHeight / 3;
var depth:Number = 0;
var root:MovieClip = this;
setInterval(chooseRandom, 1);
Test dit (met de juiste image in je library met juiste linkage naam) en je krijgt ze over heel het scherm verspreid, behalve in het midden.
Ps: Ik heb het zo geschreven dat hij echt wel dynamisch is en dat je denk ik gemakkelijk dingen kan aanpasen. Tenzij dit niet was wat je bedoelde natuurlijk :D In dat geval zeg je het maar en probeer ik het opnieuw ;).
Greets,
Dauntless
theFlashWizard
%Europe/Berlin %828 %2005, 20:52
mooi script! :)
Kzal het idd nog wat aan moeten passen want hij zal alleen doel posities moeten aanmaken.. het attachen enzo wordt al goed geregelt.. :)
ook is alleen het middelste vak de stage dus ik zal wat moeten omrekene.. maar dat lukt denk wel..:)
dus thnx! :)
Dauntless
%Europe/Berlin %831 %2005, 20:57
mooi script! :)
Thx :)
Als je er niet meer uitkomt zeg je het maar :).
theFlashWizard
%Europe/Berlin %860 %2005, 21:39
ik heb er dit van gemaakt:
dit aant begin:
SW = 200 //Stage width
SH = 175 //Stage height
dit in een functie die ik aanroep wanneer ik random posities nodig heb:
for(i=0;i<A;i++){
mc = holder["mc"+i]
do {
var x = makeRandom(0,3)-1
var y = makeRandom(0,3)-1
} while (x == 0 && y == 0)
trace("x: "+x)
trace("y: "+y)
mc.fendX = makeRandom(x*SW, (x+1)*SW)
mc.fendY = makeRandom(y*SH, (y+1)*SH)
}
en deze voor me randoms:
function makeRandom(min,max){
return Math.floor(Math.random()*max+min)
}
het vreemde is alleen dat de meeste mc's helemaal op de rand van de blokken gaan staan.. zover als ze max aan de buitenkant mogen zijn.. heel vreemd..
en ik moet nu nog ff inbouwen dat hij ook de diameter van me mc's in de gaten houd..
owja.. en ik wist dat flash crasht bij een infinite loop.. maar omdat het meestal dan aan zoiets ligt heb je dat ook zo gevonde ;)
Dauntless
%Europe/Berlin %862 %2005, 21:42
function makeRandom(min,max){
return Math.floor(Math.random()*max-min)+min;
}
Probeer zo eens...
owja.. en ik wist dat flash crasht bij een infinite loop.. maar omdat het meestal dan aan zoiets ligt heb je dat ook zo gevonde ;)
Nieuw as document:
while(true){
trace("hey ;)");
}
:p
maar omdat het meestal dan aan zoiets ligt heb je dat ook zo gevonde ;)
Euhm, mijn A* staat in een while lus (zo'n 50 regeltjes), en als daar een bug in zit, man, daar wil je echt niet aan beginnen hoor :D ('k ben nu al 5 uur op een fout aan het zoeken :@).
theFlashWizard
%Europe/Berlin %868 %2005, 21:51
ow shit je hebt gelijk.. :| me hele makeRandom klopt nie.. :| stom.. :$
en nee dat hoef ik niet te proberen want ik weet wat er gebeurt ;)
ik snap niet hoe je het bedoelt met dat A*.. maar em.. als mijn flash gaat mopere dat het script de comp sloom maakt ga ik als eerste alle for's en while's doorkijke..
dus vandaar dat ik zei dat ik het zo gevonde zou hebbe..
Dauntless
%Europe/Berlin %870 %2005, 21:53
A* is een pathfinding engine.
public function findPath():Object
{
//if you reuse the same tiles, the tiles will be closed. So we need to open all the tiles:
openMap();
if(!ready()) return false;
//array containing all the nodes that can be visited
open = new Array();
//there is no path found yet
var pathFound:Boolean = false;
//start off with the first tile (startPoint).
//set it to open, calculate its G (0, 'cause it IS the startpoint), and H.
//and add that tile to the open array
var beginTile = map[startPoint[1]][startPoint[0]];
beginTile.setOpen();
beginTile.setG(0);
beginTile.setH(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
beginTile.setParent(beginTile);
open.push(beginTile);
//as long as there is a tile that can be visited and no path is found...
//(if open is empty, there is no solution)
while(open.length > 0 && !pathFound)
{
// the current-array always represents the current tile
var current:Tile = getLowestFTile();
//check if the path is found (current tile = end tile)
if(current.x == endPoint[0] && current.y == endPoint[1])
{
trace("Path was found");
pathFound = true;
break;
}
//remove the current object from the open-array
removeFromOpen(current);
current.setClosed();
//find all the surrounding nodes
var neighbours:Array = findSurroundingTiles(current);
for(var i in neighbours)
{
//if this neighbour is not in the open-array
if(!neighbours[i].getOpen())
{
//add this neighbour to the open-array
//and calculate all the needed settings.
open.push(neighbours[i]);
neighbours[i].setOpen();
neighbours[i].setParent(current);
neighbours[i].setH(neighbours[i].x, neighbours[i].y, endPoint[0], endPoint[1]);
neighbours[i].setG(current.getG());
} else {
//calculate new F. If the new F is smaller, that means the way to this node trough
//the currentnode is shorter. So update that node to make current node its parent
//and calculate new G.
var tempF:Number = neighbours[i].getH() + current.getG() + neighbours[i].getCost();
if(tempF < neighbours[i].getF())
{
neighbours[i].setParent(current);
neighbours[i].setG(current.getG());
}
}
}
}
//if the open array is empty, no path was found
if(open.length == 0){
trace("There is no path!");
return false;
}
//the path is calculated, so now we have to start at the end and work our way back:
var path:Array = new Array();
var px:Number = endPoint[0]; //pathX;
var py:Number = endPoint[1]; //pathY;
//as long as one of the two cordinates still isn't the same as the start point, continue
while(px != startPoint[0] || py != startPoint[1] )
{
path.push(map[py][px]);
//map[py][px] returns the tile; getParent() returns its parent and x the x property of
//the tiles parent
px = map[py][px].getParent().x;
py = map[py][px].getParent().y;
}
//and put the startPoint in there too
path.push(map[startPoint[1]][startPoint[0]]);
//we started at the endpoint, so now we have to reverse the array
path.reverse();
//and now we're all done so return the path!!!
return path;
}
Hier zit dus ergens een bug in, zin om hem te zoeken? :p Moet niet hoor, ik zoek het veel liever op mezelf uit :). Je kan het toch zowieso bijna onmogelijk aan oplossen aangezien je de rest niet hebt... :)
//EDIT
Ow, sorry, ik dacht dat je zei: ik wist niet dat flash crasht bij... Sorry :)
theFlashWizard
%Europe/Berlin %875 %2005, 22:00
me random lijkt beter te kloppe dan die van jou :S
_root.onEnterFrame = function(){
trace(makeRandom(1,10))
trace("2: "+makeRandom2(1,10))
}
function makeRandom(min,max){
return Math.floor(Math.random()*max+min)
}
function makeRandom2(min,max){
return Math.floor(Math.random()*max-min)+min;
}
dan komt er bij die van jou ook 0 uit.. dus ik blijf toch maar bij de mijne denk.. :P
Dauntless
%Europe/Berlin %879 %2005, 22:06
dan komt er bij die van jou ook 0 uit.. dus ik blijf toch maar bij de mijne denk.. :P
Gebruik dan Math.ceil ;)
function makeRandom2(min,max){
return Math.ceil(Math.random()*max-min)+min;
}
En die geeft 1 t.e.m. 10 :)
theFlashWizard
%Europe/Berlin %055 %2005, 02:19
ey Dauntless Thnx!
hij werkt nu perfect..
de fout zat em in me makeRandom..
return Math.floor(Math.random()*(max-min))+min;
moest et zijn..
maar het werkt perfect en et ziet er super uit in waarvoor ik et gebruik..
wat ik alleen helaas ff nie kan delen met jullie..
Dauntless
%Europe/Berlin %059 %2005, 02:25
ey Dauntless Thnx!
hij werkt nu perfect..
de fout zat em in me makeRandom..
return Math.floor(Math.random()*(max-min))+min;
moest et zijn..
maar het werkt perfect en et ziet er super uit in waarvoor ik et gebruik..
wat ik alleen helaas ff nie kan delen met jullie..
You're welcome :).
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.