DXらいぶらり エラー

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

DXらいぶらり エラー

#1

投稿記事 by seji » 11年前

DXライブラリでゲームを作り始めようとして、クラス化しようとしたんですが以下のようなエラーが出ました
ほどんどいじったことがないのでよくわかりません。ご指摘おねがいします.

エラー 1 error LNK2005: "public: void __thiscall MyChar::jump(void)" (?jump@MyChar@@QAEXXZ) は既に main.obj で定義されています。
エラー 2 error LNK2005: "int __cdecl onLand(int)" (?onLand@@YAHH@Z) は既に main.obj で定義されています。
エラー 3 error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

ソースファイルは下です。

//main.cpp

#include "DxLib.h"
#include "MyChar.cpp"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);

if (DxLib_Init() == -1)
{
return -1;//エラーが起きたら直ちに終了
}

SetDrawScreen(DX_SCREEN_BACK);


MyChar p;


while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
ClearDrawScreen();

//ジャンプと移動の処理
p.jump();

DrawGraph(p.x, p.y, p.img, TRUE);


ScreenFlip();
}

DxLib_End();

return 0;
}


//MyChar.cpp
#include "DxLib.h"
int onLand(int);

class MyChar{

public:
int img = LoadGraph("player.png");
int x=0, y=480-32;

int isJump=0;
int ay=0;

int isThrow;
int g = 1;

void jump();
int onland(int);
};

void MyChar::jump(){
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);

if (key & PAD_INPUT_RIGHT) x += 10;
if (key & PAD_INPUT_LEFT) x -= 10;

int StartTime = 0;
if (isJump != 2){
if (key & PAD_INPUT_10 && 200 <= GetNowCount() - StartTime){
StartTime = GetNowCount();
ay = -17;
isJump++;
}
}

if (isJump >= 1){
ay += g;
y += ay;

if (onLand(y)){
isJump = 0;
y = 480 - 32;
StartTime = 0;
}
}
}

int onLand(int y){
if (y > 480 - 32)
return 1;
else
return 0;
}

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: DXらいぶらり エラー

#2

投稿記事 by zxc » 11年前

  コードを貼る場合はコードタグを使ってください。インデントももう少し見やすくしたらいかがでしょうか。宣言はヘッダファイルに、定義は.cppファイルに書く場合が多いと思うのですが、.ccpファイルにまとめた理由はなんでしょうか。きちんとファイル分割し、多重インクルードガードをすればある程度エラーは減ると思います。
もしファイル分割やインクルードガードが分からなくとも、それらは検索やC++学習サイトを確認することで、すぐに分かると思います。

コード:

//main.cpp

#include "DxLib.h"
#include "MyChar.cpp"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){
   ChangeWindowMode(TRUE);

   if (DxLib_Init() == -1){
      return -1;//エラーが起きたら直ちに終了
   }

   SetDrawScreen(DX_SCREEN_BACK);


   MyChar p;

   while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
      ClearDrawScreen();

      //ジャンプと移動の処理
      p.jump();

      DrawGraph(p.x, p.y, p.img, TRUE);

      ScreenFlip();
}

   DxLib_End();

   return 0;
}

コード:

//MyChar.cpp
#include "DxLib.h"
int onLand(int);

class MyChar{
   public:
   int img = LoadGraph("player.png");
   int x=0, y=480-32;
   int isJump=0;
   int ay=0;
   int isThrow;
   int g = 1;

   void jump();
   int onland(int);
};

void MyChar::jump(){
   int key;
   key = GetJoypadInputState(DX_INPUT_KEY_PAD1);

   if (key & PAD_INPUT_RIGHT) x += 10;
   if (key & PAD_INPUT_LEFT) x -= 10;

   int StartTime = 0;
   if (isJump != 2){
      if (key & PAD_INPUT_10 && 200 <= GetNowCount() - StartTime){
         StartTime = GetNowCount();
         ay = -17;
         isJump++;
      }
   }

   if (isJump >= 1){
      ay += g;
      y += ay;

      if (onLand(y)){
         isJump = 0;
         y = 480 - 32;
         StartTime = 0;
      }
   }
}

int onLand(int y){
   if (y > 480 - 32)
      return 1;
   else
      return 0;
}

seji

Re: DXらいぶらり エラー

#3

投稿記事 by seji » 11年前

タグはじめてこのサイトを利用したのでわかりませんでした。
次回使わせていただくときは活用させていただきます。

あまりゲームなどを作り慣れてないので、どこに定義してよいかわかりませんでした。
いろいろ調べて参考にさせていただきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXらいぶらり エラー

#4

投稿記事 by softya(ソフト屋) » 11年前

一般アプリでも定義の基本は変わりませんよ。
あと、 zxcさんのコードも間違っている気が。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: DXらいぶらり エラー

#5

投稿記事 by zxc » 11年前

  単純にインデントを私が見やすいようにそろえたという例なので、正しいかどうかはよく見てません。

閉鎖

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