値の変化の起こらない理由

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
soccerkozo

値の変化の起こらない理由

#1

投稿記事 by soccerkozo » 4年前

#include<windows.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
#include<math.h>
#include<stdio.h>

#include"init.h"
#include"draw.h"

void display(void);//描画処理
void keyboard(unsigned char key, int x, int y);//キーボードが押されたときの処理
void specialkey(int key, int x, int y);//特殊キーが押されたときの処理
void idle(void);//ウィンドウシステム・イベントがないときの処理

static double s0 = 0 , s1 = 0 , t = 0 , p = 3.1415926535;
static int d = 4;
int k = d%4;

//視点位置を記憶する構造体
typedef struct ViewPoint{

//現在の視点位置
double x;
double y;
double z;

//移動先の視点位置
int lx;
int ly;
int lz;
}VP;

//視点位置の宣言と初期化
VP vp = {0.0, 0.0, 0.0};

//キーボード入力フラグ(trueならキーボード入力有効falseなら無効)
bool K_flag = true;

//アニメーションフラグ
bool A_flag = false;

bool B_flag = false;

bool C_flag = false;

bool D_flag = false;

void main(int argc, char** argv){
glutInit(&argc, argv);//GLUTの初期化
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);//ディスプレイのモード設定
glutInitWindowSize(640, 480);//ウインドウサイズの設定
glutInitWindowPosition(200, 200);//ウインドウを作る

glutCreateWindow("sample");//ウインドウの左上に出る文字

init_gl_settings();//初期設定

glutIdleFunc(idle);//入力がない時に呼び出される関数
glutKeyboardFunc(keyboard);//キーボードからの入力を有効にする
glutSpecialFunc(specialkey);//特殊キーからの入力を有効にする

glutDisplayFunc(display);//再描画関数
glutMainLoop();//無限ループに入る

}

void display(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//画面をクリア
glMatrixMode(GL_MODELVIEW);//マトリクスモードの設定
glLoadIdentity();//単位行列にする

//視点位置の設定
gluLookAt(vp.x, vp.y, vp.z,
vp.x+sin(s0*p/180), vp.y, vp.z - cos(s0*p/180),
0.0, 1.0, 0.0);

draw_line(vp.z);//ラインを描画

glutSwapBuffers();//画面を切り替える
}

void keyboard(unsigned char key, int x, int y){

switch(key){
//Escキー
case 27:
exit(0);//プログラム終了

}

glutPostRedisplay();//再描画

}

void specialkey(int key, int x, int y){

//key_flagがtrueの時だけキーボード入力を有効にする
if(K_flag){
switch(key){
//↑が押されたとき
case GLUT_KEY_UP:
A_flag = true;//アニメーションを有効にする
K_flag = false;//キー入力を無効にする
if(k=0){
vp.lz = vp.z - 1;//移動先を現在の位置からZ方向に-1の場所に設定
}
else if(k=2){
vp.lz = vp.z + 1;//移動先を現在の位置からZ方向に-1の場所に設定
}
else if(k=1){
vp.lx = vp.x + 1;
}
else if(k=3){
vp.lx = vp.x - 1;
}

break;

case GLUT_KEY_DOWN:
B_flag = true;
K_flag = false;
k = d%4;
if(k=0){
vp.lz = vp.z + 1;
}
else if(k=2){
vp.lz = vp.z - 1;
}
else if(k=1){
vp.lx = vp.x - 1;
}
else if(k=3){
vp.lx = vp.x + 1;
}
break;

case GLUT_KEY_RIGHT:
C_flag = true;
K_flag = false;
s1 = s0 - 90;
d = d + 1;
break;

case GLUT_KEY_LEFT:
D_flag = true;
K_flag = false;
s1 = s0 + 90;
d = d - 1;
break;
}
}

glutPostRedisplay();//再描画
}

void idle(void){

//A_flagがtrueのとき
if(A_flag){
k = d%4;
if(k=0){
vp.z -= 0.01;//vp.z少しずつマイナス
if(vp.z < vp.lz){//vp.zが移動先の値をこえたとき
vp.z = vp.lz;//vp.zを移動先の値にする
A_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
printf("d=%d,k=%d",d,k);
}
}
else if(k=2){
vp.z += 0.01;//vp.z少しずつプラス
if(vp.z > vp.lz){//vp.zが移動先の値を下回ったと
vp.z = vp.lz;//vp.zを移動先の値にする
A_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
printf("d=%d,k=%d",d,k);
}
}
else if(k=1){
vp.x += 0.01;//vp.z少しずつプラ
if(vp.x > vp.lx){//vp.zが移動先の値を下回ったとき
vp.x = vp.lx;//vp.zを移動先の値にする
A_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
printf("d=%d,k=%d",d,k);
}
}
else if(k=3){
vp.x -= 0.01;//vp.z少しずつプラ
if(vp.x < vp.lx){//vp.zが移動先の値を下回ったとき
vp.x = vp.lx;//vp.zを移動先の値にする
A_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
printf("d=%d,k=%d",d,k);
}
}
}
if(B_flag){
vp.z += 0.01;//vp.z少しずつプラス
if(vp.z > vp.lz){//vp.zが移動先の値を下回ったとき
vp.z = vp.lz;//vp.zを移動先の値にする
B_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
}

}
if(C_flag){
s0 -= 1;
if(s0<s1){
s0 = s1;
C_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
}
}
if(D_flag){
s0 += 1;
if(s0>s1){
s0 = s1;
D_flag = false;//アニメーションフラグをfalseにする
K_flag = true;//キーボード入力を有効にする
}
}



glutPostRedisplay();//再描画
}
このプログラムのkの値がどうしても2のままになってしまうのですが、原因の分かる方いらっしゃいますか?
御教授願います。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 値の変化の起こらない理由

#2

投稿記事 by みけCAT » 4年前

コードはBBcodeを有効にした状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
soccerkozo さんが書きました: if(k=0){
vp.lz = vp.z - 1;//移動先を現在の位置からZ方向に-1の場所に設定
}
else if(k=2){
vp.lz = vp.z + 1;//移動先を現在の位置からZ方向に-1の場所に設定
}
else if(k=1){
vp.lx = vp.x + 1;
}
else if(k=3){
vp.lx = vp.x - 1;
}
ここを実行すると、まず、if文の条件になっているk=0が評価されます。kの値は0になり、0が帰るので条件は偽となり、else以降が評価されます。
次に、elseの次のif文の条件になっているk=2が評価されます。kの値は2になり、2が帰るので条件は真となり、このif文の直後のブロックが実行され、else以降は評価されません。
似た構造の他の部分も同様です。
よって、GLUT_KEY_UPまたはGLUT_KEY_DOWNを押すと、kの値が2になります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 値の変化の起こらない理由

#3

投稿記事 by へにっくす » 4年前

if文の条件が代入になってますね。
C言語では条件と代入の書き方が違います。
下記のリンク先にある(注1)を参照。
if文
written by へにっくす

soccerkozo

Re: 値の変化の起こらない理由

#4

投稿記事 by soccerkozo » 4年前

回答ありがとうございます。
解決しました。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 値の変化の起こらない理由

#5

投稿記事 by みけCAT » 4年前

解決したのでしたら、解決チェックをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る