Mai 07 2010

Adobe Flash CS5 ein kurzes Review

Tag: AdobeKonstantin Elstner @ 17:57

Ich fasse mal die für mich wichtigsten Verbesserungen zusammen, aus der Sicht eines Mac Users nach einer Woche Produktiveinsatz, wobei ich noch nicht komplett alles getestet habe.

Die besten neuen Features:
– Das Text Layout Framework
– Crosslinking zum Flash Builder (bei Editierung / Öffnen von Klassen fragt Flash ob diese im Flash Builder editiert werden sollen)
– Codehints und Autocomplete auch für externe Klassen (Must Have)
– Direkte Bearbeitung von Bildern aus der Bibliothek in Photoshop und Speichern direkt in die Datei

– XLF Dateiformat – perfekt für die Versionierung
– Zentrale Verwaltung der eingebetteten Schriftarten (Menü Text > Schrift Einbettung)

Performance & Stabilität:
– Ich habe in dieser Woche kein einziges mal erlebt, dass die Flash IDE abgestürzt ist, kann mir daher ständiges Speichern wieder abgewöhnen
– Die Flash IDE wurde deutlich in Sachen CPU-Last überarbeitet, früher hat Flash mit ein paar offenen Dateien schnell mal im Hintergrund eine CPU-Last von 20-30% gehabt, jetzt zw. 5 und 10%

Das schlechteste neue Feature:
– Community Help Center als Ersatz der klassischen Hilfe – bisher absolut schrecklich

Fazit:
Adobe Flash CS4 hatte einige Neuerungen im Gepäck, war dafür auf Mac und Windows CPU hungrig und instabil.
Flash CS5 hingegen läuft ruhig und stabil. Viele kleine Änderungen (Photoshoplinking, Flash Builder Crosslinking) erleichtern die Workflows und bringen eindeutig mehr Erleichterungen im Alltag. Ein meiner Meinung nach ‚Must Have‘.

[Update]

– 1 Absturz in 3 Wochen Nutzung

weitere geniale Neuerungen:

  • endlich Aktualisierung der Schriften ohne Neustart
  • Anzeige der Größe der Datei-SWF-Größe im Eigenschaftenfenster (traumhaft wenn es auf die KBs angkommt)

Mrz 19 2010

LocalConnection’s Domain übergreifend

Tag: AdobeKonstantin Elstner @ 10:21

Vor zwei Tagen stolperte ein befreundeter Flashentwickler über das Problem der LocalConnection über mehre Domains hinweg in Actionscript 2.0. Er bekam die Verbindnung einfach nicht zum laufen.

Wie ich nun mal bin, fand ich das Problem gleich sehr interessant und testete auch gleich ausführlich.

Wir setzten den Dokumentationen entsprechend zum Test:

System.security.allowDomain(„*“);

Auch gab es im Internet die Angaben, dass auf allen Servern die crossdomain.xml notwendig wäre, was sich aber als Unsinn heraus stellte.

Nach kurzer Zeit fand ich dann jedoch in den Dokumentationen von Adobe den eigentlich wichtigen Punkt, der meiner Meinung nach in der Actionscript 3.0 Dokumtation beiweitem übersichtlicher dargestellt ist:

Different domains with predictable domain names. When two SWF files from different domains communicate, you need to allow communication between the two domains by calling the allowDomain() method. You also need to qualify the connection name in the send() method with the receiving LocalConnection object’s domain name:

// receivingLC is in http://www.domain.com/receiving.swf
receivingLC.allowDomain(‚www.anotherdomain.com‘);
receivingLC.connect(‚myConnection‘);

// sendingLC is in http://www.anotherdomain.com/sending.swf
sendingLC.send(‚www.domain.com:myConnection‘, ‚myMethod‘);

Different domains with unpredictable domain names. Sometimes, you might want to make the file with the receiving LocalConnection object more portable between domains. To avoid specifying the domain name in the send() method, but to indicate that the receiving and sending LocalConnection objects are not in the same domain, precede the connection name with an underscore (_), in both the connect() and send() calls. To allow communication between the two domains, call the allowDomain() method and pass the domains from which you want to allow LocalConnection calls.

Flash speichert lokale Daten in jeweiligen ‚Ordnern‘ pro Domain, dies gilt für LocalSharedObjects und LocalConnections. So ist sichergestellt, dass sich Daten von verschiedenen Domains nicht gegenseitig überschreiben können, bzw. das ein Actionscript nicht Zugriff auf Daten anderer Domains erhält.

Wird nun eine LocalConnection erstellt, so wird der LocalConnection ein Prefix bestehend aus der Domain voran gestellt zB. wird ‚myConnection‘ zu ‚www.domain.com:myConnection‘ gewandelt, selbiges gilt auch für Actionscript 2.0.

Will man diesen Automatismus umgehen weil man zB. nicht weiß wie die unterschiedlichen Domains auf dem Zielserver heißen werden, so muss man den Namen der LocalConnection einen Unterstrich voranstellen, daher ‚_myConnection‘, mit diesem Unterstrich weißt man den Flash Player an die LocalConnection als globale LocalConnection zu handeln. Der Flash Player fügt in diesem Fall nicht die Domain als Prefix hinzu. Zusätzlich muss aber auch allowDomain für die LocalConnection gesetzt werden:

myLC.allowDomain(‚*‘);

Hinweis

Die Domain die als Prefix verwendet wird ist nicht die des Servers auf dem die SWF eingebettet wurde, sondern die Domain des Servers der die SWF hostet.

Sicherheitshinweis:

An dieser Stelle sei an zumerken, dass mit allowDomain mit einer Wildcard (‚*‘)  immer mit Vorsicht gearbeitet werden sollte und die übergebenen Daten exakt geprüft werden sollten. Denn hier besteht die Gefahr von Sicherheitslücken, da über eine LocalConnection auch binäre Daten gehandelt werden können. So wäre ein Szenario denkbar, in dem ein Hacker, gezielt SWF’s auf LocalConnecntions prüft, diese dekompiliert, sich die Schnittstellen und Übergabewerte anschaut und so bald er einen Schwachpunkt findet versucht diesem Clip per LocalConnection manipulierte Daten unterzuschieben.

SWFBridge: Easier AS3 to AS2 Communication

Grant Skinner war so freundlich und hat uns Flashentwicklern ein kleines Geschenk gemacht, er hat die Class SWFBridge zur Verfügung gestellt, mit der sich in Knapp 4 Zeilen Code LocalConnections erstellen lassen, auch zwischen Actionscript 2.0 und 3.0 SWF’s. Kein nerviges Testen mehr ob die Synchronität klappt und ewiges Loopen … ein echtes must have:

http://www.gskinner.com/blog/archives/2007/07/swfbridge_easie.html


Jan 12 2009

visicam panorama VR Portierung auf Papervision3d 2.0 Great White

Tag: Adobe,AllgemeinKonstantin Elstner @ 21:44

Bei der Arbeit an einem aktuellen Projekt ist ‚ganz nebenbei‘ eine Portierung des Visicam Panorama VR Viewers von Papversion Version 1.5 auf Version 2.0 Great White angefallen.

Die ich natürlich nicht vorenthalten will, da dies auch anderen Suchenden zu Gute kommen könnte. Anzumerken sei noch, das ich die Integration der Texturen von Bitmaps auf Movieclips die vorher instanziert werden müssen gewandelt habe, um später noch clickbare Flächen hin zu zufügen.

Als Basis dient das Aktuelle Papervision3d 2.0 Pack (bitte per SVN ziehen) und ein FLA, bei dem die Baseclass den Namen ‚main‘ hat. Desweiteren müssen in der Bibliothek noch die MovieClips front_mc, back_mc, left_mc, right_mc, top_mc und bottom_mc in für AS exportierter Form vorliegen.

Der Code für das Package der main class ist:

package {
import flash.display.*;
import flash.filters.*;
import flash.display.Stage;
import flash.events.*;

// Import Papervision3D
import org.papervision3d.cameras.*;
import org.papervision3d.scenes.*;
import org.papervision3d.objects.*;
import org.papervision3d.objects.special.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.special.*;
import org.papervision3d.materials.shaders.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.lights.*;
import org.papervision3d.render.*;
import org.papervision3d.view.*;
import org.papervision3d.events.*;
import org.papervision3d.core.utils.*;
import org.papervision3d.core.utils.virtualmouse.VirtualMouse;

public class main extends Sprite {
// ___________________________________________________________________ vars3D

var container :Sprite;
var scene     :Scene3D;
var camera    :Camera3D;
var renderer  :BasicRenderEngine;
var viewport3D:Viewport3D;

var mouseDrag :Boolean = false;

var    mtx:int;
var    mty:int;

var m_x:Number = 0;  // set the x startlocation
var m_y:Number = 0;  // set the y startlocation
var m_z:Number = 0;  // do not set the z-axis! YOUR SCREEN IS FLAT!!!

var keyboard_Steps:Number = 6;    // set the stepwide for the keys
var mouse_Steps:Number = 70;    // set the speed for mousetracking

var zoom_MAX:Number = 6;        // set the maximum of zoom
var zoom_MIN:Number = 2;        // set the minimum of zoom
var zoom_Steps:Number = 0.5;    // set the stepwide for zooming
var zoom_Start:Number = 100;    // set the zoomstart

// ___________________________________________________________________ main

function main() {
// onEnterFrame
this.addEventListener( Event.ENTER_FRAME, loop3D );

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
this.addEventListener(MouseEvent.MOUSE_DOWN,  onmouseDown);
this.addEventListener(MouseEvent.MOUSE_UP,  onmouseUp);

init3D();
}

// ___________________________________________________________________ init3D

function init3D():void {

viewport3D = new Viewport3D(1000, 550, true, true);

addChild(viewport3D);

renderer = new BasicRenderEngine();

// Create container sprite and center it in the stage
//container = new Sprite();
//addChild( container );
//container.x = 500;
//container.y = 275;

// Create scene
scene = new Scene3D( );

// Create camera
camera = new Camera3D();
camera.zoom=zoom_Start;
camera.x = camera.y = camera.z = 0;
camera.rotationX = camera.rotationY = camera.rotationZ = 0;
camera.yaw(0); camera.pitch(0); camera.roll(0);

addCubicVR();

renderer.renderScene(scene, camera, viewport3D);

}

// ___________________________________________________________________ CubicVR

function addCubicVR():void {

var materialRoom:MovieMaterial

// name, angle, x, y, z
var ar:Array = new Array();
ar.push ([„front_mc“,   0, 0, 0, 2500]);
ar.push ([„right_mc“,  90, 2500, 0 ,0]);
ar.push ([„back_mc“,  180, 0, 0,-2500]);
ar.push ([„left_mc“,  -90,-2500, 0, 0]);
ar.push ([„bottom_mc“, 90, 0,-2500, 0]);
ar.push ([„top_mc“,   -90, 0, 2500, 0]);

for (var i:int = 0; i < 6; i++) {
var planeT:MovieClip;
if( i == 0 ) planeT = new front_mc();
else if( i == 1 ) planeT = new right_mc();
else if( i == 2 ) planeT = new back_mc();
else if( i == 3 ) planeT = new left_mc();
else if( i == 4 ) planeT = new bottom_mc();
else if( i == 5 ) planeT = new top_mc();

materialRoom = new MovieMaterial ( planeT );
materialRoom.interactive = true;

var plan:DisplayObject3D = new Plane(materialRoom, 5000,5000,12,12);

if (i==4 || i==5) plan.pitch(ar[i][1]) else plan.yaw(ar[i][1]);
plan.x = ar[i][2];
plan.y = ar[i][3];
plan.z = ar[i][4];
scene.addChild( plan );
}

}

function overFunc (e:MouseEvent):void {
trace(„over „+e.target);
}

// ___________________________________________________________________ update

function update_Camera():void
{
if (m_x >= 360) m_x = 0;
if (m_x <=-360) m_x = 0;
if (m_y >=  10) m_y = 10;
if (m_y <= -10) m_y = -10;

camera.rotationX = m_y;
camera.rotationY = m_x;
camera.yaw(0); camera.pitch(0); camera.roll(0);

//renderer.renderScene(scene, camera, viewport3D);

}

// ___________________________________________________________________ keyboard

function keyDownHandler(event:KeyboardEvent):void
{

if (event.keyCode == 37) { //LEFT
m_x -= keyboard_Steps;
update_Camera();
}

if (event.keyCode == 38) { //UP
m_y -= keyboard_Steps;
update_Camera();
}

if (event.keyCode == 39) {  //RIGHT
m_x += keyboard_Steps;
update_Camera();
}

if (event.keyCode == 40) {  //DOWN
m_y += keyboard_Steps;
update_Camera();
}

if (event.keyCode == 16){
if(zoom_MAX > camera.zoom) {
camera.zoom += zoom_Steps;
}
}

if (event.keyCode == 17){
if(zoom_MIN < camera.zoom) {
camera.zoom -= zoom_Steps;
}
}

}

// ___________________________________________________________________ loop

function loop3D(event:Event):void {

if(mouseDrag){

var dx: Number = mouseX – 500;
var dy: Number = mouseY – 275;

m_x += dx/mouse_Steps;
m_y += dy/mouse_Steps;

}

update_Camera();

renderer.renderScene(scene, camera, viewport3D);

// Render the scene
//scene.renderCamera( camera );
}

// ___________________________________________________________________ mouse

function onmouseDown(event:Event):void {
mtx = mouseX;
mty = mouseY;
mouseDrag = true;
}

function onmouseUp(event:Event):void {
mouseDrag = false;
}

}
}

Demolink: http://dashart-os.de/pv3dDemo/

Link: Quellcode


Nov 17 2008

Flash CS4 und kein Flex Builder Debugging mehr

Tag: AdobeKonstantin Elstner @ 10:32

Nach dem ich letzten Donnerstag zum Test Adobe Flash CS4 installiert hatte, dass unter anderem das Adobe AIR Update 1.1 mit sich brachte und den neuen Flash Player 10 mit den Debuggingmode, konnte ich im Adobe Flex Builder nicht mehr Debuggen.

Sowohl AIR-Anwendungen wie auch nur Flash basierende Anwendungen konnten keine Verbindung mehr zu dem Debugger des Flex Builders aufbauen. Beim Beenden der Anwendungen erschien nur der schöne Hinweis, dass keine Verbindung mit dem Debugger möglich gewesen wäre.

Ich war wie man sich vorstellen kann reichlich irritiert. Was war da passiert?

Google Recherchen brachten nur sehr spärlich Treffer.  Zwar gab es einige User die ähnliches berichteten jedoch oftmals nur in Bezug auf Flash Anwendungen und keine AIR Hinweise.

Nach einiger Zeit stieß ich jedoch auf eine Seite bei Adobe Open Source, auf der schon etwas ‚veraltete‘ Hinweise zum Handling mit dem neuen Flash 10 Beta Player publiziert waren.

Nach kurzem Lesen der Seite war mir der Bug klar. Die aktuellen SDK’s von Adobe nutzen die mittlerweile veraltete playerglobal.swc bzw. airlobal.swc die nicht mehr konform mit Adobe Flash Player 10 bzw. AIR 1.1 sind.

Zwar liefert Adobe für den Flex Builder regelmäßig Updates über den üblichen Updatemanager aus, jedoch ist hier die letzte Version des Flex Builders die 3.1.0.

Unter http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3 lässt sich jedoch schon die aktuelle Version 3.2.0 als offiziellen Release downloaden.

Dies ist dringend zu empfehlen, da Version 3.1.0 nicht den Flash Player 10 unterstützt und ebenso die integrierten Debugging Klassen für Adobe AIR nicht mehr mit AIR 1.1 harmonieren.

Nach dem Download der aktuellen Adobe Flex SDK 3.2.0 sollte diese in den Pfad „[…] Adobe Flex Builder 3 Plug-in/sdks/" entpackt werden.

Anschließend muss der Flex Builde rmit folgendne Schritten auf die neue SDK hingweisen werden:

Im Menü: Window -> Preferences

Dann im sich öffnenden Fenster: Flex -> Installed Flex SDKs

Hier per ‚Add‘ die neue SDK hinzufügen und aktivieren.

Alle neuen Projekte in AIR oder Flash nutzen von nun an das aktuelle SDK und lassen sich nun ohne Probleme debuggen.

Ältere Projekte müssen jedoch noch per Hand wie folgt angepasst werden:

AIR projects
Rechtsklick auf das Projekt > properties

Flex Build Path > Libary path

Und hier prüfen, dass bei ‚Build path libaries‘ Flex 3.2 eingebunden ist, andernfalls das veraltete Paket entfernen und die Flex SDK über ‚Add SWC Folder‘ hinzufügen …

Flex / Flash projects
Rechtsklick auf das Projekt > properties

Flex Build Path > Libary path

Und hier prüfen, dass bei ‚Build path libaries‘ Flex 3.2 eingebunden ist, andernfalls das veraltete Paket entfernen und die Flex SDK über ‚Add SWC Folder‘ hinzufügen …

Außerdem, wenn eine Veröffentlichung auf Flash Player 10 Basis erwünscht ist, noch im Fenster unter ‚Flex Compiler‘ bei der Eigenschaft HTM wrapper als required Flash version 10.0.0 eintragen.

Hinweis:

Der Adobe Flex Builder scheint nach einem Neustart automatisch alle Projekte an die neue SDK anzupassen, daher vielleicht das ganze nur kontrollierend gegen prüfen und von Fall zu Fall eingreifen 😉

Viel Erfolg


Nov 15 2008

Adobe CS4 Demos verfügbar

Tag: AdobeKonstantin Elstner @ 17:28

Seit dem 11.11.08 sind nun die Demoversionen der neuen Adobe Produktlinie CS4 verfügbar. Daher nun kein ständiges Schauen mehr der Streams von Adobe TV sondern endlich selber probieren.

Natürlich war für mich als ‚Flasher‘ das Interesse für Adobe Flash CS4 am größten. Und das Warten hat sich gelohnt. Auf den ersten Blick wirkt Flash genau so wie Photoshop CS4 bei weitem aufgeräumter. Der im Fenster verfügbare Platz wird durch die neue Oberfläche perfekt ausgenutzt.

Etwas unangenehm viel gleich zu Anfang auf, dass es zwar nun ein direktes Suchfeld am oberen rechten Rand gibt, dass direkt auf die Hilfe verweist, jedoch erfolgt der gesamte Abruf der Hilfe nur von den Adobe Servern. Selbiges gilt auch für die Scripting-Hilfe in der Codeansicht. Ein für mich schon etwas unangenehmeres Detail, da so die Recherche auf Fahrten im Zug erschwert wird. Im Falle eines Falles wird dann wohl die Vorgängeversion helfen müssen.

Von der Codebasis her hat sich kaum etwas geändert, nach wie vor dominiert Actionscript 3.0 die Entwicklung. Nice to have sind die neuen 3D-Fetaures die sich aber leider erst ab Flash Player 10 nutzen lassen. Leichte und schwerere 3D-Animationen von Flächen und Formen lassen sich nun mit wenigen Klicks erstellen.

Eine große Aufmerksamkeit von mir erhielt auch das Bones-Tool/Werkzeug. Mit Hilfe dessen verschiedene Objekte oder Verktorformen schnell mit einem ‚Skelett‘ ausgestattet werden können und dann in ihrer Abhängigkeit bewegt/animiert werden.

Eine Vektorfigur, die einen Pfad entlang wandert, lässt sich so schnell und mühelos erstellen.

Womit wir dann bei der nächsten Thematik wären, dem neuen Animationstool mit Hilfe dessen nun Umfangreiche Animationen/Tweens in windeseile erstellt werden können. Nach der Definition eines Tweens kann das Objekt nun an beliebige stellen gezogen/verschoben werden oder skaliert werden. Auf der Arbeitsfläche erscheint dann ein kompletter Pfad der Bewegung der schnell und einfach nach den Wünschen angepasst werden kann, sei es eine Bogenförmige Bewegung, ein kurzes Holpern oder ein Ausbruch in der Bewegung nach links oder rechts.

Auch fällt sehr attraktiv aus, dass diese Bewegungen nun mit Leichtigkeit gebremst oder beschleunigt werden können, hierbei lässt sich jede einzelne Eigenschaft wir x, y – Koordinaten, Skalieren, Unschärfe etc. einzeln editieren. Sprich die Figur kann sich schnell bewegen aber im selben Zug nur langsam und verzögert größer werden.

Für Banneranimation und ähnliches daher ein absolutes muss. Animationen die vorher eine halbe oder gar eine ganze Stunde dauerten entstehen nun in fünf bis 10 Minuten.

Das ganze ist natürlich fein, jedoch wird sich jeder ‚Flash-Animateur‘ nun Fragen … wie sieht es dann mit Flash 8 aus? Und die definitiv gute Nachricht ist:

Diese neuen Animationen benötigen als einzige Basis Actionscript 2.0, daher sind selbst Ausgaben unter Version 8 möglich 😉

So viel vorerst von der neuen CS4er Front.