#author("2019-07-15T02:12:17+00:00","default:cho","cho") #author("2019-07-15T02:12:30+00:00","default:cho","cho") [[oc2019]] このページでは、当日資料では紹介していない命令・変数などを紹介しています。 *プログラムの構成 [#a96da06a] -プログラムはJavaScript(EcmaScript6)で記述します。 -ゲームに登場するキャラクタの種類ごとに「クラス」を定義します。 --ゲーム全体の流れを制御するものも、クラスで定義します(Titleや Startなど) -それぞれのクラスには「親クラス」を指定します。 --親クラスには、通常のActorを指定します。 --親クラスの機能をそのまま使うことができます。 //クラス定義 class クラス名 extends 親クラス名 { *main() { //動作 } } //(クラス定義は複数可能) setMain(最初に実行するクラス名); *クラス Actor [#ad4ee3bd] **フィールド(変数) [#b74be1e5] フィールドは、それぞれのクラスの中でthis.xxx というように、 頭にthis. を付けて使います. 例: class Start extends Actor { *main() { new Player(); } } class Player extends Actor { *main() { // (100,200)の場所に,2倍に拡大して表示 this.x=100; this.y=200; this.p=$pat_neko+0; this.scaleX=2; } } setMain(Start); また,オブジェクトを最初に作るときには{ }内に「名前:値」の形式でそれぞれのフィールドを指定することができます. class Start extends Actor { *main() { // (50,250)の場所に,3倍に拡大して表示 new Player({x:50, y: 250, p:$pat_neko+10, scaleX:3}); // (200,200)の場所に"OC"を黄色で表示 new Title({x:200,y:200,text:"OC", fillStyle:"yellow"}); } } class Player extends Actor { *main() { } } class Title extends Actor { *main() { } } setMain(Start); -x : オブジェクトのx座標をあらわします -y : オブジェクトのy座標をあらわします -p : 表示する画像の番号をあらわします。 -zOrder : オブジェクト同士が重なった場合、この値が小さい方が手前に表示されます。 -alpha : 表示する画像の透明度を指定します(255-0)。 -scaleX : オブジェクトの横方向の拡大率を指定します.scaleYが未定義の場合は縦方向にもscaleXの拡大率が適用されます。 -scaleY : オブジェクトの縦方向の拡大率を指定します -rotation : オブジェクトの回転を指定します.右回りで指定した値の角度だけ回転します。 -text : textに値がセットされると,文字を表示します(キャラクタパターンは表示されなくなります) -size : 文字の大きさをあらわします -fillStyle : 文字の色などをあらわします(JavascriptのCanvasにおけるfillStyleと同じ書式です) -align: "center" "left" "right"のいずれかを指定します.xの値であらわされる横位置がそれぞれ文字の中央,左端,右端になるように表示します. **メソッド(命令) [#id28b3c3] :yield| yield; を実行するとその時点でそのオブジェクトの動作を停止し、他のオブジェクトに動作を譲ります。yield n; のように後ろに数値をつけると、指定されたフレーム数待機します 以下の命令は、それぞれのクラスの中でthis.xxxx( ) のように使います。 ( )の中には引数を指定する場合があります。 :getkey(n)|nで指定した名前のキーが押されていなければ0を、押されていれば1以上を返します 押された瞬間は1が返され、それ以上押し続けていると1より大きい値が返されます :die() |オブジェクトを消滅させます :isDead() | オブジェクトが消滅しているかどうかを判定します :crashTo(obj) | 指定されたオブジェクトobjと衝突しているかを調べます。 衝突していればtrue、していなければfalseを返します :crashTo(Class)|指定されたクラスClassのオブジェクトのうちどれか衝突しているかを調べます。 衝突していれば衝突したオブジェクトのうちどれかを返し、衝突していなければnullを返します :allCrash(Class)|指定されたクラスClassのオブジェクトのうち、衝突しているものをすべて配列で返します :all(Class)|指定されたクラスClassのオブジェクトをすべて配列で返します //getCrashRect :within(obj,d)|このオブジェクトとobjとの距離がd以下であればtrue,そうでなければfalseを返します. :crashTo(Class,d)|このオブジェクトがClassで指定されるクラスのオブジェクトのうちどれかとの距離がd以下であれば,そのうちどれか1つのオブジェクトを返します.そうでなければnullを返します :allWithin(Class,d)|Classで指定されたクラスのオブジェクトのうち,自分との距離がd以下のすべてのオブジェクトをあらわすTQueryオブジェクトを返します. //hide //show //draw :print(msg)|画面に文字を表示します。デバッグ用です :color(r,g,b)|指定したRGB値に対応する色を表す文字列を返します :loadPage(Class)|指定したクラスで新しいページ(場面)を作成します :screenOut()|このオブジェクトが画面外に出ている場合、はみ出したピクセル数を返します。画面内にいる場合は0を返します :rnd()|0から1までの実数乱数を返します :rnd(n)|0以上n未満の整数乱数を返します :sin(d), cos(d)|角度d(度数法)の正弦,余弦を返します :rad(d)|角度d(度数法)をラジアンに変換します :deg(r)|角度r(ラジアン)を度数法に変換します :atan2(y,x)|線分(0,0)-(x,y)とx軸のなす角を度数法で返します ※yが先,xが後です. :atanxy(x,y)| 線分(0,0)-(x,y)とx軸のなす角を度数法で返します ※xが先,yが後です. :abs(v)|絶対値 |v| を返します :sqrt(t)| 平方根 √t を返します :dist(dx,dy)| 線分(0,0)-(dx,dy)の長さを返します :dist(obj)|オブジェクト obj とこのオブジェクト間の距離を返します :angleDiff(a,b)|角度a-b と同じ向きを持つ、-180 から 179 までの角度を返します.angleDiff(a,b)の値が正のとき、a から b に 至るには 左回り(aを減らす)が近く、負のときは右回り(aを増やす) のほうが近くなります. :floor(x)| xを超えない最大の整数を返します :ceil(f)| f以上の最小の整数を返します. :trunc(f)| fの小数点を除いた値を返します. fが正の値の場合、floorと同じ値を返し、fが負の値の場合、ceilと同じ値を返します. :clamp(v,a,b)| vの値がa~bの範囲内に収まっていればv自身を返します。 vの値がa~bの範囲をはみ出していれば、aまたはbのうちvに近いほうの値を返します。 a<=b、a>=b いずれでも可 :clamped(v,a,b)| clamp(v,a,b)-v と等価です。(はみ出した分の差を返す) *グローバル変数 [#m72352ab] グローバル変数は、すべてのクラスから読み書きすることができます。 //-[[$Boot>Boot]] :$mouseX, $mouseY|マウスカーソルの座標(横の位置と縦の位置)を表します :$touches[n].x, $touches[n].y | n番目の指のタッチされている座標(n=0,1,2,3) :$touches[n].touched | n番目の指がタッチされていれば1以上、そうでなければ0 :$screenWidth,$screenHeight|画面の幅と高さ :$Screen.resize(w,h)|画面の幅と高さを変更します *グローバル変数を自分で定義する [#c2476330] グローバル変数を自分で定義するときは、 window.$score=0; のように、頭にwindow.をつけてください。 一度定義したグローバル変数は $name のようにwindow.をつけなくても使えるようになります *クラス BodyActor [#rdb2746c] (このクラスは2019年のオープンキャンパスでは紹介していません) 物理運動するオブジェクトはこのクラスを継承してください。 **フィールド(変数) [#f7590850] Actorのフィールドの他に、次のフィールドはそれぞれ特別な意味をもちます。 -density --物体の密度(重さ/大きさ) -friction --物体の摩擦係数 -restitution --物体の反発係数 -shape --物体の衝突判定を円にするには"circle"を、長方形にするには"box"を指定します。 -width、height --物体の衝突判定の幅と高さ(ピクセル数)を指定します。 --これらが指定されていると自動的に衝突判定の形状は長方形になります -radius --物体の衝突判定の半径(ピクセル数)を指定します。 --これが指定されていると自動的に衝突判定の形状は円になります -vx,vy --横方向、縦方向の速度(1フレームあたり・ピクセル数)を指定します --代入することで速度を変更できます -vrotation --1フレームあたりの回転速度を表します --代入することで回転速度を変更できます -manualRotation --これをtrueに設定すると、物体が回転してもオブジェクトの見かけは回転しなくなります。例えば、キャラクタを物理運動させつつも、見かけ上は常に直立しているように見せることができます。 ※ width,height,radiusがいずれも指定されていない場合、フィールドpの値によって指定される画像の大きさ、およびscaleX,scaleYにより物体の衝突判定を決定します。 **メソッド(命令) [#f284bc03] :contactTo(obj)|指定したオブジェクトにぶつかっていればtrue、そうでなければfalseを返します :contactTo(Class)|指定したクラスのオブジェクトのうちどれかぶつかっていればそのオブジェクトのうちの1つを、そうでなければnullを返します //=クラス Button