{"id":7027,"date":"2019-03-26T19:03:51","date_gmt":"2019-03-26T12:03:51","guid":{"rendered":"http:\/\/binus.ac.id\/knowledge\/?p=7027"},"modified":"2020-01-10T14:12:55","modified_gmt":"2020-01-10T07:12:55","slug":"membuat-interactive-movie-bagian-ke-2","status":"publish","type":"post","link":"https:\/\/binus.ac.id\/knowledge\/2019\/03\/membuat-interactive-movie-bagian-ke-2\/","title":{"rendered":"Membuat Interactive Movie Bagian ke-2"},"content":{"rendered":"<p>Melanjutkan dari artikel <a href=\"http:\/\/binus.ac.id\/knowledge\/2019\/02\/membuat-interactive-movie-bagian-ke-1\/\">membuat interactive movie bagian ke-1<\/a>, kali ini saya akan membahas bagaimana membuat tombol atau area <em>hotspot<\/em> pada video agar dapat muncul pada waktu tertentu dan pengguna dapat berinteraksi dengan mengkliknya.<\/p>\n<p>Pertama, kita perlu men-download video untuk dijadikan sebagai contoh yaitu video dari Sintel \u00a9 oleh <em>Blender Foundation<\/em> pada tautan berikut <a href=\"https:\/\/mdn.github.io\/learning-area\/javascript\/apis\/video-audio\/finished\/video\/sintel-short.mp4\">https:\/\/mdn.github.io\/learning-area\/javascript\/apis\/video-audio\/finished\/video\/sintel-short.mp4<\/a>, simpan file video dan beri nama <span style=\"text-decoration: underline;\"><strong>movie.mp4<\/strong><\/span> pada <em>folder<\/em> videos.<\/p>\n<p>Kedua, kita perlu menambahkan <em>style<\/em> dengan tipe <em>class<\/em> <strong>hotspot<\/strong> ke dalam <em>CSS<\/em> kita. <em>Style class<\/em> <strong>hotspot<\/strong> berarti setiap elemen yang menggunakan <em>style<\/em>\u00a0<em>class<\/em> ini akan memiliki <em>format<\/em> tampilan yang sama.<\/p>\n<pre>#overlay-v, #video-container{ \r\n\u00a0 position:absolute; \r\n\u00a0 left:50%; \r\n\u00a0 top:50%; \r\n\u00a0 transform: translate(-50%, -50%); \r\n\u00a0 width: 100%; \r\n\u00a0 height: 100%; \r\n\u00a0 object-fit: contain; \r\n} \r\nhtml, body { \r\n\u00a0 height: 100%; \r\n\u00a0 margin:0; \r\n\u00a0 background: #000; \r\n}\r\n.hotspot {\r\n\u00a0 position: absolute;\r\n\u00a0 background-color:rgba(0,0,128, 0.5);\r\n\u00a0 display: none;\r\n\u00a0 text-align:center;\r\n\u00a0 cursor: pointer;\r\n\u00a0 padding: 20px;\r\n\u00a0 color: #fff;\r\n\u00a0 left: 0;\r\n\u00a0 top: 0;\r\n\u00a0 width: 100px;\r\n\u00a0 height: 100px;\r\n}<\/pre>\n<p><em>Class CSS hotspot<\/em> ini akan disembunyikan terlebih dahulu (<em><strong>display:none<\/strong><\/em>) dan akan ditampilkan pada saat waktu yang telah ditentukan melalui <em>javascript.<\/em><\/p>\n<p>Bukalah dokumen <strong>index.html<\/strong> dan tambahkan ke dalam <em>tag <strong>overlay-v<\/strong><\/em> beberapa <em>tag<\/em> baru untuk kita jadikan <em>hotspot<\/em> seperti ditunjukkan pada <em>code<\/em> di bawah:<\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"en\"&gt;\r\n&lt;head&gt;\r\n  &lt;meta charset=\"UTF-8\"&gt;\r\n  &lt;title&gt;Judul Interactive Movie&lt;\/title&gt;\r\n  &lt;meta name=\"description\" content=\"Interactive movie.\"&gt;\r\n  &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\r\n  \r\n  &lt;link rel=\"stylesheet\" href=\"css\/app.css\"&gt;\r\n  &lt;script src=\"js\/app.js\"&gt;&lt;\/script&gt;  \r\n\r\n&lt;\/head&gt;\r\n&lt;body onload=\"init();\" &gt;\r\n  &lt;div&gt;\r\n    &lt;video id=\"video-container\" type=\"video\/mp4\" src=\"videos\/movie.mp4\" playsinline&gt;&lt;\/video&gt;\r\n    &lt;div id=\"overlay-v\"&gt;\r\n\r\n       &lt;div class=\"hotspot\" data-show-time=\"3.5\" onclick=\"seekTo(84)\" style=\"width: 30%; height: 15%; left: 35%; top: 60%\" &gt;Skip to Dragon Scene&lt;\/div&gt;\r\n\r\n       &lt;div class=\"hotspot\" data-show-time=\"97\" style=\"top: 20%; width: 50%; left: 25%; height: 5%\"&gt;What will she do?&lt;\/div&gt;\r\n      &lt;div class=\"hotspot\" data-show-time=\"97\" onclick=\"seekTo(97.1)\" style=\"background: green; top: 70%; width: 20%; height: 5%; left: 20%\"&gt;Safe&lt;\/div&gt;\r\n      &lt;div class=\"hotspot\" data-show-time=\"97\" onclick=\"seekTo(61)\" style=\"background: red; top: 70%; width: 20%; height: 5%; left: 60%\"&gt;Leave&lt;\/div&gt;\r\n\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n\r\n<\/code><\/pre>\n<p>Pada setiap elemen <em>div<\/em> dengan <em>class <strong>hotspot<\/strong><\/em> kita dapat memberikan perubahan <em>style<\/em> khususnya pada <em>width, height<\/em>, posisi <em>left<\/em>, dan <em>right.<\/em> Selain itu yang sangat penting adalah atribut <em><strong>data-show-time<\/strong><\/em> yang akan <span style=\"text-decoration: underline;\">berisi nilai kapan waktu <em>hotspot<\/em> ini muncul<\/span> dan <em><strong>onclick<\/strong><\/em> yang akan berisi <span style=\"text-decoration: underline;\">fungsi javascript yang akan dilakukan ketika <em>hotspot<\/em> ini diklik<\/span> oleh pengguna.\u00a0 Terdapat 1 <em>hotspot<\/em> yang hanya berisi informasi dan 3 <em>hotspot<\/em> yang diklik dan memindahkan detik video ke detik 84, 97.1, dan 61.<\/p>\n<p>Berikutnya adalah memodifikasi <em>code<\/em>\u00a0pada dokumen <strong>app.js<\/strong>, sisipkan <em>code<\/em> berikut pada awal baris <strong>sebelum<\/strong> fungsi init():<\/p>\n<pre>var media; \/\/ video player element\r\nvar cuePoints = []; \r\nvar overlay;\r\nvar prevTime = 0;\r\nvar activeHotspots = [];<\/pre>\n<p>Berikut adalah penjelasan dari variabel-variabel yang didefinisikan:<\/p>\n<ul>\n<li>Variabel <strong>media<\/strong> berguna untuk menampung video <em>player<\/em> yang akan kita gunakan untuk melakukan manipulasi pada elemen video seperti <em>play, pause, stop<\/em>, dan lompat <em>(seek)<\/em> ke waktu tertentu pada video.<\/li>\n<li>Variabel <strong>cuePoints<\/strong> merupakan sebuah himpunan <em>(array)<\/em> yang akan menampung seluruh elemen <em>hotspot<\/em> dan waktu mulai dari <em>hotspot<\/em> tersebut.<\/li>\n<li>Variabel <strong>overlay<\/strong> merupakan div dengan ID #overlay-v yang berfungsi untuk mulai memainkan video ketika diklik oleh pengguna.<\/li>\n<li>Variabel <strong>prevTime<\/strong> berguna untuk menyimpan posisi waktu detik terakhir dari video saat dimainkan, ini akan bermanfaat ketika akan mengecek waktu untuk menampilkan <em>hotspot.<\/em><\/li>\n<li>Variabel <strong>activeHotspots<\/strong> merupakan sebuah himpunan <em>(array)<\/em> yang akan menampung <em>hotspot-hotspot<\/em> yang sedang muncul (aktif) pada layar. Ketika kita akan menyembunyikan\/menghilangkan seluruh <em>hotspot<\/em> dari tampilan, kita hanya perlu menyembunyikan seluruh <em>hotspot<\/em> yang ada di dalam himpunan <strong>activeHotspots.<\/strong><\/li>\n<\/ul>\n<p>Modifikasi fungsi init() dengan <em>code<\/em> berikut:<\/p>\n<pre>function init() {\r\n\u00a0 media = document.querySelector('#video-container');\r\n\u00a0 media.addEventListener('timeupdate', mediaTimeUpdate);\u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \r\n\u00a0 overlay = document.querySelector('#overlay-v');\u00a0 \u00a0 \r\n\u00a0 overlay.addEventListener('click', startVideo);\u00a0 \u00a0\r\n\r\n\u00a0 var hotspots = document.querySelectorAll('.hotspot');\r\n\u00a0 for (var i=0; i&lt;hotspots.length; i++) {\r\n\u00a0 \u00a0 var hotspot = hotspots[i];\r\n\u00a0 \u00a0 var showTime = parseFloat(hotspot.getAttribute('data-show-time'));\r\n\u00a0 \u00a0 if (isNaN(showTime) == false) {\r\n\u00a0 \u00a0 \u00a0 cuePoints.push({\r\n\u00a0 \u00a0 \u00a0 \u00a0 hotspot: hotspot,\r\n\u00a0 \u00a0 \u00a0 \u00a0 showTime: showTime\r\n\u00a0 \u00a0 \u00a0 });\r\n\u00a0 \u00a0 }\r\n\u00a0 }\r\n}<\/pre>\n<p>Fungsi init ini melakukan 3 fungsi, yaitu:<\/p>\n<ol>\n<li>Memberikan isi variabel <strong>media<\/strong> menjadi elemen video <em>player<\/em> dengan ID #video-container pada HTML, kemudian memberikan <em>event listener timeupdate<\/em>, yang berarti setiap kali video berjalan maka akan otomatis memanggil fungsi <strong>mediaTimeUpdate<\/strong> (yang akan dibuat selanjutnya).<\/li>\n<li>Memberikan isi variabel <strong>overlay<\/strong> menjadi elemen div dengan ID #overlay-v pada HTML, kemudian memberikan <em>event listener click<\/em>, yang berarti bila pengguna mengklik elemen ini, maka akan memanggil fungsi <strong>startVideo<\/strong> (yang akan dibuat selanjutnya).<\/li>\n<li>Menghimpun seluruh elemen div dengan class hotspot pada HTML dan memasukkannya ke variabel himpunan <strong>cuePoints.<\/strong><\/li>\n<\/ol>\n<p>Masih pada <strong>app.js<\/strong>, tambahkan fungsi <strong>startVideo<\/strong> seperti pada <em>code<\/em> berikut setelah fungsi init:<\/p>\n<pre>function startVideo() {\r\n\u00a0 media.play();\r\n\u00a0 overlay.removeEventListener('click', startVideo);\r\n}<\/pre>\n<p>Fungsi ini melakukan 2 tugas yaitu:<\/p>\n<ol>\n<li>Memainkan video<\/li>\n<li>Menghilangkan kemampuan pengguna untuk mengklik pada elemen #overlay-v agar selanjutnya kita dapat mengklik <em>hotspot-hotspot.<\/em><\/li>\n<\/ol>\n<p>Kemudian tambahkan fungsi <strong>mediaTimeUpdate<\/strong> seperti pada <em>code<\/em> berikut:<\/p>\n<pre>function mediaTimeUpdate() {\r\n\u00a0 for (var i=0; i&lt;cuePoints.length; i++) {\r\n\u00a0 \u00a0 var cuePoint = cuePoints[i];\r\n\u00a0 \u00a0 if (cuePoint.showTime &gt;= prevTime &amp;&amp; cuePoint.showTime &lt; media.currentTime) {\r\n\u00a0 \u00a0 \u00a0 showHotspot(cuePoint.hotspot);\r\n\u00a0 \u00a0 }\r\n\u00a0 }\r\n\u00a0 prevTime = media.currentTime;\r\n}<\/pre>\n<p>Fungsi ini akan melakukan pengecekan waktu untuk muncul <strong>(showTime)<\/strong> terhadap seluruh <em>hotspot<\/em> yang ada dalam himpunan <strong>cuePoints<\/strong> apakah sudah +\/- sama dengan waktu video berjalan saat ini. Bila ya, maka tampilkan <em>hotspot<\/em> dengan memanggil fungsi <strong>showHotspot<\/strong> dengan code sebagai berikut:<\/p>\n<pre>function showHotspot(hotspot) {\r\n\u00a0 hotspot.style.display = 'block';\r\n\u00a0 activeHotspots.push(hotspot);\r\n\u00a0 media.pause();\r\n}<\/pre>\n<p>Fungsi <strong>showHotspot<\/strong> ini melakukan 3 hal yaitu:<\/p>\n<ol>\n<li>Menampilkan elemen div <em>hotspot<\/em> dengan mengeset <em>style<\/em> CSS pada <em>hotspot<\/em> menjadi <em><strong>&#8216;block&#8217;.<\/strong><\/em><\/li>\n<li>Menambahkan <em>hotspot<\/em> ke dalam himpunan <strong>activeHotspot<\/strong><\/li>\n<li>Menghentikan sementara <em>(pause)<\/em> video yang sedang main, agar pengguna dapat melakukan interaksi terhadap <em>hotspot.<\/em><\/li>\n<\/ol>\n<p>Kembali ke dokumen <strong>index.html,<\/strong> beberapa elemen <em>hotspot<\/em> memiliki atribut <strong>onclick,<\/strong> tujuannya adalah ketika elemen ini diklik oleh pengguna, maka akan memanggil fungsi yang didefinisikan pada <strong>onclick.<\/strong> Pada contoh ini, <strong>onclick<\/strong> akan memanggil fungsi <strong>seekTo<\/strong> yang akan dibuat untuk memindahkan video ke detik tertentu.<\/p>\n<p>Tambahkan fungsi <strong>seekTo<\/strong> dan <strong>hideHotspot<\/strong> pada <strong>app.js<\/strong> dengan <em>code<\/em> berikut:<\/p>\n<pre>function seekTo(second) {\r\n\u00a0 media.currentTime = second;\r\n\u00a0 media.play();\r\n\u00a0 hideHotspot();\r\n}\r\nfunction hideHotspot() {\r\n\u00a0 for (var i=0; i&lt;activeHotspots.length; i++) {\r\n\u00a0 \u00a0 var hotspot = activeHotspots[i];\r\n\u00a0 \u00a0 hotspot.style.display = 'none';\r\n\u00a0 }\r\n}<\/pre>\n<p>Pada bagian akhir fungsi <strong>seekTo,<\/strong> kita akan memanggil fungsi <strong>hideHotspot<\/strong> untuk menyembunyikan seluruh <em>hotspot<\/em> yang muncul pada layar.<\/p>\n<p>Bila semuanya sudah dibuat, silakan dicoba dengan membuka dokumen <strong>index.html<\/strong> pada web browser dan klik pada video, tunggu sampai detik ke 3.5 untuk melihat <em>hotspot<\/em> muncul dan coba klik <em>hotspot<\/em> tersebut untuk melompat ke detik 84 dari video.<\/p>\n<p>Demikian dasar pembuat <em>movie interactive<\/em> dengan menggunakan HTML5 dan <em>Javascript.<\/em> Semoga artikel ini membantu anda dan silakan berkreasi, lakukan modifikasi pada <em>code<\/em> sesuai dengan kebutuhan anda.<\/p>\n<p><strong>Referensi:<\/strong><\/p>\n<p>Mozilla Developer Network: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Learn\/JavaScript\/Client-side_web_APIs\/Video_and_audio_APIs\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.mozilla.org\/en-US\/docs\/Learn\/JavaScript\/Client-side_web_APIs\/Video_and_audio_APIs<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Melanjutkan dari artikel membuat interactive movie bagian ke-1, kali ini saya akan membahas bagaimana membuat tombol atau area hotspot pada video agar dapat muncul pada waktu tertentu dan pengguna dapat berinteraksi dengan mengkliknya. Pertama, kita perlu men-download video untuk dijadikan sebagai contoh yaitu video dari Sintel \u00a9 oleh Blender Foundation pada tautan berikut https:\/\/mdn.github.io\/learning-area\/javascript\/apis\/video-audio\/finished\/video\/sintel-short.mp4, simpan [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":7010,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83],"tags":[187,146,184],"class_list":["post-7027","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-html5","tag-interactive-content","tag-interactive-movie"],"_links":{"self":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/comments?post=7027"}],"version-history":[{"count":6,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7027\/revisions"}],"predecessor-version":[{"id":7063,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7027\/revisions\/7063"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media\/7010"}],"wp:attachment":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media?parent=7027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/categories?post=7027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/tags?post=7027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}