アフィリエイト広告を利用しています
最新記事
検索
プロフィール
てぅちかさんの画像
てぅちか
  • ・禁煙4年目
  • ・禁パチ挫折
  • ・禁睡眠薬2年目
  • ・猫様との同居生活2年目

 ブログランキング・にほんブログ村へ

にほんブログ村 ゲームブログ ブラウザゲームへ
にほんブログ村 IT技術ブログ JavaScriptへ
プロフィール
最新コメント
現在HTML調整中・・・・・・ by てぅちか (04/16)
月別アーカイブ
タグクラウド
ブログはこちらからお借りしてます A8ネット A8ネット サーバーはこちらを……借りたい ミックスホスト ミックスホスト エックスサーバー エックスサーバー

広告

posted by fanblog

2021年05月12日

【JavaScript】動いたよ!!【サーバーアップ】

今日こそは何か動くものを作るぞ!

■参考サイトまずは前回把握したサンプルスクリプトの中から、画像の表示に関する部分だけを取り出してみます。

エックスサーバーエックスサーバーミックスホストミックスホストにほんブログ村 にほんブログ村へ
I did it !

  • JavaScript:画像を表示する
  • JavaScript:クリックで動かす
  • サーバーにアップする

JavaScript:画像を表示する

前回はロード後の処理をざっくりまとめました。
入れ子構造の少し内側まで見たのでようやく内容がつかめてきましたが、今回はまた外側を見てみましょう。
 1.状態が変化する変数
2.毎フレーム処理を追加する関数
3.登録している毎フレーム処理を全部削除する関数
4.全てのシーンを画面から取り除く関数
5.ボタンを生成してオブジェクトを返す関数
6.ゲームのメインシーンを生成する関数
7.ゲームの結果画面シーンを生成する関数
8.起動直後はゲームシーンを追加する

抜き出した外側の階層のコメントに、上から番号を付けてみました。

この中で、画像の表示をしているのは「6.メインシーン生成関数」です。
その中にある、メインシーン生成の2行とボール画像についての4行の6行が本日の肝。それを17行目の中カッコにぶっこんで見ました。
15| //画像をプリロードしてからイベント呼び出し
16| PIXI.loader.add("img_s.svg");
17| PIXI.loader.load((loader, resources) => {
18| const gameScene = new PIXI.Container();
19| app.stage.addChild(gameScene);
20| const ball2 = new PIXI.Sprite(resources["img_s.svg"].texture);
21| ball.x = 130;
22| ball.y = 350;
23| gameScene.addChild(ball);
24| })
サンプルスクリプトでは110行目あたりの内容です。

こちらのスクリプトを日本語にしてみるとこんな感じ。
15| //画像をプリロードしてからイベント呼び出し
16| プリロードするよ("img_s.svg");
17| ロードが終わったらする処理はこれ((loader, resources) => {
18| gameSceneを新しいコンテナにするよ;
19| ステージの子にして配置するよ(gameScene);
20| ballって名前のスプライト作るよ(画像はこれ["img_s.svg"].texture);
21| ballを x = 130 に置くつもり;
22| ballを y = 350 に置くつもり;
23| gameSceneの子にして配置するよ(ball);
24| })

微妙に分からないところもあるけれど、さすがにここまで短くすると分かりやすいですね。

しかし、うまく表示されず…格闘すること2時間程。
結局スペルミスと大文字小文字の間違いが2箇所ございました。
こんなに短いのにね!!

どうにかこうにか間違いを訂正して、画像が表示できました!
ss_20210511_02.png

画像が表示されたぞ!!やっほう!!今回使用しているのはsvg画像です。
将来的に拡大縮小などの処理も試してみたかったのでベクタにしました。
サイズは150*150くらいですかね?ちょっとデフォルトサイズの見方が分からない…。
けどとりあえず表示された!

はぁー。ここまで長かった。
こんなに短いのにね…

JavaScript:クリックで動かす

とりあえず表示した画像をクリックで動かしたいので、必要なところだけ記述しましょう。
 1.状態が変化する変数
2.毎フレーム処理を追加する関数
6.ゲームのメインシーンを生成する関数 の一部
8.起動直後はゲームシーンを追加する

「1.」「2.」「8.」はそのまま記述。「6.」は前項の内容に
  • ボールをクリック可能にする
  • クリックしたときの処理
  • ゲーム本体のループ処理
  • ループ処理を毎フレーム処理にする

これらを追加します。
ボールを動かすためには「6.ゲームのメインシーンを生成する関数」があればいいのですが、

「クリックしたときの処理」と「ゲーム本体のループ処理」には「1.状態が変化する変数」
「ループ処理を毎フレーム処理にする」ために、「2.毎フレーム処理を追加する関数」

がそれぞれ必要です。
さらに、ページを開いただけで「6.」が実行されるように「8.起動直後はゲームシーンを追加する」が必要です。

と言うわけで「6.」だけ書きたくても、動かすには「1.」「2.」「8.」が必要なんですね。

1.状態が変化する変数

「score」「ballVx」「ballVy」の3つの変数をletで宣言します。
20| let score = 0;  //スコア
21| let ballVx = 2; //ボール移動速度 X方向
22| let ballVy = 0; //ボール移動速度 Y方向

古い人間なもので、宣言ってvarじゃないの?と思ってしまったてぅちかですが、
今はletかconstを使って宣言するのが主流なのですね。



 再定義再代入範囲
verできるできる関数
letできないできるブロック
constできないできないブロック

という理解でいいのかな?参考サイトはこちらです。


2.毎フレーム処理を追加する関数

前回調べたティッカーに関数を登録する関数です。
ここで登録されたものが毎フレーム処理されるようになります。
25| function addGameLoop(gameLoopFunction){
26|  app.ticker.add(gameLoopFunction);
28| }


6.ゲームのメインシーンを生成する関数 の一部

31| function createGameScene() {
34|  score = 0;//スコア初期化
35|
36|  const gameScene = new PIXI.Container();//ゲームシーン生成
37|  app.stage.addChild(gameScene); //ゲームシーンをステージに追加
38|  const ball = new PIXI.Sprite(resources["img_s.svg"].texture);//ボールをスプライト化
39|  ball.x = 130;
40|  ball.y = 350;
41|  ball.interactive = true; //クリック可能に
42|  ball.on("pointerdown", () => //クリック時に呼ぶ関数
43|  {
44|   score++;
45|   ballVy = -8;
46|   if (ballVx < 1 || ballVx > -1) { ballVx += 1; } //☆停止からの復帰
47|   else if (ballVx >= -10 || ballVx <= 10) { //☆速度10まで追い打ち
48|    ballVx *= 1.2;
49|   }
51|  });
52|  gameScene.addChild(ball); //ボールをゲームシーンに追加

ゲームシーンを追加する関数の前半です。
(☆印の項目はてぅちかが付け加えたもの)

36行目から40行目、52行目に前項の内容がありますね。
その続き、41行目で「.interactive」「true」にすることで「ball」をクリックできるようにして、「.on("pointerdown",()=>{});」でクリック時に起こしたい処理を書いていきます。

この後、本来ならテキストに関する処理をいれて、スコアを表示するのですが今回はスキップします。

57|  function gameLoop() {
59|   if (score === 0) return;
60|
61|   ball.x += ballVx; // ボールに速度を加算
62|   ball.y += ballVy;
63|
64|   if (ball.x > 268) { //X方向の挙動 壁で反射
65|    ball.x = 268;
66|    ballVx = -ballVx;
67|   }
68|   if (ball.x < 0) {
69|    ball.x = 0;
70|    ballVx = -ballVx;
71|   }
72|   ballVy += 0.1; //Y方向の挙動 重力
73|   if (ball.y <= 0) {//☆上に壁を作って跳ね返るようにする
74|    ball.y = 0;
75|    ballVy = -ballVy; //Y 跳ね返る
76|   }
77|   if (ball.y > 460) {//☆下に壁を作って落ちないようにする
78|    ball.y = 460;
79|    ballVy = -ballVy / 2; //Y 落ちたら跳ね返る
80|    ballVx *= 0.8; //X 摩擦で止まる
81|   }
85|  }

後半。本来はX方向の壁しかないのですが、どうしてもボールを取り落してしまうので動作確認用にY方向にも壁を作りました。
永遠にボールをつんつんできます。

てぅちかは本当にお手玉ができないので、こうしなければクリックするたびに加速し続けて、ボールが残像を残して反復横移動をする事に気づけなかったと思います。※気づいたので、47行目でクリック加速を10までに制限しました

8.起動直後はゲームシーンを追加する

90| createGameScene();

最期の一文。
これはロード後に行う処理の地の文に書かれているので、ページが読み込まれたらすぐに実行されます。
実行内容は「createGameScene()」なのでゲームが起動します。

サーバーにアップする

VScodeのローカルサーバで動作確認はできるのですが、せっかくなので本当のサーバーにアップしてみました。

 お手玉テスト http://juz.r.ribbon.to/teutika/01otedama.html

こちらはずいぶん昔から使わせていただいている無料サーバーなのですが、強制的に画面下に広告が入ってしまう上に、エンコード違いの為文字化けしてしまうんですよね。でも無料なので愛用しています。すごく放置しても消されない。ありがたい。きっとサービス終了まで使わせていただいてると思います。
強制の広告が嫌な人は有料のレンタルサーバーを借りましょう。私もいつかお借りしたい!

現在はなんのゲーム性もありませんが、動くものが出来て満足です♪
次回は今回スルーしていたテキスト表示と、画面の遷移あたりをやっていこうと思います!

当日追記

おや、おやおやおや!?
ss_20210512.png
こちら、スマホで確認した画面です。SVGがちっちゃいな??!
HTMLの方は60*60で指定してあるので固定サイズですが、スクリプト内でも大きさ指定をしないといけない感じかな?

これも次回の課題ですね!


利用中の無料サーバー
●リボンネットワーク http://ribbon.to/

いつか借りたい有料サーバー
ミックスホストミックスホストエックスサーバーエックスサーバー

ブログ村に登録してみました
にほんブログ村 にほんブログ村へ 1日1クリックで応援いただけたら嬉しいです。
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/10721187
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は30日以上新しい記事の更新がないブログに表示されております。