質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

0回答

1803閲覧

PixiJSで1枚の画像をバラバラのオブジェクトにして個別にアニメーションさせたい。

the_zombis

総合スコア0

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

1クリップ

投稿2020/06/23 08:12

前提・実現したいこと

画像をcanvasに描画してクリックしたら画像がバラバラに落ちていくようなことをいたいと思っています。
canvasでは実現できてますが、処理が重くいろいろ調べてたらPixiJSというライブラリを知りました。

canvasのdrawimageのように画像のコピーする範囲をずらして配列に保存してアニメーションさせたいのですが、PixiJSでは1枚の画像をバラバラのオブジェクト?にしてアニメーションさせるのか方法が分かりません。

canvasで試したこと

同じような処理をCanvasのみで実現しました。画像の大きさを15px * 15px ごとに細切れにしてcanvasにdrawimageしてる感じです。

javascript

1var imgw = 15; 2var imgh = 15; 3var img_original = new Image(); 4img_original.src = "画像のパス"; 5 6var canvas = document.getElementById("canvas"); 7var ctx = canvas.getContext("2d"); 8 9var cntW = img_original.width / imgw; 10var cntH = img_original.height / imgh; 11var max_speed = 6; 12var min_speed = 2; 13var imgLen = 0; 14var timer=null; 15 16//画像コピーする 17copyimage(); 18 19canvas.addEventListener("click",function() { 20 testTimer = setInterval(particleFunc, 10); 21}); 22 23//画像をcanvasにコピーする 24 function copyimage() { 25 for (var i = 0; i < cntH; i++) { 26 for (var j = 0; j < cntW; j++) { 27 //イメージを細切れにして全体をきれいに描画する 28 ctx.drawImage( 29 img_original, 30 j * imgw, 31 i * imgh, 32 imgw, 33 imgh, 34 j * imgw, 35 i * imgh, 36 imgw, 37 imgh 38 ); 39 40 imgPos.push({ 41 xpos: j * imgw, 42 ypos: i * imgh, 43 initx: j * imgw, 44 inity: i * imgh, 45 angle: Math.random() * 360, 46 speed: Math.random() * (max_speed - min_speed) + min_speed 47 }); 48 } 49 } 50 51 } 52 53//パーティクルアニメーション 54 var idx = 0; 55 var cos = 0; 56 var sin = 0; 57 var rad = Math.PI / 180; 58 var angleAdd = 2; 59 60 function particleFunc() { 61 //ctx.scale(0.25, 0.25); 62 ctx.clearRect(0, 0, canW, canH); 63 64 for (var i = 0; i < imgPos.length; i++) { 65 imgPos[i].ypos += imgPos[i].speed; 66 imgPos[i].angle += Math.random() * angleAdd; 67 cos = Math.cos(imgPos[i].angle * rad); 68 sin = Math.sin(imgPos[i].angle * rad); 69 70 ctx.setTransform(sin, cos, cos, sin, imgPos[i].xpos, imgPos[i].ypos); 71 72 ctx.drawImage( 73 img_original, 74 imgPos[i].initx, 75 imgPos[i].inity, 76 imgw, 77 imgh, 78 0, 79 0, 80 imgw, 81 imgh 82 ); 83 //これを設定しないとばグル 84 ctx.setTransform(1, 0, 0, 1, 0, 0); 85 86 } 87 }

PixiJSのソースコード

javascript

1 2var imgw = 10; 3var imgh = 10; 4var cntW = 600; 5var cntH = 600; 6 7const app = new PIXI.Application(cntW, cntH) 8document.body.appendChild(app.view) 9 10// 画像を読み込み、テクスチャにする 11let imageTexture = new PIXI.Texture.from('画像のパス'); 12// 読み込んだテクスチャから、スプライトを生成する 13let sprite = new PIXI.Sprite(imageTexture); 14 15 16sprite.anchor.x = 0.5; 17sprite.anchor.y = 0.5; 18sprite.scale.x=0.5; 19sprite.scale.y=0.5; 20 21sprite.x = app.screen.width / 2; // ビューの幅 / 2 = x中央 22sprite.y = app.screen.height / 2; // ビューの高さ / 2 = y中央 23// 表示領域に追加する 24app.stage.addChild(sprite); 25app.ticker.add(delta => { 26 27})

試したこと

とりあえず元画像を読み込んでSpriteでstage上に追加することはできましたが、この画像を読みこんだ画像をcanvasのようにバラバラにするにはどうしたらいいのか分かりません。

読みこんだ画像をコピーする範囲を指定するようなメソッドがあれば、for文で同じようなことが出来そうな気がします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問