ページ 11

DXライブラリの使い方

Posted: 2009年11月07日(土) 20:39
by ピーマァン
東方みたいなシューティングを作りたいと思いC言語をはじめてみました
それで基礎は一通りやったので
DXライブラリをつかっていろいろしようとおもったのですが
DXライブラリというものがそもそもなにでどうやって設定したりするのか
まったくわかりません><
自分はあまり賢くないのでわかりやすく誰か教えてください
おねがいします

Re:DXライブラリの使い方

Posted: 2009年11月07日(土) 21:32
by チルチル
とりあえず本家のサイトは見たでしょうか?

http://homepage2.nifty.com/natupaji/DxLib/

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 06:51
by ピーマァン
もう一度最初から見直したらできました
ありがとうございます^^

ですがDXライブラリの使い方を学習していたんですが
一つのプロジェクトにたくさんあると見にくいので2つ目のプロジェクトをつくったんですが
「WinMain@16 は既に 1~9.obj で定義されています」
とでてエラーになります
コノ場合はどうすればいいのでしょうか?
どこかで設定を間違えたのでしょうか?

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 11:52
by チルチル
え~と状況が良くわからないのですが

>一つのプロジェクトにたくさんあると見にくいので

何が沢山あるのでしょうか?

>2つ目のプロジェクトをつくったんですが

そこには何を入れていますか?

>「WinMain@16 は既に 1~9.obj で定義されています」

おそらく1~9.cppがあるんだと思いますが
そこには何が書かれていますか?

全部にWinMain関数が書いてあったりしませんか?

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 12:57
by ピーマァン
回答ありがとうございます

>何が沢山あるのでしょうか?
ちょっと間違えました><
えと二つ目のcpp形式のものを作りたかったということです

>全部にWinMain関数が書いてあったりしませんか?
二つ目のものにも1つ目と同じようにかきました
二つ目からはどのようにかけばいいのでしょか?

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 13:22
by チルチル
あ~なるほど、何となくわかったかもしれません

とりあえずプログラムが複数のプロジェクトにまたがっているのはマズイので
プロジェクトが複数あるなら1つにしてください

おそらく分割コンパイルが良くわからないみたいなので

http://www.geocities.jp/ky_webid/c/032.html

この辺が参考になるかもしれません

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 13:49
by ピーマァン
よくわからないのでもう一度かかせてもらいます><

今したいことは
二つ目以降のcppのファイルで今までどおりのをコピペして実行したところ
WINAPIのところのやつで再定義されているとでてしまったのでそれの解決法がしりたいってことです

参考にだしてもらったのを見ましたが
自分で定義した関数を複数のファイルに読み取らせるにはexternをつけなきゃいけないよ
ってことですよね?

てことはDxLib.hのファイルに何か手を加えないといけないってことですか?

もし意味不明だったらすいません;;

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 14:28
by チルチル
>二つ目以降のcppのファイルで今までどおりのをコピペして実行したところ

一つ目と二つ目以降は全部同じものが書かれているんでしょうか?

差し支えなければプログラムを全部添付していただけませんか?

>WINAPIのところのやつで再定義されているとでてしまったのでそれの解決法がしりたいってことです

そこは理解しているので大丈夫です

先ほどのサイトの内容が理解できれば解決できると思いますが
さすがにアレだけで理解するのは無理がありますね・・

エラーの内容は「WinMain関数が複数定義されているので、どれを使えば良いかわからない」と言うものです

なのでWinMain関数を1つだけ残して後は消してください

そして

>自分で定義した関数を複数のファイルに読み取らせるにはexternをつけなきゃいけないよってことですよね?

これは方法によります

externを使わなくてもできますが
どの方法が一番良いかは時と場合によります

とりあえず今回はexternを使えば良いと思います

前提知識の話ですが
ヘッダをインクルードするのは
コンパイル時にヘッダに書かれている内容が
インクルードしている場所に貼り付けられると言うものです

なので複数のcppに同じ宣言を書く時はヘッダに書いておいてインクルードした方が管理がしやすいのです
つまりプログラムの「大きな」部品化です、「小さな」は関数とかです

>てことはDxLib.hのファイルに何か手を加えないといけないってことですか?

ヘッダファイルに手を加える必要は無いです

関数はブラックボックスと言う考え方があります
つまり引数と戻り値がわかっていれば中身を知らなくても使えます

ヘッダファイルには宣言を書きます
関数ならプロトタイプ宣言を書きます
つまり引数と戻り値が何かを宣言します

ソースファイルには定義を書きます
関数の実体、つまり中身です

例えばmain.cppにWinMain関数の定義を書きます

WinMain関数の中でSum関数を使います

Sum関数の定義はSum.cppに書いてあります

Sum関数のプロトタイプ宣言はSum.hに書かれています

main.cppでWinMain関数の前にSum.hをインクルードすれば

WinMain関数からSum関数の中身は見えませんが

Sum関数の使い方は見えるのでWinMain関数はSum関数を使う事ができます

>もし意味不明だったらすいません;;

今の所はわかりやすいので大丈夫ですよ

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 14:50
by ピーマァン
なるほど!
WINAPIのところをなくしてint main()にしたらできました
わかりやすい説明ありがとうございました m(_ _)m

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 14:58
by チルチル
ん?DXライブラリを使うのにWINAPI WinMain関数じゃなくてmain関数って言うのは大丈夫なんでしょうかね・・

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 15:14
by ピーマァン
一応できました;;
ですが3つめのをmain関数にするとまたエラーが・・・

二つ目に作ったのをのせるので間違っているところがあれば教えてください><

#include "DxLib.h"
int main(){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了



//3、4 画像表示

LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
//つまりtrueが透過処理をする falseが透過処理をしない


WaitKey(); // キーの入力待ち(なにかキー入力があるまで待つ)
DxLib_End(); // DXライブラリの終了処理
return 0;
}



これって一つのパソコンの中にWINAPIやmainは一回しか書かない
というような意味なんでしょうか?
違いますよね? どうすればいいんでしょう・・・

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 15:42
by チルチル
あ~なるほど説明不足でした

オーバーロードは別として基本的にmain関数に限らず同名の関数とか変数とかは
コンパイラがどれを使えば良いかわからないのでエラーになります

と言うかWINAPI WinMainでもmainでもmain関数である事に変わりはありません

コンソールプログラムの時はmainを使って

Windowsプログラムの時はWINAPI WinMainを使うといった違いがあるだけです

DXライブラリを使うのでWINAPI WinMainですね

プログラムは基本的にmain関数から始まるので複数あってはいけません

main.cppにWINAPI WinMain関数を書いて

他の関数は別々のcppに定義を書いておいて

対応するヘッダをmain.cppでインクルードして

WINAPI WinMain関数で他の関数を呼び出すのが基本的な流れです

今回の場合においては

まずmain.cppと言うソースファイルを作ってWINAPI WinMain関数を書きます



>ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
>if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

この辺はmain.cppに書いておけば良いと思います



>LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
>LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
>//つまりtrueが透過処理をする falseが透過処理をしない

この辺は別の関数の中に書いておいて
その関数は別のcppファイルに定義を書いておきます

そしてこの関数のプロトタイプ宣言を対応するヘッダに書いておきmain.cppでインクルードします



WINAPI WinMain関数でその関数を呼び出した後に

>WaitKey(); // キーの入力待ち(なにかキー入力があるまで待つ)
>DxLib_End(); // DXライブラリの終了処理
>return 0;

この辺を書いておきます



#include "DxLib.h" はDXライブラリの関数を使っているcppだけに書けばOKです

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 16:10
by ピーマァン
理屈はだいたいわかりましたが書きかたがいまいちわかりません

>>LoadGraphScreen(0,0,"背景1.png" ,false); //falseはその絵の何もない部分を黒 で表示する
>>LoadGraphScreen(0,0,"絵1.png" ,true); //trueは その絵の何もない部分は透明で表示する
>>//つまりtrueが透過処理をする falseが透過処理をしない
(とくに上のインクルードのところです)

何か具体例でいいので書き方一覧を見たいのですがそれがのっているサイトはありませんか?

Re:DXライブラリの使い方

Posted: 2009年11月08日(日) 16:20
by ピーマァン
あ さっき紹介してくださったサイトみてみたらできました^^
最後まで教えてくださってありがとうございましたm(_ _)m