引数にクラス

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

引数にクラス

#1

投稿記事 by OBJ » 14年前

現在VC++2010でゲーム開発を行っています

敵キャラクターとプレイヤーキャラクターには共通の動作がありますので
それを関数にして、引数に敵クラス、プレイヤークラスを適用して動作させたいと考えています

以下、現在のソースコードです

コード:


// Character.h

// キャラクタークラス
//敵クラス、プレイヤークラスに継承させる
class Character{

		// キャラクターモデルとの壁、床の当たり判定 
		void Collision( Character *ch);

		// キャラクターモデルの向きを変更する処理 
		void AngleProcess( Character *ch );

       //これら二つの関数の引数に敵クラス、プレイヤークラスのポインタを渡したい

};



// Character.cpp
#include"Character.h"


// キャラクターモデルとの壁、床の当たり判定 
void Collision( Character *ch){

ch->pos = nextpos;

// アロー演算子を使って色々処理させる

}



// キャラクターモデルの向きを変更する処理 
void AngleProcess( Character *ch ){

ch->angle = PHI ;
// アロー演算子を使って色々処理させる
}



//player.h
#include"Character.h"


class player : public Character{

void Player_Move();

//色々宣言する

}


//enemy.h
#include"Character.h"


class enemy : public Character{

void enemy_Move();

//色々宣言する

}

//player.cpp


void Player_Move(){

// キャラクターのベクトルを求めたりして、移動させる

// キャラクターモデルとの壁、床の当たり判定 
Collision(  &player );  //  error C2275: 'player' : この型は演算子として使用できません

// キャラクターモデルの向きを変更する処理 
AngleProcess( &player ); //  error C2275: 'player' : この型は演算子として使用できません




}



//enemy.cpp


void enemy_Move(){

// キャラクターのベクトルを求めたりして、移動させる

// キャラクターモデルとの壁、床の当たり判定 
Collision(  &enemy );//  error C2275: 'enemy' : この型は演算子として使用できません


// キャラクターモデルの向きを変更する処理 
AngleProcess( &enemy );//  error C2275: 'enemy' : この型は演算子として使用できません




}




クラスでゲームを作るのは初めてなので色々と試行錯誤しながらやっています
敵クラスとプレイヤークラスでステージモデルとの当たり判定と進む方向にキャラクターモデルを回転させる処理
を共有させたいので大元のCharacterクラスに当たり判定と回転処理の関数を記述し、それを敵クラスとプレイヤークラス
それぞれに継承させてこの2つの関数を使えるようにしたいと思っています


質問1
抽象的な質問ですがこの方法は大丈夫でしょうか?
自分でコードを書いてなんですが不安になります

質問2
player.cpp enemy.cppともにplayer::posのようにスコープ解決演算子を使ってコードを書いています
各クラスのオブジェクト化はさらに上位のクラスのGameMainで行っています
クラスを引数にする場合はオブジェクト化したものだけに限られるのでしょうか?


説明で足りない部分があれば追記させていただきます
教えて頂ければ幸いです

sq

Re: 引数にクラス

#2

投稿記事 by sq » 14年前

書いたコードはコンパイルできてますか?
典型的なコードは次のようになるんですが。

コード:

class Character {
public:
  void Collision();
  void AngleProcess();
protected:
  int m_pos;
  double m_angle;
};

void Character::Collision() {
  m_pos = nextpos;
}

void Character::AngleProcess() {
  m_angle = PHI;
}

class Player : public Character {
public:
  void Player_move();
};

void Player::Player_move() {
  // いろいろ
}

class Enemy : public Character {
public:
  void Enemy_move();
};

void Enemy::Enemy_move() {
  // いろいろ
}

void use()
{
  Player p;
  Enemy e;

  p.Collision();
  p.AngleProcess();
  p.Player_move();

  e.Collision();
  e.AngleProcess();
  e.Enemy_move();
}
まずはC++のクラスの文法や使い方を確認してみたほうがよさげです。

へにっくす

Re: 引数にクラス

#3

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

とりあえず掲示したソースのエラーを、無理やり直すとこんな感じになります。
親クラスのメンバ関数をstaticにすると、希望通りの動作に近いかと
※すみません、.NET C++で書いてます。
普通のC++ですと、ポインタは ^ でなく * です
あと ref キーワードは使いません

コード:

//================= character.h
#pragma once

ref class Character
{
public:
	Character(void);
	// 位置
	int pos;
	// 角度
	double angle;
	// キャラクターモデルとの壁、床の当たり判定
	static void Collision(Character^ ch);
	// キャラクターモデルの向きを変更する処理
	static void AngleProcess(Character^ ch);
};

//================= character.cpp

#include "StdAfx.h"
#include "Character.h"

Character::Character(void)
: pos(0)
, angle(0)
{
}

// キャラクターモデルとの壁、床の当たり判定
void Character::Collision(Character^ ch)
{
	ch->pos = 0;
}

// キャラクターモデルの向きを変更する処理
void Character::AngleProcess(Character^ ch)
{
	ch->angle = 3.14;
}

//================= player.h
#pragma once
#include "character.h"

ref class player :
public Character
{
public:
	player(void);
	// プレイヤー移動
	void Player_Move(void);
};


//================= player.cpp
#include "StdAfx.h"
#include "player.h"

player::player(void)
{
}

// プレイヤー移動
void player::Player_Move(void)
{
	// キャラクターモデルとの壁、床の当たり判定
	Character::Collision(this);
	// キャラクターモデルの向きを変更する処理
	Character::AngleProcess(this);
}


//================= enemy.h
#pragma once
#include "character.h"

ref class enemy :
public Character
{
public:
	enemy(void);
	// 敵の移動
	void enemy_Move(void);
};

//================= enemy.cpp
#include "StdAfx.h"
#include "enemy.h"

enemy::enemy(void)
{
}

// 敵の移動
void enemy::enemy_Move(void)
{
	// キャラクターモデルとの壁、床の当たり判定
	Character::Collision(this);
	// キャラクターモデルの向きを変更する処理
	Character::AngleProcess(this);
}
そもそもCharacterクラスの派生でPlayer、Enemyクラスがあるのですから、
特に自分のクラスを引数にする必要がない気がしますね。
親クラスのメンバを呼ぶだけだから。

コード:

//================= character.h
#pragma once

ref class Character
{
public:
	Character(void);
	// 位置
	int pos;
	// 角度
	double angle;
	// キャラクターモデルとの壁、床の当たり判定
	void Collision();
	// キャラクターモデルの向きを変更する処理
	void AngleProcess();
};

//================= character.cpp
#include "StdAfx.h"
#include "Character.h"

Character::Character(void)
: pos(0)
, angle(0)
{
}

// キャラクターモデルとの壁、床の当たり判定
void Character::Collision()
{
	pos = 0;
}

// キャラクターモデルの向きを変更する処理
void Character::AngleProcess()
{
	angle = 3.14;
}

//================= player.h
#pragma once
#include "character.h"

ref class player :
public Character
{
public:
	player(void);
	// プレイヤー移動
	void Player_Move(void);
};


//================= player.cpp
#include "StdAfx.h"
#include "player.h"

player::player(void)
{
}

// プレイヤー移動
void player::Player_Move(void)
{
	// キャラクターモデルとの壁、床の当たり判定
	Character::Collision();
	// キャラクターモデルの向きを変更する処理
	Character::AngleProcess();
}
//================= enemy.h
#pragma once
#include "character.h"

ref class enemy :
public Character
{
public:
	enemy(void);
	// 敵の移動
	void enemy_Move(void);
};

//================= enemy.cpp
#include "StdAfx.h"
#include "enemy.h"

enemy::enemy(void)
{
}

// 敵の移動
void enemy::enemy_Move(void)
{
	// キャラクターモデルとの壁、床の当たり判定
	Character::Collision();
	// キャラクターモデルの向きを変更する処理
	Character::AngleProcess();
}
どっちにするかお好みで。
でも2012年5月01日(火) 20:24にレスしているsqさんの方が分かりやすいと思いますけど。。

閉鎖

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