Autor Zpráva
Jadro007
Profil *
Ahoj, v AS2 teprve začínám a proto mám začátečnický dotaz ;)
Chtěl bych si na zkoušku vytvořit takovou jednoduchou hru... :) Panáček vystřelí na cíl.
Vše funguje jak má, ale mám problém s náboji...
Protože potřebuji víc nábojů naráz, vytvořil jsem třídu Náboj, vše funguje jak má, ale nevím, jak vytvořený objekt, třeba
var strela = new Naboj();

Tady nastává problém, nevím, jak nově vzniklý objekt nějak "navěsit" na zkopírovaný MC náboje...
Chtěl bych to udělat tak, aby když sem měl v třídě Naboj metodu pohyb(), aby šla aplikovat na MC... ;)
Nevíte jak na to? :)
VXC008
Profil *
Rozsir si tridu MovieClip o metody tridy Naboj
MovieClip.prototype.pohyb() {
// obsah metody pohyb
}

a metoda by se mela volat:
duplikovany_mc.pohyb();

A nebo uprav metodu pohyb() o parametr target, ktery bude pracovat s danym MovieClipem
pohyb(target:MovieClip) {
// obsah metody pohyb
}

V AS2 jsou dva zpusoby jak vytvorit vlastni objekt (tridu) jeden se podoba zpusobu podobnem JS a druhy zase zpusobu, ktery se pouziva v AS3.
Jadro007
Profil *
Kam mám napsat tohle?
MovieClip.prototype.pohyb() { 
// obsah metody pohyb 
}

Zkoušel jsem to dát přímo do kódu, ale nefunguje to tak jak by mělo... ;)
VXC008
Profil *
Promin zpletl jsem si pojmy z dojmy :D.
Tridu rozsiris o metodu, napr. takto:
MovieClip.prototype.pohyb = function(value:Number):Void {
this._x += value;
}

circle.pohyb(20);

Deklarujes to nekde na zacatku a pak tuto metodu muzes volat v jakemkoli MC. V tomto pripade posunec MC circle o 20 bodu v ose _x.

Ja osobne mam radeji tridy v AS3 je to lepsi a prehlednejisi...
VXC008
Profil *
A jete to jde udelat takto:

Trida Strela.as, ktera je ve slozce com. Slozka com je ve slozce kde je dany soubor *.FLA, tento zpusob pouzivani trid ma byt funkcni od FlashPlayeru 6 AS2
// AS2

class com.Strela {
		
	public function Strela() {
		// ..
	}
	
	public static function pohyb(target:Object):Void {
		target.i = 0;
		target.onEnterFrame = function():Void {
			if (this.i < 50) {
				target.i++;
				target._x += 1;
			} else if (this.i == 50) {
				delete this.onEnterFrame;
				trace("end");
			}			
		};
	}
	
}


Tento script dej do _root nekde na zacatek casove osy
// importovani tridy
import com.Strela;

var timeout:Number = setTimeout(startPohyb, 20, circle);
var timeout2:Number = setTimeout(startPohyb, 350, circle2);
var timeout3:Number = setTimeout(startPohyb, 720, circle3);

function startPohyb(target:Object):Void {
	// zavolani metody pohyb() staticke tridy Strela, ktera pomoci parametru target zacne animovat MC circle, circle1...
	Strela.pohyb(target);
}

//Strela.pohyb(circle);

Protoze je pouzito metody setTimeout() tento priklad bude funkcni od FlashPlayeru 8



Trida Strela.as, ktera je ve slozce com. Slozka com je ve slozce kde je dany soubor *.FLA, funguje od FlashPlayeru 9 AS3
// AS3

package com {
	
	import flash.display.MovieClip;	
	import flash.events.Event;	
	
	public class Strela {
		
		public function Strela() {
			// ..
		}
		
		public static function pohyb(target:MovieClip):void {			
			target.i = 0;
			target.addEventListener(Event.ENTER_FRAME, animovani);
		} 
		
		private static function animovani(thisEvent:Event):void {			
			if (thisEvent.currentTarget.i < 50) {
				thisEvent.currentTarget.i++;
				thisEvent.currentTarget.x += 1;
			} else if (thisEvent.currentTarget.i == 50) {
				thisEvent.currentTarget.removeEventListener(Event.ENTER_FRAME, animovani);
				trace("end");
			}
			
		}
		
	}
	
}


Tento script dej do stage - root nekde na zacatek casove osy
importovani tridy Strela
import com.Strela;

var timeout:uint = setTimeout(startPohyb, 20, circle);
var timeout2:uint = setTimeout(startPohyb, 350, circle2);
var timeout3:uint = setTimeout(startPohyb, 720, circle3);

function startPohyb(target:MovieClip):void {
                // zavolani metody pohyb() staticke tridy Strela, ktera pomoci parametru target zacne animovat MC circle, circle1...
	Strela.pohyb(target);
}


Testovano v Flash CS4 a funkcni pro FlashPlayer10.
Jadro007
Profil *
Mám s tím tak trochu problém... :) Použil sem možnost s "prototype"...
Mám kód:
// posune MC z aktuálního umístění o cil_x, cil_y za nastavenou dobu
MovieClip.prototype.pohybThis = function (cil_x:Number, cil_y:Number, doba:Number):Void
{
	obj = this;
	cil_x = this._x + cil_x;
	cil_y = this._y + cil_y;
	trace("pohyb");
	var i = 0;
	var plus = 0.5/doba;
	var count = 0;
	var posuv_x = cil_x-obj._x;
	var posuv_y = cil_y-obj._y;
	var startX = obj._x;
	var startY = obj._y;
	obj.onEnterFrame = function() {
		count++;
		i += plus;
		obj._x = startX+posuv_x*(Math.sin(Math.PI*i));
		obj._y = startY+posuv_y*(Math.sin(Math.PI*i));
		if (count == doba) {
			delete obj.onEnterFrame;
		}
	};
};

onEnterFrame = function () {
	if (Key.isDown(Key.RIGHT)) {
		ctv.pohybThis(10, 0, 10);
		//ctv2.pohybThis(20, 0, 10);
	}
	if (Key.isDown(Key.RIGHT) && Key.isDown(Key.SHIFT) ) {
		ctv.pohybThis(10, 0, 2);
	}
};


Pro jeden MC to funguje v pohodě
MC1.pohybThis(100, 0, 3);
,
ale když mám třeba:
 MC1.pohybThis(100, 0, 3);
 MC2.pohybThis(200, 0, 3);
 

Udělá to tohle: jadro.ic.cz/problem.swf
Nevíte kde je chyba? :)
X
Profil *
Ahoj, musis deklarovat promenne do daneho MovieClip (MC) pomoci this. Pokud je deklarujes pomoci var tak se smazou po vykonani funkce a pri udalosti onEnterFrame nejsou k nalezeni.

MovieClip.prototype.pohybThis = function(cil_x:Number, cil_y:Number, doba:Number):Void  
{
	this._doba = doba;
	this._cil_x = this._x+cil_x;
	this._cil_y = this._y+cil_y;
	//trace("pohyb");
	this.i = 0;
	this.plus = 0.5/doba;
	this.count = 0;
	this.posuv_x = this._cil_x-this._x;
	this.posuv_y = this._cil_y-this._y;
	this.startX = this._x;
	this.startY = this._y;
	//trace("vars");
	this.onEnterFrame = function():Void  {
		//trace("enterFrame");
		this.count++;
		this.i += this.plus;
		this._x = this.startX+this.posuv_x*(Math.sin(Math.PI*this.i));
		this._y = this.startY+this.posuv_y*(Math.sin(Math.PI*this.i));
		//trace(this+" "+this.count+" "+this._doba+" "+this.i);
		if (this.count == this._doba) {
			//trace("delete");
			delete this.onEnterFrame;
		}
	};
};

MC1.pohybThis(100,0,3);
MC2.pohybThis(200,80,3);
Jadro007
Profil *
Díky moc všem za pomoc, už to funguje ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: