PDA

Volledige versie bekijken : 3D room in Flash


Crypt36
%Europe/Berlin %298 %2009, 08:09
Ik zoek een voorbeeld .fla van een 3D kamer gemaakt met 6 bitmaps, een kubus is ook prima maar kan alleen maar getekende kubussen vinden en weet niet hoe ik dit om moet zetten naar bitmaps.

Ik wil graag gebruik maken van Sandy. Ik ga nu hiermee: http://theflashblog.com/?p=224 aan de slag maar weet niet of dit netjes gaat lukken en zou dus graag een goed voorbeeld hebben!

Crypt36
%Europe/Berlin %763 %2009, 19:19
Ik wil mijn "muur" vanuit de library laden maar ik krijg hem zo telkens dubbel te zien waarvan er 1 distort en de ander gewoon blijft op x=1 en y=1. Ik snap echt niet waarom en krijg hem niet weg?!


import sandy.util.DistortImage;

dx1=0;
dy1=0;
dx2=500;
dy2=0;
dx3=500;
dy3=400;
dx4=0;
dy4=400;

onEnterFrame = function() {
this.attachMovie("photo2","photo2",this.getNextHighestDepth());
this.photo2._visible=false;

var obj:Object = new Object();
obj.x1 = dx1;
obj.y1 = dy1;
obj.x2 = dx2;
obj.y2 = dy2;
obj.x3 = dx3;
obj.y3 = dy3;
obj.x4 = dx4;
obj.y4 = dy4;

clip = _root.createEmptyMovieClip("holder", 1);
_root.clip._x = 50;
_root.clip._y = 50;
clip.cacheAsBitmap = true;
di = new DistortImage(this["clip"], this["photo2"], 1, 1);
di.setTransform(obj.x1, obj.y1, obj.x2, obj.y2, obj.x3, obj.y3, obj.x4, obj.y4);
di.texture.draw(photo2);


if(Key.isDown(KEY.LEFT)){
dy2-=5;
dy3+=5;
dx2+=5;
dx3+=5;
}
else if(Key.isDown(KEY.RIGHT)){
dy2+=5;
dy3-=5;
dx2-=5;
dx3-=5;


}

}

Jan
%Europe/Berlin %770 %2009, 19:29
Waarom gebruik je toch in elke script dat je hier plaatst een onEnterFrame? :S

onEnterFrame = function()
{
this.attachMovie("photo2","photo2",this.getNextHighestDepth());
this.photo2._visible=false;
clip = _root.createEmptyMovieClip("holder", 1);
}
Je maakt dus 30 keer per seconde een instance van photo2 aan. Die hebben allemaal dezelfde instance name wat al niet mag en je zet ze allemaal op _visible=false
Je hebt na 1 minuut swf spelen dus 1800 onzichtbare photo2's staan. :S
Je maakt 30 keer per seconde een lege movieclip holder aan die allemaal dezelfde instance name hebben en ook allemaal op dezelfde depth komen waarmee je niet enkel de vorige holder overschrijft maar ook één van die photo2's. :S
Dus na 1 minuut heb je 3599 waardeloze movieclips geplaatst.

Doe jezelf een plezier en lees een goed boek over actionscript, druk op F1 en lees de uitleg daar, of volg wat beginnerstutorials zodat je tenminste de meest basic dingen verstaat.
http://www.flashfocus.nl/forum/showthread.php?t=6338

En probeer niet gelijk iets met games of 3D te doen als je nog maar 3 drie dagen met actionscript bezig bent, en duidelijk niet weet wat je (of het script dat je neerzet) doet.

Groeten;
Jan

Crypt36
%Europe/Berlin %787 %2009, 19:53
Ik hoop dat je dit niet kwalijk opvat adnez want zo is het niet bedoeld. Als ik met boeken en die saaie tutorials en oefeningen begin dan houdt ik er al snel mee op uit totale verveling. Het is me te saai en niet boeiend. En als ik lekker mijn eigen spel ga schrijven ben ik dagen achter elkaar bezig en leer ik ten minste echt wat zonder dat ik het opgeef. Verder wordt het schrijven van spellen door veel mensen als 1 van de beste leer methodes van een taal gezien. Verder doe ik wel degelijk tutorials maar alleen die die me direct helpen. Als jij een tutorial weet die me nu direct zou helpen met deze vraag dan zou ik hem lezen maar ik zou niet weten welke. Het principe van de 3D room heb ik al zo'n beetje uitgewerkt en anders worden het gallerijen dat is mijn eigen keuze en maakt het schrijven van deze game er niet makkelijker of moeilijker op.

Ik wil een functie die niet door de gebruiker geinitialiseerd hoeft te worden en waarvan ik wel de waarden kan blijven aanpassen daarom ik heb ik de code in de onEnterFrame gezet, ik zou niet weten hoe anders. Als jij een betere weet vertel het me!

Ok, ik weet dus niet hoe ik dit aan moet pakken dus ik hoop dat ik weer wat mag leren van iemands aanpassing.

PS: als ik de MC gewoon op de movie plaats en niet uit de library laat laden krijg ik hem wel gewoon 1 maal distortend te zien en mij is het echt een raadsel.

Crypt36
%Europe/Berlin %185 %2009, 05:26
Ik heb hem iets aangepast. Maar nog steeds krijg ik hem gewoon niet aan de praat op een plaatje uit de library dat niet ook al op de stage staat. Ik begrijp echt niet waarom, kan iemand me aub helpen?

Hier is de .fla met de benodigde class voor distort (File is voor CS4).
http://rapidshare.com/files/254788326/distort.rar


import sandy.util.DistortImage;



var obj:Object = new Object();
obj.x1 = 0;
obj.y1 = 0;
obj.x2 = 500;
obj.y2 = 0;
obj.x3 = 500;
obj.y3 = 500;
obj.x4 = 0;
obj.y4 = 500;

clip = _root.createEmptyMovieClip("holder", 1);
_root.clip._x = 50;
_root.clip._y = 50;
clip.cacheAsBitmap = true;
di = new DistortImage(this["clip"], this["blood"], 1, 1);
di.setTransform(0, 0, 500, 0, 500, 500, 0, 500);
di.texture.draw(blood);

this.onEnterFrame = function() {


if(Key.isDown(KEY.LEFT)){
obj.y2-=1;
obj.y3+=1;
obj.x2+=6;
obj.x3+=6;
di.setTransform(obj.x1, obj.y1, obj.x2, obj.y2, obj.x3, obj.y3, obj.x4, obj.y4);
di.texture.draw(blood);
}
else if(Key.isDown(KEY.RIGHT)){
obj.y2+=1;
obj.y3-=1;
obj.x2-=6;
obj.x3-=6;

di.setTransform(obj.x1, obj.y1, obj.x2, obj.y2, obj.x3, obj.y3, obj.x4, obj.y4);
di.texture.draw(blood);
}

}



Dit gebruik ik om normaal een MC uit de library the halen maar als ik dat hierboven toepas dan geeft hij hem ineens niet meer weer?!

_root.attachMovie("photo2", "photo6", 1);
myObj._x = 100;
myObj._y = 100;

fons
%Europe/Berlin %368 %2009, 09:50
Dus als ik het goed begrijp wil je aan de hand van dat "3d distort photo stack" voorbeeld een 3D game gaan maken?
Succes ermee!

Ik zou naar Adnez luisteren.

Crypt36
%Europe/Berlin %387 %2009, 10:18
Nee ik wil geen 3D game maken ik wil 2 plaatjes tegelijk laten distorten zodat ik door een gallery kan lopen.

En dat werkt ook prima, ik kan door een gang lopen en vijandjes tegenkomen. Alleen die muren wil ik uit de Library trekken en niet op de stage hoeven te plaatsen.

Zo zet ik de MC uit de library op het scherm:

_root.attachMovie("photo2", "photo6", 1);
photo6._x = 100;
photo6._y = 100;



En dan wil ik die distorten met de volgende code maar dan verdwijnt hij opeens?!


_root.attachMovie("photo2", "photo6", 1);
photo6._x = 100;
photo6._y = 100;

clip = createEmptyMovieClip("holder", 1);
clip._x = 300;
clip._y = 300;
clip.cacheAsBitmap = true;
di = new DistortImage(clip, photo6, 1, 1);
di.setTransform(0, 0, 400, 0, 500, 500, 0, 500);
di.texture.draw(photo6);

Jan
%Europe/Berlin %425 %2009, 11:13
En dan wil ik die distorten met de volgende code maar dan verdwijnt hij opeens?!
root.attachMovie("photo2", "photo6", 1);
clip = createEmptyMovieClip("holder", 1);
Je maakt beide clips aan op dezelfde depth. Depths moeten uniek zijn (zoals voorheen reeds gezegd) anders overschrijf je de (vorige) movieclip die al op die depth (be)staat.

Dat bedoel ik met de basisprincipes leren van actionscript. Als je zelfs zulke dingen niet weet, kan je eigenlijk nog niet eens 2 movieclips aanmaken. :S

Druk op F1 en lees de uitleg bij:
Learning ActionScript 2.0 in Adobe Flash -> Working with Movie Clips -> Creating movie clips at runtime :
-Creating movie clips at runtime
-About controlling movie clips with ActionScript
-Managing movie clip depths

Als je zelfs dat niet wil lezen is alle hulp hier tevergeefs.:)

Voordat je ook maar 1 regel script gaat schrijven, zou je tenminste moeten weten wat volgende begrippen inhouden of hoe je het gebruikt:

1) scopes:
this, _parent, _root, _global, _level
http://www.flashfocus.nl/forum/showpost.php?p=343843&postcount=3

2)stacking order (z-index)
getDepth(), getNextHighestDepth(), getInstanceAtDepth()

3)instance names:_name property bij
createEmptyMovieClip(), duplicateMovieClip(), attachMovie()

4)herhalen van een actie:
setInterval, setTimeout, onEnterFrame, for loop, while loop, Tween
http://www.flashfocus.nl/forum/showpost.php?p=339959&postcount=2

5)Dynamische identifiers / instance names:
blokhaken / associatative array notatie:
http://www.flashfocus.nl/forum/showpost.php?p=345066&postcount=5

Als je niet goed weet hoe of waar je moet zoeken in de F1, zet dan je cursor in het actionswindow op/in een 'blauw woordje' en druk op F1, je komt dan automatisch uit bij de uitleg over dat 'woord'.


Groeten;
Jan

Crypt36
%Europe/Berlin %458 %2009, 12:00
Hij moet dus op een nieuwe layer :)

Ga het zo ff proberen, thanx!

PS: En zal ook die guides eens doornemen.

Jan
%Europe/Berlin %463 %2009, 12:06
Hij moet dus op een nieuwe layer
:S
Nee, layers bestaan niet in een swf. Die bestaan enkel in het Flash programma zodat je daar makkelijker/georganiseerd kan werken.
In een swf worden depths gebruikt en zitten al die objecten uit al die layers in 1 frame (maar op verschillende depths).

Misschien bedoelde je met "op een nieuwe layer" "op een nieuwe depth"? In dat geval klopt het.

Groeten;
Jan

Crypt36
%Europe/Berlin %485 %2009, 12:38
Geweldig, het werkt :)

Alleen houdt ik nu nog steeds die dubbele foto, met _visible false zie je hem niet maar hij moet weg.

root.attachMovie("photo2", "photo6", 2);

Hiermee laad ik hem in, maar hoe unload ik hem nu weer zodat ie weg is in het filmpje?


Antwoord:
removeMovieClip(photo6);

Heel erg bedankt!

Jan
%Europe/Berlin %487 %2009, 12:42
Hiermee laad ik hem in, maar hoe unload ik hem nu weer zodat ie weg is in het filmpje?
Als je even de moeite had genomen om op F1 te drukken en bij de MovieClip class te kijken had je al lang gezien dat er dingen zijn als removeMovieClip() unloadMovie(), unloadClip() etc.

Het forum is niet bedoeld om vragen te stellen waarop je makkelijk zelf het antwoord kan vinden.

Groeten;
Jan

Crypt36
%Europe/Berlin %526 %2009, 13:37
Op de blauwe code en dan op F1 is idd erg handig, weet ik veel :)