#include "../resource/dxlib/DxLib.h"
#include <stdio.h>
#include <math.h>
#include "../header/stageback.h"
#include "../header/mode.h"
#define PI 3.141592
#define STB_MAX 20
#define STBNUM_MAX 21
typedef struct{
float x,y;
float u,v;
}stp_t;
stp_t stp[6]={{-1,1,0,0},{1,1,1,0},{-1,-1,0,1},{1,-1,1,1},{-1,-1,0,1},{1,1,1,0}};
typedef struct{
float x,y,z;
VERTEX3D stbv[6];
}stbc_t;
int stbz;
typedef struct{
int Img;
int Imgsi;
int Imgx1;
int Imgx2;
int Imgy1;
int Imgy2;
int Type;
int sidlo;
float six,siy;
float fromz,toz;
float fadfromz,fadtoz;
float zhaba;
float angl;
int resetf;
stbc_t stbc[STB_MAX];
}stbt_t;
int stbnum;
stbt_t stbt[STBNUM_MAX];
void stbtini(){
if(stbinif==0){
switch(stagemode){
case 1:
break;
case 2:
break;
case 3:
stbt[0].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/water.png");
stbt[0].Imgsi=255;
stbt[0].Imgx1=0;
stbt[0].Imgx2=255;
stbt[0].Imgy1=0;
stbt[0].Imgy2=255;
stbt[0].six=100;
stbt[0].siy=100;
stbt[0].fromz=1500;
stbt[0].fadfromz=1000;
stbt[0].fadtoz=-100;
stbt[0].toz=-200;
stbt[0].Type=1;
stbt[0].sidlo=5;
stbt[0].zhaba=100;
stbnum++;
stbt[1].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/tile.png");
stbt[1].Imgsi=255;
stbt[1].Imgx1=0;
stbt[1].Imgx2=255;
stbt[1].Imgy1=0;
stbt[1].Imgy2=255;
stbt[1].six=100;
stbt[1].siy=100;
stbt[1].fromz=1500;
stbt[1].fadfromz=1000;
stbt[1].fadtoz=-100;
stbt[1].toz=-200;
stbt[1].Type=2;
stbt[1].sidlo=5;
stbt[1].zhaba=100;
stbnum++;
for(int t=0;t<stbnum;t++){
float ou1 = (float)stbt[t].Imgx1 / stbt[t].Imgsi, ou2 = (float)(stbt[t].Imgx2 -stbt[t].Imgx1) / stbt[t].Imgsi;
float ov1 = (float)stbt[t].Imgy1 / stbt[t].Imgsi, ov2 = (float)(stbt[t].Imgy2 -stbt[t].Imgy1) / stbt[t].Imgsi;
switch(stbt[t].Type){
case 0:
break;
case 1:
for(int s=0; stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
stbt[t].stbc[stbt[t].sidlo*s+l].y=0/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
for(int i=0;i<6;i++){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
}
}
}looptest++;
break;
case 2:
for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
stbt[t].stbc[stbt[t].sidlo*s+l].y=-10/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
for(int i=0;i<6;i++){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
}
}
}looptest++;
break;
}
}
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
default :
break;
}
stbinif=1;
}
}
配列型構造体の数値代入について
配列型構造体の数値代入について
背景表示の構造体に配列型構造体を使用しているのですが、stbtという名前の構造体の0番以外の配列に値を代入することができずに困っています。原因の究明をしたいので、ソースコードの間違いの指摘をお願いいたします。
Re: 配列型構造体の数値代入について
そのように判断された根拠を教えてください。夢猫。 さんが書きました:stbtという名前の構造体の0番以外の配列に値を代入することができず
実行時に何かエラーメッセージでも出ましたか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 配列型構造体の数値代入について
返信が遅れて申し訳ありません。
試しに
stbt[2].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/water.png");
stbt[2].Imgsi=255;
stbt[2].Imgx1=0;
stbt[2].Imgx2=255;
stbt[2].Imgy1=0;
stbt[2].Imgy2=255;
stbt[2].six=100;
stbt[2].siy=100;
stbt[2].fromz=1500;
stbt[2].fadfromz=1000;
stbt[2].fadtoz=-100;
stbt[2].toz=-200;
stbt[2].Type=1;
stbt[2].sidlo=5;
stbt[2].zhaba=100;
stbnum=2;
stbt[1].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/tile.png");
stbt[1].Imgsi=255;
stbt[1].Imgx1=0;
stbt[1].Imgx2=255;
stbt[1].Imgy1=0;
stbt[1].Imgy2=255;
stbt[1].six=100;
stbt[1].siy=100;
stbt[1].fromz=1500;
stbt[1].fadfromz=1000;
stbt[1].fadtoz=-100;
stbt[1].toz=-200;
stbt[1].Type=2;
stbt[1].sidlo=5;
stbt[1].zhaba=100;
stbnum++;
としてみると1番の方のみのポリゴンが生成され、1番のみに代入されていることがわかりました。
変数の数値の変化をDrawFormatStringによる確認も行いましたがやはり代入されていないと思われる方は何も表示されませんでした。
追記
エラーメッセージはまったく表示されずに動作しました。
その代入以外の動作以外は普通に動きます。代入だけされません。
すみません。確認してみたところ0番以外に入らないのではなく代入に指定されているうちの最も小さい番号にしか入らないことがわかりました。box さんが書きました: そのように判断された根拠を教えてください。
実行時に何かエラーメッセージでも出ましたか?
試しに
stbt[2].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/water.png");
stbt[2].Imgsi=255;
stbt[2].Imgx1=0;
stbt[2].Imgx2=255;
stbt[2].Imgy1=0;
stbt[2].Imgy2=255;
stbt[2].six=100;
stbt[2].siy=100;
stbt[2].fromz=1500;
stbt[2].fadfromz=1000;
stbt[2].fadtoz=-100;
stbt[2].toz=-200;
stbt[2].Type=1;
stbt[2].sidlo=5;
stbt[2].zhaba=100;
stbnum=2;
stbt[1].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/tile.png");
stbt[1].Imgsi=255;
stbt[1].Imgx1=0;
stbt[1].Imgx2=255;
stbt[1].Imgy1=0;
stbt[1].Imgy2=255;
stbt[1].six=100;
stbt[1].siy=100;
stbt[1].fromz=1500;
stbt[1].fadfromz=1000;
stbt[1].fadtoz=-100;
stbt[1].toz=-200;
stbt[1].Type=2;
stbt[1].sidlo=5;
stbt[1].zhaba=100;
stbnum++;
としてみると1番の方のみのポリゴンが生成され、1番のみに代入されていることがわかりました。
変数の数値の変化をDrawFormatStringによる確認も行いましたがやはり代入されていないと思われる方は何も表示されませんでした。
追記
エラーメッセージはまったく表示されずに動作しました。
その代入以外の動作以外は普通に動きます。代入だけされません。
Re: 配列型構造体の数値代入について
void stgback(){
switch(stagemode){
case 1:
break;
case 2:
break;
case 3:
for(int t=0;t<stbnum;t++){
for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
stbt[t].stbc[stbt[t].sidlo*s+l].z-=20;
for(int i=0;i<6;i++){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.x=stbt[t].stbc[stbt[t].sidlo*s+l].x+stbt[t].six/2*stp[i].x+50;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.y=stbt[t].stbc[stbt[t].sidlo*s+l].y/*+stwat.siy*stp[i].y*/;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.z=stbt[t].stbc[stbt[t].sidlo*s+l].z+stbt[t].zhaba/2*stp[i].y;
}
}
}
for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
for(int i=0;i<6;i++){
stbz=stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.z;
if(stbz<stbt[t].toz){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=0;
}
else if(stbt[t].toz<stbz && stbz<=stbt[t].fadtoz){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=(unsigned char)(255.0f/(stbt[t].fadtoz-stbt[t].toz)*(stbz-stbt[t].toz));
}
else if(stbt[t].fadtoz<stbz && stbz<=stbt[t].fadfromz){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
}
else if(stbt[t].fadfromz<stbz && stbz<=stbt[t].fromz){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=(unsigned char)(255.0f/(stbt[t].fromz-stbt[t].fadfromz)*(stbt[t].fromz-stbz));
}
else if(stbz<stbt[t].fromz){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=0;
}
}
if(stbt[t].stbc[stbt[t].sidlo*s+l].z<stbt[t].toz-stbt[t].zhaba*0.5f){
float sub=(stbt[t].toz-stbt[t].zhaba*0.5f)-stbt[t].stbc[stbt[t].sidlo*s+l].z;
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba*0.5f-sub;
}
if(stbt[t].stbc[stbt[t].sidlo*s+l].z>stbt[t].fromz+stbt[t].zhaba*0.5f){
float sub=stbt[t].stbc[stbt[t].sidlo*s+l].z-(stbt[t].fromz+stbt[t].zhaba*0.5f);
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].toz-stbt[t].zhaba*0.5f+sub;
}
}
}
}
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
SetDrawMode( DX_DRAWMODE_BILINEAR );
DrawFormatString(400,240,GetColor(1,1,1),"[0] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[0].dif.r,stbt[1].stbc[0].stbv[0].dif.b,stbt[1].stbc[0].stbv[0].dif.g,stbt[1].stbc[0].stbv[0].dif.a);
DrawFormatString(400,270,GetColor(1,1,1),"[1] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[1].dif.r,stbt[1].stbc[0].stbv[1].dif.b,stbt[1].stbc[0].stbv[1].dif.g,stbt[1].stbc[0].stbv[1].dif.a);
DrawFormatString(400,300,GetColor(1,1,1),"[2] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[2].dif.r,stbt[1].stbc[0].stbv[2].dif.b,stbt[1].stbc[0].stbv[2].dif.g,stbt[1].stbc[0].stbv[2].dif.a);
DrawFormatString(400,330,GetColor(1,1,1),"[3] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[3].dif.r,stbt[1].stbc[0].stbv[3].dif.b,stbt[1].stbc[0].stbv[3].dif.g,stbt[1].stbc[0].stbv[3].dif.a);
DrawFormatString(400,360,GetColor(1,1,1),"[4] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[4].dif.r,stbt[1].stbc[0].stbv[4].dif.b,stbt[1].stbc[0].stbv[4].dif.g,stbt[1].stbc[0].stbv[4].dif.a);
DrawFormatString(400,390,GetColor(1,1,1),"[5] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[5].dif.r,stbt[1].stbc[0].stbv[5].dif.b,stbt[1].stbc[0].stbv[5].dif.g,stbt[1].stbc[0].stbv[5].dif.a);
DrawFormatString(400,420,GetColor(1,1,1)," %.d",stbt[2].sidlo);
for(int t=0;t<stbnum;t++){
for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
DrawPolygon3D(stbt[t].stbc[stbt[t].sidlo*s+l].stbv,2,stbt[t].Img,TRUE);
}
}
}
}
ここまでで何か問題があればご指摘いただきたいです。
Re: 配列型構造体の数値代入について
どうやら調べているうちに
この部分が原因だと判明しました。
しかし、詳しいことはまだわかっていないのでまた調べて何か分かり次第上げたいと思います。
for(int t=0;t<stbnum;t++){
float ou1 = (float)stbt[t].Imgx1 / stbt[t].Imgsi, ou2 = (float)(stbt[t].Imgx2 -stbt[t].Imgx1) / stbt[t].Imgsi;
float ov1 = (float)stbt[t].Imgy1 / stbt[t].Imgsi, ov2 = (float)(stbt[t].Imgy2 -stbt[t].Imgy1) / stbt[t].Imgsi;
switch(stbt[t].Type){
case 0:
break;
case 1:
for(int s=0; stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
stbt[t].stbc[stbt[t].sidlo*s+l].y=0/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
for(int i=0;i<6;i++){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
}
}
}looptest++;
break;
case 2:
for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
for(int l=0;l<stbt[t].sidlo;l++){
stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
stbt[t].stbc[stbt[t].sidlo*s+l].y=-10/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
for(int i=0;i<6;i++){
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
}
}
}looptest++;
break;
}
}
しかし、詳しいことはまだわかっていないのでまた調べて何か分かり次第上げたいと思います。
Re: 配列型構造体の数値代入について
≫の開発者さん
返信ありがとうございます。参考になりました。
しかし、私の質問からは少しずれてしまっているようです。
返信ありがとうございます。参考になりました。
しかし、私の質問からは少しずれてしまっているようです。
Re: 配列型構造体の数値代入について
自己解決しました。
どうやらstbc(ポリゴン生成用の変数)の配列の個数が足りなかっただけのようです。
ご返信くださった皆様、ありがとうございました。
こんな初歩的なことに気づかないとは恥ずかしいです(笑)
どうやらstbc(ポリゴン生成用の変数)の配列の個数が足りなかっただけのようです。
ご返信くださった皆様、ありがとうございました。
こんな初歩的なことに気づかないとは恥ずかしいです(笑)