classを使って龍神録を書き換えています

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

classを使って龍神録を書き換えています

#1

投稿記事 by wing » 15年前

本やネットで調べながらです。独学です。
VC2008EE DXライブラリ Windows7です。
「たくさん敵の行動パターンを作ってみよう」のところで
エラーが解決できません。

質問の内容
1.
error C2065: 'Enemy_Pattern0' : 定義されていない識別子です。
'Enemy_Pattern15'まで同じエラーがでます。Enemy_Pattern0~15は
class Enemyで宣言しています。認識させる書き方が分かりません。

2.
void (*Enemy_Pattern[ENEMY_PATTERN_MAX])(int)={
	Enemy_Pattern0, Enemy_Pattern1, Enemy_Pattern2, Enemy_Pattern3,
	Enemy_Pattern4, Enemy_Pattern5, Enemy_Pattern6, Enemy_Pattern7,
	Enemy_Pattern8, Enemy_Pattern9, Enemy_Pattern10, Enemy_Pattern11,
	Enemy_Pattern12, Enemy_Pattern13, Enemy_Pattern14, Enemy_Pattern15,
};
この関数はどのクラスでも宣言していないがそれでいいのでしょうか?
宣言するとしたらどのように書くのか分かりません。
どなたかご指導をお願いします。
/* enemy.h */
#ifndef __ENEMY_H__
#define __ENEMY_H__
#include "DxLib.h"
#include <math.h>

#define ENEMY_MAX 30
#define ENEMY_PATTERN_MAX 16
#define ENEMY_ORDER_MAX 500
#define FX	   32
#define FY	   16
#define FMX    384
#define FMY    448
#define PI 3.1415926535898
#define PI2 (PI*2)

class Enemy{
	int img_enemy[3][3];
protected:

public:
	float x, y, vx, vy, sp, ang;
	int bltime, blknd, blknd2, col, state, wtime, wait, cnt;
	int flag, pattern, knd, hp, hp_max, img;
	int item_n[6];

	void Init();
	void Enter();
	void Move();
	void Draw();
	void LoadStory();
	void Enemy_Pattern0(int i);  void Enemy_Pattern1(int i);
	void Enemy_Pattern2(int i);  void Enemy_Pattern3(int i);
	void Enemy_Pattern4(int i);  void Enemy_Pattern5(int i);
	void Enemy_Pattern6(int i);  void Enemy_Pattern7(int i);
	void Enemy_Pattern8(int i);  void Enemy_Pattern9(int i);
	void Enemy_Pattern10(int i); void Enemy_Pattern11(int i);
	void Enemy_Pattern12(int i); void Enemy_Pattern13(int i);
	void Enemy_Pattern14(int i); void Enemy_Pattern15(int i);

	int Num_Search();
};
class EnemyOrder{
public:
	float x, y, vx, vy, sp, ang;
	int bltime, blknd, blknd2, col, state, wtime, wait, cnt;
	int flag, pattern, knd, hp, hp_max, img;
	int item_n[6];
};

#endif
長いので次に続きます。

wing

Re:classを使って龍神録を書き換えています

#2

投稿記事 by wing » 15年前

/* enemy.cpp */
#include "../include/enemy.h"

Enemy enemy[ENEMY_MAX];
EnemyOrder enemy_order[ENEMY_ORDER_MAX];
extern int stage_count;

//渡された-ang~angまでのランダムな角度を返す
double rang(double ang){
    return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}

void (*Enemy_Pattern[ENEMY_PATTERN_MAX])(int)={
	Enemy_Pattern0, Enemy_Pattern1, Enemy_Pattern2, Enemy_Pattern3,
	Enemy_Pattern4, Enemy_Pattern5, Enemy_Pattern6, Enemy_Pattern7,
	Enemy_Pattern8, Enemy_Pattern9, Enemy_Pattern10, Enemy_Pattern11,
	Enemy_Pattern12, Enemy_Pattern13, Enemy_Pattern14, Enemy_Pattern15,
};

void Enemy::Move(){
	for(int i=0; i<ENEMY_MAX; i++){
		if(enemy.flag==1){
			Enemy_Pattern[enemy.pattern](i);
            enemy.x+=cos(enemy.ang)*enemy.sp;
            enemy.y+=sin(enemy.ang)*enemy.sp;
            enemy.x+=enemy.vx;
            enemy[i].y+=enemy[i].vy;
			enemy[i].cnt++;
			enemy[i].img=(enemy[i].cnt%18)/6;
			//敵が画面から外れたら消す
			if(enemy[i].x<-20.0f || enemy[i].x>FX+FMX+16.0f || enemy[i].y<-25.0f || enemy[i].y>FY+FMY+21.0f)
				enemy[i].flag=0;
		}
	}
}

void Enemy::Enter(){	
    int i,j,t;
    for(t=0;t<ENEMY_ORDER_MAX;t++){
        if(enemy_order[t].cnt==stage_count){//現在の瞬間がオーダーの瞬間なら
			if((i=Num_Search())!=-1){
                enemy[i].flag   =1;//フラグ
                enemy[i].cnt    =0;//カウンタ
                enemy[i].pattern=enemy_order[t].pattern;//移動パターン
                enemy[i].knd    =enemy_order[t].knd;//敵の種類
                enemy[i].x      =enemy_order[t].x;//座標
                enemy[i].y      =enemy_order[t].y;
                enemy[i].sp     =enemy_order[t].sp;//スピード
                enemy[i].bltime =enemy_order[t].bltime;//弾の発射時間
                enemy[i].blknd  =enemy_order[t].blknd;//弾幕の種類
                enemy[i].blknd2 =enemy_order[t].blknd2;//弾の種類
                enemy[i].col    =enemy_order[t].col;//色
                enemy[i].wait   =enemy_order[t].wait;//停滞時間
                enemy[i].hp     =enemy_order[t].hp;//体力
                enemy[i].hp_max =enemy[i].hp;//体力最大値
                enemy[i].vx     =0;//水平成分の速度
                enemy[i].vy     =0;//鉛直成分の速度
                enemy[i].ang    =0;//角度
                for(j=0;j<6;j++)
                    enemy[i].item_n[j]=enemy_order[t].item_n[j];//落とすアイテム
            }
        }
    }
} //以下 省略

よろしくお願いします。

softya

Re:classを使って龍神録を書き換えています

#3

投稿記事 by softya » 15年前

staticでは無いメンバ関数のポインタについては次のようにする必要があります。
http://www.geocities.jp/ky_webid/cpp/language/034.html

私はC#で書き換えたときにクラスで関数ポインタを使うのが気持ち悪かったので全部switch~caseに書き換えました。
龍神録XNA
http://softyasu.net/game/gametop.html
C#とXNAで書いたソースですが、もし良かったら参考にしてください。19章までは出来ています。

wing

Re:classを使って龍神録を書き換えています

#4

投稿記事 by wing » 15年前

siftya様、ありがとうございます。
関数ポインタを勉強してきます。
switch caseの方法も参考にさせていただきます。

夜も遅いのでとりあえず御礼だけさせていただきます。

wing

Re:classを使って龍神録を書き換えています

#5

投稿記事 by wing » 15年前

switch文を使ってみごとにできました。
void Enemy::Move(){
	for(int i=0; i<ENEMY_MAX; i++){
		if(enemy.flag==1){
			int k;
			k = enemy.pattern;
			switch(k){
				case 0:
					Enemy::Enemy_Pattern0(i);
					break;
				case 1:
					Enemy::Enemy_Pattern1(i);
					break;
				case 2:
					Enemy::Enemy_Pattern2(i);
					break;
				case 3:
					Enemy::Enemy_Pattern3(i);
					break;
				case 4:
					Enemy::Enemy_Pattern4(i);
					break;
				case 5:
					Enemy::Enemy_Pattern5(i);
					break;
				case 6:
					Enemy::Enemy_Pattern6(i);
					break;
				case 7:
					Enemy::Enemy_Pattern7(i);
					break;
				case 8:
					Enemy::Enemy_Pattern8(i);
					break;
				case 9:
					Enemy::Enemy_Pattern9(i);
					break;
				case 10:
					Enemy::Enemy_Pattern10(i);
					break;
				case 11:
					Enemy::Enemy_Pattern11(i);
					break;
				case 12:
					Enemy::Enemy_Pattern12(i);
					break;
				case 13:
					Enemy::Enemy_Pattern13(i);
					break;
				case 14:
					Enemy::Enemy_Pattern14(i);
					break;
				case 15:
					Enemy::Enemy_Pattern15(i);
					break;
			}
            enemy.x+=cos(enemy.ang)*enemy.sp;
            enemy.y+=sin(enemy.ang)*enemy.sp;
            enemy.x+=enemy.vx;
            enemy[i].y+=enemy[i].vy;
			enemy[i].cnt++;
			enemy[i].img=(enemy[i].cnt%18)/6;
			//敵が画面から外れたら消す
			if(enemy[i].x<-20.0f || enemy[i].x>FX+FMX+16.0f || enemy[i].y<-25.0f || enemy[i].y>FY+FMY+21.0f)
				enemy[i].flag=0;
		}
	}
}


関数ポインタは例題はわかるような気がするんですが、今回の場合は
うまくあてはめることができませんでした。
これで先に進めます。
softya様、ありがとうございました。

wing

Re:classを使って龍神録を書き換えています

#6

投稿記事 by wing » 15年前

解決マークを忘れました。

閉鎖

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