すでに定義されてます・・・

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

すでに定義されてます・・・

#1

投稿記事 by 亀猫 » 16年前

本当に初歩的な質問で申し訳ございません・・・。

test1.cppに

#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//ココにプログラム



ScreenFlip();
}

DxLib_End();
return 0;
}



ココにプログラムというところにプログラムを書いて


test2.cpp を作って




#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//ココにプログラム


ScreenFlip();
}

DxLib_End();
return 0;
}




同じようにココにプログラムと書いてあるところにプログラムを書いてデバック開始を押したら
WinMain@16がすでに定義されています。 とでて、できません・・。

test.cppには主人公を操作するプログラムでtest2.cppにはマップを表示するプログラムです。

WinMainという部分を消してデバック開始を押したらintにたいして初期化...みたいなエラーがでました・・・
サンプルプログラムを見ても複雑すぎて解読できません・・・。

本当に初歩的な質問で申し訳ございません・・・。

conio

Re:すでに定義されてます・・・

#2

投稿記事 by conio » 16年前

>>同じようにココにプログラムと書いてあるところにプログラムを書いてデバック開始を押したら 
>>WinMain@16がすでに定義されています。 とでて、できません・・。 
test1.cpp と test2.cpp をソースファイルに追加してコンパイルしたという事ですかね?
その場合はWinMain関数が2つ存在することになるので、エラーになると思いますよ。

あと、「マップを表示して 主人公を動かす」というようなプログラムにしたいのであれば、
下記のようにして実行する事が出来ます。

現在は文字しか使ってませんが、画像を使うようにすれば同じように出来るはずです。
------------------------------------------------------------------------------
#include "DxLib.h" 

int Key[256];
int Cr;
int pt_x = 300, pt_y = 220;

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){ 
   char GetHitKeyStateAll_Key[256]; 
   GetHitKeyStateAll( GetHitKeyStateAll_Key ); 

   for(int i=0;i<256;i++){ 
      if(GetHitKeyStateAll_Key==1)
         GetHitKeyStateAll_InputKey++; 
       else GetHitKeyStateAll_InputKey=0; 
   } 
   return 0; 
}

void MovePlayer(void)
{
	if(CheckHitKey(KEY_INPUT_RIGHT))
		pt_x += 2;
	else if(CheckHitKey(KEY_INPUT_LEFT))
		pt_x -= 2;

	if(CheckHitKey(KEY_INPUT_UP))
		pt_y -= 2;
	else if(CheckHitKey(KEY_INPUT_DOWN))
		pt_y += 2;

}
void DrawMap(void)
{
   DrawString( 0 , 0 , "マップが表示されました" , Cr );
}

void DrawPlayer(void)
{
   DrawString( pt_x , pt_y - 40 , "ここにいる" , Cr );
   DrawString( pt_x , pt_y - 20 , "  ↓" , Cr );
   DrawString( pt_x , pt_y , "  ●" , Cr );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 
    ChangeWindowMode(TRUE);//ウィンドウモード 
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 
	 Cr = GetColor( 255 , 255 , 255 ) ;

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){ 
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない 

		  MovePlayer();
		  DrawMap();
		  DrawPlayer();

         ScreenFlip(); 
    } 
    DxLib_End(); 
    return 0; 
} 
------------------------------------------------------------------------------

亀猫

Re:すでに定義されてます・・・

#3

投稿記事 by 亀猫 » 16年前

返信ありがとうございます。
返答遅くなってしまって申し訳ございません・・・。

>>test1.cpp と test2.cpp をソースファイルに追加してコンパイルしたという事ですかね?

そういうことです。

test1.cppでプレイヤー操作のプログラムを組んで test2.cppでマップを表示するプログラムを組むとういうような
違うソースファイルを追加してどちらも出来るようにするというテストをしてるので、どこを消せばちゃんと
コンパイルできるでしょうか?

例えば
  攻撃するプログラム    操作するプログラム
に分かれてて、どちらも↓のココにプログラムに書いたら定義されていますとでて出来ないので、どこを消せば二つともできるのでしょうか?


#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//ココ!!



ScreenFlip();
}

DxLib_End();
return 0;
}


説明下手ですみません・・・。

要は二つのソースファイルを実行するにはどうすればいいでしょうか?

質問ばかりですみません・・・。

Dixq (管理人)

Re:すでに定義されてます・・・

#4

投稿記事 by Dixq (管理人) » 16年前

とりあえず、分割コンパイルするには、どうしたらいいか調べてみて下さい。

例えば
http://dixq.net/s/5.html

一方で、宣言したグローバル変数を他のファイルで使うにはextern宣言をします。
関数はプロトタイプ宣言を記述したヘッダファイルを両方からインクルードすればよいでしょう。
また、インクルードすべきヘッダファイルは他のファイルでも同じです(DxLib.hとか)
(ただし、DxLib.hの機能を使わないファイルでは必要ない)

「分割コンパイル」や「extern」というキーワードで調べたり試したりしてみて下さい。

conio

Re:すでに定義されてます・・・

#5

投稿記事 by conio » 16年前

例えば、PlayerならPlayer、MapならMapに関するものだけをソースファイルにして
分割したいという事ですね。

そういうことであれば、下記のようにして実行する事が出来ます。

【WinMain.cpp】-----------------------------------------------------------
#include "DxLib.h"
#include "Player.h"
#include "Map.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){ 
   char GetHitKeyStateAll_Key[256]; 
   GetHitKeyStateAll( GetHitKeyStateAll_Key ); 

   for(int i=0;i<256;i++){ 
      if(GetHitKeyStateAll_Key==1)
         GetHitKeyStateAll_InputKey++; 
       else GetHitKeyStateAll_InputKey=0; 
   } 
   return 0; 
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ 
    ChangeWindowMode(TRUE);//ウィンドウモード 
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 
	 Cr = GetColor( 255 , 255 , 255 ) ;
	 Player player;
	 Map map;

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){ 
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない 

		player.MovePlayer();

		map.DrawMap();
		player.DrawPlayer();
       
		ScreenFlip(); 
    } 
    DxLib_End(); 
    return 0; 
} 
----------------------------------------------------------------------------------
【Player.h】----------------------------------------------------------------------
#include"DxLib.h"

class Player{
public:
	Player();
	~Player();
	void MovePlayer(void);
	void DrawPlayer(void);

private:
	int pt_x;
	int pt_y;
	int Cr;
};
-----------------------------------------------------------------------------------
【Player.cpp】---------------------------------------------------------------------
#include"Player.h"

Player::Player()
{
	pt_x = 300;
	pt_y = 200;
	Cr = GetColor( 255 , 255 , 255 ) ;
}

Player::~Player()
{


}

void Player::MovePlayer(void)
{
	if(CheckHitKey(KEY_INPUT_RIGHT))
		pt_x += 2;
	else if(CheckHitKey(KEY_INPUT_LEFT))
		pt_x -= 2;

	if(CheckHitKey(KEY_INPUT_UP))
		pt_y -= 2;
	else if(CheckHitKey(KEY_INPUT_DOWN))
		pt_y += 2;
}

void Player::DrawPlayer(void)
{
   DrawString( pt_x , pt_y - 40 , "ここにいる" , Cr );
   DrawString( pt_x , pt_y - 20 , "  ↓" , Cr );
   DrawString( pt_x , pt_y , "  ●" , Cr );
}
----------------------------------------------------------------------------------
【Map.h】-------------------------------------------------------------------------
#include"DxLib.h"
class Map{
public:
	Map();
	~Map();
	void MakeMap(void);
	void DrawMap(void);
private:
	int FieldMap[15][15];
	int Cr;

	void Init(void);
};
----------------------------------------------------------------------------------
【Map.cpp】-----------------------------------------------------------------------
#include"Map.h"

Map::Map()
{
	Cr = GetColor( 255 , 255 , 255 ) ;
	Init();
	MakeMap();
}

Map::~Map()
{


}

void Map::MakeMap()
{
	for(int i = 0; i < 15; i++)
		for(int j = 0; j < 15; j++)
			if(i == 0 || i == 14 || j == 0 || j == 14)
				FieldMap[j] = 1;
}
void Map::DrawMap()
{
	for(int i = 0; i < 15; i++)
		for(int j = 0; j < 15; j++)
			if(FieldMap[j] == 1)
				 DrawString( i * 18 , j * 18 , "●" , Cr );

	DrawString( 4 * 18 , 15 * 18 , "↑マップのつもり" , Cr );
}

void Map::Init(void)
{
	for(int i = 0; i < 15; i++)
		for(int j = 0; j < 15; j++)
			FieldMap[j] = 0;
}
-------------------------------------------------------------------------------------
■ソースファイル
┣Map.cpp
┣Player.cpp
┗WinMain.cpp
■ヘッダーファイル
┣Map.h
┗Player.h

亀猫

Re:すでに定義されてます・・・

#6

投稿記事 by 亀猫 » 16年前

申し訳ございません・・・。RPGゲームを作成しようとしてたので、シューティングゲームの館は確認してませんでした・・・。


なるほど!WinMainはWinMainで分割するんですね!返信ありがとうございます!

シューティングゲームの館を参考したりしてがんばります!

tomazo

BG背景のスクロールスピード処理について

#7

投稿記事 by tomazo » 16年前

 初めて投稿させていただきます。この場所をきっかけにプログラム始めました。
 
 現在、龍神録プログラミングの館25章のプログラムの所を勉強させていただいております。
 
龍神録プログラミングの館で、縦スクロールプログラム処理の学習途中ですが大変、沢山参考に

なります。少しスクロール処理での疑問がありました。過去ログを検索してもちょっと探せなかった

ので質問させていただきます。

 龍神録プログラミングの館のプログラムコードを使って、BG背景のスクロールスピードを速める方法です。

背景スピードを遅くするのは多分、描画前後のタイミングで少しウェイト処理を入れれば遅くなるんだろう

と思うのですが、BG背景スピードを今より速くする処理方法というのはないのでしょうか?

グラフィックカードやハードウェアの環境や性能などハードウェアの処理スピードに依存

してしまうのでしょうか?

参考になる情報、サンプルコードなどが御座いましたらよろしくお願いします。

array

Re:BG背景のスクロールスピード処理について

#8

投稿記事 by array » 16年前

はじめまして、tomazoさん

まず、背景を描画している箇所は分かりますか?

背景スクロールはcountを利用して毎フレーム描画位置をずらしていくことでスクロールしているかのように
みせています。

なので、countの値を1倍すれば、通常速度、2倍すれば2倍、0.5倍すれば低速度でスクロールしてくれると思います。


ちなみに、ウェイト処理を入れてしまうと、並列処理(マルチスレッドというのかな?)でもしてない限り、ゲーム全体に影響が出てしまいます。

TRUTH

Re:BG背景のスクロールスピード処理について

#9

投稿記事 by TRUTH » 16年前

こんにちは。はじめまして


スピードの調節はarrayさんの仰った方法で実装できます。
自分も龍神録プログラミングの館を使用して勉強しましたが
その疑問は、第43章「きっちりFPSを制御してみよう」でも解決する事も可能です。


簡単に言いますと、ハード(処理速度に関係するもの)に依存しないように
処理したあとにウェイトをかけて、どのPCでも同じように動いてるように見せています。
ですので、ウェイトを長くするということはゲームのスピード全体を遅くすることになってしまいます。
(弾の速度・動きまですべて)

tomazo

Re:BG背景のスクロールスピード処理について

#10

投稿記事 by tomazo » 16年前

arrayさん、TRUTHさん、こんばんは、初めまして。

早速の御回答ありがとうございます。

確かに思うような動きました。ありがとうございました。

まだ25章なのでもうちょっとがんばって45章も理解したいと思います。

時間軸に対しての処理は、どうも苦手だったんですけど、ここで勉強すれば多分

克服できそうに思えてきました。これからもお願いします。

閉鎖

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