スマホ(android,ios)+WEBブラウザ(IE,Chrome,Firefox)全部で動くアニメーションを作る方法

mixiアプリスマホ+PC版で同じソースを使って
アニメーションを描画できないか調査しました。

GREEなどのアプリを見ると、AndroidFlashで、iOSではSVGなどで表示しているものも
多くあるようです。
ただ、個人でアプリを作る場合など、
なるべく工数や変換に掛かるコストを減らしたいものです。

下記、5種類のなかで、今回採用したのは5)です。
簡単なソースを貼り付けたのでこれを元に
開発をしていこうと思います。

1)GoogleSwiffyを使ってFlash->SVG変換

http://www.google.com/doubleclick/studio/swiffy/

SVGを使うのでandroidで再生できず
android×
ios
IE,Chrome,Firefox

2)Flashを使う


iosじゃ無理
android
ios×
IE,Chrome,Firefox

3)アニメーションGIF


重い
android
ios
IE,Chrome,Firefox

4)ユーザーエージェントでFlashSVGを切替

工数かかる...

<?php
function return_useragent_code(){
$isiPhone = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPhone');
$isiPod = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPod');
$isiPad = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPad');
$isAndroid = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'Android');
if($isiPad){return 1;}
else if($isiPod){return 2;}
else if($isiPhone){return 3;}
else if($isAndroid){return 4;}
else{return 5;}
}
?>

5)純粋なhtml5のみで描き、IEexcanvas.jsで動かす


全部動く!excanvas.jsは動かない関数もあることに注意。

5-1)・動的にcanvasを使用している場合。->getElementByIdで取得している場合は問題ない。

http://d.hatena.ne.jp/uupaa/20080723/1216748383

5-2)uupaa-excanvas.jsとExplorerCanvasで微妙に対応している関数が違う
uupaa-excanvas.js
未実装: MaxWidth, strokeText(in Silverlight)
制限あり: createLinearGradient, createRadialGradient, clip, drawImage, globalCompositeOperation, shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY

ExplorerCanvas
未実装: clip, createPattern, createRadialGradient, globalCompositeOperation, テキストAPI(strokeText, fillText, measureText, textAlign等), Shadow API(shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY)
制限あり: drawImage, fillStyle, strokeStyle, clearRect, drawImage + 移動/変形
5-3)onloadが実行されない様子なので外したら動いた
img_1.src = "/jpg/test1.png";
//img_1.onload = function(){
ctx.drawImage(img_1,initEnemy.x,initEnemy.y);
//}

6)サンプルコード


6-1)画像を用意


6-2)動かし方を考える


6-3)ソース

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<!--[if IE]><script type="text/javascript" src="./excanvas_r3/excanvas.compiled.js"></script><![endif]--> 
<title>canvas test</title> 
</head>
<style type="text/css">
<!--
canvas#testCanvas{
display:block;
margin:0 auto;
margin-top:0;
margin-left:0;
}
-->
</style>
<body>
<div style="text-align:center;"> 
<canvas id="testCanvas" width="320" height="320" style="border:0px solid #CCC;"></canvas> 
</div> 
<script type="text/javascript"> 
//制御
var timerID;
var cW=320;
var cH=320;
var back_X=0;
var back_Y=0;
var human_X=-50;
var human_Y=0;
window.onload = function(){
setTimer();
}
//フレームレート
function setTimer(){
clearInterval(timerID);
timerID = setInterval("setMove()", 100);
}
//制御
function setMove(){
back_Y-=50;
human_X+=2;
draw();
}
var i=0;
//描画
function draw(){
//Canvas
var canvas=document.getElementById('testCanvas');
if (!canvas||!canvas.getContext) return false;
var ctx = canvas.getContext('2d');
//refresh
ctx.clearRect(0,0,cW,cH);
//images
back_img = new Image();
back_img.src = "/jpg/back.png";
human_img = new Image();
human_img.src = "/jpg/human.png";
char_img = new Image();
char_img.src = "/jpg/char.png";
ctx.drawImage(back_img, back_X, back_Y);
ctx.drawImage(human_img, human_X, human_Y);
i+=1;
if(i%5==0){
ctx.drawImage(char_img, 0, 100);
}
}
</script> 
</body> 
</html>