main.cpp
#include "DxLib.h"
#include "Anim.h"
//配列の生成に変数は使えない
//関数の外では変数に値を代入できない
//配列は定義時に値を代入する事
int TimeCount;//全体の時間カウント
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
//int Color ;
//Color = GetColor( 255 , 255 , 255 ) ;//test
TimeCount=0;
PictureRead();
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
//DrawFormatString( 0, 0, Color, "TimeCount=%d", TimeCount ) ;//test
Obj_Syutugen(TimeCount);
Anim_AllDraw(TimeCount);
TimeCount++;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include "DxLib.h"
#include "Anim.h"
#include "Obj.h"
#define Anim_longest_Picture 5//最も多い枚数の画像を使うアニメの使用画像枚数
#define ObjApMax 3//ObjApの要素の数
#define SpriteAmount 12//スプライトの総数
#define PictureReadAmount 2//読み込む画像ファイルの数
static int Object_Gr[SpriteAmount];//画像格納変数
static double Object_point[SpriteAmount][2]={//各画像の原点
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20},
{20,20}
};
struct Anim{
int Picture[Anim_longest_Picture];//アニメに使う画像番号 [アニメ番号][使用画像]
int Frame[Anim_longest_Picture];//アニメの各画像の表示フレーム [アニメ番号][フレーム数]
};
static struct Anim AnimObj[6] = {
{{0,1,-1,-1,-1},{100,200,-1,-1,-1}},//0:自機ニュートラル
{{2,3,-1,-1,-1},{10,20,-1,-1,-1}},
{{4,5,-1,-1,-1},{10,20,-1,-1,-1}},
{{6,7,-1,-1,-1},{100,200,-1,-1,-1}},
{{8,9,-1,-1,-1},{10,20,-1,-1,-1}},
{{10,11,-1,-1,-1},{10,20,-1,-1,-1}}
};
struct ObjA{
int AnimNo,Stcnt,layer;//アニメ番号,アニメ切り替え基準カウンター,表示レイヤー
int flag;//出現する時間and出現判定
double x,y;//x座標,y座標
};
static struct ObjA ObjAp[ObjApMax] = {//出現しているオブジェクトのデータ(出現していない所は全て-1)
{-1,-1,-1, -1, -1,-1},
{-1,-1,-1, -1, -1,-1},
{-1,-1,-1, -1, -1,-1}
};
struct ReadFileInf{
char *FileName;//ファイルのポインタ
int allnum,xnum,ynum,xsize,ysize;//画像の分割総数,横に対する分割数,縦に対する分割数,分割された画像一つのx方向の大きさ,y方向の大きさ
};
static struct ReadFileInf ReadForObject_Gr[PictureReadAmount] = {
{ "../Picture/STGtate_test.png" , 6 , 2 , 3 , 40 , 40 },
{"../Picture/STGtate_test2.png" , 6 , 2 , 3 , 40 , 40 }
};
void Obj_Syutugen(int TC_inObj_Syutugen){//オブジェクトの出現管理:ObjAp入力用
Obj_Syutugen_main(TC_inObj_Syutugen,ObjAp,ObjApMax);
}
void PictureRead(){//画像ファイル読み込み 使用外部変数:PictureReadAmount
int i;
int a=0;
for(i = 0; i < PictureReadAmount; i ++){
LoadDivGraph( ReadForObject_Gr[i].FileName , ReadForObject_Gr[i].allnum , ReadForObject_Gr[i].xnum , ReadForObject_Gr[i].ynum , ReadForObject_Gr[i].xsize , ReadForObject_Gr[i].ysize , Object_Gr + a );
a += ReadForObject_Gr[i].allnum;
}
}
void Anim_Draw(int ObjectNumber,int TC_inAnimDraw){//アニメ描画
int i,j;
int a[Anim_longest_Picture];//アニメの各画像の終了フレーム
for(i = 0; i < Anim_longest_Picture; i ++){//aの初期化
a[i] = 0;
}
int b=0;//aの最大値
int c=0;
for(i = 0; i < Anim_longest_Picture; i ++){
for(j = 0; j <= i; j ++){
if(AnimObj[ObjAp[ObjectNumber].AnimNo].Frame[j] >=0){
a[i] += AnimObj[ObjAp[ObjectNumber].AnimNo].Frame[j];
}
else{
a[i] = -1;
}
}
}
for(i = 0;i < Anim_longest_Picture; i ++){
if(a[i]>b){
b = a[i];
}
}
c = (TC_inAnimDraw - ObjAp[ObjectNumber].Stcnt)%b;
for(i = 0;i < Anim_longest_Picture; i ++){
if(c<a[i]){
DrawGraph( ObjAp[ObjectNumber].x - Object_point[AnimObj[ObjAp[ObjectNumber].AnimNo].Picture[i]][0], ObjAp[ObjectNumber].y - Object_point[AnimObj[ObjAp[ObjectNumber].AnimNo].Picture[i]][1], Object_Gr[AnimObj[ObjAp[ObjectNumber].AnimNo].Picture[i]], TRUE ); //画像の描画
break;
}
}
}
void Anim_AllDraw(int TC_inAnimAllDraw){//定義されたアニメの描画
int i,j,k;
int dumy=100000;
int H=0;
int KariObj[ObjApMax];//仮想的な出現オブジェクトデータベース
for(i = 0; i < ObjApMax; i ++){
KariObj[i]=-1;
}
for(j = 0; j < ObjApMax; j ++){
for(i = 0; i < ObjApMax; i ++){
if(ObjAp[i].flag>=0){
if(dumy>=ObjAp[i].layer){
for(k = 0; k < j; k++){
if(i==KariObj[k]){
H=1;
}
}
if(H==0){
dumy=ObjAp[i].layer;
KariObj[j]=i;
}
H=0;
}
}
}
H=0;
dumy=100000;
}
for(j = 0; j < ObjApMax; j ++){
if(KariObj[j] >= 0 && KariObj[j] < ObjApMax){
Anim_Draw(KariObj[j],TC_inAnimAllDraw);
}
}
}
#include "DxLib.h"
#include "Obj.h"
#define ObjPalMax 3//ObjPalの要素の数
struct Obj{
int AnimNo,Stcnt,layer;//アニメ番号,アニメ切り替え基準カウンター,表示レイヤー
int flag;//出現する時間and出現判定
double x,y;//x座標,y座標
};
static struct Obj ObjPal[ObjPalMax] = {//オブジェクト毎のパラメータ
{4,0,80, 0, 100,100},
{0,0,50, 1000, 110,110},
{0,0,50, 2000, 150,110}
};
void Obj_Syutugen_main(int TC_inObj_Syutugen , struct ObjA *OA_inOSm , int OAM_inOSm){//オブジェクトの出現管理
int i,j;
for(i = 0; i < ObjPalMax; i ++){
if(TC_inObj_Syutugen == ObjPal[i].flag){
for(j = 0; j < OAM_inOSm; j++){
if(OA_inOSm[j].flag == -1){
OA_inOSm[j].AnimNo = ObjPal[i].AnimNo;
OA_inOSm[j].flag = ObjPal[i].flag;
OA_inOSm[j].layer = ObjPal[i].layer;
OA_inOSm[j].Stcnt = ObjPal[i].Stcnt;
OA_inOSm[j].x = ObjPal[i].x;
OA_inOSm[j].y = ObjPal[i].y;
break;
}
}
}
}
}
#ifndef DEF_PLAYER_H //二重include防止
#define DEF_PLAYER_H
void Obj_Syutugen(int TC_inObj_Syutugen);
void PictureRead();
void Anim_AllDraw(int TC_inAnimAllDraw);
#endif
#ifndef DEF_PLAYER_H //二重include防止
#define DEF_PLAYER_H
void Obj_Syutugen_main(int TC_inObj_Syutugen , struct ObjA *OA_inOSm , int OAM_inOSm);
#endif
1>main.cpp
1>Anim.cpp
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\anim.cpp(59) : error C3861: 'Obj_Syutugen_main': 識別子が見つかりませんでした
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\anim.cpp(97) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\anim.cpp(97) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>Obj.cpp
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(21) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(21) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(21) : error C2228: '.flag' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(22) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(22) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(22) : error C2228: '.AnimNo' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(23) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(23) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(23) : error C2228: '.flag' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(24) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(24) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(24) : error C2228: '.layer' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(25) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(25) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(25) : error C2228: '.Stcnt' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(26) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(26) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(26) : error C2228: '.x' の左側はクラス、構造体、共用体でなければなりません
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(27) : error C2036: 'ObjA *' : サイズが不明です。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(27) : error C2027: 認識できない型 'ObjA' が使われています。
1> c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.h(4) : 'ObjA' の宣言を確認してください。
1>c:\users\aaaa\visual studio 2008\projects\bbbbb\obj.cpp(27) : error C2228: '.y' の左側はクラス、構造体、共用体でなければなりません
エラーメッセージの内容から分割された別のファイルの内容を参照するのに失敗していると言う事は大体見当が付きますが、これをどうやって直したら良いのかが分かりません。
とりあえずファイルを分割する際は
・プログラムの処理の順番はmain関数の頭からスタートし、main関数の最後で終了する。
・基本的に他のファイルの変数や構造体やdefineを参照する事は出来ないので他のファイルのデータを使いたい場合は関数に引数として渡す必要がある。
・main関数のあるファイル以外で変数などを宣言する際は頭にstaticと付ける。
・関数を宣言するファイルと参照するファイルの頭に#include "aaa.h"等とヘッダーを読み込む記述をし、ヘッダーファイルに関数のプロトタイプ宣言をする事で別のファイルの関数を使用する事が出来る。
・ヘッダファイルには二重読み込み防止の記述をする。
・全てのファイルの間で同じ名前の関数や構造体を二つ以上宣言してはいけない。
こんな感じの認識で行っていたのですが、何か間違いはあるでしょうか。
私のプログラムではどこが間違っていてどういう風に直したら良いのか、ファイルを分割する際の私の認識のどこに間違いや至らない点があるのかを教えて頂けると幸いです。
自分でも突っ込み所満載の記述になっている予感がひしひしと感じるのですがよろしくお願いします。