SlideShare a Scribd company logo
JS と Canvas で作る
シューティングゲーム
自己紹介
• HN: さい
• Twitter: @sairoutine
• Webアプリケーションエンジニア
• 東方Projectが大好きです
• JavaScript 1年生
シューティングゲームが作りたい
Unity とか UnrealEngine とか使うと、
最近は手軽に作ることができる
らしいですね
新しいことを覚えるのが面倒くさい
(注) ソフトウェアエンジニアとして
相当死んでる発言です
JavaScript でゲームが
作れるらしいぞ!
マジか!
偉大なる先人
https://github.com/takahirox/toho-like-js
すげぇ!
俺も作る!
DEMO
使ったツール
Browserify
Gulp
画面
Canvas API
音/効果音
Web Audio API
フレームワーク
なし!
基本的な流れ
Game.prototype.run = function(){
// シーン更新
this.scenes[ this.state ].run();
this.scenes[ this.state ].updateDisplay();
// SEを再生
this.runPlaySound();
// 経過フレーム数更新
this.frame_count++;
// 押下されたキーを保存しておく
this.before_keyflag = this.keyflag;
// 次の描画タイミングで再呼び出ししてループ
requestAnimationFrame(this.run.bind(this));
};
シーンの流れ
StageScene.prototype.run = function(){
// 自機
this.character.run();
// 自機弾
this.shotmanager.run();
// 敵
this.enemymanager.run();
// 敵弾
this.bulletmanager.run();
// アイテム
this.itemmanager.run();
// エフェクト
this.effectmanager.run();
// ボム
this.bombmanager.run();
// アイテムと自機の衝突判定
this.itemmanager.checkCollisionWithCharacter(this.character);
// 自機弾と敵の衝突判定
this.shotmanager.checkCollisionWithEnemies(this.enemymanager);
// 敵と自機の衝突判定
this.enemymanager.checkCollisionWithCharacter(this.character);
// 敵弾と自機の衝突判定
this.bulletmanager.checkCollisionWithCharacter(this.character);
キーボード入力①
// キー押下
Game.prototype.handleKeyDown = function(e){
this.keyflag |= this._keyCodeToBitCode(e.keyCode);
e.preventDefault( ) ;
};
// キー押下解除
Game.prototype.handleKeyUp = function(e){
this.keyflag &= ~this._keyCodeToBitCode(e.keyCode);
e.preventDefault( ) ;
};
キーボード入力②
// 指定のキーが押下状態か確認する
Game.prototype.isKeyDown = function(flag) {
return this.keyflag & flag;
};
// 指定のキーが押下されたか確認する
Game.prototype.isKeyPush = function(flag) {
// 1フレーム前に押下されておらず、現フレームで押下さ
れてるなら true
return !(this.before_keyflag & flag) && this.keyflag & flag;
};
当たり判定
// オブジェクトとオブジェクトの衝突判定を行う
ObjectBase.prototype.checkCollision = function(obj) {
if( this.inCollisionArea(obj.getCollisionLeftX(), obj.getCollisionUpY()) ||
this.inCollisionArea(obj.getCollisionLeftX(), obj.getCollisionBottomY()) ||
this.inCollisionArea(obj.getCollisionRightX(), obj.getCollisionUpY()) ||
this.inCollisionArea(obj.getCollisionRightX(), obj.getCollisionBottomY())
||
this.inCollisionArea(obj.x, obj.y)
) {
return true ;
}
return false ;
};
敵/敵弾の動きを記述する
var __enemyBulletsParams = [
[
{
'v': { 'r': 5, 'theta': 165, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
{
'v': { 'r': 5, 'theta': 135, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
{
'v': { 'r': 5, 'theta': 105, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
{
'v': { 'r': 5, 'theta': 75, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
{
'v': { 'r': 5, 'theta': 45, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
{
'v': { 'r': 5, 'theta': 15, 'w': 0, 'ra': 0.1, 'wa': 0, 'raa': -0.01, 'rrange': { 'min': 2 } },
},
角度と速度から移動先の(x, y)座標を
求める方法は、
高校の教科書にお任せします!
まとめ
1/60秒ごとに画面全部のオブジェクトの座標/オ
ブジェクト同士の当たり判定を行ってるが、古い
PCでも特に処理落ちの様子はなし
→ Chrome の V8 エンジン優秀
WebGL でより表現が広がるので次は試してみたい
ありがとうございました!

More Related Content

PPTX
JSでファミコンエミュレータを作った時の話
PPTX
Touhou Project on JavaScript
PPTX
em-dosbox
PDF
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
PDF
日曜プログラマーとigoogle先生
PDF
日曜プログラマーがHtml5とかで通信対戦ゲームを作ってます
PDF
通信対戦ゲームを作った話
PPTX
Tizen web app について調べたよ
JSでファミコンエミュレータを作った時の話
Touhou Project on JavaScript
em-dosbox
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーとigoogle先生
日曜プログラマーがHtml5とかで通信対戦ゲームを作ってます
通信対戦ゲームを作った話
Tizen web app について調べたよ

What's hot (20)

PPTX
Html5 でアプリを作るということ
PPTX
プログラマのためのPC自動化
PDF
Unity×HTMLで作るiPhone オンラインゲーム開発事例
PPTX
Bootstrap
PDF
120225 bootstrap
PPT
Flash Playerの作り方
PDF
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
PDF
Make TypingGame in JavaScript
PDF
Web frontend performance tuning
PDF
こんなに違う!Unityアプリケーション講座
PDF
自作ゲームをWebpack対応させてみた
PDF
Gitライフをはじめましょう〜GUIツールで簡単運用 Mac編〜
PDF
Yeoman RIAビルドツール超入門
PPTX
Web班
PDF
早く家へ帰るための
Grunt入門
[+gulp紹介]
PDF
デザイナーさんでもできる Browsersync からはじめる作業効率化
PDF
Introduction to Favmemo for Immature Engineers
PDF
Gruntの罪と罰
PDF
デザイナーさんでもできる Browsersync からはじめる作業効率化・春
PDF
BuddyPressの導入からカスタマイズまでの日記
Html5 でアプリを作るということ
プログラマのためのPC自動化
Unity×HTMLで作るiPhone オンラインゲーム開発事例
Bootstrap
120225 bootstrap
Flash Playerの作り方
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
Make TypingGame in JavaScript
Web frontend performance tuning
こんなに違う!Unityアプリケーション講座
自作ゲームをWebpack対応させてみた
Gitライフをはじめましょう〜GUIツールで簡単運用 Mac編〜
Yeoman RIAビルドツール超入門
Web班
早く家へ帰るための
Grunt入門
[+gulp紹介]
デザイナーさんでもできる Browsersync からはじめる作業効率化
Introduction to Favmemo for Immature Engineers
Gruntの罪と罰
デザイナーさんでもできる Browsersync からはじめる作業効率化・春
BuddyPressの導入からカスタマイズまでの日記
Ad

Viewers also liked (20)

PPTX
Mithril - 軽量/高速なMVCフレームワーク
PPTX
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
PPTX
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
PPTX
ゲームエンジニアのためのデータベース設計
PPTX
flow による型のある世界入門
PPTX
法規制後でも個人で楽しむ ドローン入門 2016・秋
PPTX
秋葉原IT戦略研究所のご紹介
PPTX
アイデアスケッチ テンプレート
PDF
GEEK ACADEMY REAL Vol.2. 「最先端のデータ解析/Apache Sparkを利用したレコメンドエンジン開発」
PPTX
とらのあなエンジニア採用イベント 2017年2月9日
PDF
Spark Streamingで作る、つぶやきビッグデータのクローン(Hadoop Spark Conference Japan 2016版)
PPTX
[Anitech] ITでアニメを考える、「ShangriLa Meetup5」
PPTX
アニメ聖地デザインパターン
PPTX
ラブライブ!サンシャイン!!入門書 (A4 縦向き)
PPTX
リンスタしくじり先生_2016春リンスタ関ヶ原
PPTX
せいまち〜聖地探訪に出会いを求めるのは間違っているだろうか〜
PDF
Mobage を支える Ruby の技術 ~ 複数DB編 ~
PPTX
戦慄企画迷宮~新規事業が生まれるまで~
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
PDF
Flowtype Introduction
Mithril - 軽量/高速なMVCフレームワーク
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
ゲームエンジニアのためのデータベース設計
flow による型のある世界入門
法規制後でも個人で楽しむ ドローン入門 2016・秋
秋葉原IT戦略研究所のご紹介
アイデアスケッチ テンプレート
GEEK ACADEMY REAL Vol.2. 「最先端のデータ解析/Apache Sparkを利用したレコメンドエンジン開発」
とらのあなエンジニア採用イベント 2017年2月9日
Spark Streamingで作る、つぶやきビッグデータのクローン(Hadoop Spark Conference Japan 2016版)
[Anitech] ITでアニメを考える、「ShangriLa Meetup5」
アニメ聖地デザインパターン
ラブライブ!サンシャイン!!入門書 (A4 縦向き)
リンスタしくじり先生_2016春リンスタ関ヶ原
せいまち〜聖地探訪に出会いを求めるのは間違っているだろうか〜
Mobage を支える Ruby の技術 ~ 複数DB編 ~
戦慄企画迷宮~新規事業が生まれるまで~
Cookpad Summer Intern 2015 - Programming Paradigm
Flowtype Introduction
Ad

Similar to JS と Canvas で作るシューティングゲーム (11)

PDF
Html canvas shooting_and_performanceup
PDF
Canvas de shooting 制作のポイント
PPTX
Unity勉強会ハンズオン
PDF
Unity Introduction from 2D shooting game.
PDF
2012 03-03-titanium plusquicktigame2d
PDF
JSで対戦できるゲーム作った
PDF
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
PDF
enchant.jsでゲーム制作をはじめてみよう
PDF
enchant.js meetup Tokyo vol.2 Tutorial
PPTX
Html5+javascriptでゲーム開発
PPTX
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Html canvas shooting_and_performanceup
Canvas de shooting 制作のポイント
Unity勉強会ハンズオン
Unity Introduction from 2D shooting game.
2012 03-03-titanium plusquicktigame2d
JSで対戦できるゲーム作った
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう
enchant.js meetup Tokyo vol.2 Tutorial
Html5+javascriptでゲーム開発
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン

JS と Canvas で作るシューティングゲーム