お久しぶりです、また質問させてもらいます。よろしくお願いします。
テトリスで回転させる処理を作ろうとしたのですが回転がおかしくなり
計算しているやり方を見てはもらえないでしょうか?
こんな感じです
#include<stdio.h>
#include <math.h>
#include <conio.h>
#include"Console.h"
#define M_PI 3.14159265358979323846
//テトリス構造体
struct Tetris{
double x;
double y;
};
//メイン関数
int main()
{
//処理構造
//Init();
//Update();
//Drow();
//Relsesu();
double sin_c[4];
sin_c[0] = 0.0;
sin_c[1] = 90.0;
sin_c[2] = 180.0;
sin_c[3] = 270.0;
//テトリスブロック
Tetris t_date[4];
t_date[0].x = 0.0;
t_date[0].y = 0.0;
t_date[1].x = 1.0;
t_date[1].y = 0.0;
t_date[2].x = 2.0;
t_date[2].y = 0.0;
t_date[3].x = 3.0;
t_date[3].y = 0.0;
double p_kakudo = 0;
double c_x, c_y;
int backbuffer[20][20] ;
CConsole Cc;
double e_x, e_y;
int count = 0;
while(1)
{
//バックバッファの初期化
for(int b_x = 0; b_x <10; b_x++)
{
for(int b_y = 0; b_y <20; b_y++)
{
backbuffer[b_x][b_y] = 0;
}
}
//角度変更
p_kakudo = sin_c[count] / M_PI *180.0 ;
//テトリスをバックバッファに出力
for(int i = 0; i < 4; i++)
{
e_x= (t_date.x * cos(p_kakudo) - t_date.y * sin(p_kakudo));
e_y = (t_date.x * sin(p_kakudo) + t_date.y * cos(p_kakudo));
backbuffer[5 + (int) e_x] [ 5 + (int) e_y] = 1;
//
}
//画面表示
Cc.SetCursorPosition(0, 0);
for(int y = 0; y <20 ; y++)
{
for(int x = 0; x < 10; x++)
{
Cc.SetCursorPosition(x, y);
if(backbuffer[x][y] == 1)
{
printf("A");
}else
{
printf(" ");
}
}
}
//キーを押したら次の角度へ移行
getch();
//3版目を終えあら最初の角度に戻る
if(count == 3)
{
count = 0;
}else
{
count += 1;
}
}
getch();
}
テトリスの回転について
Re: テトリスの回転について
コードはBBcodeを有効にした状態でcodeタグで囲み、かつ適切なインデントをしていただけると、見やすくてありがたいです。
Not Tetris 2ならまだしも、「普通」のテトリスならブロックの処理に実数や三角関数を使う必要は無いはずです。
無駄に三角関数を使っている上、単純な整数へのキャストを行っているので、実行はしていないですが誤差の影響を受けているかもしれません。
Not Tetris 2ならまだしも、「普通」のテトリスならブロックの処理に実数や三角関数を使う必要は無いはずです。
無駄に三角関数を使っている上、単純な整数へのキャストを行っているので、実行はしていないですが誤差の影響を受けているかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
ガラくた屋
Re: テトリスの回転について
みけCATさん 返答ありがとうございます。
またすいませんcodeとインデントは気を付けます。
難しく考えてしまってたのか三角関数を使ってやろうとしてのが悪かったんですね。
無理せずできるところからやってみます。
またすいませんcodeとインデントは気を付けます。
難しく考えてしまってたのか三角関数を使ってやろうとしてのが悪かったんですね。
無理せずできるところからやってみます。