Discuss Scratch
- takkun0530
-
100+ posts
オンラインゲーム
このTopicについて
ここは、オンラインゲームのことについて話し合ったり、オンラインゲームを1から作ったりすることです。
注意
100%ペンの3Dオンラインゲーム開発機構も見てください。
ここは、オンラインゲームのことについて話し合ったり、オンラインゲームを1から作ったりすることです。
注意
- オンラインゲームについての質問は、質問コーナー3を使用してください。
- オンラインゲームの宣伝などは、宣伝、告知、依頼をするコーナーを使用してください。
100%ペンの3Dオンラインゲーム開発機構も見てください。
Last edited by takkun0530 (Oct. 8, 2019 11:03:15)
- ARATAKU
-
500+ posts
オンラインゲーム
オンラインゲームって、1から作るとすごいめんどくさいけど、基本さえ作っとけば、割と簡単だから、
このとぴっくで基本となる部分だけを作って、バックパックで誰でも使えるようにしませんかっていう
提案をしに来ました
このとぴっくで基本となる部分だけを作って、バックパックで誰でも使えるようにしませんかっていう
提案をしに来ました

- ARATAKU
-
500+ posts
オンラインゲーム
yeah.
割とこう言うのっていろんな人が作ってるから今更感がなくもないけど、他の人のより使いやすくするってことで・・・
割とこう言うのっていろんな人が作ってるから今更感がなくもないけど、他の人のより使いやすくするってことで・・・
Last edited by ARATAKU (Oct. 8, 2019 07:58:20)
- gagagagagagagaqqww
-
1000+ posts
オンラインゲーム
オンラインゲームのことはオンラインゲームのことでしょう。それ以上の説明はありますか? オンラインゲームのこととは、具体的にどのようなことでしょうか?
- daikonnbatake
-
100+ posts
オンラインゲーム
クラウド変数について2年間研究してきた人間としてこのトピックに貢献したいと思います。
オンラインゲームを作るまえに、「データを通信する」と言うことがどう言うことであるかを考える必要があります。
通信とはすなわち手紙の交換と同等の行為です。
たとえば、AさんとBさんが文通をしたいとします。
手紙を特定の個人に届ける為には必ず「住所や氏名」が必要となります。
なぜこれが必要かと言うと、Aさんが郵便局の人に「Bさんに届けてください」と言って住所の書かれていない手紙を出したとしましょう。
現実ではそもそも郵便局の人に受け取ってもらえないですが、ここでは郵便局の人が融通を利かせてBさんになんとか届けようと努力したと仮定します。そして、その町にBさんと同姓同名のB’さんもいたとします。すると、郵便局の人は50%の確率でB’さんに手紙を届けてしまうことになります。
このようなことを避ける為に、この世に一つしかない「住所」が必要なのです。住所があれば、名前を書かなくてもその場所に手紙を届けることができます。
通信の世界でも同じことが言えます。あっちこっちにデータがばら撒かれると困るので「住所」が必要です。
これが一般的に「IPアドレス」と呼ばれるものです。
Scratchでクラウド変数を使った通信にも「アドレス(住所のこと)」を使うことでうまく通信することができます。
通信の基礎はこんなもんです。
正直、説明が非常に難しいのでこれ以上はあまり語れませんが、しっかりとまとめたものをその内書こうとは思っています。
また、オンラインゲームの通信部分として、私が作った通信ライブラリ「Network Kit 2.0」(私の署名のやつです)をぜひ使ってみてください。
このライブラリを使用すれば、大量の文字列データでも最適化して数回に分けて通信を行うため、通信に関しては全く気に留めることなくゲームを作れるかと思います。
しかし、Scratchのクラウド変数の性質上どうしても1秒間に10回以上の通信が不可能なので、ターン制のゲームに止まるかと思われます。
工夫を凝らせばもっと様々なことができると思います。実際、私はこの通信方式を用いてscratch上でサーバーベースのネットワークを構築し、200000人x10240文字分のデータを保存する技術を確立しています。(現在は公開していませんが、SDTokyo2019で発表したのでその動画がYoutubeに上がっています)
私に力添えできることであれば私の都合に合わせる形となってしまいますが出来る限り協力したいと思います。
オンラインゲームを作るまえに、「データを通信する」と言うことがどう言うことであるかを考える必要があります。
通信とはすなわち手紙の交換と同等の行為です。
たとえば、AさんとBさんが文通をしたいとします。
手紙を特定の個人に届ける為には必ず「住所や氏名」が必要となります。
なぜこれが必要かと言うと、Aさんが郵便局の人に「Bさんに届けてください」と言って住所の書かれていない手紙を出したとしましょう。
現実ではそもそも郵便局の人に受け取ってもらえないですが、ここでは郵便局の人が融通を利かせてBさんになんとか届けようと努力したと仮定します。そして、その町にBさんと同姓同名のB’さんもいたとします。すると、郵便局の人は50%の確率でB’さんに手紙を届けてしまうことになります。
このようなことを避ける為に、この世に一つしかない「住所」が必要なのです。住所があれば、名前を書かなくてもその場所に手紙を届けることができます。
通信の世界でも同じことが言えます。あっちこっちにデータがばら撒かれると困るので「住所」が必要です。
これが一般的に「IPアドレス」と呼ばれるものです。
Scratchでクラウド変数を使った通信にも「アドレス(住所のこと)」を使うことでうまく通信することができます。
通信の基礎はこんなもんです。
正直、説明が非常に難しいのでこれ以上はあまり語れませんが、しっかりとまとめたものをその内書こうとは思っています。
また、オンラインゲームの通信部分として、私が作った通信ライブラリ「Network Kit 2.0」(私の署名のやつです)をぜひ使ってみてください。
このライブラリを使用すれば、大量の文字列データでも最適化して数回に分けて通信を行うため、通信に関しては全く気に留めることなくゲームを作れるかと思います。
しかし、Scratchのクラウド変数の性質上どうしても1秒間に10回以上の通信が不可能なので、ターン制のゲームに止まるかと思われます。
工夫を凝らせばもっと様々なことができると思います。実際、私はこの通信方式を用いてscratch上でサーバーベースのネットワークを構築し、200000人x10240文字分のデータを保存する技術を確立しています。(現在は公開していませんが、SDTokyo2019で発表したのでその動画がYoutubeに上がっています)
私に力添えできることであれば私の都合に合わせる形となってしまいますが出来る限り協力したいと思います。
- ARATAKU
-
500+ posts
オンラインゲーム
ターンせいで無くても、滅茶苦茶頑張れば対戦アクションも行けます
ただ、本気で頑張らないと無理。
ただ、もし、数人集まって議論できる場所があったなら出来るかも・・・って、そんな場所あるわけ無いよね~(すっとぼけ)
ただ、本気で頑張らないと無理。
ただ、もし、数人集まって議論できる場所があったなら出来るかも・・・って、そんな場所あるわけ無いよね~(すっとぼけ)
Last edited by ARATAKU (Oct. 16, 2019 12:36:07)
- daikonnbatake
-
100+ posts
オンラインゲーム
残念ながら、現環境では1秒間に10回の更新が限度となります。よってリアルタイム性のあるゲームはおそらく不可能です。 ターンせいで無くても、滅茶苦茶頑張れば対戦アクションも行けます
ただ、本気で頑張らないと無理。
ただ、もし、数人集まって議論できる場所があったなら出来るかも・・・って、そんな場所あるわけ無いよね~(すっとぼけ)
昔あった手法では1秒のラグが生じますが、1秒分のプレイヤーの座標情報などを記録したものを1秒に1回送信するという方法でアクションゲームを作っている方がいました。しかし、現在では256文字の制限があるのでかなり厳しい方法です。
Last edited by daikonnbatake (Oct. 17, 2019 01:26:57)
- tan-10
-
100+ posts
オンラインゲーム
もうこうなったらScratchDayとかで公開議論するしかないんじゃ?(←それは無理がありすぎる) ただ、もし、数人集まって議論できる場所があったなら出来るかも・・・って、そんな場所あるわけ無いよね~(すっとぼけ)
でもdaikonnbatakeさんは実際にクラウド変数の活用法についてSDで発表しているわけだし、出来ないことはないかも。
- ARATAKU
-
500+ posts
オンラインゲーム
ここがあるじゃないですか。このディスカッションフォーラムが。
まぁ、出来ることなら実際に現実で話したほうが、色々便利だし、何しろ楽しいだろうになぁとは思います。
まぁ、出来ることなら実際に現実で話したほうが、色々便利だし、何しろ楽しいだろうになぁとは思います。
Last edited by ARATAKU (Oct. 17, 2019 15:13:17)
- tan-10
-
100+ posts
オンラインゲーム
実際にみんなで話し合って、ひとつのプロジェクトを作り上げると思うと、とても面白くなりそうでつい投稿しました。
でもまずはこのディスカッションフォーラムですね。
クラウド変数をあまり使ったことはありませんが、オンラインゲームは一度作ってみたいものです。
話し合いには貢献できないかもしれませんが、時々トピックを覗かせていただきます。
でもまずはこのディスカッションフォーラムですね。
クラウド変数をあまり使ったことはありませんが、オンラインゲームは一度作ってみたいものです。
話し合いには貢献できないかもしれませんが、時々トピックを覗かせていただきます。
- korokoro19
-
100+ posts
オンラインゲーム
slither.ioがすごく参考になりますね。(同じく) griffpatchさんのBomberman v1.0も参考になりますね。ボムの爆風や、自分の位置とかがとても細かいです…
- yuzupon1133-sub
-
1000+ posts
オンラインゲーム
【この投稿は約7分で読めます】
オンラインの仕組み・・・オンラインゲームを作りたいがクローズされたのでこちらに投稿します。
まず一番わかりやすいオンラインゲームの作り方を一から説明している動画があります。
https://youtu.be/-KoHaz7ZPvo
まずはこれを見てみましょう。
オンラインゲームを作るにあたって必要不可欠なのが「データ」です。
これがないと通信ができません。まずはクラウド変数を使って、自分のプレイヤーのx座標、y座標を送るプログラムを作ってみましょう。
まずは「送信側」と「受信側」のプログラムの違いについて説明します。
「送信側」は自分のいる位置(x座標、y座標)をクラウド変数に「書き込む」プログラムです。一方
「受信側」はその書き込まれたクラウド変数を「読み込んで」「データを解析」するプログラムです。
ではなぜ「解析」しなければならないのか?クラウド変数は「256桁までの数字」しか書き込めないからです。
つまり、x座標とy座標を1つにまとめないといけません。(xとy座標を別々の変数にすることもできますが、ためにならないため割愛します。)
座標についておさらいしましょう。スクラッチではx座標は-240~240、y座標は-180~180まであります。
1つにまとめるためにはどこまでがx座標のデータなのか、どこからがy座標のデータなのかをはっきりさせないといけません。
試しに
まずは
「00」と返ってきました。では、
「50100」と返ってきました。
ここで疑問に思います。
「座標が変わるごとに桁(文字数)が変わって、どこまでがx座標、どこからがy座標かわからない!」
大丈夫です。これは正常な考えです。ではどうすればいいのか?
“桁揃え”をします。
まず桁揃えってなんや?ズバリ、
・座標が変わっても文字数が必ず一定で返ってくる!=解析できる!
というとてつもなく便利な仕組みです。
こちらがコードになります。
使い方は簡単です。例えば
x座標が-240の場合→-240
-50の場合→0-50
0の場合→0000
50の場合→0050
240の場合→0240
と、必ず4桁で出力されます。便利すぎる。
さっきの検証に戻りましょう。今度はこのようにコードを組んでください。
「00000000」と返ってきました。では、
「-2400-10」と返ってきました。
無事桁揃えができて必ず8桁になりますね。素晴らしい。
でもちょっと待ってください。クラウド変数のルールは「256桁までの数字」しか書き込めません。となると「-」が邪魔でクラウド変数に書き込めません。「-」を排除するにはどうすればいいのか。ズバリ、
“数字の自然数化”をします。
え、どうやったら負の数が正の数になるんと思っているかもしれないですが、簡単です。その数に更に数字を「足す」だけです。
座標について考えてみると、x座標は-240~240、y座標は-180~180までしかありません。
つまり一番最大の数「240」を足せばどんな数でも自然数になります。
例えば、
-240+240は0、
-100+240は140、
0+240は240、
100+240は340、
240+240は480になり、かならず自然数になることが見て取れます。そしてなにより、自然数化によって最大3桁になることです。1桁少なくすることができます。
検証に戻ります。コードを次のように書き換えます。(4を3にするのを忘れずに)
「240240」と返ってきました。では、
「140340」と返ってきました。
あの邪魔な「-」がなくなったので、いよいよクラウド変数に書き込むことが可能になります。
「送信側」のプログラムを作る・・・前に、重要なことが2点あります。
一つ目は、送信と受信の区別をつけないといけない。
二つ目は、クラウド変数は1秒間に10回までしか書き込めない(更新できない)という暗黙のレート制限がある。
順を追って説明します。まず一つ目。
これどういうことかというと、そのプロジェクトに2人いたとします。どちらも「送信側」のプログラムを実行してしまうと、1人目がクラウド変数を更新→2人目がすぐ上書き されて1人目のデータが秒で消えてしまいます。
これを回避するにはプレイヤー番号を付ける必要がありますが、説明が億劫なので今回は別の方法にします。
「受信側」のプログラムは常に実行させ、「送信側」のプログラムは「a」キーを押すとを実行させるようにします。
言葉で説明するのもあれなので、コードをお見せします。また、スプライトは猫で、マウスで動かせるようにします。
ブラウザを2つ立ち上げて、同じプロジェクトを開きます。(いわゆる二窓ってやつ)
どちらも旗を押して、片方はaキーを押します。すると、片方しか猫を操作していないのにどちらの猫も同じ座標にいることが分かります。
これがオンラインの型番です。後はプレイヤー番号を付けたり、その他アクション(向きとかコスチュームとか)を付けることもできます。
でもこれだけは言いたいのが、「オンラインゲームの作り方を教えて」だけでは的確な答えが得られないことです。
どういう動作をするのか?例えば、オンラインプラットフォーマーとオンラインブロック崩し(?)は全くプログラムが違う。
一番いい方法は「テンプレを見て学習し、そこから改造する」ことです。
これができるようになればオンラインゲームを作ることなんて楽勝でしょう。
以上になりますが、ご不明な点などございましたらお申し付けください。
オンラインの仕組み・・・オンラインゲームを作りたいがクローズされたのでこちらに投稿します。
まず一番わかりやすいオンラインゲームの作り方を一から説明している動画があります。
https://youtu.be/-KoHaz7ZPvo
まずはこれを見てみましょう。
オンラインゲームを作るにあたって必要不可欠なのが「データ」です。
これがないと通信ができません。まずはクラウド変数を使って、自分のプレイヤーのx座標、y座標を送るプログラムを作ってみましょう。
まずは「送信側」と「受信側」のプログラムの違いについて説明します。
「送信側」は自分のいる位置(x座標、y座標)をクラウド変数に「書き込む」プログラムです。一方
「受信側」はその書き込まれたクラウド変数を「読み込んで」「データを解析」するプログラムです。
ではなぜ「解析」しなければならないのか?クラウド変数は「256桁までの数字」しか書き込めないからです。
つまり、x座標とy座標を1つにまとめないといけません。(xとy座標を別々の変数にすることもできますが、ためにならないため割愛します。)
座標についておさらいしましょう。スクラッチではx座標は-240~240、y座標は-180~180まであります。
1つにまとめるためにはどこまでがx座標のデータなのか、どこからがy座標のデータなのかをはっきりさせないといけません。
試しに
((x座標) と (y座標)) と言うについて考えてみましょう。
まずは
x座標を (0) 、y座標を (0) にすると設定して、さっきのコードを実行してみましょう。
「00」と返ってきました。では、
x座標を (50) 、y座標を (100) にすると設定して、さっきのコードを実行してみましょう。
「50100」と返ってきました。
ここで疑問に思います。
「座標が変わるごとに桁(文字数)が変わって、どこまでがx座標、どこからがy座標かわからない!」
大丈夫です。これは正常な考えです。ではどうすればいいのか?
“桁揃え”をします。
まず桁揃えってなんや?ズバリ、
・座標が変わっても文字数が必ず一定で返ってくる!=解析できる!
というとてつもなく便利な仕組みです。
こちらがコードになります。
((((000) と (x座標)) の ((x座標) の長さ) 番目の文字 ::operators) と ((((000) と (x座標)) の (((x座標) の長さ) + (1)) 番目の文字 ::operators) と ((((000) と (x座標)) の (((x座標) の長さ) + (2)) 番目の文字 ::operators) と (((000) と (x座標)) の (((x座標) の長さ) + (3)) 番目の文字 ::operators))))というのは冗談で、こちらを使います。
定義 桁揃え (文字) (桁)(定義についてはこちらをご覧ください。)
[tmp v] を (文字) にする
((桁) - ((文字) の長さ)) 回繰り返す
[tmp v] を ((0) と (tmp)) にする
end
使い方は簡単です。例えば
桁揃え (x座標) (4) ::customこのようにすると、変数(tmp)が
x座標が-240の場合→-240
-50の場合→0-50
0の場合→0000
50の場合→0050
240の場合→0240
と、必ず4桁で出力されます。便利すぎる。
さっきの検証に戻りましょう。今度はこのようにコードを組んでください。
桁揃え (x座標) (4) ::customコードが組めたら座標を設定しましょう。
[tmp2 v] を (tmp) にする
桁揃え (y座標) (4) ::custom
((tmp2) と (tmp)) と言う
x座標を (0) 、y座標を (0) にすると設定して、さっきのコードを実行してみましょう。
「00000000」と返ってきました。では、
x座標を (-240) 、y座標を (-10) にすると設定して、さっきのコードを実行してみましょう。
「-2400-10」と返ってきました。
無事桁揃えができて必ず8桁になりますね。素晴らしい。
でもちょっと待ってください。クラウド変数のルールは「256桁までの数字」しか書き込めません。となると「-」が邪魔でクラウド変数に書き込めません。「-」を排除するにはどうすればいいのか。ズバリ、
“数字の自然数化”をします。
え、どうやったら負の数が正の数になるんと思っているかもしれないですが、簡単です。その数に更に数字を「足す」だけです。
座標について考えてみると、x座標は-240~240、y座標は-180~180までしかありません。
つまり一番最大の数「240」を足せばどんな数でも自然数になります。
例えば、
-240+240は0、
-100+240は140、
0+240は240、
100+240は340、
240+240は480になり、かならず自然数になることが見て取れます。そしてなにより、自然数化によって最大3桁になることです。1桁少なくすることができます。
検証に戻ります。コードを次のように書き換えます。(4を3にするのを忘れずに)
桁揃え ((x座標) + (240)) (3) ::customコードが組めたら座標を設定しましょう。
[tmp2 v] を (tmp) にする
桁揃え ((y座標) + (240)) (3) ::custom
((tmp2) と (tmp)) と言う
x座標を (0) 、y座標を (0) にすると設定して、さっきのコードを実行してみましょう。
「240240」と返ってきました。では、
x座標を (-100) 、y座標を (100) にすると設定して、さっきのコードを実行してみましょう。
「140340」と返ってきました。
あの邪魔な「-」がなくなったので、いよいよクラウド変数に書き込むことが可能になります。
「送信側」のプログラムを作る・・・前に、重要なことが2点あります。
一つ目は、送信と受信の区別をつけないといけない。
二つ目は、クラウド変数は1秒間に10回までしか書き込めない(更新できない)という暗黙のレート制限がある。
順を追って説明します。まず一つ目。
これどういうことかというと、そのプロジェクトに2人いたとします。どちらも「送信側」のプログラムを実行してしまうと、1人目がクラウド変数を更新→2人目がすぐ上書き されて1人目のデータが秒で消えてしまいます。
これを回避するにはプレイヤー番号を付ける必要がありますが、説明が億劫なので今回は別の方法にします。
「受信側」のプログラムは常に実行させ、「送信側」のプログラムは「a」キーを押すとを実行させるようにします。
言葉で説明するのもあれなので、コードをお見せします。また、スプライトは猫で、マウスで動かせるようにします。
@GreenFlag がクリックされたときこのように組めばもう完成です。実行してみましょう。(注: 自分で作ったプロジェクトは非共有でもクラウド変数は動作します。最高。)
ずっと
[x v] を (((☁ データ) の (1) 番目の文字 ::operators) と (((☁ データ) の (2) 番目の文字 ::operators) と ((☁ データ) の (3) 番目の文字 ::operators))) にする
[x v] を (-240) ずつ変える
[y v] を (((☁ データ) の (4) 番目の文字 ::operators) と (((☁ データ) の (5) 番目の文字 ::operators) と ((☁ データ) の (6) 番目の文字 ::operators))) にする
[y v] を (-240) ずつ変える
x座標を (x) 、y座標を (y) にする
end
[a v] キーが押されたとき
ずっと
桁揃え ((マウスのx座標) + (240)) (3) ::custom
[tmp2 v] を (tmp) にする
桁揃え ((マウスのy座標) + (240)) (3) ::custom
[☁ データ v] を ((tmp2) と (tmp)) にする
x座標を (マウスのx座標) 、y座標を (マウスのy座標) にする
(0.1) 秒待つ //レート回避
end
ブラウザを2つ立ち上げて、同じプロジェクトを開きます。(いわゆる二窓ってやつ)
どちらも旗を押して、片方はaキーを押します。すると、片方しか猫を操作していないのにどちらの猫も同じ座標にいることが分かります。
これがオンラインの型番です。後はプレイヤー番号を付けたり、その他アクション(向きとかコスチュームとか)を付けることもできます。
でもこれだけは言いたいのが、「オンラインゲームの作り方を教えて」だけでは的確な答えが得られないことです。
どういう動作をするのか?例えば、オンラインプラットフォーマーとオンラインブロック崩し(?)は全くプログラムが違う。
一番いい方法は「テンプレを見て学習し、そこから改造する」ことです。
これができるようになればオンラインゲームを作ることなんて楽勝でしょう。
以上になりますが、ご不明な点などございましたらお申し付けください。
Last edited by yuzupon1133-sub (Dec. 12, 2021 17:44:10)