Per Klick eine Variable ändern? AS3

green_phanta

Erfahrenes Mitglied
Hallo,

ich bin seit kurzem dabei, AS3 ein bisschen kennen zu lernen. Ich habe mir schon mittels Internet einen kleinen Script zusammengebastelt. Er funktioniert nur nicht ...

Code:
// Dynamischer Hintergrund (Farbänderung)

import flash.geom.ColorTransform;
var DynBgCl:ColorTransform = DynBg.transform.colorTransform;

var i:int = 100; 

DynBgCl.color = i;
DynBg.transform.colorTransform = DynBgCl;




ClGreen.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler(event:MouseEvent):void {
	i = 10;
	trace("press");
}

Es gibt einen mc:DynBg dem ich mittels ColorTransfor eine Farbe zuweise,
Nun möchte ich per Klick die Farbe ändern, und versuche das mit einer Variablen. Aber es klappt nicht..
Was mache ich falsch?

Danke
Gruß,
green
 
Wenn du i änderst, dann änderst du auch nur i - und nicht DynBgCl.color.

Code:
function mouseDownHandler(event:MouseEvent):void {
	DynBgCl.color = 10;
	DynBg.transform.colorTransform = DynBgCl;
}
 
Zuletzt bearbeitet:
Hallo,
Danke funktioniert!!

Noch eine Frage dazu: wüsstest du/ihr einen Weg, wie ich mit diesem Klick nicht sofort die Farbe wechsle sondern langsam fade?

Code:
// Dynamischer Hintergrund (Farbänderung)

import flash.geom.ColorTransform;
var DynBgCl:ColorTransform = DynBg.transform.colorTransform;

var i:int = 100; 

DynBgCl.color = i;
DynBg.transform.colorTransform = DynBgCl;




ClGreen.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler(event:MouseEvent):void {
	DynBgCl.color = i+98760;
	DynBg.transform.colorTransform = DynBgCl;
	trace("press");
}


Gruß,
Green
 
Kurz hingeklatscht:

Code:
// Dynamischer Hintergrund (Farbänderung)

import flash.geom.ColorTransform;
var DynBgCl:ColorTransform = DynBg.transform.colorTransform;

var ziel:int = 250; 

DynBgCl.color = 10;
DynBg.transform.colorTransform = DynBgCl;



function blubb(e) {
	DynBgCl.color += (ziel - DynBgCl.color) / 2;
	trace(DynBgCl.color);
	DynBg.transform.colorTransform = DynBgCl;
	
	if(Math.abs(DynBgCl.color - ziel) < 10) {
		DynBgCl.color = ziel;
		DynBg.transform.colorTransform = DynBgCl;
		DynBg.removeEventListener(Event.ENTER_FRAME, blubb);
	}
}
DynBg.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler(event:MouseEvent):void {
	DynBg.addEventListener(Event.ENTER_FRAME, blubb);
}

Gute Nacht.
 
Hallo,

mhh, mein Button funktioniert und auch der Farbwechsel.
Das Problem ist das es nicht schön fadet sondern irgendwelche Farben(siehe Code) zwischen den zwei Ausgangspunkten "blitzen" lässt. Woher soll Flash auch wissen welche Farben es nehmen soll?
Ich hab mir das so vorgestellt, dass es aussieht, als würde man es Tweenen (mit Farbeffekt, Farbton). Muss ich vielleicht die Farben anders definieren oder ähnliches?

Das gibt mein Script aus:
Code:
6993704
9216096
9956893
10203825
10286136
10313573
10322719
10325767
10326783
10327122
10327235
10327273
10327285
10327292
...


Danke
greets green
 
Naja - kommt ganz darauf an, wie du die Farben definierst. Du hast ja einfach color = 10; genommen. Das ist eher suboptimal - schau mal hier aus der Flashreferenz:

When you pass a value for this property, use the format 0xRRGGBB. RR, GG, and BB each consist of two hexadecimal digits that specify the offset of each color component. The 0x tells the ActionScript compiler that the number is a hexadecimal value.

Dein einfaches i hat immer nur eine Farbe gefadet, und sobald das über 255 kam hat's geruckelt. Was auch absolut logisch ist.
 
Mhh das verstehe ich nicht. Hex-Farben verstehe ich wie ich sie einsetzte. Aber selbst mit diesem kommt es zu keinem befriedigenden Ergebnis.

Code:
var ziel:int = 0xD2BDCF; 

DynBgCl.color = 0x8B5A7D;
DynBg.transform.colorTransform = DynBgCl;

Die Farbe des MC ist am Anfang schon die definierte Farbe(0x8B5A7D), aber nach "Klick" blinken einige anderen Farben schnell hintereinander auf, um dann bei der definierte "ziel"-Farbe(0xD2BDCF) stehen zu bleiben..
Es sieht eher nicht wie ein fade aus.. ich weiß aber nicht warum :)
Kann man diesen Farbeffekt-Tween nicht auch programmieren, bzw wäre das einfacher?
(Bilde mir ein das ich mal irgendwo eine Tween funktion in AS3 gesehen habe, bitte korrigiert mich wenn ich falsch liege)

thx,
Gruß,
Green
 
Kann man diesen Farbeffekt-Tween nicht auch programmieren

Ja kann man,
col1 (Alpha,Red, Green, Blue - Kanäle) ist die startfarbe und col2 die zielfarbe, maxsteps bestimmt die Anzahl der Farben die zwischen start und zeilfarbe beim "tweenen" angezeigt werden sollen:
Code:
var mc:Sprite = new Sprite();
mc.graphics.beginFill(0xFF0000, 1);
mc.graphics.drawRect(0, 0, 200, 200);
mc.graphics.endFill();
addChild(mc);


var step = 0;
var maxstep = 30;
var col1:Number = 0xFFFF0000
var col2:Number = 0xFF00FF00

var color_trans=  new ColorTransform();
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler(e:Event):void {
	color_trans.color=transformColor( col1, col2, step++, maxstep );
	mc.transform.colorTransform = color_trans;
	if (step == maxstep) {this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler); step = 0;}
}

function transformColor( argbColorOld:Number, argbColorNew:Number, step:Number, steps_max:Number ):Number {
	var aOff:Number = (argbColorOld >> 24) - ( ( (argbColorOld >> 24) - (argbColorNew >> 24) ) * ( step / steps_max ) );
	var rOff:Number = (argbColorOld >> 16 & 0xFF) - ( ( (argbColorOld >> 16 & 0xFF) - (argbColorNew >> 16 & 0xFF) ) * ( step / steps_max ) );
	var gOff:Number = (argbColorOld >> 8 & 0xFF) - ( ( (argbColorOld >> 8 & 0xFF) - (argbColorNew >> 8 & 0xFF) ) * ( step / steps_max ) );
	var bOff:Number = (argbColorOld & 0xFF) - ( ( (argbColorOld & 0xFF)- (argbColorNew & 0xFF) ) * ( step / steps_max ) );
	return (aOff << 24 | rOff << 16 | gOff << 8 | bOff);
}
 
Hallo,

Genau diesen Effekt habe ich mir vorgestellt, Danke :)

Letztes Problem, der fade wiederholt sich und wiederholt sich und....

Code:
var step = 0;
var maxstep = 24;
var col1:Number = 0xFFFF0000
var col2:Number = 0xFF00FF00
 
var BGcolor_trans=  new ColorTransform();

function enterFrameHandler(e:Event):void {
    BGcolor_trans.color=transformColor( col1, col2, step++, maxstep );
    DynBg.transform.colorTransform = BGcolor_trans;
    if (step == maxstep) {this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler); step = 0;}
}


function transformColor( argbColorOld:Number, argbColorNew:Number, step:Number, steps_max:Number ):Number {
    var aOff:Number = (argbColorOld >> 24) - ( ( (argbColorOld >> 24) - (argbColorNew >> 24) ) * ( step / steps_max ) );
    var rOff:Number = (argbColorOld >> 16 & 0xFF) - ( ( (argbColorOld >> 16 & 0xFF) - (argbColorNew >> 16 & 0xFF) ) * ( step / steps_max ) );
    var gOff:Number = (argbColorOld >> 8 & 0xFF) - ( ( (argbColorOld >> 8 & 0xFF) - (argbColorNew >> 8 & 0xFF) ) * ( step / steps_max ) );
    var bOff:Number = (argbColorOld & 0xFF) - ( ( (argbColorOld & 0xFF)- (argbColorNew & 0xFF) ) * ( step / steps_max ) );
    return (aOff << 24 | rOff << 16 | gOff << 8 | bOff);
}

//Bei Klick Farbfade ausführen
ClGreen.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

function mouseDownHandler(event:MouseEvent):void {
	ClGreen.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
	trace("Klick Grün");
}

Die herausgenommene Zeile Code, sollte doch dafür da sein, das der fade Stoppt, oder? Das tut der Script allerdings nicht. Ich denke es liegt daran das ich einen EventListener erstelle sobald ich klicke, diesen aber nicht mehr entferne.
Jedoch greift der ClGreen-Listener ja auf den enterFrameHandler zu (mit der Zeile welche für das stoppen des fadings zuständig sein sollte?) :confused:

Denke ich mir das ganz falsch? Kann mir das vielleicht jemand erklären?


thx
Gruß,
green
 
Moin,

der listener ist jetzt auf CIGreen registriert, also muß er darüber auch wieder entferrnt werden:

if (step == maxstep) {e.target.removeEventListener(Event.ENTER_FRAME, enterFrameHandler); step = 0;}
 

Neue Beiträge

Zurück