You are not logged in.

Dear visitor, welcome to krpano.com Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Saturday, March 3rd 2012, 9:29pm

AS3 plugin interface umbau?

Ich stehe etwas an; vielleicht kann jemand helfen(?):

Beim Upgraden mancher meiner touren, die eigene swf-plugins enthalten, ist es nötig, die mittlerweile neue swf 1.0.8.14 sowie deren interface.as und die neue Einbindung in as3-code zu verwenden, wie es klaus schreibt.
Sieht bei mir zB so aus:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function registerplugin(krpanointerface:Object, pluginfullpath:String, pluginobject:Object):void
{
	// get the krpano interface and the plugin object
	kr = krpanointerface;
	plugin = pluginobject;

	// add plugin attributes and functions
	/* some example attributes:
	plugin.registerattribute("attr1", "defaultvalue");
	
	add a from xml callable functions:
	plugin.testfunction1 = testfunction1;*/

	kr.set("pas_makeLinkTo", placeLink);
	kr.set("ScrGet.texte", getScTexte);
	kr.set("ScrSet.newscene", newSc);
	kr.set("Scr.showtitle", putTitle);
	kr.set("Scr.HideHot", hideHotspots);
	kr.set("Scr.ShowHot", showHotspots);

	// say hello
	kr.trace(0,"hello from plugin[" + plugin.name + "]");
}

.. jetzt habe ich hier nur die möglichkeit, (xml-aufrufbare) funktionen zu definieren, aber nicht, wie bisher - nach geladenem plugin - direkt code ausführen zu lassen, mit dem diese funktionen ggf. interagieren;
so wie bisher einfach mit code fortzusetzen:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var sceneCount:int = kr.get("scene.count");

var scTexte = new Array  ;
var scTitel = new Array  ;
	scTitel[1] = "leer";
	scTexte[1] = "Ich bin von scene 1 abgerufen";


function getScTexte():void
{
	var i:int = 1;
	var ausdruck:String = "";
	var tmp:String = "";
	var teile = new Array  ;

	for (i=1; i<=sceneCount; i++)
	{
		var pano:String = kr.get("sc" + makeLeadingCero(3,i));
		ausdruck = "data[pano" + pano + "].content";
		tmp = kr.get(ausdruck);
		teile = tmp.split("#",2);
		scTitel[i] = teile[0];
		scTexte[i] = teile[1];
	}
}

function newSc(Nr: int)
{
	scroller.kopf.htmlText = scTitel[Nr];// Titel & Text einsetzen
	scroller.scrollText.htmlText = scTexte[Nr];

	scroller.scrbar.validateNow();
	scroller.scrbar.scrollPosition = 1;

	if (scTitel[Nr] == "leer")
	{// Leertextverhalten definieren (im scenentext mus "leer" stehen!)
		scroller.scrollText.htmlText = scroller.kopf.htmlText = "";
		scroller.alpha = 0.2;
	}
	else
	{
		scroller.alpha = initA;
	}

}

... ist nicht möglich, da zB die arrays scTexte und scTitel sich nicht mehr im jew. benötigten Gültigkeitsbereich befinden. In der bisherigen Methode, war ich nicht gezwungen, die benötigten funktionen (die mit kr.set("...",...)) innerhalb der registerplugin-funktion zu definieren.
Gibt es einen Weg, dies zu umgehen?

PS: Es geht in dem Beispiel um eine in Flah erstellte Textbox "Scroller" mit Titelleiste und Textscrollbereich, für die beim Laden des Plugins ein 2dim Array alle Texte erhält und das Plugin selbst tauscht (xml-Befehl "newSC" bei jedem szenenwechsel) auf Befehl diese Texte für die neue szene aus...

EDIT:
Bin schon draufgekommen, dass meine bisherige Version der Einbindung - mit

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import krpano_as3_interface;

// create krpano as3 interface object - krpano
var kr:krpano_as3_interface = krpano_as3_interface.getInstance();


// empty functions? - then it wasn't included in the viewer
if (kr.get == null)
{
	// run plugin swf standalone - no interfaces - add dummy functions

	function dummy_get(v:String):String
	{// avoid progress timer traces
		if (v != "progress.loaddone")
		{
			trace("get(" + v + ");");
		}
		return "";
	}
	function dummy_set(v:String,val:String):void
	{
		trace("set("+v+","+val+");");
	}

	function dummy_call(action:String):void
	{
		trace("call("+action+");");
	}

	kr.get = dummy_get;
	kr.set = dummy_set;
	kr.call = dummy_call;
}
... code
...code
...code


weiterhin auch mit der neuen interface.as funktioniert und damit das Problem der Variablengültigkeit ausserhalb v. funktionen gar nicht besteht...
Manchmal ist der einfache Weg, etwas zum Laufen zu bringen, der, der einem zuletzt einfällt...
best regards from www.PanAustria.com

This post has been edited 2 times, last edit by "PanAustria" (Mar 4th 2012, 3:34pm)


2

Wednesday, March 7th 2012, 12:14pm

Hi,

ich verstehe leider das genaue Problem nicht ganz...
ist die Frage bzgl. AS3 oder dem Interface selbst?

grundsätzlich lässt sich aber mit dem neuen Interface auch alles (und noch mehr) machen, was mit dem alten auch möglich war...
im Prinzip hat sich nur der Startpunkt (registerplugin anstelle dem Register Event) und die Art wie das krpano Interface Objekt übergeben wird, geändert...

Schöne Grüße,
Klaus

3

Friday, March 9th 2012, 9:04am

Bin mir nicht sicher, wo der "Hund begraben liegt", aber der code:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.ui.Mouse;
import flash.events.*;
import flash.geom.*;
import fl.motion.Color;
/*
krpano as3 plugin example / template
for Flash CS (.fla)
*/

var kr:Object = null;
var plugin:Object = null;

if (stage == null)
{
	this.addEventListener(Event.ADDED_TO_STAGE, versioncheck);
}
else
{
	stage.scaleMode = "noScale";
	stage.align = "TL";

	var txt:TextField = new TextField();
	txt.defaultTextFormat = new TextFormat("_sans",14,0xFFFFFF,false,false,false,null,null,"center");
	txt.autoSize = "center";
	txt.htmlText = "krpano\n\nplugintemplate plugin";
	addChild(txt);

	var resizefu:Function = function(event:Event=null):void
	{
	txt.x = (stage.stageWidth  - txt.width )/2;
	txt.y = (stage.stageHeight - txt.height)/2;
	};

	stage.addEventListener(Event.RESIZE, resizefu);

	resizefu();
}

function versioncheck(evt:Event):void
{
	this.removeEventListener(Event.ADDED_TO_STAGE, versioncheck);
	var oldkrpanointerface:Object = (getDefinitionByName("krpano_as3_interface") as Class)["getInstance"]();
	if (oldkrpanointerface.get("version") < "1.0.8.14" || oldkrpanointerface.get("build") < "2011-05-10")
	{
		oldkrpanointerface.trace(3, "plugintemplate plugin - too old krpano viewer version (min. 1.0.8.14)");
	}
}

// registerplugin;
function registerplugin(krpanointerface:Object, pluginfullpath:String, pluginobject:Object):void
{
	kr = krpanointerface;
	plugin = pluginobject;

	// add plugin attributes and functions
	// plugin.registerattribute("attr1", "defaultvalue");
	
	kr.set("getTxt",getScTexte);

}

// unloadplugin
function unloadplugin():void
{
	// remove all your custom plugin stuff here
	// ...

	plugin = null;
	kr = null;
}
 //****************
 
var actualScene:int = 0;
var scNumberStr:String = "";
var hotCount:int = 0;
var plugCount:int = 0;

var sceneCount:int = kr.get("scene.count");

var scTexte = new Array  ;
var scTitel = new Array  ;
	scTitel[1] = "leer";
	scTexte[1] = "Ich bin von scene 1 abgerufen";


function getScTexte():void
{
	var i:int = 1;
	var ausdruck:String = "";
	var tmp:String = "";
	var teile = new Array  ;

	for (i=1; i<=sceneCount; i++)
	{
		var pano:String = kr.get("sc" + makeLeadingCero(3,i));
		ausdruck = "data[pano" + pano + "].content";
		tmp = kr.get(ausdruck);
		teile = tmp.split("#",2);
		scTitel[i] = teile[0];
		scTexte[i] = teile[1];
	}
}
function makeLeadingCero(stellen:int, i:int):String
{
	var textnr:String = String(i);
	while (textnr.length< stellen)
	{
		textnr = "0" + textnr;
	}
	return textnr;
}

function krtrace(xy:Object)
{
	kr.call("trace(" + xy + ")");
}

führt bei mir in Flash immer zur Ausgabemeldung:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at paScroller01dev_fla::MainTimeline/frame1()
best regards from www.PanAustria.com

4

Tuesday, March 13th 2012, 1:34pm

Hi,

der Zugriff auf das "kr" Objekt hier erfolgt zu früh:

Source code

1
var sceneCount:int = kr.get("scene.count");


das "kr" Objekt ist aber erst nach dem "registerplugin" Aufruf verfügbar (das war aber in den vorherigen Versionen genauso),

Schöne Grüße,
Klaus

Similar threads