質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1083閲覧

テトリス制作 回転した時の当たり判定の位置修正を方法を知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/11 06:37

編集2022/08/12 11:31

提示画像ですがテトリスのブロック回転でブロックのある場所と重なったときに左右に移動して画面の内側に留まるという処理のバグなのですが提示コードのように実装しているのですがブロックによって外側に出てしまいます。これはどう実装したらいいのでしょうか?

現状

両方のめり込み量を計算して少ない方に座標を足し引きしています。

実装したいこと

右端や左端回転した時に重なった時にめり込みをどうしたらいいのか知りたい。

イメージ説明
イメージ説明

cpp

1 2 if(isRotate == true) 3 { 4 int leftMove = 0; 5 int rightMove = 0; 6 7 /* right */ 8 glm::ivec2 pos = position; 9 for(int y = 0; y < 4; y++) 10 { 11 for(int x = 0; x < 4; x++) 12 { 13 if( (piece[y][x] == (byte)1) && (stageBoard[pos.y + y][pos.x + x] != 0) ) 14 { 15 rightMove += 1; 16 pos.x += -1; 17 } 18 } 19 } 20 21 /* left */ 22 for(int y = 0; y < 4; y++) 23 { 24 for(int x = 0; x < 4; x++) 25 { 26 if( (piece[y][x] == (byte)1) && (stageBoard[pos.y + y][pos.x + x] != 0) ) 27 { 28 leftMove += 1; 29 pos.x += 1; 30 31 } 32 } 33 } 34 35 if(leftMove < rightMove) 36 { 37 if(leftMove == 0) 38 { 39 position.x += -rightMove; 40 } 41 else 42 { 43 position.x += leftMove; 44 } 45 } 46 else 47 { 48 position.x += -rightMove; 49 } 50 } 51

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

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

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

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

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

ak.n

2022/08/12 00:04

「左の壁にあたっていたら右側に押し戻すように、右の壁にあたっていたら左側に押し戻すように」 したらいかがでしょうか。 添付ですと、「左だろうが右だろうがとにかく壁にあたっていたら右に、押し戻すかと思ったら、次の判定では左に押し戻す」ことにしています、その後の移動処理もなんかへんです。 移動処理に if など必要ないです。 leftMove と rightMove はどちらか一方のみが 1 ということが保証されるなら、 postion.x += rightMove - leftMove; でいいですよね。
退会済みユーザー

退会済みユーザー

2022/08/12 00:07

なるほど質問ですがこの場合は壁ですが他のブロックが配置されている場合などの場合も含めたちゃんとした処理を作りたいのですがその場合どうすればいいんのでしょうか?実装原理が思いつきません。
guest

回答1

0

ベストアンサー

以下の参考サイトを参考に個別にめり込み量を修正するやり方で実装しました。

参考サイト:https://tetris.fandom.com/wiki/SRS#Wall_Kicks

投稿2022/08/12 02:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問