webForumDet fria alternativet

stopDrag, fortsätt en liten stund till.

Flash

7 svar · 462 visningar · startad av phred

Medlem sedan nov. 2005314 inlägg
Frågan#1

Hejsan!
Jag håller på med ett litet projekt i flash, där man ska kunna dra runt lite olika objekt i filmen. Det fungerar bra som det är nu, men jag skulle vilja att om jag drar och släpper ett objekt så vill jag inte att det ska bli "tvärstopp" utan jag vill att den ska avstanna mjukt, typ easeOut och detta ska ju då vara beroende av hastighet och riktning.

Jag har ingen som helst aning om vad jag ska söka på eller läsa om.

Någon får gärna putta mig i rätt riktning.

Tack!!

Medlem sedan juni 2006244 inlägg
#2

Hm det låter som det kan bli ganska avancerat...

du behöver nog använda dig av musens riktning skulle jag tro...
jag har tyvärr inte koll själv på hur man gör det, men det finns nog tutorials på nätet...

om du har en funktion som känner av musens riktning och sparar den i en variabel, så kan du förhoppningsvis använda det lagrade värdet som är där för att bestämma vilken riktning som det släppta objektet skall förflytta sig.

Medlem sedan nov. 2005314 inlägg
#3

Jo jag är medveten om att det blir ganska avancerat :)

Jag är öppen för föslag vad jag ska läsa om eller söka på, under tiden rotar jag lite själv omkring på nätet. Jag återkommer vid lycka :)

Medlem sedan nov. 2004149 inlägg
#4

Hej,
http://www.kammaren.com har jag en funktion som troligen liknar det du är ute efter.
Klicka på VAD ÄR KAMMAREN.
Om man för musen utanför bildytan så bromsas bildens rörelse upp.

På huvudtidslinjen:

function getmouse() {
themouse = 0-(_ymouse-508);//508=sajtens höjd
}

function elastic() {
physics = [0.05, 0.1];
yspeed = ((themouse-image._y)*physics[0])+(yspeed*physics[1]);
image._y += yspeed;
}

På movieclipet (höjd=1016, dvs 2x508) som heter image:

onClipEvent (enterFrame) {
_parent.elastic();
}
onClipEvent (mouseMove) {
if (_root._xmouse<350) {
_parent.getmouse();
}
}

Hur du ska anpassa scripten till dina behov vet jag inte, men om du lyckas skulle jag gärna vilja veta hur du gjort.
/Alar

Medlem sedan nov. 2004149 inlägg
#5

Här har du förresten en variant på temat - scrollar åt alla håll, även diagonalt - och bromsar upp:

Huvudtidslinjen:

function getmouse() {
themouse = [_xmouse, _ymouse];
}
function elastic() {
physics = [0.10, 0.1];
xspeed = ((themouse[0]-image._x)*physics[0])+(xspeed*physics[1]);
yspeed = ((themouse[1]-image._y)*physics[0])+(yspeed*physics[1]);
image._x += xspeed;
image._y += yspeed;
}

Movieclipet:

onClipEvent (enterFrame) {
_root.elastic();
}
onClipEvent (mouseMove) {
_root.getmouse();
}

Medlem sedan nov. 2005314 inlägg
#6

Hejsan då var jag tillbaka igen.
jag har läst lite och pulat fram och tillbaka, jag har faktiskt kommit en bit på vägen men jag skulle behöva en puff igen.

one.onPress = function() {
	oX = this._x;
	oY = this._y;
	this.startDrag();
	this.pr = true;
}

one.onRelease = one.onReleaseOutside = function() {
	this.pr = false;
	this.stopDrag();
}

	one.onEnterFrame = function() {
		// ox is x location of clip in previous frame (=oldx)
		this.ox = this.x;
		this.oy = this.y;
		this.x = this._x;
		this.y = this._y;
		// if user is pressing this clip, set delta x based on where clip was in
		// previous frame (so can tell how fast user is dragging it)
		if (this.pr) {
			this.dx = (this.x-this.ox)*7;
			this.dy = (this.y-this.oy)*7;
		// otherwise, user has let go, so add to dy for gravity, use dx and dy calculated
		// while user was dragging, and then add a smaller delta to x and y each frame
		} else {
			this.x += this.dx/10;
			this.y += this.dy/10;
			this._x = this.x;
	    	this._y = this.y;
		}
	}

Det här delvis en kod jag kom över på något forum (tror det var flashkit).
den gör nästan som jag vill, man kan börja dra i rutan och när man släpper så fortsätter den, men den fortsätter i all evighet och det är jag mindre intresserad av :)

Jag vill att den ska sakta stanna in efter man har släppt.

om någon har några tips så tar jag emot dem med öppna armar.

Bifogar .fla

Medlem sedan feb. 200738 inlägg
#7

Hallå,

Lägg till följande i one.Press funktionen.

this.stopSteps = 20;
this.stopSpeed = 2;

Sedan ändrar du one.EnterFrame funktionen till nåt i stil med:

one.onEnterFrame = function() {
		// ox is x location of clip in previous frame (=oldx)
		if(	this.stopSteps > 0 ){
			this.ox = this.x;
			this.oy = this.y;
			this.x = this._x;
			this.y = this._y;
			// if user is pressing this clip, set delta x based on where clip was in
			// previous frame (so can tell how fast user is dragging it)
			if (this.pr) {
					this.dx = (this.x-this.ox)*7;
					this.dy = (this.y-this.oy)*7;
				// otherwise, user has let go, so add to dy for gravity, use dx and dy calculated
				// while user was dragging, and then add a smaller delta to x and y each frame
			} else {
					this.x += this.dx/this.stopSpeed;
					this.y += this.dy/this.stopSpeed;
					this._x = this.x;
					this._y = this.y;
			}
			this.stopSteps --;
			this.stopSpeed += 10;
		}
	}

Det kanske inte fungerar precis som du vill, men det får klippet att stanna iaf.

//Matte

Medlem sedan nov. 2005314 inlägg
#8

Nu börjar det likna något här :)
tack för det Matte, jag sätter inte tråden som löst ännu jag ska spinna vidare lite på det här och återkommer.

Om det kikar in någon här som tänker "men det där skulle jag löst såhär" så tveka inte att komma med input.

Tack ännu en gång Matte det fungerar i stora drag som jag vill ha det.

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)