• 締切済み

matter.jsのテクスチャーについての質問

matter.jsを学び始め、 matter.jsの基本的な機能を使ったサンプル集 https://mmsrtech.com/entry/2022/10/16/210254 このサイトのサンプルを参考にさせていただき、勉強しています。 サンプルの中の オブジェクトの表示切り替え、削除、総数のカウント のコードを触りながらいろいろ試しています。 サンプルの2か所を変更して、クリックで生成される円の半径を15に固定して、テクスチャーを張ろうとしてるのですが、テクスチャーが貼れません。何も反応しなくなります。どのようにすれば、テクスチャーが貼れますか? // 使用モジュール const Engine = Matter.Engine, Render = Matter.Render, Runner = Matter.Runner, Body = Matter.Body, Bodies = Matter.Bodies, Composite = Matter.Composite, Composites = Matter.Composites, Vector = Matter.Vector, Constraint = Matter.Constraint, MouseConstraint = Matter.MouseConstraint, Mouse = Matter.Mouse, Events = Matter.Events; // エンジンの生成 const engine = Engine.create(); // 物理演算canvasを挿入する要素 const canvas = $('#canvas-area')[0]; // レンダリングの設定 const render = Render.create({ element: canvas, engine: engine, options: { width: 800, height: 600, } }); // マウス、マウス制約を生成 const mouse = Mouse.create(canvas); const mouseConstraint = MouseConstraint.create(engine, { mouse: mouse, constraint: { render: { visible: false } } }) Composite.add(engine.world, mouseConstraint) render.mouse = mouse // レンダリングを実行 Render.run(render); // エンジンを実行 Runner.run(engine); /** * 以下、各例毎に処理を記述する */ $('body').append('<p class="body-counter">Number of balls : <span></span></p>'); $('body').append('<button>Clear</button>'); // ボール用Compositeを生成する【⑬】 const ballComposite = Composite.create(); Composite.add(engine.world, ballComposite); // 静止オブジェクト(空中の床と画面外落下判定オブジェクト)【⑭】 const floor = Bodies.rectangle(400, 400, 500, 30, { isStatic: true }); const pit = Bodies.rectangle(400, 900, 50000, 30, { isStatic: true, label: 'pit' }); Composite.add(engine.world, [floor, pit]); // クリックした位置に円を生成とballCompositeへの追加 Events.on(mouseConstraint, 'mousedown', e => { // ドラッグ中は生成しない if (mouseConstraint.body) { return } // 半径はランダム(10〜30) //const min = 10; //const max = 30; //ここを変更/////////////////////////////////////////////////////////////// const radius = 15; ///////////////////////////////////////////////////////////////////////////// const ball = Bodies.circle( e.mouse.position.x, e.mouse.position.y, radius, { restitution: 0.5 }, //ここを変更//////////////////////////////////////////////////////////// render: { sprite: { texture: 'img/ball.png'}} ////////////////////////////////////////////////////////////////////////// ); Composite.add(ballComposite, ball); }); // Engineモジュールに対するイベント/衝突の発生を検知する【⑮】 Events.on(engine, 'collisionStart', e => { $.each(e.pairs, (i, pair) => { // 画面外落下判定オブジェクトに衝突したボールを削除する if (pair.bodyA.label === 'pit') { Composite.remove(ballComposite, pair.bodyB); } }) }); // Compositeへのオブジェクト追加を検知してボール総数の表示を更新する【⑯】 Events.on(ballComposite, 'afterAdd', e => { // Eventオブジェクトを直接参照してCompositeに含まれる全bodyを取得 $('p.body-counter span').text(e.source.bodies.length); }); // Compositeからのオブジェクト削除を検知してボール総数の表示を更新する【⑯】 Events.on(ballComposite, 'afterRemove', () => { // Composite#allBodies()を利用してCompositeに含まれる全bodyを取得 $('p.body-counter span').text(Composite.allBodies(ballComposite).length); }); $('button').on('click', () => { // ボールを一括削除する【⑰】 Composite.clear(ballComposite); $('p.body-counter span').text(0); })

  • dkong
  • お礼率86% (170/197)

みんなの回答

回答No.1

テクスチャーを貼るためには、以下の手順を実行する必要があります。 1. 'img/ball.png'にテクスチャーファイルが存在していることを確認してください。ファイルのパスが正しいかどうか確認してください。 2. `Bodies.circle`の引数の`render`オブジェクトの`sprite`プロパティ内にテクスチャーの情報を記述します。以下のように書き換えてください。 ```javascript const ball = Bodies.circle( e.mouse.position.x, e.mouse.position.y, radius, { restitution: 0.5, render: { sprite: { texture: 'img/ball.png' }} } ); ``` テクスチャーを正しく読み込んだ場合、円が生成される際にテクスチャーが貼られます。 これにより、テクスチャーが正常に貼られるはずです。お試しください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A

  • matter.jsについて教えてください。

    いろいろなサイトのサンプルコードを参考にさせていただきながら、matter.jsを使って物理エンジンでの表現を勉強してます。なんとか、10個のボールを生成し、そのボールを掴んで移動するところまではできました。ボールを掴んで移動させるのではなく、10個を区別して、どのボールをタッチしたのかを表示させていのですが、どのようにすればよいでしょうか? <!doctype html> <html> <head> <meta charset="utf-8"> <title>matter.js demo</title> <script src="matter.js"></script> </head> <body> <div id="matter"></div> <script> const engWidth = 680; const engHeight = 400; const wall = 10; const ball = 20; var ballSize = 20; var objs = []; var engine = Matter.Engine.create(document.getElementById("matter"), { render: { options: { wireframes: false, width: engWidth, height: engHeight, background: "rgba(0, 0, 0, 1)" } } }); objs.push(Matter.Bodies.rectangle(engWidth/2, wall/2, engWidth, wall, {isStatic: true})); objs.push(Matter.Bodies.rectangle(engWidth-wall/2, engHeight/2, wall, engHeight, {isStatic: true})); objs.push(Matter.Bodies.rectangle(engWidth/2, engHeight-wall/2, engWidth, wall, {isStatic: true})); objs.push(Matter.Bodies.rectangle(wall/2, engHeight/2, wall, engHeight, {isStatic: true})); for (var i = 0; i < ball; i++) { var x = Math.random()*engWidth; var y = Math.random()*engHeight; objs.push(Matter.Bodies.circle(x, y, ballSize, { render:{ fillStyle: "#FFFFFF"} })); } Matter.World.add(engine.world, objs); var MouseConstraint = Matter.MouseConstraint; var mousedrag = MouseConstraint.create(engine, { element: document.getElementById("matter").childNodes[0], }); Matter.World.add(engine.world, mousedrag); Matter.Engine.run(engine); </script> </body> </html>

  • matter.jsのイベントについて教えてください

    いろいろなサイトのサンプルコードを参考にさせていただきながら、matter.jsを使って物理エンジンでの表現を勉強してます。なんとか、20個のボールを生成し、それぞれにラベルで番号をふりました。そのボそのボールをクリックして、どのボールをタッチしたのかをalertで表示させようとしているのですが、以下のコードでうまくいきません。どのようにすればよいでしょうか? <!doctype html> <html> <head> <meta charset="utf-8"> <title>matter.js demo</title> <script src="matter.js"></script> </head> <body> <div id="matter"></div> <script> const engWidth = 680; const engHeight = 400; const wall = 10; const ball = 20; var ballSize = 20; var objs = []; var engine = Matter.Engine.create(document.getElementById("matter"), { render: { options: { wireframes: false, width: engWidth, height: engHeight, background: "rgba(0, 0, 0, 1)" } } }); objs.push(Matter.Bodies.rectangle(engWidth/2, wall/2, engWidth, wall, {isStatic: true})); objs.push(Matter.Bodies.rectangle(engWidth-wall/2, engHeight/2, wall, engHeight, {isStatic: true})); objs.push(Matter.Bodies.rectangle(engWidth/2, engHeight-wall/2, engWidth, wall, {isStatic: true})); objs.push(Matter.Bodies.rectangle(wall/2, engHeight/2, wall, engHeight, {isStatic: true})); for (var i = 0; i < ball; i++) { var x = Math.random()*engWidth; var y = Math.random()*engHeight; // ボールに番号のラベルをつける objs.push(Matter.Bodies.circle(x, y, ballSize, { label: i, render:{ fillStyle: "#FFFFFF", } })); } Matter.World.add(engine.world, objs); var MouseConstraint = Matter.MouseConstraint; // マウスドラッグではなく、マウスクリックのイベントを設定する var mouseclick = MouseConstraint.create(engine, { element: document.getElementById("matter").childNodes[0], constraint: { stiffness: 0.2, render: { visible: false } } }); Matter.World.add(engine.world, mouseclick); // マウスクリックしたボールの番号をalertで表示する Matter.Events.on(mouseclick, 'mousedown', function(e) { alert("You clicked on ball number " + e.body.label); }); Matter.Engine.run(engine); </script> </body> </html>

  • スライダーでオブジェクト変数の値を変更するには?

    JavaScript スライダーでオブジェクト変数の値を変更するには? <div id="wrap"> <div class="target">○</div> <div class="target">○</div> <div class="target">○</div> </div> <div>delay : <input type="range" id="delay_slider" min="0" max="100" value="0" step="10"> <span id="delay_slider_span">0</span> </div> <script> //全ての対象要素を取得して配列に変換 const targets = Array.from(document.querySelectorAll('#wrap .target')); const animations = []; //生成アニメーションの格納配列 //取得した要素にアニメーションを設定 targets.forEach((target, i) => { const animation = target.animate( [ { transform: 'translateX(0px)'}, { transform: 'translateX(60px)'}, ], { duration: 500, fill: 'forwards', delay: 0, endDelay: 0 } ); animation.cancel(); animations.push(animation); }); </script> スライダー要素を動かして、 オブジェクト変数の値「delay」を変更するためには どういうコードで実現できますか? くわしい方のお力添えをお待ちしております。

  • actionscript3.0 オブジェクトの動的生成

    actionscript3.0についての質問です。 イラストレーターのテキストツールのように 任意の文字オブジェクトを複数生成し、生成された任意の文字オブジェクト をドラッグで移動する処理をactionScriptで実行したいと考えています。 現在actionscript3.0で行いたいと考えている一連の流れは以下の通りです。 1.ステージに配置したテキストフィールに任意の文字列を入力 2.入力された文字列を参照してムービークリップ内のダイナミックテキストに出力。 3.ステージにボタンを配置し、それを押すことでステージに1.2の手順によって作成されたムービークリップが生成。 4.生成されたムービークリップをドラッグすると動かすことができる。 1から3までの内容を下記のようなスクリプトで行いました。 //ダイナミックテキストを内包するためのムービークリップを定義 //埋め込みアセットクラスmcからインスタンスを生成 var word_mc:MovieClip = new mc( ); //ボタンクリックイベントを登録 create_btn.addEventListener( MouseEvent.Click, creClick ); //ボタンクリック時の処理 function creClick( evt:MouseEvent ):void { //テキストフィールドinputWordに入力されたテキストを変数inputに格納 var input:String = inputWord.text; //word_mc内に配置したダイナミックテキストoutputWordに入力テキスト内容を出力 word_mc.outputword.text = input; //word_mcを画面に表示 addChild( word_mc ); } //word_mcをドラッグで移動させるためのスクリプト word_mc.addEventListener( MouseEvent.MOUSE_OVER, wordMO ); function wordMO( evt:MouseEvent ):void { word_mc.addEventListener( MouseEvent.MOUSE_DOWN, wordMD ); word_mc.addEventListener( MouseEvent.MOUSE_UP, wordMU ); } function wordMD( evt:MouseEvent ):void { word_mc.startDrag( ); } function wordMU( evt:MouseEvent ):void { word_mc.stopDrag( ); } ひとつのオブジェクトを生成するだけならこれで問題ないのですが、 このスクリプトでは、、"車"、"自転車"、"飛行機"という文字列をそれぞれ内包した変数名もしくはクラス名の違うオブジェクトを生成することが できません。 埋め込みアセットクラスをあらかじめ複数作っておいて、クラス名を 連番で名づけ、クラス名から動的にオブジェクトを生成すれば 内容の異なるオブジェクトを生成することは可能ですが、 単語を追加するたびに埋め込みアセットクラスを作成しなければ ならない上、変数名は同じなため、個々のオブジェクトをマウスドラッグすることができません。 イラストレーターのテキストツールのように 任意の文字列を生成した後、個々にマウスドラッグできようにするには どうしたら良いのでしょうか。 どうかご指導のほど、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • テクスチャについて質問です。

    絵を描いて、読み込んで、フォトショップで画像の質感を画用紙のような感じにしたいのですが、テクスチャはどのように作成したらいいのでしょうか? 和紙とは少し違います。 よろしくお願いします。

  • テクスチャーについて質問です。

     油絵を勉強中です。 好きな画家(モディリアーニ、ルフィーノタマヨ)の絵を見ていると、絵をはがしたりして(?)キャンバスの目が見えてたりするものがあったりします。 キャンバスの粗い目のものを使っているのですが、膠張りしてあるものを買ったせいかきれいにはがせません。 膠もやはり自分で塗ったりしてからやるものなのでしょうか。 膠は絶対塗ってからやるものなのでしょうか。 それと最初に下地を塗るかと思うのですが、普通のもの(ジェッソなど)を塗ってしまうとキャンバスにくっついてしまい(あたりまえなのですが)はがしたりするのはかなり力がいるし無理な気がしてます。 独特の下地作りが必要なのでしょうか。それとも剥がしたりしやすい何か特別な下地のようなものがあるのでしょうか。 それとホワイト(?)でかなり筆跡を残しながら厚めに塗ってから上に薄い色を塗って下のホワイト(?)のテクスチャーを見せているような作品があったりするのですが(うまく説明できないですが、、、)これはホワイト、、なのでしょうか。ホワイトと言ってもいろんな種類がありますし、ジェッソなのかホワイト(チタニウムホワイトとか)なのかよくわかりません。 うまく表現できていないのですが、テクスチャーについて何かご存知の方がいらっしゃったら是非教えて下さい。 またテクスチャー作りに何か参考になるような本などご存知でしたら教えて下さい。

  • node-qrcodeのQRコードを画像で取得

    以前QRcode.jsで出力したQRコードを画像で取得する方法を教えてもらいましたが・・https://okwave.jp/qa/q100 今回は下記のようなnode-qrcodeを使った場合どうすれば出来るかお教えください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/qrcode@1.4.4/build/qrcode.min.js"></script> <script> document.addEventListener("DOMContentLoaded", () => { let info = "ひらがなQRサンプル" ; const options = { width: 128, height: 128, color: { dark: "#000000", // QRコードの自体 light: "#ffffff", // QRコードの背景 }, }; QRCode.toDataURL(info, options) .then((url) => { document.getElementById("qrcode").src = url; }) .catch((err) => { console.error(err); }); }); </script> </head> <body> <img id="qrcode" alt="QRコード" /> </body> </html> 前回のように 「QRコードを生成しているスクリプトの後ろに var canv = document.getElementsByTagName("canvas"); var image = canv[0].toDataURL("image/jpeg", 0.75 ); と書き足せば image 変数の中にJPEGデータが生成されます。」 では駄目でした。 よろしくお願いいたします。

  • メンバ関数の引数としてオブジェクトの配列をとれる?

    VC++6.0 on W2Kを使っている初心者です。 表題のとおりですが、具体的なプログラムは下のようです。 また、*部分に相当するところもエラーになるのですが、 どのように変えればよいのでしょうか? なお、プログラムの内容そのものには意味はなく 単に動作確認のためのサンプルです。 実行すると、 「How many cats do you create?」 と聞かれるので、数字を入力すると、 Nekoオブジェクトが生成され、i番目の猫にはiという名が付けられます。 そして、「何匹目を鳴かせますか?」と聞かれるので、 数字を入力すると、 「My name is i-th cat.」 と答えられ、さらに、Inuが、 「i-th cat is tasty.」 と答える、という内容になっています。 #include <iostream> #include <string> using namespace std; class Neko { int name; public: Neko(){} Neko(int n):name(n){} void setname(int n){name=n;} int getname(){return name;} void naku(int n) const; }; void Neko::naku(int i) const { cout <<"My name is "<<getname()<<"th cat."<<endl;・・・* } class Inu { public: Inu(){} void naku(int i) const; }; void Inu::naku(int i)const{ cout <<i<<"th cat is tasty."<<endl; } int main() { int i; int num; int temp; Neko *x; Inu y; cout <<"How many cats do you create?"<<endl; cin >>num; x=new Neko[num]; for(i=0;i<num;i++){ x[i].setname(i); } cout <<"何匹目を鳴かせますか?"<<endl; cin >> temp; x[temp].naku(); y.naku(temp); }

  • テクスチャー

    本を読んでいたら、食品のテクスチャーという言葉が出てきました。わからないにのでインターネットで調べてみたのですがよくわかりませんでした。食品のテクスチャーとは何ですか?わかる人は詳しく教えてください!!お願いします。

  • テクスチュアとは?

    音楽用語で使用するテクスチュアとはどのような意味ですか?