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

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

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

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

Q&A

解決済

1回答

2006閲覧

テトリスのブロック回転で座標がずれてしまう原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/10/11 12:18

編集2020/10/11 12:23

参考サイトのようにテトリスのブロック回転を実装しているのですがなぜ回転するときに座標がずれてしまうのでしょうか?

Set_rotate();関数
printf("ああああ");部ですが最初の表示で-2という値が来てしまいます。 R = 0;のときです。 R = 1;にすると2という値が来てしまいます。
参考サイトでは3x3マスですが4x4なのでサイトの式の3 /2の部分を4 / 2にしています。ちなみにこれは正しいのでしょうか?ブロックの表示する座標と各ブロック座標は分けていますのでposに来るのは単一にブロックの座標です。

イメージ説明
参考サイト: https://openbook4.me/projects/56/sections/333

cpp

1 2//描画アップデート 3void Game::GenerateOutput() 4{ 5 6 //画面クリア関係 7 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 8 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 9 10 11 //ステージ 12 for (int y = 0; y < 8; y++) 13 { 14 for (int x = 0; x < 10; x++) 15 { 16 if (stage[y][x] == 1) { 17 DrawMap->DrawGraph(stage_pos.x + (CELL * x) , stage_pos.y + (-CELL * y)); 18 printf("stage: %d\n", stage_pos.x + (CELL * x)); 19 } 20 } 21 } 22 23 printf("あああああ\n"); 24 for (int i = 0; i < 4; i++) { 25 for (int j = 0; j < 4; j++) { 26 27 if (block[i][j] == 1) { 28 29 glm::ivec2 v; 30 v.x = (CELL * j); 31 v.y = (CELL * i); 32 33 Set_rotate(&v,r); 34 printf("block: %d\n", v.x); 35 36 v.x = move_sprite.x + v.x; 37 v.y = move_sprite.y + v.y; 38 39 sprite->DrawGraph(v.x, v.y); 40 41 42 } 43 } 44 } 45 46 47 48 char str[1000]; 49// sprintf_s(str, sizeof(str), "block x %.2f , y %.2f", move_sprite.x, move_sprite.y); 50 sprintf_s(str, sizeof(str),"block x %d , y %d", move_sprite.x, move_sprite.y); 51 font->RenderText(str, -CELL * 7, -CELL * 2, 0.5, glm::vec3(1.0, 1.0, 1.0)); 52 53// sprintf_s(str, sizeof(str), "stage x %.2f , y %.2f", stage_pos.x, stage_pos.y); 54 sprintf_s(str, sizeof(str), "stage x %d , y %d", stage_pos.x, stage_pos.y); 55 font->RenderText(str, -CELL * 7, -CELL * 3, 0.5, glm::vec3(1.0, 1.0, 1.0)); 56 57 58 59 glViewport(0, 0, WIDTH, HEIGHT); //ビューポート 60 glfwSwapBuffers(Window); //ダブルバッファリング 61 glfwPollEvents(); //イベント処理 62 63 64} 65 66 67void Game::Set_rotate(glm::ivec2 *pos,const int R) 68{ 69 float posX = (float)pos->x; 70 float posY = (float)pos->y; 71 72 float r[4]; 73 r[0] = cos((PI / 2.0f) * (float)R ); 74 r[1] = sin((PI / 2.0f) * (float)R ); 75 76 r[2] = -sin((PI / 2.0f) * (float)R ); 77 r[3] = cos((PI / 2.0f) * (float)R ); 78 79 glm::mat2 m = glm::make_mat2(r); 80 81 float p[2]; 82 p[0] = posX - (4.0f / 3.0f); 83 p[1] = posY - (4.0f / 3.0f); 84 85 glm::vec2 m2 = glm::make_vec2(p); 86 87 glm::vec2 t = (m * m2); 88 89 pos->x = (int)t.x; 90 pos->y = (int)t.y; 91 92 printf(" あああ: %d \n",pos->x); 93 94}

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

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

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

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

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

txty

2020/10/11 14:51 編集

https://programming.pc-note.net/c/mojiretsu7.html sprintf_sがコンパイラによると書いてあって私のではできなかったのですが、私が初めてだから聞くけど、特定のコンパイラでできないと問題は発生するのでしょうか。
退会済みユーザー

退会済みユーザー

2020/10/11 15:01

どういう意味でしょうか?
txty

2020/10/11 15:08 編集

文字を出すところを調べていて 'sprint_s' was not declared in this scop と私のコンパイラでは、その関数が使えないことがわかったんですけど、 開発や 配布のとき問題がおきないのか考えました。
退会済みユーザー

退会済みユーザー

2020/10/11 15:13

visual studio ではsprintfはバッファオーバーランの可能性の問題から使えなくて使えるのはsprintf_s();なんですよね、引数がちょっと違っていてバッファサイズを指定することになっています。
txty

2020/10/12 10:25 編集

visual studio じゃないからなんともいえませんし些細なことだと思いますが、一度聞ける人が周りにいたら聞いてみたらどうでしょうか。もし駄目なら洒落にならないし。(だってobjファイルに変換されて通るとしてもgitでソースコード取れるのでは。)()は初心者なのでよくわからないでしゃべってます。(私の環境では、sprintf ,snprintfは通った。用途わからないけど、)間違えていると嫌だから後でsprintf_sとsnprint_sも調べてみるけど追記 あと私の環境では、全部たぶん駄目だった。(こう見ると全部駄目だな)よくわからないので1度そちらで調べてください。後、数値を文字列に変えた後のコードはどうやったんですか。font->RenderText(str, -CELL * 7, -CELL * 3, 0.5, glm::vec3(1.0, 1.0, 1.0));のfontのクラスの提示をしてあったが、Freetypeのチュートリアルでもみたんですか。
guest

回答1

0

ベストアンサー

set_rotate();関数部の数式の一部を間違えていました。

cpp

1p[0] = posX - (4.0f / 3.0f); 2 p[1] = posY - (4.0f / 3.0f);

修正後

cpp

1p[0] = posX; 2 p[1] = posY;

投稿2020/10/11 14:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問