Weiße Linien beim Skalieren

raybrackho

Mitglied
Hallo Leute,

ich habe folgendes Problem:

Bei mir wird ein Hintergrund aus Mosaiksteinen generiert.

Durch noBorder skaliert sich dieser über den ganzen Bildschirm.
Code:
Stage.scaleMode = "noBorder";

Alles soweit super.

Nun werden aber je nach Auflösung unter bestimmten Bedingungen zwischen meinen Mosaiken schmale weiße Linien sichtbar. Wenn ich näher ranzoome sind sie weg. Auch wenn ich das Flash-Player-Fenster in der Größe variiere, treten die Linien manchmal auf und manchmal nicht.

Code:
var btnB = 20;				// Breite der Box
var btnH = 20;				// Hoehe der Box
var u = 1600/btnB;			// Umbruch >> 1600 = Breite des Rahmens
var m1 = 1200/btnH;			// Abstand Hoehe >> 1200 Hoehe des Rahmens
var m = u*m1;			        // Menge der Boxen
	
var a = 0;					// Abstand der Boxen
var aIn = 15;				// Wert Einfaden
var aOut = 15;				// Wert Ausfaden
var z = .005				// Abstand des Intervals > in Sekunden


hintergrund = function () {
	_global.temp = [];
	_root.createEmptyMovieClip("clip", -16329);
	with (_root.clip) {
		_alpha = 99;
		_x = clip_xPos;
		_y = clip_yPos;
	}
	for (var i = 0; i<m; i++) {
		_root.clip.attachMovie("box", "box"+i, i);
		with (_root.clip["box"+i]) {
			_alpha = 0;
			_width = btnB;
			_height = btnH;
			_x = (i%u)*(btnB+a);
			_y = Math.floor(i/u)*(btnH+a);
		}
		temp.push("box"+i);
	}
};

Die einzige Möglichkeit die ich bisher gefunden habe, ist den Abstand der Boxen auf einen Minus-Wert zu setzen. Dann verschwinden die Linien, aber dadurch wird mein Hintergrund krumm und schief, weil die Berechnung dann nicht mehr hinhaut und die Mosaike nicht mehr korrekt untereinander liegen sondern immer leicht verschoben.

Weiß jemand eine Lösung?
 

Anhänge

Zuletzt bearbeitet:
Das sind Rundungsfehler. Probier mal, bei der Zuweisung der x- und y-Werte immer abzurunden und generell so viel wie möglich mit ganzen Zahlen zu rechnen.

Abrunden kannst du so: Math.round(meineVariable - 0.5);
 
Hey, danke schonmal für die Antwort.
Gibt es denn einen Unterschied zwischen
Code:
math.floor
und deiner Variante?

Ist aber auch egal, irgendwie krieg ich es nicht hin. Wenn ich die Werte runde dann krieg ich immernoch Linien, diesmal nur wahllos verteilt und nicht mehr im Raster.

Code:
macheMaske = function () {
	_global.temp = [];
	_root.createEmptyMovieClip("clip", -16329);
	with (_root.clip) {
		_alpha = 100;
		_x = clip_xPos;
		_y = clip_yPos;
	}
	for (var i = 0; i<m; i++) {
		_root.clip.attachMovie("box", "box"+i, i);
		with (_root.clip["box"+i]) {
			_width = btnB;
			_height = btnH;
			_x = Math.round((i%u)*(btnB+a) - 0.5);
			_y = Math.round(Math.floor(i/u)*(btnH+a) - 0.5);
		}
		temp.push("box"+i);
	}
};

Vielleicht hab ich es auch falsch angewandt?
Beim Y-Wert wurde ja bereits abgerundet.
 
Also ich komme leider nicht weiter, hat vielleicht noch jemand eine Idee?
Das ganze soll ein Bildschirmschoner werden und die Vorgabe ist, dass es nur eine Version für alle Auflösungen geben darf. Sonst würde ich einfach für jede Auflösung, 4:3 / 5:4 / 16:10 ein Version bauen.

Aber so verzweifle ich daran. Wie werde ich diese Rundungsfehler los?

Könnte man irgendwie die Mosaike um 0.1 Pixel überlappen und das ganze durch eine Größenveränderung der einzelnen Blöcke wieder auffangen? Problem ist, wenn ich die Größe Fix auf 20.1px stelle, dann verschiebt sich das ganze mosaik langsam.

Bitte um Hilfe!
 
Es lag wie gesagt an Rundungsfehlern, allerdings beim Skalieren von 50 auf 20 Pixel. Ich hab das ganze mal etwas angepasst, die Boxen sind jetzt 22 Pixel groß und liegen bei -1 in x und y, überlappen sich also in alle Richtungen um 1. Skaliert werden sie per AS nicht mehr.

Du solltest dir übrigens mal etwas neuere Flash-Syntax angewöhnen, diese hier ist ziemlich 2002.
 

Anhänge

Hey, ich muss dazu sagen, dass ich alles andere als ein Flash-Experte bin.
Zumal ich jetzt zwar sehe, dass etwas anders ist (Boxen = 22px etc) aber ich sehe nicht wo du das eingetragen hast?! Die X und Y Werte stehen bei mir immernoch auf 0 und die Größe der Boxen immernoch auf 20. Aber wenn ich die Szene teste ist es so wie du sagst.

Das Problem mit den weißen Linien ist so zwar behoben, ABER jetzt ist es leider kein perfektes Mosaik mehr. Man sieht teilweise Kästchen überlappen, was ja eigentlich nicht Sinn der Sache ist.

Meinst du es gibt noch eine andere Möglichkeit die Rundungsfehler rauszubekommen?
Du meintest doch evtl mit
Code:
math.round

Und was meintest du mit dem 50 auf 20 ? ist der MC mit der Box 50px groß und wird skaliert? Was wäre wenn ich den von Anfang an auf 20x20px festlege?

Danke schonmal für deine Mühen!
 
Wie gesagt - Rundungsfehler. Du könntest mal versuchen, keine MovieClips zu instanzieren sondern das Ganze auf die Bühne zu malen. Da wird kein AA verwendet und es sollte nicht zu den Fehlern kommen. Das wird aber auch ungleich viel komplizierter.

Mir ist leider kein Weg bekannt, um Anti Aliasing bei Movieclips auszustellen. Aber das wird wohl das sein, wofür du einen Weg finden musst.

Oder, praktischer: du drehst das Ganze um. Mach den Hintergrund so grün/gelb und blende nach und nach weiße Quadrate ein. Die paar andersfarbigen kannst du ja irgendwie intelligent speichern und automatisch anders einfärben. Für den zurück-Effekt löschst du dann die weißen Quadrate.
 
Puhh, ich seh schon. Für mich als Flash Laien wird das wohl nicht so einfach umzusetzen sein. Deshalb werde ich jetzt doch verschiedene Versionen bauen, je nach Auflösung.

Danke dir trotzdem für deine Mühen.

Nun bin ich auf ein anderes kurioses Problem gestoßen. Je nach Flash Player Version scheint mein Clip mehr oder weniger schnell abzulaufen, was dazu führt, dass der Aufbau der Mosaike bereits wieder beginnt, obwohl er noch garnicht ganz abgeschlossen ist.

Wenn ich den Clip als Film teste innerhalb von Flash läuft alles wie es soll, die Timings stimmen.
Veröffentliche ich das ganze un und schaue es mit v10.1 an, dann tritt oben beschriebenes Problem auf. Schaue ich den FIlm mit v10.0, dann sind die Zeiten zu lang, also das Mosaik ist schon längst fertig, bleibt dann aber bestimmt 15 Sekunden stehen und baut sich erst dann wieder auf.

Ich bin wirklich am Ende mit meinem Latein.
 
Zurück