提示画像ですがテトリスのブロック回転でブロックのある場所と重なったときに左右に移動して画面の内側に留まるという処理のバグなのですが提示コードのように実装しているのですがブロックによって外側に出てしまいます。これはどう実装したらいいのでしょうか?
現状
両方のめり込み量を計算して少ない方に座標を足し引きしています。
実装したいこと
右端や左端回転した時に重なった時にめり込みをどうしたらいいのか知りたい。
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
「左の壁にあたっていたら右側に押し戻すように、右の壁にあたっていたら左側に押し戻すように」
したらいかがでしょうか。
添付ですと、「左だろうが右だろうがとにかく壁にあたっていたら右に、押し戻すかと思ったら、次の判定では左に押し戻す」ことにしています、その後の移動処理もなんかへんです。
移動処理に if など必要ないです。
leftMove と rightMove はどちらか一方のみが 1 ということが保証されるなら、
postion.x += rightMove - leftMove;
でいいですよね。
なるほど質問ですがこの場合は壁ですが他のブロックが配置されている場合などの場合も含めたちゃんとした処理を作りたいのですがその場合どうすればいいんのでしょうか?実装原理が思いつきません。
回答1件
あなたの回答
tips
プレビュー