SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
JavaScriptによるゲーム開発
     ~ゲーム開発初心者による
          弾幕ゲーム開発~




             2009/3/7
               Pascal
もくじ
    JavaScriptとは?
●




    JavaScriptによるゲーム開発
●




    Demo
●




    まとめ
●
自己紹介
    ハンドルネームは紅月(twitterは@koduki)
●


           mixiとかではpascalを名乗ることも
       –


    四月から東京に就職するギリギリ大学院生
●




    「ブログなんだよもん」ってBlogで、主にプロ
●

    グラム関係の話を書いてます。

    得意な言語はJava, JavaScript, Ruby
●




    最近、Scalaとか関数型言語を勉強中!
●
あれ?
自己紹介
    ハンドルネームは紅月(twitterは@koduki)
●


           mixiとかではpascalを名乗ることも
       –


    四月から東京に就職するギリギリ大学院生
●




    「ブログなんだよもん」ってBlogで、主にプロ
●

    グラム関係の話を書いてます。

    得意な言語はJava, JavaScript, Ruby
●




    最近、Scalaとか関数型言語を勉強中!
●
C言語は?
実はCは苦手です>_<
    C言語何それ? おいしいの?
●


          学校の演習+αの知識しかないです
      –

          ポインタとかメモリ管理とか忘れました
      –


    ずいぶん前にPSPでスネーク書いたのが最後
●




    この前、Hello Wold書いたら3回コンパイルエ
●

    ラーした(ぉ
参加者の多くが良く参加する
    掲示板の調査
参加者の多くが良く参加する
    掲示板の調査
参加者の多くが良く参加する
    掲示板の調査




70%以上がC使い
超
アウェイ
orz
という分けで発表してみる
    発表すれば話すネタがあるから、壁の花になら
●

    んはず!

    せっかくなので、みんなが興味ありそうな弾幕
●

    シューティングをJavaScriptで実装する話とか



    ゲーム作り自体久しぶりだけどね!
●




    しかも、弾幕シューティングとかほとんどした
●

    こと無いけどね><
JavaScriptとは?
    主にWebブラウザで利用されるスクリプト言語
●


         プラグインとか対話環境とかブラウザ以外も
     –


    Webページに動きを付けるために使う
●




    オブジェクト指向言語だけど、関数型的な書き
●

    方も出来て最近注目!
なんでJavaScript?
    ブラウザがあればどこでも動く
●


         Win/Mac/Linuxは当然OK
     –

         理論的にはケータイやiPhone, DSやWiiでも><
     –


    HTMLを使えば、描画や文字入力も簡単
●




    WWWとの連携が得意
●




    言語が強力(ガベージコレクション、オブジェ
●

    クト指向、連想配列、クロージャ...etc)
JavaScriptの特徴
    プロトタイプベースのオブジェクト指向
●


         クラスは無いけど、3大機能はちゃんとサポー
     –
          ト

    動的型付け言語
●




    関数もオブジェクト(関数ポインタの偉い奴)
●




    文字列を実行コードに変更できるeval関数
●




    組み込み型が割りと強力
●


         配列リテラルが線形List(動的配列)
     –

         連想配列(HashTable)のサポート
     –
でも
JavaScriptっ
    て
遅くね?
No
最近は
速いよ>_<
JavaScriptのパフォーマンス
    Webアプリの進化によるニーズで、ここ1〜2年
●

    で十数倍から数十倍の高速化

    JITも実装されてかなり速い
●




    流石にCよりは劣るけど、実用的なレベル
●




    でも、描画とかマルチメディア周りは遅いです
●

    o..rz
JavaScriptのパフォーマンス
お約束のフィボナッチベンチCのコード)

#include <time.h>
#include <stdio.h>
int fib(int n){ return (n < 2) ? n : fib(n-2) + fib(n-1); }
int main(){
  int i=0;
  double r = 100000;
  for (i=0;i<3;i++){
    clock_t start,end;
    start = clock();
    fib(39);
    end = clock();
    double t = (double)(end-start)/CLOCKS_PER_SEC;
    if (t <= r) r = t;
  }
  printf(quot;%.2fnquot;, r);
}
JavaScriptのパフォーマンス
お約束のフィボナッチベンチ(Javaのコード)

public class Fib {
  static int fib(int n){ return (n < 2) ? n:fib(n-2) + fib(n-1); }
  public static void main(String[] args) {
    long r = Long.MAX_VALUE;
    for(int i=0;i<3;i++){
       long s = System.currentTimeMillis();
       fib(39);
       long t = System.currentTimeMillis() - s;
       if(t <= r) r = t;
    }
    System.out.println(r / 1000.0);
  }
}
JavaScriptのパフォーマンス
お約束のフィボナッチベンチ(JavaScriptの
コード)
var fib = function(n) { return (n < 2) ? n : fib(n-2) + fib(n-1);
var r = 10000;
for(i=0; i<3; i++){
  start = new Date();
  fib(39);
  var r = new Date() - start;
}
document.write(r);
JavaScriptのパフォーマンス
  お約束のフィボナッチベンチ(結果)
  4

3.5

  3

2.5

  2
                                            実行時間


1.5

  1

0.5

  0
      cc -O0   cc -O3   java   javascript
JavaScriptまとめ
    JavaScriptはオブジェクト指向言語
●




    動的型付けだから型宣言は不要
●




    クロージャがあるのでコールバックとか簡単
●




    結構速い
●
JavaScriptによるゲーム開発
描画するための3つの方法
    DOMを直接操作する
●




    SVG/VRMLを利用する
●




    Canvasを利用する
●
描画するための3つの方法
    DOMを直接操作する
●




    SVG/VRMLを利用する
●




    Canvasを利用する
●
Cavas
    HTMLでベクタ画像を作成するための仕様
●




    HTML5からサポート
●


          Firefox3, Safariではサポート済み(IEもライブ
      –
            ラリで対応化)

    ラスタ画像も表示できる
●




    高速(チューニングの関係か今はDOMの方が
●

    速いこともorz)

    比較的従来のゲーム開発に近い開発スタイル
●
円を描く
<html>
 <head>
  <title>JS Game Sample</title>
  <meta content=quot;text/html; charset=utf-8quot; http-equiv=quot;Content-Typequot;/>
  <script type=quot;text/javascriptquot;>
   function init(){
      var canvas = document.getElementById(quot;canvasquot;).getContext(quot;2dquot;);

     canvas.fillStyle = quot;#ff0000quot;;
     canvas.beginPath();
     canvas.arc(100, 100, 50, 0, Math.PI * 2, true);
     canvas.closePath();
     canvas.fill();
    }
  </script>
 </head>
 <body onLoad=quot;init()quot;>
     <canvas id=quot;canvasquot; width=quot;380quot; height=quot;450quot;
      style=quot;border:medium solid #000000quot; />
</body>
</html>
円を描く(抜粋)

function init(){
  var canvas = document.getElementById(quot;canvasquot;).getContext(quot;2dquot;);
  // 色の指定
  canvas.fillStyle = quot;#ff0000quot;;
  // 図形を描く
  canvas.beginPath();
  canvas.arc(100, 100, 50, 0, Math.PI * 2, true);
  canvas.closePath();
  // 描画
  canvas.fill();
}
円を動かす
    ループにはsetInterval関数を使う
●




    コールバック関数を指定したミリ秒間隔で実行
●




    イベントなので非同期
●




    60FPSならこんな感じのコード
●




    var x = y = 0;
    setInterval(function(){
             canvas.clearRect(0, 0, 380, 450);
             drawCircle(x+=5, y+=5);
           }, 60 / 1000);
画像を表示する
    drawImageメソッドによるラスタ画像の貼付け
●




    ブラウザで開けるフォーマットならOK(bmp,
●

    png, jpgなど)

    var img = new Image();
    img.src = quot;sprite.pngquot;;

    var x = y = 0;
    setInterval(function(){
              canvas.clearRect(0, 0, 380, 450);
              canvas.drawImage(img, x+=5, y+=5);
           }, 60 / 1000);
音を鳴らす
    JS単体で音を鳴らすのは難しい
●




    JavaAppletやFlashを経由して音を鳴らす方が
●

    無難

    一応、embedタグで可能だけどパフォーマンス
●

    が悪い上に、細かい制御がきかない
音を鳴らす

function play(url){
  // Embedタグを作成
  var embed = document.createElement(quot;embedquot;);
  embed.setAttribute(quot;srcquot;, url);
  embed.setAttribute(quot;hiddenquot;, true);
  embed.setAttribute(quot;autostartquot;, true);
  embed.setAttribute(quot;loopquot;, true);

    // 表示しているHTMLにEmbedタグを埋め込む
    document.body.appendChild(embed);
}

play(quot;bgm1.wavquot;);
カーソルで操作する
    addEventListenerでイベントを登録する
●




    イベント時の処理はコールバック関数で記述
●
カーソルで操作する

var x = y = 0;

var img = new Image();
img.src = quot;sprite.pngquot;;

document.addEventListener(quot;keydownquot;, function(e){
  if (e.keyCode == 39) x+=10;
  else if(e.keyCode == 37) x-=10;
}, false);

setInterval(function(){
          canvas.clearRect(0, 0, 380, 450);
          canvas.drawImage(img, x, y);
       }, 60/1000);
弾幕風の描画
    弾幕に重要な三角関数もちゃんと使える
●




    var img = new Image(); img.src = quot;ball.pngquot;;

    var arc = 0; r = 1;
    var x = 190;y = 225;
    setInterval(function(){
            canvas.drawImage(img,
                     x + r*Math.sin(arc), y + r*Math.cos(arc));
            arc += 1;
            r += 5;

          }, 60/1000);
ちょっとオブジェクト指向っぽく
    オブジェクト単位で責任を分ける

    System
●




    Sprite
●


            Player
        –

            Enamy
        –

            Shot
        –
Systemオブジェクト
    ゲームシステムに対応するオブジェクト
●




    cavasやイベント等のシステム全体を管理
●




    System.canvas
●


           HTMLのcanvasのwrapperオブジェクト。
       –

           draw, clear等のメソッドを持つ

    System.sprites
●


           Spriteオブジェクトの配列
       –
Systemオブジェクト
    System.update()
●


           setIntervalによってループする関数。
       –

           bindされたイベントやSpriteの動作、衝突判
       –
             定、Spriteの描画

    System.bind(ボタン名, コールバック関数)
●


           keydown/keyupのwrapper関数
       –

           ゲームでよく使う「あるボタンを押しているイ
       –
             ベント」をサポート
updateメソッド
;
 // 全てのspriteに対しての処理.
  System.sprites.forEach(function(x){
      // 動作の更新
      x.update();
      // 衝突判定
      System.sprites.filter(isCollision)
                    .forEach(function(y){
                        x.collision(y);
                        y.collision(x);
                    });
      // 描画
      x.draw();
  });
Spriteオブジェクト
    画面に描画されるオブジェクト
●




    x, y, height, width, enableの基本プロパティ
●




    update, draw, collisionの基本メソッド
●




    描画や衝突したときの処理はSprite自身でやる
●
Spriteの派生オブジェクト
    Player
●


           プレイヤとなるオブジェクト。
       –

           カーソルでの操作を受け付ける。
       –


    Enemy
●


           敵オブジェクト
       –

           updateに記述したルーチンの通りに動作
       –


    Shot
●


           弾丸オブジェクト
       –

           基本的にはEnemyと同じ
       –
Demo
JSによるメリット/デメリット
    JSで書くメリット
●


         Webブラウザのみで動作する
     –

         オブジェクト指向をはじめ言語機能が強力なので
     –
           書きやすい
         evalで弾幕情報とかを動的に実験できる
     –


    JSで書くデメリット
●


         描画が少し重い
     –

         Soundがとても重い
     –

         実行速度/描画速度が環境依存(IEがとても遅い)
     –

         ジョイパッドの対応とか謎
     –
まとめ
    JSでのゲーム開発は音を鳴らさなければ十分可
●

    能

    今回は当たり判定の処理とかベタなアルゴリズ
●

    ムを使ってるから、もう少し速くできるかも?

    SDLで開発した時と大きくは変わらなかった。
●




    開発自体は比較的簡単
●
みんなもJSで
  ゲームを
作ってみよう!

Weitere ähnliche Inhalte

Was ist angesagt?

慣れない言語で 車輪の再発明をしよう〜JavaScriptでツリーソート編〜
慣れない言語で車輪の再発明をしよう〜JavaScriptでツリーソート編〜慣れない言語で車輪の再発明をしよう〜JavaScriptでツリーソート編〜
慣れない言語で 車輪の再発明をしよう〜JavaScriptでツリーソート編〜Hiromu Shioya
 
1242982622API2 upload
1242982622API2 upload1242982622API2 upload
1242982622API2 upload51 lecture
 
仕事で使うRuby
仕事で使うRuby仕事で使うRuby
仕事で使うRubyKentaro Goto
 
デブサミ2009 はてなの開発戦略
デブサミ2009 はてなの開発戦略デブサミ2009 はてなの開発戦略
デブサミ2009 はてなの開発戦略Yuichi Tateno
 
【13-B-3】 企業システムをマッシュアップ型に変えるには
【13-B-3】 企業システムをマッシュアップ型に変えるには【13-B-3】 企業システムをマッシュアップ型に変えるには
【13-B-3】 企業システムをマッシュアップ型に変えるにはdevsumi2009
 
Hyper Estraierの設計と実装
Hyper Estraierの設計と実装Hyper Estraierの設計と実装
Hyper Estraierの設計と実装Hiroshi Ono
 
もっと仕事で使うRuby
もっと仕事で使うRubyもっと仕事で使うRuby
もっと仕事で使うRubyKentaro Goto
 
云计算背后的商业模式变迁
云计算背后的商业模式变迁云计算背后的商业模式变迁
云计算背后的商业模式变迁Kevin cheng
 
Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.cydn.cybozu.co.jp
 
ロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムMakoto Yui
 
資工所考試密技說明會
資工所考試密技說明會資工所考試密技說明會
資工所考試密技說明會Mu Chun Wang
 
EJB3 ABC
EJB3 ABCEJB3 ABC
EJB3 ABCbose999
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!将 高野
 

Was ist angesagt? (20)

慣れない言語で 車輪の再発明をしよう〜JavaScriptでツリーソート編〜
慣れない言語で車輪の再発明をしよう〜JavaScriptでツリーソート編〜慣れない言語で車輪の再発明をしよう〜JavaScriptでツリーソート編〜
慣れない言語で 車輪の再発明をしよう〜JavaScriptでツリーソート編〜
 
1242982622API2 upload
1242982622API2 upload1242982622API2 upload
1242982622API2 upload
 
仕事で使うRuby
仕事で使うRuby仕事で使うRuby
仕事で使うRuby
 
デブサミ2009 はてなの開発戦略
デブサミ2009 はてなの開発戦略デブサミ2009 はてなの開発戦略
デブサミ2009 はてなの開発戦略
 
XS Japan 2008 App Data Japanese
XS Japan 2008 App Data JapaneseXS Japan 2008 App Data Japanese
XS Japan 2008 App Data Japanese
 
【13-B-3】 企業システムをマッシュアップ型に変えるには
【13-B-3】 企業システムをマッシュアップ型に変えるには【13-B-3】 企業システムをマッシュアップ型に変えるには
【13-B-3】 企業システムをマッシュアップ型に変えるには
 
Hyper Estraierの設計と実装
Hyper Estraierの設計と実装Hyper Estraierの設計と実装
Hyper Estraierの設計と実装
 
もっと仕事で使うRuby
もっと仕事で使うRubyもっと仕事で使うRuby
もっと仕事で使うRuby
 
XS Japan 2008 Ganeti Japanese
XS Japan 2008 Ganeti JapaneseXS Japan 2008 Ganeti Japanese
XS Japan 2008 Ganeti Japanese
 
20世紀Ruby
20世紀Ruby20世紀Ruby
20世紀Ruby
 
云计算背后的商业模式变迁
云计算背后的商业模式变迁云计算背后的商业模式变迁
云计算背后的商业模式变迁
 
Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.Cybozu Inc 10th anniversary event - developing section.
Cybozu Inc 10th anniversary event - developing section.
 
sc2009white_T2
sc2009white_T2sc2009white_T2
sc2009white_T2
 
ロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズムロックフリーGCLOCKページ置換アルゴリズム
ロックフリーGCLOCKページ置換アルゴリズム
 
極める routes.php
極める routes.php極める routes.php
極める routes.php
 
資工所考試密技說明會
資工所考試密技說明會資工所考試密技說明會
資工所考試密技說明會
 
090601-dotplot
090601-dotplot090601-dotplot
090601-dotplot
 
EclipSky200712
EclipSky200712EclipSky200712
EclipSky200712
 
EJB3 ABC
EJB3 ABCEJB3 ABC
EJB3 ABC
 
Lets Enjoy C#!
Lets Enjoy C#!Lets Enjoy C#!
Lets Enjoy C#!
 

Mehr von Hiroaki NAKADA

Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Hiroaki NAKADA
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
How to make keynote like presentation with markdown
How to make keynote like presentation with markdownHow to make keynote like presentation with markdown
How to make keynote like presentation with markdownHiroaki NAKADA
 
光のツールExcelに闇Rubyの力を注いでみた
光のツールExcelに闇Rubyの力を注いでみた光のツールExcelに闇Rubyの力を注いでみた
光のツールExcelに闇Rubyの力を注いでみたHiroaki NAKADA
 
Working effectively with legacy code chapter1
Working effectively with legacy code chapter1Working effectively with legacy code chapter1
Working effectively with legacy code chapter1Hiroaki NAKADA
 
Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法Hiroaki NAKADA
 

Mehr von Hiroaki NAKADA (9)

Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
Performance Monitoring with Java Flight Recorder on OpenJDK [DEV2406]
 
Javaから使うScala
Javaから使うScalaJavaから使うScala
Javaから使うScala
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
From document-to-code
From document-to-codeFrom document-to-code
From document-to-code
 
How to make keynote like presentation with markdown
How to make keynote like presentation with markdownHow to make keynote like presentation with markdown
How to make keynote like presentation with markdown
 
光のツールExcelに闇Rubyの力を注いでみた
光のツールExcelに闇Rubyの力を注いでみた光のツールExcelに闇Rubyの力を注いでみた
光のツールExcelに闇Rubyの力を注いでみた
 
Legacycode01
Legacycode01Legacycode01
Legacycode01
 
Working effectively with legacy code chapter1
Working effectively with legacy code chapter1Working effectively with legacy code chapter1
Working effectively with legacy code chapter1
 
Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法
 

JavaScriptによるゲーム開発

  • 1. JavaScriptによるゲーム開発 ~ゲーム開発初心者による      弾幕ゲーム開発~ 2009/3/7 Pascal
  • 2. もくじ JavaScriptとは? ● JavaScriptによるゲーム開発 ● Demo ● まとめ ●
  • 3. 自己紹介 ハンドルネームは紅月(twitterは@koduki) ● mixiとかではpascalを名乗ることも – 四月から東京に就職するギリギリ大学院生 ● 「ブログなんだよもん」ってBlogで、主にプロ ● グラム関係の話を書いてます。 得意な言語はJava, JavaScript, Ruby ● 最近、Scalaとか関数型言語を勉強中! ●
  • 5. 自己紹介 ハンドルネームは紅月(twitterは@koduki) ● mixiとかではpascalを名乗ることも – 四月から東京に就職するギリギリ大学院生 ● 「ブログなんだよもん」ってBlogで、主にプロ ● グラム関係の話を書いてます。 得意な言語はJava, JavaScript, Ruby ● 最近、Scalaとか関数型言語を勉強中! ●
  • 7. 実はCは苦手です>_< C言語何それ? おいしいの? ● 学校の演習+αの知識しかないです – ポインタとかメモリ管理とか忘れました – ずいぶん前にPSPでスネーク書いたのが最後 ● この前、Hello Wold書いたら3回コンパイルエ ● ラーした(ぉ
  • 10. 参加者の多くが良く参加する 掲示板の調査 70%以上がC使い
  • 11.
  • 13. orz
  • 14. という分けで発表してみる 発表すれば話すネタがあるから、壁の花になら ● んはず! せっかくなので、みんなが興味ありそうな弾幕 ● シューティングをJavaScriptで実装する話とか ゲーム作り自体久しぶりだけどね! ● しかも、弾幕シューティングとかほとんどした ● こと無いけどね><
  • 15. JavaScriptとは? 主にWebブラウザで利用されるスクリプト言語 ● プラグインとか対話環境とかブラウザ以外も – Webページに動きを付けるために使う ● オブジェクト指向言語だけど、関数型的な書き ● 方も出来て最近注目!
  • 16. なんでJavaScript? ブラウザがあればどこでも動く ● Win/Mac/Linuxは当然OK – 理論的にはケータイやiPhone, DSやWiiでも>< – HTMLを使えば、描画や文字入力も簡単 ● WWWとの連携が得意 ● 言語が強力(ガベージコレクション、オブジェ ● クト指向、連想配列、クロージャ...etc)
  • 17. JavaScriptの特徴 プロトタイプベースのオブジェクト指向 ● クラスは無いけど、3大機能はちゃんとサポー – ト 動的型付け言語 ● 関数もオブジェクト(関数ポインタの偉い奴) ● 文字列を実行コードに変更できるeval関数 ● 組み込み型が割りと強力 ● 配列リテラルが線形List(動的配列) – 連想配列(HashTable)のサポート –
  • 21. No
  • 23. JavaScriptのパフォーマンス Webアプリの進化によるニーズで、ここ1〜2年 ● で十数倍から数十倍の高速化 JITも実装されてかなり速い ● 流石にCよりは劣るけど、実用的なレベル ● でも、描画とかマルチメディア周りは遅いです ● o..rz
  • 24. JavaScriptのパフォーマンス お約束のフィボナッチベンチCのコード) #include <time.h> #include <stdio.h> int fib(int n){ return (n < 2) ? n : fib(n-2) + fib(n-1); } int main(){ int i=0; double r = 100000; for (i=0;i<3;i++){ clock_t start,end; start = clock(); fib(39); end = clock(); double t = (double)(end-start)/CLOCKS_PER_SEC; if (t <= r) r = t; } printf(quot;%.2fnquot;, r); }
  • 25. JavaScriptのパフォーマンス お約束のフィボナッチベンチ(Javaのコード) public class Fib { static int fib(int n){ return (n < 2) ? n:fib(n-2) + fib(n-1); } public static void main(String[] args) { long r = Long.MAX_VALUE; for(int i=0;i<3;i++){ long s = System.currentTimeMillis(); fib(39); long t = System.currentTimeMillis() - s; if(t <= r) r = t; } System.out.println(r / 1000.0); } }
  • 26. JavaScriptのパフォーマンス お約束のフィボナッチベンチ(JavaScriptの コード) var fib = function(n) { return (n < 2) ? n : fib(n-2) + fib(n-1); var r = 10000; for(i=0; i<3; i++){ start = new Date(); fib(39); var r = new Date() - start; } document.write(r);
  • 27. JavaScriptのパフォーマンス お約束のフィボナッチベンチ(結果) 4 3.5 3 2.5 2 実行時間 1.5 1 0.5 0 cc -O0 cc -O3 java javascript
  • 28. JavaScriptまとめ JavaScriptはオブジェクト指向言語 ● 動的型付けだから型宣言は不要 ● クロージャがあるのでコールバックとか簡単 ● 結構速い ●
  • 30. 描画するための3つの方法 DOMを直接操作する ● SVG/VRMLを利用する ● Canvasを利用する ●
  • 31. 描画するための3つの方法 DOMを直接操作する ● SVG/VRMLを利用する ● Canvasを利用する ●
  • 32. Cavas HTMLでベクタ画像を作成するための仕様 ● HTML5からサポート ● Firefox3, Safariではサポート済み(IEもライブ – ラリで対応化) ラスタ画像も表示できる ● 高速(チューニングの関係か今はDOMの方が ● 速いこともorz) 比較的従来のゲーム開発に近い開発スタイル ●
  • 33. 円を描く <html> <head> <title>JS Game Sample</title> <meta content=quot;text/html; charset=utf-8quot; http-equiv=quot;Content-Typequot;/> <script type=quot;text/javascriptquot;> function init(){ var canvas = document.getElementById(quot;canvasquot;).getContext(quot;2dquot;); canvas.fillStyle = quot;#ff0000quot;; canvas.beginPath(); canvas.arc(100, 100, 50, 0, Math.PI * 2, true); canvas.closePath(); canvas.fill(); } </script> </head> <body onLoad=quot;init()quot;> <canvas id=quot;canvasquot; width=quot;380quot; height=quot;450quot; style=quot;border:medium solid #000000quot; /> </body> </html>
  • 34. 円を描く(抜粋) function init(){ var canvas = document.getElementById(quot;canvasquot;).getContext(quot;2dquot;); // 色の指定 canvas.fillStyle = quot;#ff0000quot;; // 図形を描く canvas.beginPath(); canvas.arc(100, 100, 50, 0, Math.PI * 2, true); canvas.closePath(); // 描画 canvas.fill(); }
  • 35. 円を動かす ループにはsetInterval関数を使う ● コールバック関数を指定したミリ秒間隔で実行 ● イベントなので非同期 ● 60FPSならこんな感じのコード ● var x = y = 0; setInterval(function(){ canvas.clearRect(0, 0, 380, 450); drawCircle(x+=5, y+=5); }, 60 / 1000);
  • 36. 画像を表示する drawImageメソッドによるラスタ画像の貼付け ● ブラウザで開けるフォーマットならOK(bmp, ● png, jpgなど) var img = new Image(); img.src = quot;sprite.pngquot;; var x = y = 0; setInterval(function(){ canvas.clearRect(0, 0, 380, 450); canvas.drawImage(img, x+=5, y+=5); }, 60 / 1000);
  • 37. 音を鳴らす JS単体で音を鳴らすのは難しい ● JavaAppletやFlashを経由して音を鳴らす方が ● 無難 一応、embedタグで可能だけどパフォーマンス ● が悪い上に、細かい制御がきかない
  • 38. 音を鳴らす function play(url){ // Embedタグを作成 var embed = document.createElement(quot;embedquot;); embed.setAttribute(quot;srcquot;, url); embed.setAttribute(quot;hiddenquot;, true); embed.setAttribute(quot;autostartquot;, true); embed.setAttribute(quot;loopquot;, true); // 表示しているHTMLにEmbedタグを埋め込む document.body.appendChild(embed); } play(quot;bgm1.wavquot;);
  • 39. カーソルで操作する addEventListenerでイベントを登録する ● イベント時の処理はコールバック関数で記述 ●
  • 40. カーソルで操作する var x = y = 0; var img = new Image(); img.src = quot;sprite.pngquot;; document.addEventListener(quot;keydownquot;, function(e){ if (e.keyCode == 39) x+=10; else if(e.keyCode == 37) x-=10; }, false); setInterval(function(){ canvas.clearRect(0, 0, 380, 450); canvas.drawImage(img, x, y); }, 60/1000);
  • 41. 弾幕風の描画 弾幕に重要な三角関数もちゃんと使える ● var img = new Image(); img.src = quot;ball.pngquot;; var arc = 0; r = 1; var x = 190;y = 225; setInterval(function(){ canvas.drawImage(img, x + r*Math.sin(arc), y + r*Math.cos(arc)); arc += 1; r += 5; }, 60/1000);
  • 42. ちょっとオブジェクト指向っぽく オブジェクト単位で責任を分ける System ● Sprite ● Player – Enamy – Shot –
  • 43. Systemオブジェクト ゲームシステムに対応するオブジェクト ● cavasやイベント等のシステム全体を管理 ● System.canvas ● HTMLのcanvasのwrapperオブジェクト。 – draw, clear等のメソッドを持つ System.sprites ● Spriteオブジェクトの配列 –
  • 44. Systemオブジェクト System.update() ● setIntervalによってループする関数。 – bindされたイベントやSpriteの動作、衝突判 – 定、Spriteの描画 System.bind(ボタン名, コールバック関数) ● keydown/keyupのwrapper関数 – ゲームでよく使う「あるボタンを押しているイ – ベント」をサポート
  • 45. updateメソッド ;  // 全てのspriteに対しての処理. System.sprites.forEach(function(x){ // 動作の更新 x.update(); // 衝突判定 System.sprites.filter(isCollision) .forEach(function(y){ x.collision(y); y.collision(x); }); // 描画 x.draw(); });
  • 46. Spriteオブジェクト 画面に描画されるオブジェクト ● x, y, height, width, enableの基本プロパティ ● update, draw, collisionの基本メソッド ● 描画や衝突したときの処理はSprite自身でやる ●
  • 47. Spriteの派生オブジェクト Player ● プレイヤとなるオブジェクト。 – カーソルでの操作を受け付ける。 – Enemy ● 敵オブジェクト – updateに記述したルーチンの通りに動作 – Shot ● 弾丸オブジェクト – 基本的にはEnemyと同じ –
  • 48. Demo
  • 49. JSによるメリット/デメリット JSで書くメリット ● Webブラウザのみで動作する – オブジェクト指向をはじめ言語機能が強力なので – 書きやすい evalで弾幕情報とかを動的に実験できる – JSで書くデメリット ● 描画が少し重い – Soundがとても重い – 実行速度/描画速度が環境依存(IEがとても遅い) – ジョイパッドの対応とか謎 –
  • 50. まとめ JSでのゲーム開発は音を鳴らさなければ十分可 ● 能 今回は当たり判定の処理とかベタなアルゴリズ ● ムを使ってるから、もう少し速くできるかも? SDLで開発した時と大きくは変わらなかった。 ● 開発自体は比較的簡単 ●