🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

1346閲覧

JavaScript Object内での計算

Kaede0902

総合スコア32

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2019/10/23 05:17

ゲームを作っていて,キャラクターの三角形を描画して,キーに応じて移動させて,再描画したいのです.

Objectやそれを構築するclass, constructorの概念を知って,

js

1let player_x = 100; 2let plyaer_w = 50; 3let plyaer_speed = 1000;

のように宣言しまくるのを

js

1class MOB { 2 constructor(left, right, top, bottom, 3 color, speed, HP, direction,) { 4 5 this.left = left; this.right = right; 6 this.top = top; this.bottom = bottom; 7 8 this.color = color; this.speed = speed; 9 this.HP = HP; this.direction = direction; 10 11 this.center_x = ( this.left + this.right ) /2 12 this.center_y = ( this.bottom + this.top ) /2 13 } 14} // once construted, if re-assigned value, 15const player = new MOB( 16 500 -15, 500 + 15, 17 500 -60 , 500 + -10, 18 '#FFF', 15, 500, 1, 19);

の ように簡単にMOBを作れるように組んだのですが,動かす段階に至って
このthis.center.xはthis.leftが変化しても再計算されないし,
上下,左右,中央の情報は元の値を元に常に再計算されないとバグると気づきました.

  • 衝突判定を楽に作るためにthis.leftの名前は使いたいです.

このようにobject内でobject内の一つの変数を元にして再計算されるものを書くことは
可能でしょうか??

それともコードが冗長に見えても,そもそも一つ一つ

js

1let player_x = 100; 2let plyaer_y = 100; 3let plyaer_w = 10; 4let player_left = player_x; 5let player_right = player_x + player_w;

とするべきなんでしょうかこの場合は?

初心者なので説明が下手で,ググる言葉も下手なのか全く記事にたどり着けませんでした

回答いただけるとありがたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

お好きな方法をどうぞ。

  • this.center_x, this.center_y を関数にして再計算
  • this.center_x, this.center_y をgetterにして再計算(class get, `Object.defineProperty

`)

  • this.center_x, this.center_y 以外をsetterにして再計算
  • getter/setterの代わりに new Proxy を使って再計算

Re: Kaede0902 さん

投稿2019/10/23 10:08

think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「JavaScript class セッター」でググると、お求めのものが見つかると思います

投稿2019/10/23 05:24

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

class ブロックに書く constructor() は「初期化」しかしません。

例えば、右に動かすなら、moveRight() のような関数を作って、右に動かすために関連する変数(プロパティ)をすべてを処理する必要があります。

constructor() 内を見る限り、「オブジェクト:いくつもの変数をまとめた新しい処理単位」を作るところまではできていますから、メソッドで実装する例を書いてみます。

javascript

1class MOB { 2 3 constructor(){ 4 /* omitted */ 5 } 6 7 // x だけ右にうごく関数(メソッド) 8 moveRight( x ){ 9 // 左右ともにX動く 10 this.left += x; 11 this.right += x; 12 // センターは再計算 13 this.center_x = ( this.left + this.right ) /2; 14 } 15 16 // センターの再計算は class ゲッターでも書いてもいい 17/* 18 get center_x() { 19 return ( this.left + this.right ) /2 20 } 21*/ 22}

こんな感じで、欲しい機能を実装しましょう。

javascript

1let mob1 = new MOB(/* omitted */); 2mob1.moveRight( 32 ); 3console.log( mob1 ); // 右に動いたような数値になるはず。

とまぁ、超初心者向けで答えてみました。

投稿2019/10/25 10:30

編集2019/10/25 10:33
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問