PDA

Volledige versie bekijken : HitTest werkt niet.


Dirkdepirk
%Europe/Berlin %729 %2008, 17:30
Hallo

Ik heb alles geprobeerd, maar het lukt met niet om een bolletje een alpha te geven als hij over een vlak gaat.

dit is mijn code:
(waar het om gaat dan)

stop();

import mx.transitions.Tween;
import mx.transitions.easing.*;

_root.onMouseUp=function()
{
//Dit zorgt ervoor dat je kan klikken en dat het bolletje er dan in 1 seconde naartoe gaat
var Vx:Number = vierkant._x;
var Vy:Number = vierkant._y;
var Muiscursor1:Number = _root._xmouse;
var Muiscursor2:Number = _root._ymouse;
var Vtw:Tween = new Tween(vierkant,"_x",None.easeOut,Vx,Muiscursor1,1,true);
var Vtw:Tween = new Tween(vierkant,"_y",None.easeOut,Vy,Muiscursor2,1,true);
}
// dit is dus de hittest wat het niet doet :)
if (vierkant.hitTest(lijn))
{
trace("raak")
}
vierkant = het bolletje dat je bestuurt
lijn = hetgene wat hij moet raken waardoor de output "raak" is.

Weet iemand wat er fout is? Ik hoop dat het gewoon een stom foutje is :)

jaspermuts
%Europe/Berlin %780 %2008, 18:43
Je test alleen op het moment dat het script aangeroepen wordt, maar je wil (neem ik aan) elk frame testen of er geraakt wordt
stop();

import mx.transitions.Tween;
import mx.transitions.easing.*;

_root.onMouseUp=function()
{
//Dit zorgt ervoor dat je kan klikken en dat het bolletje er dan in 1 seconde naartoe gaat
var Vx:Number = vierkant._x;
var Vy:Number = vierkant._y;
var Muiscursor1:Number = _root._xmouse;
var Muiscursor2:Number = _root._ymouse;
var Vtw:Tween = new Tween(vierkant,"_x",None.easeOut,Vx,Muiscursor1,1,true);
var Vtw:Tween = new Tween(vierkant,"_y",None.easeOut,Vy,Muiscursor2,1,true);
}

_root.onEnterFrame = function()
{
if (vierkant.hitTest(lijn))
{
trace("raak")
}
}

Dirkdepirk
%Europe/Berlin %879 %2008, 21:06
Bedankt voor je reactie!

Het helpt echter niet, omdat ik maar 1 frame heb :O.
Ik ben gelijk aan het begin al op dit probleem gestuit. Dus toen heb ik gezocht en toen gepost ;).

Ik zal mijn fla wel even posten. (let niet op de graphics ;))

Jan
%Europe/Berlin %981 %2008, 23:32
Het helpt echter niet, omdat ik maar 1 frame heb
Dat maakt toch niks uit.
Jasper bedoelde eigenlijk met 'elk frame': 'elk onEnterFrame event' en zo zijn er ongeveer 12 per seconde als je fps 12 is:

Nieuwe fla, 1 frame, dit script:
onEnterFrame=function()
{
trace(getTimer());//toont 12 keer per seconde hoeveel tijd er verstreken is sinds de start van de swf
}

En aangezien je met een tween werkt kan je bij elke verandering een hitTest uitvoeren door naar het onMotionChanged event te luisteren:
Vtw.onMotionChanged=function()
{
trace(vierkant.hitTest(lijn));
}
Al kan het gebeuren dat je vierkant net voor de lijn staat bij één hitTest en voorbij de lijn is bij de volgende hitTest zodat je het net mist...

Identifiers (variabele namen en functies) beginnen normaal gezien met een kleine letter, hoofdletters zijn voor classes:
MovieClip, Number, Array etc
en
getNextHighestDepth, hitTest, length, bytesLoaded etc

Groeten,
Jan

Dirkdepirk
%Europe/Berlin %668 %2008, 16:02
Harstikke bedankt allebei, het werkt nu toch, door de onEnterFrame, maar 't werkte niet omdat ik een beetje sukkelig was en het verkeerd getypt had P) .

Bedankt! ik kan weer verder :D

Dirkdepirk
%Europe/Berlin %920 %2008, 22:05
Hey allemaal!

Ik stuit nu weer op een ander probleem.
Namelijk: Als ik klik gaat mijn bolletje erheen. Als ik over een lijn ga heb ik:
boll._x = 25.2;
boll._y = 50;

Maar als ik m'n muis stil houd op de plek waar ik klikte, (waardoor hij dus over een lijn gaat) gaat het bolletje heel even naar de aangegeven positie, en daarna naar mijn muis positie.

Even voor de duidelijkheid, ik gebruik dus een tween met actionscript(2.0).
Dus heb je een soort functie die je tween, die je met actionscript (2.0) maakt stopt?

Nog even extra code:

function playGame()
{
_root.onMouseUp=function()
{
var vx:Number = bol._x;
var vy:Number = bol._y;
var muiscursor1:Number = _root._xmouse;
var muiscursor2:Number = _root._ymouse;
var vtw:Tween = new Tween(bol,"_x",None.easeOut,vx,muiscursor1,1,true);
var vtw:Tween = new Tween(bol,"_y",None.easeOut,vy,muiscursor2,1,true);
}
}
function attachStart()
{
var sb = attachMovie("start","startb",1,{_x:30,_y:30});
this.startb.onRelease=function()
{
playGame();
startb.removeMovieClip();
}
}
attachStart();

_root.onEnterFrame=function()
{
for(i:Number = 0; i<=3; i++)
{
if (bol.hitTest(this["l"+i]))
{
bol._x = 25.2
bol._y = 50
delete _root.onMouseUp;
attachStart();

}
}
}

Wat ik dus wil, is dat zodra het bolletje een lijn raakt, de motion stopt, en het balletje naar de juiste positie gaat. En niet dat als ik mijn muis gewoon stil houd op de plek waar ik geklikt heb, het balletje er alsnog naar toe gaat.

Alvast Bedankt!

Mvg Dirk

Jan
%Europe/Berlin %945 %2008, 22:41
Dus heb je een soort functie die je tween, die je met actionscript (2.0) maakt stopt?
Dit staat allemaal in het lang en breed uitgelegd in de help. Druk af en toe eens op F1.

En die 'soort functie' die je zoekt, is gewoon tween.stop()...

Groeten,
Jan

Dirkdepirk
%Europe/Berlin %963 %2008, 23:07
Ok.

ik heb in dit geval dus:


if (bol.hitTest(this["l"+i]))
{
delete _root.onMouseUp;
vtw.stop();
bol._x = 25.2;
bol._y = 50;
attachStart();
}


maar dit werkt niet. De bol, blijft nog steeds gewoon door gaan naar de muiscursor, als je hem stil houdt.

Mvg Dirk.

Jan
%Europe/Berlin %998 %2008, 23:57
Ten eerste heb je 2 tweens: eentje voor de _x en eentje voor de _y, dus die zou je al allebei moeten stoppen.
Ten tweede maakt je die 2 tweens aan met "var" IN een functie en dus zijn dat lokale variabelen en die kan je in een andere functie niet opvragen.
Simpel voorbeeld om dit te verduidelijken:
getal1=10

function test()
{
var getal1=20; //var gebruikt dus verwijst naar de lokale variabele getal
var getal2=30; //var gebruikt dus verwijst naar de lokale variabele getal2
}
test();

trace(getal1);//nog altijd 10
trace(getal2);//undefined

getal1=10

function test()
{
getal1=20;//geen var gebruikt, verwijst dus naar de 'globale' variabele getal1
getal2=30;//geen var gebruikt, verwijst dus naar de 'globale' variabele getal2
}
test();

trace(getal1);//20
trace(getal2);//30


Probeer ook altijd _root te vermijden. Lees hier hoe en waarom:
http://www.flashfocus.nl/forum/showpost.php?p=343843&postcount=3

Meestal is het ook niet echt handig om een mouse event handler aan de _root te koppelen. Gebruik een apart object hiervoor:
var muis:Object=new Object()
Mouse.addListener(muis);
muis.onMouseUp=function()
{
//script
}
Dit biedt je de mogelijkheid om die listener gemakkelijk te verwijderen zonder de functie opnieuw te moeten scripten als je die er terug wil aanhangen:
Mouse.removeListener(muis);
Mouse.addListener(muis);
//ipv delete _root.onMouseUp


En nog een algemene opmerking is dat je een onEnterFrame functie hebt die dus constant loopt en voortdurend cpu verbruikt terwijl je eigenlijk enkel wil hitTesten als er iets beweegt. Dus beter die tween.onMotionChanged=function (){} gebruiken want die loopt enkel als er ook daadwerkelijk iets verandert via die tween.

En als iets niet werkt is het eerste wat je moet doen: trace gebruiken.
Waar je nu die vtw.stop() hebt, zet je: trace(vtw) en dan zag je dat dit undefined opleverde omwille van feit dat het een lokale variabele uit een andere functie is.

Groeten,
Jan

Dirkdepirk
%Europe/Berlin %866 %2008, 20:48
Ha adnez,

Opnieuw Harstikke bedankt voor je reply + hulp. Het heeft me weer geholpen, alleen stuit ik toch weer op een ander probleem.

Actionscript:
function playGame()
{
muis = new Object()
Mouse.addListener(muis);
muis.onMouseUp=function()
{
vx = bol._x;
vy = bol._y;
muiscursor1 = _root._xmouse;
muiscursor2 = _root._ymouse;
vtwx = new Tween(bol,"_x",None.easeOut,vx,muiscursor1,1,true);
vtwy = new Tween(bol,"_y",None.easeOut,vy,muiscursor2,1,true);
}
}


function attachStart()
{
var sb = attachMovie("start","startb",1,{_x:30,_y:30});
this.startb.onRelease=function()
{
playGame();
startb.removeMovieClip();
}
}
attachStart();

vtwx.onMotionChanged = function()
{
for(i:Number = 0; i<=3; i++)
{
if (bol.hitTest(this["l"+i]))
{
Mouse.removeListener(muis);
vtwx.stop();
vtwy.stop();
vtwr.stop();
bol._x = 70;
bol._y = 60;
attachStart();
}
}
}

Dirkdepirk
%Europe/Berlin %869 %2008, 20:52
Ha adnez,

Opnieuw Harstikke bedankt voor je reply + hulp. Het heeft me weer geholpen, alleen stuit ik toch weer op een ander probleem.

Actionscript:
function playGame()
{
muis = new Object()
Mouse.addListener(muis);
muis.onMouseUp=function()
{
vx = bol._x;
vy = bol._y;
muiscursor1 = _root._xmouse;
muiscursor2 = _root._ymouse;
vtwx = new Tween(bol,"_x",None.easeOut,vx,muiscursor1,1,true);
vtwy = new Tween(bol,"_y",None.easeOut,vy,muiscursor2,1,true);
//als ik hier trace(vtwx) dan zegt hij wel tween
}
}


function attachStart()
{
var sb = attachMovie("start","startb",1,{_x:30,_y:30});
this.startb.onRelease=function()
{
playGame();
startb.removeMovieClip();
}
}
attachStart();

als ik hier trace(vtwx) zegt hij niet tween, terwijl ik er wel een globale var van gemaakt heb
vtwx.onMotionChanged = function()
{
for(i:Number = 0; i<=3; i++)
{
if (bol.hitTest(this["l"+i]))
{
Mouse.removeListener(muis);
vtwx.stop();
vtwy.stop();
bol._x = 70;
bol._y = 60;
attachStart();
}
}
}

Ik heb de vtwx getraced, alleen hij zegt alleen tween als je hem traced in de functie terwijl het een globale variabele is.

Oftwel mijn vtwx.onMotionChanged werkt niet.

Ik hoop dat je mij z.s.m kan helpen, bedankt!

mvg Dirk

Jan
%Europe/Berlin %066 %2008, 01:35
stop();

import mx.transitions.Tween;
import mx.transitions.easing.*;

var muis:Object = new Object();//nog niet aan de Mouse gekoppeld dus onMouseUp doet nog niks

var rootScope:MovieClip=this;//sla this (is hier de _root) op in een variabele zodat je later niet _root moet gebruiken

//voor alle zekerheid maak je hier de tween variabelen aan:
var vtwx:Tween;
var vtwy:Tween;

muis.onMouseUp = function()
{
vtwx = new Tween(bol, "_x", None.easeOut, bol._x, _root._xmouse, 1, true);
vtwy = new Tween(bol, "_y", None.easeOut, bol._y, _root._ymouse, 1, true);
};
vtwx.onMotionChanged = function()
{
trace(this);//verwijst binnen deze functie naar de tween zelf en daar bestaan er geen movieclips.
for(i:Number = 0; i<=3; i++);
{
trace(this["l" + i]);//allemaal undefined want IN het tween object(waarnaar this hier verwijst) bestaan geen movieclips
trace(rootScope["l" + i]);//rootScope verwijst naar de _root en daar gaan die mc's wel gevonden worden
if (bol.hitTest(rootScope["l" + i]))
{
Mouse.removeListener(muis);
vtwx.stop();
vtwy.stop();
bol._x = 70;
bol._y = 60;
attachStart();
}
}
};

function playGame()
{
Mouse.addListener(muis);
}


function attachStart()
{
var sb:MovieClip = this.attachMovie("start", "startb", this.getNextHighestDepth(), {_x:30, _y:30});
sb.onRelease = function()
{
playGame();
this.removeMovieClip();
};
}
attachStart();

Groeten,
Jan

Dirkdepirk
%Europe/Berlin %740 %2008, 17:45
Ha Jan,

Hartelijk dank voor je reactie!

Opnieuw lijkt alles perfect te werken. Maar de Hittest werkt weer niet. Ik vermoed dat het door de //deze functie lijkt helemaal niet uitgevoerd te worden
vtwx.onMotionChanged = function() komt, want als ik vtwx trace trace(vtwx)

Geeft hij undefined. Heel raar want het staat niet eens in een functie. Hij traced niet eens in de onmotionchanged functie, omdat de functie dus blijkbaar helemaal niet wordt uitgevoerd. Voor de rest snap ik wel alles van wat je hebt verbeterd, en het werk perfect met een simpele code, behalve dan de hittest.

Graag zo snel mogelijk je hulp

Mvg Dirk

Jan
%Europe/Berlin %746 %2008, 17:55
En zo?:
muis.onMouseUp = function()
{
vtwx = new Tween(bol, "_x", None.easeOut, bol._x, _root._xmouse, 1, true);
vtwy = new Tween(bol, "_y", None.easeOut, bol._y, _root._ymouse, 1, true);

vtwx.onMotionChanged = function()
{
trace(this);//verwijst binnen deze functie naar de tween zelf en daar bestaan er geen movieclips.
for(i:Number = 0; i<=3; i++);
{
trace(this["l" + i]);//allemaal undefined want IN het tween object(waarnaar this hier verwijst) bestaan geen movieclips
trace(rootScope["l" + i]);//rootScope verwijst naar de _root en daar gaan die mc's wel gevonden worden
if (bol.hitTest(rootScope["l" + i]))
{
Mouse.removeListener(muis);
vtwx.stop();
vtwy.stop();
bol._x = 70;
bol._y = 60;
attachStart();
}
}
};
}
Groeten,
Jan

Dirkdepirk
%Europe/Berlin %773 %2008, 18:33
Het gaat al beter alleen de hittest werkt nog steeds niet.

Maar nu werkt de vtwx.onMotionChanged wel. Alleen de
trace(rootScope["l" + i]) geeft undefined. Dus de hittest werkt ook niet.

wat ook raar is: Als ik trace(Rootscope.l1) kent hij het wel.
En als ik de hittest verander in:if (bol.hitTest(rootScope.l1)) dan reset hij alleen de x-waarde van de bol, en niet de y waarde, op het moment dat ik tegen l1 aankom.

Verder, mijn start button zit op iets waar je 'dood' kan gaan. Als ik dus klik op de start butten en daarna nog een keer op dezelfde plek ga ik dus dood. Als ik heel vaak op die plek klikt. Attached hij een start button en haalt hij hem weg heel snel. Maar als ik dus heel snel klik, attached hij op een gegeven moment een start button óver de andere startbutton. Waardoor ik dus wel de bol kan bewegen, maar de start button staan blijft.

Ik zal weer is mijn fla posten, omdat ik denk dat het voor jou dan makkelijker is.

Mvg Dirk

Dirkdepirk
%Europe/Berlin %597 %2008, 14:20
bump

(kijk ook in mijn fla file plz)

Dirkdepirk
%Europe/Berlin %963 %2008, 23:07
Nog maar een bump dan. Zo moeilijk lijkt het probleem me toch niet?

Dirkdepirk
%Europe/Berlin %878 %2008, 21:04
Ik heb het vermoeden dat ik vervelend word :). Dus dit is mijn allerlaatste bump. Als er niet gereageerd wordt, ga ik ervan uit dat niemand een reden ziet om mijn te helpen.

In dat geval, bedankt voor ieders hulp in dit topic

Jan
%Europe/Berlin %891 %2008, 21:23
1)Pas je for loop aan van for(i:Number... naar for (var i:Number...
2)Misschien zit je met een scope probleem in die onMotionChanged. Verhuis al het script dat je daar hebt staan naar een aparte functie en roep die functie dan op:
tw.onMotionChanged=function()
{
//script weg
f();
}
function f()
{
//hier je script
}
3)En blijven tracen tot je vind waar de mogelijke fout zit.

Groeten,
Jan