From: Larry D. <ld...@cf...> - 2009-10-11 02:25:18
|
Here is an example of animated text which worked in 0.3Beta. The functions used in the script are extracted from a larger library I am (was) building. I apologize for the lack of code comments, but I removed them for this email. The method I developed for this script is an approximation of how I viewed it being done in Adobe Flash: create a text string, break it up into individual shapes, then animate those shape by easing their positions. ====================== <?php function spread_objects($count, $width, $height, $mode=0) { for ($i=0; $i<$count; $i++) { switch ($i) { case 1 : case 3 : case 5 : $xsign = 1; break; case 7 : case 9 : $xsign = -1; break; case 0 : case 2 : case 4 : $ysign = 1; break; case 6 : case 8 : $ysign = -1; break; } switch ($mode) { case 0 : // Place objects at the bottom $xy[$i]['x'] = rand(1, $width); $xy[$i]['y'] = rand($height, $height+10); break; case 1 : // Place objects at right $xy[$i]['x'] = rand($width, $width+10); $xy[$i]['y'] = rand(1, $height); break; case 2 : // Place objects at top $xy[$i]['x'] = rand(1, $width); $xy[$i]['y'] = -rand(1, $height); break; case 3 : // Place objects at left $xy[$i]['x'] = -rand(1, $width); $xy[$i]['y'] = rand(1, $height); break; case 4 : // Distribute around the frame $xy[$i]['x'] = rand(1, $width) * $xsign; $xy[$i]['y'] = rand(1, $height) * $ysign; break; } } return $xy; } function breakApart($string, $font, $color, $scale, $border, $bordercolor=0) { for ($i=0; $i<strlen($string); $i++) { $glyph = new SWFShape(); list($r, $g, $b) = hex2rgb($color); $glyph->setRightFill($r, $g, $b); if ($border > 0) { list($r, $g, $b) = hex2rgb($bordercolor); $glyph->setLine($border, $r, $g, $b); } else { $border = 0; } $glyph->drawGlyph($font, $string[$i]); $w = $font->getWidth($string[$i]) * $scale; $shapes[$i]['clip'] = new SWFSprite(); $shapes[$i]['glyph'] = $shapes[$i]['clip']->add($glyph); $shapes[$i]['glyph']->scaleTo($scale); $shapes[$i]['width'] = $w + $border; } return $shapes; } function hex2rgb($c) { if (!$c) return false; $c = trim($c); $out = false; if (eregi("^[0-9ABCDEFabcdef\#]+$", $c)) { $c = str_replace('#','', $c); $l = strlen($c); if ($l == 3) { unset($out); $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0, 1)); $out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 1, 1)); $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 2, 1)); $out[3] = $out['a'] = $out['alpha'] = 0; } elseif ($l == 6) { unset($out); $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0, 2)); $out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 2, 2)); $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 4, 2)); $out[3] = $out['a'] = $out['alpha'] = 0; } elseif ($l == 8) { unset($out); $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0, 2)); $out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 2, 2)); $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 4, 2)); $out[3] = $out['a'] = $out['alpha'] = hexdec(substr($c, 6, 2)); } else $out = false; } return $out; } function moveObject($clip, $object, $start_x, $start_y, $stop_x, $stop_y, $duration, $use_time=false) { global $swfRate; if ($use_time) { $duration *= $swfRate; } $inc_x = ($stop_x - $start_x); $inc_y = ($stop_y - $start_y); for ($i=1; $i<=$duration; $i++) { $x = easeLinear($i, $start_x, $inc_x, $duration); $y = easeLinear($i, $start_y, $inc_y, $duration); $object->moveTo($x, $y); $clip->nextFrame(); } } function easeLinear($t, $b, $c, $d) { return $c * $t / $d + $b; } function skip_frames($n, $parent=0) { global $stage; if ($parent == 0) $parent = $stage; for ($i=0; $i<$n; $i++) { $parent->nextFrame(); } } $swfWidth = 550; $swfHeight = 400; $stage = new SWFMovie(7); $stage->setDimension($swfWidth, $swfHeight); $stage->setBackground(0xCC, 0xCC, 0xCC); $myFont = new SWFFont("fdb/Impact.fdb"); $myString = "Ming Lives!"; $scale = 0.5; $myShapes = breakApart($myString, $myFont, "0000ff", $scale, 0, "ff0000"); $totalWidth = 0; for ($i=0; $i<count($myShapes); $i++) { $totalWidth += $myShapes[$i]['width']; } for ($mode=0; $mode<5; $mode++) { $xy = spread_objects(count($myShapes), $swfWidth, $swfHeight, $mode); $stop_x = $swfWidth/2 - $totalWidth/2; for ($i=0; $i<count($myShapes); $i++) { moveObject($myShapes[$i]['clip'], $myShapes[$i]['glyph'], $xy[$i]['x'], $xy[$i]['y'], $stop_x, 200, 24); $stop_x += $myShapes[$i]['width']; skip_frames(15, $myShapes[$i]['clip']); $stage->add($myShapes[$i]['clip']); } } $stage->save($outswf="test.swf",9); $ftmp=fopen($outswf,"r"); $stmp=fread($ftmp,filesize($outswf)); $ftmp=fopen($outswf,"w"); fwrite($ftmp,substr_replace($stmp,chr(8),3,1)); header('Content-type: application/x-shockwave-flash'); $stage->output(); ?> ====================== I would like to get this working in 0.4.2. I do not relish the thought of moving to text fields, but it looks like it cannot be avoided. Larry strk wrote: > On Fri, Oct 09, 2009 at 11:46:45AM -0400, Larry Dunbar wrote: > > >> animated. With ming 0.3 this is was easily accomplished using a >> combination of SWFFont, SWFText, and SWFShape methods. This seems nearly >> impossible now that SWFText and SWFShape no longer support >> SWFBrowserFont fonts. >> > > Could you show the ming-0.3 code producing what you are looking for ? > Do you have funding to help fixing the regression ? > > --strk; > > Free GIS & Flash consultant/developer () ASCII Ribbon Campaign > http://foo.keybit.net/~strk/services.html /\ Keep it simple! > > |