• 締切済み

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>

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

みんなの回答

回答No.1

このような場合、以下のようにコードを修正することでボールをクリックしたときに番号を表示することができます。 1. コードの冒頭で、`ballSize`の値を`20`から`10`に変更してください。 2. `Matter.World.add(engine.world, objs);`の行の下に、以下のコードを追加してください。 ```javascript Matter.Events.on(engine, 'tick', function() { objs.forEach(function(obj) { obj.render.fillStyle = '#FFFFFF'; }); }); Matter.Events.on(mouseclick, 'mousedown', function(e) { alert("You clicked on ball number " + e.body.label); e.body.render.fillStyle = '#FF0000'; }); ``` これで、ボールをクリックしたときに番号が表示されるだけでなく、クリックしたボールの色が赤色に変わるようになります。ご参考までに修正後のコード全体を以下に示します。 ```html <!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 = 10; 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(engine, 'tick', function() { objs.forEach(function(obj) { obj.render.fillStyle = '#FFFFFF'; }); }); Matter.Events.on(mouseclick, 'mousedown', function(e) { alert("You clicked on ball number " + e.body.label); e.body.render.fillStyle = '#FF0000'; }); Matter.Engine.run(engine); </script> </body> </html> ``` ご質問があればお気軽にどうぞ。 ------ こちらの回答は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を学び始め、 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); })

  • このJavaScriptソースを解説して下さい

    JavaScript勉強中です。とあるサイトのソースの一部なのですが 何が書いてあるのかわかりません。 どなたか解説してください。 ----------ソースここから---------- <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-23877599-2']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> ----------ソースここまで---------- 全体的にわからないのですが、1行目だけでも教えてください。 var宣言で、論理和?(||)が使われてて、さらに配列?らしき括弧が続いてます。 これはなんという構文なのですか?

  • Google Analytics トラッキングコードについて

    Google Analytics トラッキングコードについて ホームページのhead部分にこのスクリプトを埋め込んでくださいとありますが、 外部のJavaScriptに埋め込む方法はないでしょうか?外部のファイルにコピペしてみたのですがトラッキングコードを認識できませんでした。 <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-18744062-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>

  • このソースはJavaScriptですか?

    Webサイトの作成のためにJavascriptやJQueryについて勉強しようと思っており、いろんなサイトを調べてみたら、次のようなソースが書かれていることが多いです。 var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-746118-2']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); たぶんJavaScriptかJQueryだと思いますが、これは一体どのような命令文なのでしょうか? このソースを多くのサイトで使っているのならば、私も試してみたいと思っております。初心者ですが、宜しくお願い致します!!

  • 以下のJAVASCRIPTが、動作しないのですが、その原因がわかりませ

    以下のJAVASCRIPTが、動作しないのですが、その原因がわかりません。助けてください <html> <head> <script type="text/javascript"> var x=200,y=100; var dx=10,dy=10; function move() { setTimeout("move()",100); var ball=document.getElementById("ball"); x+=dx; y+=dy; ball.style.left=x; ball.style.top=y; if (x<=50 || x+10>=450) dx=-dx; if (y<=50 || y+10>=450) dy=-dy; } </script> </head> <body onLoad="move()"> <img src="wall.png" style="position:absolute;left:46;top:46"> <img id="ball" src="ball.png" style="position:absolute;left:200;top:100"> </body> </html>

  • Ajaxで表示させると内容が不変

    下記Ajaxでtest.txtを表示できたのですが test.txtの内容を Hello Japan. 変えてもブラウザのキャッシュをクリアしない限り Hello World! が出つづけます。 下記ページにキャッシュ無効のヘッダをつけても同じです。 子の問題を解決する手段を教えてください。 test.txt: Hello World! x.html: <script> var xmlHttp; function loadText() {  if (window.XMLHttpRequest)  {   xmlHttp = new XMLHttpRequest();  }  else  {   if (window.ActiveXObject)   {    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   }   else   {    xmlHttp = null;   }  }  xmlHttp.onreadystatechange = checkStatus;  xmlHttp.open("GET","test.txt",true); xmlHttp.send(null); } function checkStatus() { if (xmlHttp.readyState==4&&xmlHttp.status==200) { var node = document.getElementById("disp"); node.innerHTML = xmlHttp.responseText; } } </script> <form> <input type="button" value="push" onClick="loadText()"> </form> <div id="disp"></div>

  • chart.js4.2でカラー設定をする方法

    過去にこのサイトでchart.js2.9を使い複数グラフを表示する方法(https://okwave.jp/qa/q9834370.html)を教えてもらいましが、今回v.4.2にそれを適用するにあたりプラグインのカラー設定に代わる方法がないかと試行を繰り返し、素人のため無理筋の方法ですが下記のコードまで至りました。そこで、このお粗末なコードを適切なものに手直ししていただきたくお願い申し上げます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;width:300px; height:250px" > <canvas id="myChart1"></canvas></div> <div class="chart2" style="float: right;width:300px; height:250px"> <canvas id="myChart2"></canvas></div> <div class="chart3" style="bottom: 0;float: left;width:300px; height:250px"> <canvas id="myChart3"></canvas></div> <div class="chart4" style="bottom: 0;float: right;width:300px; height:250px"> <canvas id="myChart4"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"></script> <script> function displayChart(canvasId, chartType, datasets, options) { var ctx = document.getElementById(canvasId); var myPieChart = new Chart(ctx, { type: chartType, data: { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // X軸のラベル datasets: datasets }, options: { plugins: { //responsive: false, title: { display: options.title.length > 0, // タイトルがあれば表示 text: options.title }, legend: { // 凡例 display: true, // 表示の有無 position: options.legendPosition, // 表示位置 labels: { usePointStyle: options.usePointStyle // 円の凡例スタイルを使うか } } } } }); } const color1 = ['red','green','skyblue']; const mycolor = ['rgb(221,160,221)','rgb(228,0,127)','rgb(160,216,239)','rgb(146,7,131)','rgb(0,153,68)','rgb(255, 215, 0)','rgb(0,158,150)']; const label1 = [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000],backgroundColor:mycolor}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000],backgroundColor:mycolor}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000],backgroundColor:mycolor} ]; const datasets = [ {label: label1[0].label,data: label1[0].data,backgroundColor:color1[0]}, {label: label1[1].label,data: label1[1].data,backgroundColor:color1[1]}, {label: label1[2].label,data: label1[2].data,backgroundColor:color1[2]} ]; displayChart('myChart1', 'bar', datasets,{ title: '', usePointStyle: false, legendPosition: 'top', }); for (var i = 0; i < 3; i++) { displayChart("myChart".concat(i + 2), 'pie', [label1[i]], { title: label1[i].label, backgroundColor:mycolor, usePointStyle: true, legendPosition: 'left' }); } </script> </body> </html> 特にbackgroundColorの設定をoptionで設定出来ないかと思いましたが方法が分かりませんでしたのでこのようなコードをに成り果てました。 また、カラースキーム組み合わせは別の手段を使って作りコピペしているのですがこれも貧弱なものですので、使えるプラグインがあればご教授お願いいたします。

  • 雑誌のスクリプトの意味がわかりせん2

    スクリプトと解らない点を載せさせていただきました。もしよければ教えて下さい。800字を超えないためにギュウギュウで記述しましたのでかなりややこしくなっていますが、お願いいたします。 ●MCの写りこみを作成するスクリプトです。引数に3つのMCを渡しています。 CreateReflect = function (OriginalTG, DisplayTG, MaskTG) { var OriginalBMP = new flash.display.BitmapData(OriginalTG._width, OriginalTG._height, true, 0); var DisplayBMP = OriginalBMP.clone(); //OriginalBMPと全く同じオブジェクトを新しくDisplayBMPとして作成? var MaskBMP = new flash.display.BitmapData(MaskTG._width, MaskTG._height, true, 0); OriginalBMP.draw(OriginalTG); MaskBMP.draw(MaskTG); DisplayTG.attachBitmap(DisplayBMP, 1); //ここが理解できなかったとこなのですが、これは完全に透明なビットマップを割り当てているって事ではないのでしょうか? var DisplayRectangle = new flash.geom.Rectangle(0, 0, MaskTG._width, MaskTG._height); var OffSetPoint = new flash.geom.Point(0, 0); var BasePoint = new flash.geom.Point(0, 0); //マスクを適用する際のサイズとxとyの値を設定するために定義してる? DisplayBMP.copyPixels(OriginalBMP, DisplayRectangle, OffSetPoint, MaskBMP, BasePoint, true); //これはビットマップオブジェクトのDsplayBMPにOriginalBMPをアルファーをかけた上体でコピーするって事だと思うのですが、この後にDisplayBMPをattachする必要はないのでしょうか?上記の方でDisplayTG.attachBitmap(DisplayBMP, 1);を定義してるから?とここらへんで解らなくなってしまいました。 //attachBitmapをした後にattach元のビットマップを変更すると自動的にattachされたムービークリップに反映されるという事でしょうか?};

    • ベストアンサー
    • Flash
  • CSS(スタイルシート)を切り替えるJavascriptについて

    CSS(スタイルシート)を切り替えるJavascriptについて 現在、表題のスクリプトサンプルに少し変更を加えたいと思い悩んでいます。 その内容ですが、サンプルでは切り替えるCSSの数だけボタンを配置する仕組みのようなのですが、当方では切り替えたいCSSが1種のため、ボタンもON/OFFのような単体にできればと思っています。 既存のラジオボタンやプルダウンメニューなどを使用した例はいくつか紹介されていましたが、できれば画像を用いたボタンで作りたいと考えています。 以下、サンプルからの抜粋となりますが、もしもご存知の方がいらっしゃいましたら回答いただけますと幸いです。 /* html */ <head> <link rel="stylesheet" type="text/css" href="/mode1.css" /> <link rel="alternate stylesheet" type="text/css" title="change" href="/mode2.css" /> </head> <body> <div class="mode"> <a href="javascript:selectMode('none')"><img alt="1" src="/mode1.gif" width="10" height="10" /></a> <a href="javascript:selectMode('change')"><img alt="2" src="/mode2.gif" width="10" height="10" /></a> </div> </body> ※ボタンに使用する画像は1種でも構いませんので、<a>タグをひとつにしてselectMode( )内の値をJavaの方で制御できないでしょうか? /* javascript */ function setMode(title) { var i, objs for(i=0; (objs=document.getElementsByTagName("link")[i]); i++) { if(objs.getAttribute("rel").indexOf("style") != -1 && objs.getAttribute("title")) { objs.disabled = true if(objs.getAttribute("title") == title) objs.disabled = false } } } function selectMode(styletitle){ if (document.getElementById){ setMode(styletitle) } } 言葉たらずの質問ですが、どうぞよろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう