このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

enchant.js HTML5+JavaScript 重力のあるボール挙動

JavaScript

2013.02.28

この記事は最終更新日から1年以上が経過しています。

いやー。楽しいですね。enchant.jsは。

重力のあるボール挙動のscriptを書いてみました。ボールをドラッグ出来て、放り投げることも可能です。

何より便利だなと感じたのは、「touchstartでクリックスタート」「touchendでクリックエンド」などもカバーしてくれているところです。

デモページ

http://webcyou.com/demo/js/enchant/ball/

こちらのscriptの詳細に関しては以前の記事、

ActiinScript2.0 ボールアクション 重力、摩擦、跳ね返り係数

を参照して頂ければと思います。

順番を追って制作されたい方は以下の順を参照してください。

ActionScript 簡単なイージング

https://www.webcyou.com/?p=637

ActionScript2.0 ボール反転

https://www.webcyou.com/?p=1636

ActiinScript2.0 縦横移動ボールアクション

https://www.webcyou.com/?p=1645

ActiinScript2.0 縦横移動 ボールを掴む

https://www.webcyou.com/?p=1655

ActiinScript2.0 縦横移動 ボールを掴んで投げる

https://www.webcyou.com/?p=1668

ActiinScript2.0 ボールアクション 重力、摩擦、跳ね返り係数

https://www.webcyou.com/?p=1676

そう、ActionScriptで記述していたのを持って来る感じで流用できるところがenchant.jsの素晴らしいところだったりしますね。

要点のみ挙げていきたいと思います。

enchant();

おまじない。全ての始まりはここから。

var game = new Game(320, 320);

ゲームのステージの幅を決めます。

enchant.Class.create()

容易にクラス(という考え)を生成することが出来ます。

initializeのメンバーが最初に実行されるようになっております。

this.addEventListener("touchstart",this.onTouch);
this.addEventListener("touchmove",this.onTouchMove);
this.addEventListener("touchend",this.onTouchEnd);

本来なら、スマートフォンでのタッチのイベントのみを取得するのですが、enchant.jsではクリックにも対応している。

this.addEventListener('enterframe', this.onEnterFrame);

enterframeのイベントを取得。Flash同様の要領でscriptを記述していける。

game.onload = function() { var ball000 = new ball(100, 100); };

new演算子でコンストラクタの生成。x座標100px 、y座標100pxに配置。

game.start();

いけ。

最後の全部のスクリプトを

HTML & CSS

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no"> 
<meta name="apple-mobile-web-app-capable" content="yes">
<script type="text/javascript" src="enchant.js"></script>
<script type="text/javascript" src="main.js"></script>
<style type="text/css">
body {
  margin: 0;
  padding: 0;
  background: #eee;
}
canvas { background: #fff; }
</style>
</head>
<body>
</body>
</html>

JavaScript (main.js)

enchant();
window.onload = function() {
  var game = new Game(320, 320);
  game.preload('ball.png');
  game.speedX = 5;
  game.speedY = 5;
  game.ballHold = 0;
  game.x1 = 0;
  game.x2 = 0;
  game.y1 = 0;
  game.y2 = 0;

  var ball = enchant.Class.create(enchant.Sprite, {
    initialize: function(x, y) {
      enchant.Sprite.call(this, 50, 50);
      this.x = x;
      this.y = y;
      this.image = game.assets['ball.png'];

      this.addEventListener("touchstart",this.onTouch);
      this.addEventListener("touchmove",this.onTouchMove);
      this.addEventListener("touchend",this.onTouchEnd);
      this.addEventListener('enterframe', this.onEnterFrame);      
      game.rootScene.addChild(this);
    },
    onTouch : function(e) {
      game.ballHold = 1;
    },
    onTouchMove : function(e) {
      this.x = e.x -25;
      this.y = e.y -25;
    },
    onTouchEnd : function(e) {
      game.ballHold = 0;
    },  
    onEnterFrame : function(){
      if(game.ballHold == 1) {
        game.x1 = game.x2;
        game.y1 = game.y2;
        game.x2 = this.x;
        game.y2 = this.y;
        game.speedX = (game.x2 - game.x1);
        game.speedY = (game.y2 - game.y1);
      } else {
        if (this.x > 320 - this.width) {
          this.x = 320 - this.width;
          game.speedX = game.speedX*-1*0.8;
        }
        if (this.x < 0){
          this.x = 0;
          game.speedX = game.speedX*-1*0.8;
        }
        if (this.y < 0) {
          this.y = 0;
          game.speedY = game.speedY*-1*0.8;
        }
        if (this.y > 320 - this.height) {
          this.y = 320 - this.height;
          game.speedY = game.speedY*-1*0.8;
        }
        game.speedX = game.speedX*0.99;
        game.speedY = game.speedY*0.99+0.98;
        this.x += game.speedX;
        this.y += game.speedY;
      }
    }
  });
  game.onload = function() { var ball000 = new ball(100, 100); };
  game.start();
};

ではでは。

Comment

Related Article

JavaScriptで、DOMを放り投げる処理

2024.07.27

2022 VIVA JS World Cup 開幕!! 〜 Vue3で作るサッカーゲーム 〜

2022.12.24

OAuthのフローを可視化できるツールを作ってみました。

2020.05.17

令和の時代に、JavaScriptで Shift-JISファイル作成 全銀データフォーマットに対応する。

2020.03.03

インターネットにて世論調査を行う「世論Web」サービスを始めてみました。

2020.01.31

年末のレトロゲーム熱の際、ファミコンソフト一覧パッケージ作ってました。

2020.01.24

あと10日で「jsdo.it」のサービスが終わってしまう!! ソースダウンロードまだの方は急げぇ〜!

2019.10.21

正規表現 先読み後読み 論理積

2019.07.28

「二段階認証?」という方も 5分で覚える パスワードレス WebAuthnのまとめ

2019.07.07

上級者向け JavaScript 問題集 「javascript-questions」日本語翻訳担当してます。

2019.06.22

CATEGORY LIST

LATEST NEWS

Mac VSCodeで、SFML C++開発環境を作る。

C++

2024.09.09

Rust-SDL2 examplesをすべて試す

Rust

2024.09.01

JavaScriptで、DOMを放り投げる処理

JavaScript

2024.07.27

Rustで創る MOS 6502 CPU その2

Rust

2024.07.23

Rustで創る MOS 6502 CPU その1

Rust

2024.07.19

汎用 3D mesh/model viewerを求め。と、簡単に、FBXファイルをglTF(glb)に変換ツールを求め。

C++

2024.06.06

M1 Macで、OpenGL GLUTを使ってコンパイルする

C

2024.04.27

Rust - Actix Web mongo ユーザー登録 JWT認証

Rust

2024.03.24

Rust - Actix Web JWT 認証認可 APIの作成

Rust

2024.02.25

Rust - Actix Web × JSON 静的ファイルをAPIで返却

Rust

2024.01.19

Rust - Actix Web × MongoDB環境をサクッと起動

Rust

2024.01.18

5分で学ぶ RustでWave Function Collapse (波動関数崩壊アルゴリズム)

Rust

2024.01.15

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US