|
Name: キエル ..ぴよぴよ(50ポイント)
Date: 2008/09/25(木) 10:57
No:21667
|
|
Title: 画像使用
|
|
C言語でのシューティングゲーム作成で使われているキャラクター画像なんですが、ゲーム制作の為に使用してもよろしいでしょうか?
50ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(15,478ポイント)
Date: 2008/09/25(木) 11:24
No:21668
|
|
Title: Re:画像使用
|
|
>キエルさん
下の文は以前、同じような質問の際の管理人さんの回答です(^^;
>>二次使用を許可すると歯止めが効かなくなりそうなのでとりあえず今の所ダメということでお願いします。
>>ただ報告して下さった方、作品を拝見させて下さる方、無料で公開される方に限り、
>>申し訳ないですが私の判断で許可させて頂きたいと思っています。
>>ただし、アイシャの立ち絵だけは私が製作したものではないので許可出来ないかもしれません。
>>今度聞いておきます。
>>元々私はこういう規約に全くうるさくない人間なので、全て気軽に使っていただきたいのですが、
>>どうも規約を細かく設けないと心無い使用をされる方がいらっしゃるようなので、仕方なく設けていま
>>す・・。
>>もちろんarrayさんが心無い使用をされるとは思っていませんが、一般的にラインを決めないといけないの
>>で、
>>どうかご理解頂けるとありがたいと思います。
>>あと、最初は限りなく東方に似るように作ったため、色んな素材が東方に似ているのですが、
>>もし販売などお金に関わることをされる場合は、あまりよくないと思うので
>>完全にオリジナルにされた方がいいかもしれませんm(_ _)m
355ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(803,889ポイント)
Date: 2008/09/25(木) 13:21
No:21675
|
|
Title: Re:画像使用
|
|
Haruさんありがとうございます。
ゲーム製作の為には使用していただいて結構です。
ただそれを商用利用したり、配布したりするのは一応ダメということにさせて頂いています。
私はなるべく自由に使っていただきたいのでこの規約については現在検討中です。
もしどうしてもアイシャを使いたいと言う事でしたら
アイシャが龍神録のキャラであることを明確にしていただける事を条件にご使用下さって結構です。
よい作品が出来るといいですね。
130ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(15,597ポイント)
Date: 2008/09/25(木) 13:25
No:21676
|
|
Title: Re:画像使用
|
|
>管理人さん
>Haruさんありがとうございます。
余計なお世話だったらすいません(^^;
また、わからないところがあって、質問しようかなぁ、、
でも、もうちょっと頑張ってみようかなぁ・・・なんて考えている最中で。。。
つまりは気分転換です!(ぉぃ
119ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(15,749ポイント)
Date: 2008/09/25(木) 15:15
No:21681
|
|
Title: Re:画像使用
|
|
管理人さん
>いえいえ、わざわざ過去ログから引用してくださりありがとうございます。
管理人さんにお礼言われたら逆に恐縮です(汗
>何かわからないことがありました?
>もし私が力になれる範囲でしたら力になりますm(_ _)m
ありがとうございます!
もう少し考えてみてわからなかったらトピたてます!
そのときは宜しくお願いしますm(_ _)m
152ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..ぴよぴよ(613ポイント)
Date: 2008/09/18(木) 16:32
No:21471
|
|
Title: 3次元配列の初期化
|
|
int a[2][2][2] = {
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
};
これを実行すると
「初期化子が多すぎる」
とでます。
int a[2][2][2] = {
0,0 ,
0,0 ,
0,0 ,
0,0 ,
0,0 ,
0,0 ,
0,0 ,
0,0
};
にするとうまくいくのですが上のほうがすっきりしているので
上のようにできないものでしょうか。
289ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(51,127ポイント)
Date: 2008/09/18(木) 16:47
No:21472
|
|
Title: Re:3次元配列の初期化
|
|
以下ではどうでしょうか?
int a[2][2][2] =
{
{
{ 0, 0 },
{ 0, 0 }
},
{
{ 0, 0 },
{ 0, 0 }
}
};
後、上も下も数値の数が多すぎます。
2x2x2なので数値の数は8個までですが
YHさんのプログラムでは16個の初期化子が定義されています。
51ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(17,499ポイント)
Date: 2008/09/18(木) 16:49
No:21473
|
|
Title: Re:3次元配列の初期化
|
|
int の総数は8(2の3乗)なので、
エラーが出るのは数値の数が多い(16個)からではないでしょうか。
後者の書き方では 0 以外の数値を入れるとエラーが出ると思います。
(もしかしたらエラーではなく警告がでるかも)
63ポイント を手に入れた。
|
|
|
|
|
Name: conio ..ぴよぴよ(255ポイント)
Date: 2008/09/23(火) 00:18
No:21583
|
|
Title: Re:3次元配列の初期化
|
|
全部「0」で初期化するのであれば、
a[2][2][2] = {0};
で良いのではないでしょうか?
31ポイント を手に入れた。
|
|
|
|
|
Name: conio ..かけだし(1,196ポイント)
Date: 2008/09/23(火) 02:06
No:21587
|
|
Title: Re:3次元配列の初期化
|
|
あと補足ですが、これでは{}の数が合っていないので、ただの二次元配列"a[8][2]"です
-----------------------------------------------------------------------------
int a[2][2][2] = {
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
{ 0,0 },
};
-----------------------------------------------------------------------------
要素を全部書く場合は、配列の一番左の値から順に書いていけば大丈夫だと思います。
●a[2][3][2]の場合●
@:まず、配列全体の{}を書く。
a[2][3][2] = { };
A:一番左の数だけカッコを中に書く(この例では2個)
a[2][3][2] = { { },{ } };
B:二番目の数だけカッコを更に中に書く(この例では3個)
a[2][3][2] = { { {},{},{} },{ {},{},{} } };
C:一番最後の数だけ要素を書く。(この例では2個。要素の間にはコンマを付ける。)
a[2][3][2] = { { {●,●},{●,●},{●,●} },{ {●,●},{●,●},{●,●},} };
D:見やすくする場合は、段落などを付ける。
int a[2][3][2] =
{
{
{ ●, ● },
{ ●, ● },
{ ●, ● }
},
{
{ ●, ● },
{ ●, ● },
{ ●, ● },
}
};
※a[2][2][2]の場合はGPGAさんのを見て下さい(上記参照)
多重ループのように、どんどん階層が深くなるという感じです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ついでに、カッコを書かない場合は配列の最初から順に初期化されます。
要素が足りない場合は、残りが全て「0」になります。(多い場合はエラー)
a[2][3][2]={1,2,3,4,5,6,7};
int a[2][3][2] =
{
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
},
{
{ 7, 0 },
{ 0, 0 },
{ 0, 0 },
}
};
a[0][0][0] = 1
a[0][0][1] = 2
a[0][1][0] = 3
a[0][1][1] = 4
a[0][2][0] = 5
a[0][2][1] = 6
a[1][0][0] = 7
a[1][0][1] = 0
〜以下略〜
このようになります。
941ポイント を手に入れた。
|
|
|
|
|
Name: wiz ..ぴよぴよ(34ポイント)
Date: 2008/09/25(木) 02:55
No:21653
|
|
Title: Re:3次元配列の初期化
|
|
Cの規格では
int a[2][2][2] = { 1,2,3,4,5,6,7,8 };
と書こうが、
int a[2][2][2] ={
{
{ 1, 2 },
{ 3, 4 }
},
{
{ 5, 6 },
{ 7, 8 }
}
};
と書こうが意味は一緒です。
34ポイント を手に入れた。
|
|
|
|
|
Name: 匿名
Date: 2008/10/06(月) 16:56
No:214711223279778
| 解決!
|
Title: Re:3次元配列の初期化
|
|
a[2][2][2] = {0};
って言うのできるんですね
ありがとうございます
|
|
|
|
Name: KIKI ..ぴよぴよ(36ポイント)
Date: 2008/09/25(木) 04:50
No:21656
|
|
Title: 文字操作
|
|
初めまして、KIKIと申します。
現在C言語にて、バイナリからs-jis変換し、
出力するという処理を行っています。
1バイト変換はsprintfで変換できました。
(例:0x61をaに変換し出力)
しかし2バイト変換がどうしてもできません。
(例:0x820xA0を「あ」という文字で出力をしたい。)
現在わかっていることといえば、
1バイト目が0x81から0x9Fと0xE0から0xEFの場合は
全角文字になるというぐらいです。
どなたか、アドバイスよろしくお願いいたします。
(例:
36ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(18,470ポイント)
Date: 2008/09/25(木) 10:13
No:21666
|
|
Title: Re:文字操作
|
|
バッファを用意して、
char buf[3];
1バイト変換の時は、
buf[0] = c1;
buf[1] = '\0';
2バイト変換の時は、
buf[0] = c1;
buf[1] = c2;
buf[2] = '\0';
として、後は文字列として処理すれば良いと思います。
84ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(25,245ポイント)
Date: 2008/09/21(日) 12:00
No:21539
|
|
Title: DXライブラリプロジェクト作成ツールについて
|
|
お邪魔します。お久しぶりです。
まず、バグさんが開発された「DXライブラリプロジェクト作成ツール」をDLさせていただきました。ありがとうざいます。
さっそく何ですが、DXライブラリプロジェクト作成ツールを使用し、作られたプロジェクトには
main.cpp
stdafx.cpp
main.h
stdafx.h
があります。
1、stdafx.cppにいろいろと書いてありましたが、分割ファイルの一つと考えてよろしいのでしょうか?それともなにか重要な意味があるのでしょうか?
2、main.hは何のためにあるのでしょうか?
2についてはググってresource.hは調べてみたのですが、はっきりとした意味がつかめませんでした。。勉強不足かもしれませんが。。注釈のコメントも初心者には少し理解が^^;
よろしくお願いします。
PS.過去ログを見てこのツールの説明的なのを探してみましたが、見つかりませんでした。
昇進制度ができる前あたりの雑談は個人的に好きですww
52ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(224,169ポイント)
Date: 2008/09/21(日) 23:34
No:21556
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
>1 分割ファイルの一つと考えてよろしいのでしょうか
stdafx.h/cppは VisualStudioで新規に Win32プロジェクトを作ったとき、
プリコンパイル済みヘッダーにチェックが入っていると VisualStudioによって
自動的に生成されるファイルです。
分割ファイルというのが異なるソースファイルということであれば yesです。
> それともなにか重要な意味があるのでしょうか?
vcprojファイル内に書かれているプロジェクトの設定次第ですが、
今回の場合これらのファイルがプリコンパイル済みヘッダーに指定されているので
重要な意味があるといえばその通りです。
>2 main.hは何のためにあるのでしょうか?
今後、main.cpp内の関数、或いは変数を別のソースファイルで使いたいときの、
宣言を記述する為、ではないでしょうか。
つまり main.cpp単独で完結するなら不要なファイルで、削除してしまって構いません。
(というか、デフォルトの状態ですと main.hはどこからも使われてないわけで
完全にゴミファイルですね。)
>過去ログを見てこのツールの説明的なのを探してみましたが、見つかりませんでした
マニュアルも添付はしていませんでしたし、これだけ過去ログも多くなると、
検索するのが困難なのはわかります(w
C言語何でも質問掲示板
http://www.play21.jp/board/formz.cgi?action=res&resno=1832&page=&lognum=6&id=dixq&rln=1847
410ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,725ポイント)
Date: 2008/09/21(日) 23:56
No:21557
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
>>まず、バグさんが開発された「DXライブラリプロジェクト作成ツール」をDLさせていただきました。ありがとうざいます。
私が作ったのではありませんよ(苦笑)
66ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(799,910ポイント)
Date: 2008/09/22(月) 00:11
No:21560
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
お作りになったのはJustyさんですね^^;
>過去ログ
いや〜作ったばかりの頃はまさかこんな大量に過去ログが出来るとは思いませんでした・・^^;
21styaleさんに何度かお願いしているんですが、
「全ログ検索はサーバーの負担がかかるからダメ」とのことで、10個ずつの検索になってます。
う〜ん、やはり自作掲示板にした方がいいんですかね・・。
しかし、最初の頃の掲示板は自分でも恥ずかしくなるような内容が多いですね〜^^;
最初の常連さんはJustyさんかyukemuriさんかダッシュさんの3人しかいらっしゃいませんでしたし、
お互いに会話してるだけのようなトピが多いですねw
一番最初の頃はログを保存してなかったので消えてしまいましたけど、
一応今見れる一番古いログよりもっと前から掲示板はあったんですよね。
こんなトピック型じゃなく、色々と使いにくい掲示板でしたよ^^;
作ったばかりの頃は書き込むのは管理人だけという日記のような掲示板でしたw
しかし過去ログ100以上になってくるとそれこそ全ログ検索機能が欲しいな・・。
334ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(223,588ポイント)
Date: 2008/09/22(月) 00:45
No:21562
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
>全ログ検索はサーバーの負担がかかるからダメ
うーん、せめて過去ログの(一括)ダウンロードができればいいんですよね。
(今は現行ログしかできない)
htmlベースでも、cgiが出力するテキストベースでもいいんで
ローカル上で検索できればサーバーの負担も減りますし、
もっと柔軟な検索ができるわけですし。
>最初の常連さんはJustyさんかyukemuriさんかダッシュさんの3人しかいらっしゃいませんでしたし
私は過去ログ1からの参戦のようですね。
それよりも前から有ったとは知りませんでした。
>う〜ん、やはり自作掲示板にした方がいいんですかね・・。
検討するなら自作掲示板というか、サーバーの移転じゃないでしょうか。
添付ファイルの容量制限も結構キツイですし、過去ログに行くとファイルが
失われるのも問題といえば問題ですし。
どこかのレンタルサーバー借りて、適当な掲示板 cgiと専用のアップローダを乗っけて。
ついでに今までの過去ログの生データが手にはいるなら加工を、そうでなければ
1スレずつ htmlで(ツールを使って)保存しておけば、過去ログも見られてバッチシ。
なんてどーでしょう?
581ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(799,762ポイント)
Date: 2008/09/22(月) 00:59
No:21563
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
C言語何でも質問サイトとしての掲示板は作ってすぐJustyさんがいらっしゃったので、
この関連の掲示板としては過去ログ1はほとんど最初に近いですね。
その前はしょうもないあるゲーム攻略サイトでしたから^^;
>検討するなら自作掲示板というか、サーバーの移転じゃないでしょうか。
ホントですね・・。
今現在借りているレンタルサーバーには何度問い合わせても返事ないですし、
料金払えず未納なので、いつなくなってもおかしくない・・。
毎日心配してます^^;
しかしお金払わせてくれと連絡しているのに返事しないなんて一体どういう対応・・orz
>今までの過去ログの生データが手にはいるなら加工を、そうでなければ
>1スレずつ htmlで(ツールを使って)保存しておけば、過去ログも見られてバッチシ。
そうできれば理想的ですね〜。
生データは今掲示板の製作者さんにいただけないか聞いてみました。
ダメな場合、自分で全ログ引き出すツール作れば何とかなりそうですが、大変そう・・。
とりあえず管理人がCGIの知識つけなければ始まりませんね(汗
491ポイント を落としてしまった。
|
|
|
|
|
Name: kazuoni ..プログラマー(25,811ポイント)
Date: 2008/09/22(月) 01:22
No:21564
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
Justyさん、バグさん本当にご迷惑をおかけしました。。
ぷよぷよと見誤っていました。。
だから過去ログも見つけられなかったんです。。
投稿者をバグさんで必死に探していましたから^^;
訂正
Justyさんが開発された「DXライブラリプロジェクト作成ツール」をDLさせていただきました。
ありがとうざいます。
「プリコンパイルはビルドの高速化に役立つものであって
stdafx.hは変更がさほど頻繁に行われないヘッダーを読み込むもの
(stdio.hなど)」
これはわかりました。
main.hは「main.cpp内」の関数・変数を他のソースファイルで使用するためのものなので
例えばmain関数内にint iという変数があり
それを他で使いたければmain.hに
extern int i;
を記述し、使いたいところで
#include "main.h"
を加えればよいということですよね?
ということはmain関数には関わらないが他のソースファイル間で使用されている関数・変数は
新たにヘッダーを作り、各々のソースファイルにインクルードさせてやる
いちいちすいません。順序たてないと理解できないたちでして。。
ただやはりstdafx.cppだけ理解できないです。
指定されているとなると消せなさそうで、でも何のために使ったらいいか分からず。。
488ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(224,648ポイント)
Date: 2008/09/22(月) 02:08
No:21565
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
kazuoniさん
>Justyさんが開発された「DXライブラリプロジェクト作成ツール」をDLさせていただきました
ありがとうございます。
ですが、いい話と悪い話があります。
悪い話から。
実はこのツールは作られたのも2年くらい前で、古い DXライブラリのバージョンを
対象にしていることや MSVC2005以降はなくなったシングルスレッドでのビルドになっていたりと、
ビルドに問題があります。
そこでいい話です。
filesディレクトリを一端消して頂いて、添付のものに差し替えて下さい。
これで現バージョンのものに対応できるはずです。
>投稿者をバグさんで必死に探していましたから
あー、それは見つからないですわ(w
私はツールの日付を見て、過去ログの大体のあたりを付けて見つけました。
>使いたいところで〜略〜を加えればよいということですよね
そういうことです。
>ということはmain関数には関わらないが他のソースファイル間で使用されている関数・変数は
新たにヘッダーを作り、各々のソースファイルにインクルードさせてやる
んーと、一般的には *.cや *cppで定義されている関数を
別のソースコードで使いたい場合は拡張子が .hなファイルを用意し、
そこにプロトタイプ宣言を書きます。
このあたりは浅いようで深かったりしますので、じっくりと勉強してみて下さい。
ソースファイルとヘッダーファイル
ttp://www.kab-studio.biz/Programing/Codian/Cpp/02.html
C言語編 第32章 ファイル分割
ttp://www.geocities.jp/ky_webid/c/032.html
>ただやはりstdafx.cppだけ理解できないです
簡潔に言ってしまえば、プリコンパイル済みヘッダは stdafx.hなのですが、
stdafx.cppはその「プリコンパイル済み」な情報(*.pch)を作成するためのソースファイルです。
ちなみに先の files以下を添付のものに差し替えると、main.cppだけになり、
プリコンパイル済みヘッダーはプロジェクトからも削除してあります。
シンプルになったので、大分わかりやすくなったのではないでしょうか。
1,060ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(224,930ポイント)
Date: 2008/09/22(月) 02:10
No:21566
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
管理人さん
>その前はしょうもないあるゲーム攻略サイトでしたから^^;
あー、そうだったんですか。
トリビアだ(w
>今現在借りているレンタルサーバーには何度問い合わせても返事ないですし
まだ解決していなかったのですか。
ここまで来て全データ消滅とかになったら、ほんと怖いですね。
>生データは多分掲示板の製作者さんにお願いしないと無理だと思いますが、
>手に入らない可能性大きいですね・・。
21Styleのページを見たところ生データはダメそうな気がしますね。
>自分で全ログ引き出すツール作れば何とかなりそうですが、大変そう・・。
過去ログ表示 cgiに POSTして、各過去ログページの htmlを取得、
ファイル内のタグを解析して各スレへのリンクを見つけ、内容をDL。
ついでに、余計な Javascriptを排除し、html版と text版の2種類で
出力って感じですかねぇ。
282ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(26,006ポイント)
Date: 2008/09/22(月) 09:23
No:21569
| 解決!
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
Justyさん、ご回答ありがとうございます!
さっそくfilesの中身を変えてきました。
これならものすごいシンプルですが
もし今回の事を調べなければ
プリコンパイルについてなどは
おそらく一切触れずにいたと思います^^;
C言語は勉強(ポインタ、構造体など)できても、
その他の用語(リソース、ビルドなど)は何となく通り過ぎるだけであって
根本から理解していないのが現状なんですよね^^;
だからいつまでたってもvisual c++ 2008が使いこなせないんですけど。。
今回とても勉強になりました。本当にありがとうございました
昔はゲーム攻略サイトだったんですか!?
それにしても確かにあの過去ログが消えてしまうのは残念ですね。。
195ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,075ポイント)
Date: 2008/09/22(月) 13:55
No:21570
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
>Justyさん
管理人のみ入れる設定画面の中に過去ログダウンロードのボタンがありましたm(_ _)m
ただ「過去ログn番目をダウンロード」という方法でダウンロードしていかないといけないので、
68回入力してダウンロードしないといけなさそうです(汗
ただとりあえず検索画面からダウンロード出来るような形で全ログは入手は可能でした。
>たかぎさん
ありがとうございます><
たかぎさんにご協力いただけるとは心強いですm(_ _)m
早速今出来る事をやっておこうと思うのですが、
全ログデータをダウンロードして、それを全て
何かわかりやすいタグ別に分けておけばいいですか?
(例)
名前:○○
題名:○○
投稿日:○○
本文:○○
それとももう既にダウンロードして入手できるHTML形式のデータのままの方がいいのでしょうか。
313ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,253ポイント)
Date: 2008/09/22(月) 14:10
No:21572
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
ありがとうございます。
今日中にデータは全てダウンロードしておこうと思います。
ただレンタルサーバーの契約と掲示板の契約は別なので、
(レンタルサーバーはtok2、掲示板は21style)
仮にレンタルサーバーの方がうちきられても、掲示板は存在しているので、
その部分は大丈夫かなと思います。
また、掲示板以外のサーバー上にあるデータは全て自分のPCにもあるので、
そちらも大丈夫かと思います。
早速今日学校帰りに本屋へ行ってみます〜♪
178ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,533ポイント)
Date: 2008/09/22(月) 14:20
No:21573
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
後、tok2は月200円でファイルアップロード無制限と、すごく格安だったのですが、
他に格安でよいレンタルサーバーをどなたかご存知でしたら教えていただけるとありがたいですm(_ _)m
サーバーは安定しててよかったものの、
カスタマーサービスの対応が最悪でした・・。
その辺中々広告見ただけじゃわかりにくいですね;
2倍のポイントを手に入れた! 280ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(59,747ポイント)
Date: 2008/09/22(月) 17:04
No:21574
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
> 後、tok2は月200円でファイルアップロード無制限と、すごく格安だったのですが、
> 他に格安でよいレンタルサーバーをどなたかご存知でしたら教えていただけるとありがたいですm(_ _)m
その価格帯で手厚いサポートを期待するのは無理です。
もし自分がホスティングサービスを始めるとして、月200円でどれだけのサービスを提供できるかを考えれば容易に想像がつくはずです。
というわけで、安定性や機能面に問題がないのであれば、敢えて引越しする必要はないと思います。
もし将来的に引越しすることを睨むのであれば、早めに独自ドメインに切り替えることをお勧めします。
181ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,743ポイント)
Date: 2008/09/22(月) 20:39
No:21579
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
手厚いサポートは期待してないのですが、
カスタマーサポートの問い合わせ欄があるのなら、
振込みさせてくれという問い合わせに位答えて欲しいです・・。
早急にとは言いませんが、今まで5〜6通送ったのに
半年間何の返事もありません。
う〜ん、アップロード無制限なのと、機能面、安定性に問題が無いのはいいのですが、
データ転送量が2Gなのと、200円を考慮してもあまりにも酷い対応が欠点なので、
やはり他を探してみようかと思います。独自ドメインも取得しようと思います。
学生だったのでお金がなかったですが、4月から社会人になりますし、
年間1万円位まで予算上げて探してみようと思います。
210ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,204ポイント)
Date: 2008/09/22(月) 20:56
No:21580
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
パソコンで余ってるのがあれば自分でサーバーを立ち上げるのもありかと思います。
必要と思われるのは(私の経験によるとですが
@PC(サーバ用)
A回線
B適当なDNSサービス
他になにかあった気もしますが気のせいと思いたいです(汗)
#最近は固定IPじゃなくても良い所も多いようです。
118ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,860ポイント)
Date: 2008/09/22(月) 21:20
No:21581
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
あ〜それもそうですね。
色々融通が利くし、とても興味あります・・・
が、
ただワンルームなので、常に大音量のファンが回転しているのは耐えられないです;
それに月200円なら電気代だけ考えても・・
とくとくはよく200円で提供してますね〜;
確かにホームサーバーは魅力的ですね。
後々考えてみようと思います。
117ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(225,205ポイント)
Date: 2008/09/23(火) 03:02
No:21594
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
>ただレンタルサーバーの契約と掲示板の契約は別なので
そういうことでしたか。
なら掲示板そのものは安心ですね。
>後、tok2は月200円でファイルアップロード無制限と
容量無限だけど、転送料制限があるわけですね・・・。
>年間1万円位まで予算上げて探してみようと思います
そんだけあれば、それなりにいいレンタルサーバーが使えますよ(w
275ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(59,912ポイント)
Date: 2008/09/23(火) 11:02
No:21604
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
何もかも一度にやるのは大変なので、まずはドメインからですね(年間1,000円以内ですし)。
huu.ccについてはリダイレクトできそうな気がしますが、play21.jpが大変そうです。直リンクもかなり貼られていることですから。
71ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(28,292ポイント)
Date: 2008/09/23(火) 13:51
No:21615
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
最近、色々なサーバーを比較する機会があったので、参考までに一番良さそうだった所を
http://www.xrea.com/
が一番気に入りました。
理由は、サーバーの仕様がかなり明確にされてる事と、独自ドメインの取得も簡単でサポートされてる所です。
容量3Gで値段も、年間で支払えば月/200円で安めだと思います。あと、独自で取らなくてもサブドメインが付いてくるみたいです(多分)
他にさくら鯖を使ったことがあるのですが、サポートは良い方だったと思います。
2倍のポイントを手に入れた! 188ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(60,006ポイント)
Date: 2008/09/23(火) 21:34
No:21626
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
年間1万円以内の予算であれば、XREAよりCORESERVERの方がお勧めです。
ただし、メールの安定性には何となく不安が残ります。
我慢できないほどではないのですが、ある程度遅延するからです。
その点、さくらのレンタルサーバーはよいですね。
機能面ではXREAに及びませんが、安心して使えます。
94ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(803,068ポイント)
Date: 2008/09/25(木) 03:10
No:21654
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
皆様ありがとうございました。
とりあえず
dixq.net
として独自ドメインを取得しました。これから引越ししていこうとおもいます。
レンタルサーバーの方ですが、よく考えてみたら、
tok2を避けたい理由は、サポートの対応が悪く、
振り込み期間に振り込まなかった場合、永久に振込みが出来なくなると言うことだけで、
機能面、安定面に全く問題が無かったので、独自ドメインさえ取得しておけば、
万一振り込めなくなって使えなくなってしまったとしても、
そのURLが使えなくなるわけではない為、tok2でも問題ないかなと思いました。
転送量制限2Gというのが辛いですが・・。
(龍神録公開時は、250G以上だったので)
何か公開するときはアップローダか何かを利用しようと思います。
いや〜しかしADSL1Mで3Gアップロードするのに何時間かかることやら^^;
・・・で計算してみたら
(3G/(80kbps/8)/3600s)=83(h)
83時間ですか(汗
まぁきっと要らないデータも沢山あるでしょうから、この際整理してみます^^;
433ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(60,247ポイント)
Date: 2008/09/25(木) 09:24
No:21658
|
|
Title: Re:DXライブラリプロジェクト作成ツールについて
|
|
> 転送量制限2Gというのが辛いですが・・。
> (龍神録公開時は、250G以上だったので)
2Gは厳しいですね。うちのサイトでも2Gはオーバーしそうです。
# 250Gは異常ですが...。アダルトサイトなみです。
> いや〜しかしADSL1Mで3Gアップロードするのに何時間かかることやら^^;
これだと、自家サーバーはまず無理ですね。
52ポイント を手に入れた。
|
|
|
|
Name: Hajime ..ぴよぴよ(978ポイント)
Date: 2008/09/21(日) 18:36
No:21546
|
|
Title: C言語でのリサージュ曲線軌跡の描き方
|
|
こんにちは。
このたび学校でC言語を勉強することになり、自主的に本を購入して勉強していたのですが、わからない点があるので質問させていただきます。独習している書籍は、高橋麻奈氏の「やさしいC」と、大槻有一郎氏の「14歳からはじめるリアルに動く!ゲーム物理プログラミング教室」です。
このうち後者のものにそってプログラムを組んでいたのですが、100ページほど済んだところで自分でそれを改造し、動画サイトに投稿されていた数学の動画において曲線の美しさに気付いたこともあり、画面に表示された円がリサージュ曲線の軌跡を描くようなプログラムを作りたくなりました。
-----------------------------------------
#include "DxLib.h"
#include "math.h"
double posx, posy;
void PhysicsDraw(){
for(int x=40; x<640; x=x+40) DrawLine(x,0,x,480, GetColor(64,64,64));
for(int y=40; y<480; y=y+40) DrawLine(0,y,640,y, GetColor(64,64,64));
DrawCircle(posx-10,posy-10,2, GetColor(255,200,200), FALSE);
DrawCircle(posx-5,posy-5,2, GetColor(255,100,00), FALSE);
DrawCircle(posx,posy,2, GetColor(255,0,0), FALSE);
posx = posx + 1;
posy = posy + 1;
}
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hp, LPSTR lpc, int nc){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClsDrawScreen();
PhysicsDraw();
ScreenFlip();
}
DxLib_End();
return(0);
}
-----------------------------------------
これではDXライブラリを使用して、直線をなぞっていくように円を表示しているだけなのですが、ここからどうやってリサージュ曲線の数式を使用した軌跡を描くように発展させていくことができるのか、まったく想像がつかない状況です。三角関数を使用してみようともしましたが、うまくいきません。詳しい解説と具体的なソースを示していただけないでしょうか?
OSはXPでVisualC++ExpressEditionを使用しています。当方の経験といたしましては、どのようにプログラムを学んでいけばよいのか学校の他教科と違いすぎてまったくわからない、といったものです。
978ポイント を手に入れた。
|
|
|
|
Name: 木霊 ..上級者(16,726ポイント)
Date: 2008/09/22(月) 03:51
No:21567
|
|
Title: Re:C言語でのリサージュ曲線軌跡の描き方
|
|
一応、C++で作ってみました。
今回gdgdなのですみません・・・
リサージュ曲線の説明はこちら
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B5%E3%82%B8%E3%83%A5%E3%83%BC%E5%9B%B3%E5%BD%A2
---------- ここから ----------
#include "DxLib.h"
#include <math.h>
const double PI = 3.14159265358979323846;
inline double Get_Angle_To_Radian ( double Temp_Angle ) { return Temp_Angle /180.0 *PI; }
void Draw_Grid ( void );
void Draw_Lissajous ( double Alpha, double Beta, double Delta, double Radius );
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode ( TRUE ) ;
if ( DxLib_Init () == -1 ) { return -1; }
SetDrawScreen ( DX_SCREEN_BACK );
while ( ProcessMessage () == 0 ) { // ------------------ ループ開始
ClearDrawScreen ();
Draw_Grid ();
Draw_Lissajous ( 1.0, 2.0, -PI/4.0, 100.0 );
ScreenFlip ();
if ( CheckHitKey ( KEY_INPUT_ESCAPE ) == 1 ) { break; }
}
DxLib_End();
return 0;
}
void Draw_Grid ( void )
{
int Cr = GetColor ( 128, 128, 128 );
for ( int X = 0; X < 640; X += 16 ) { DrawLine ( X, 0, X, 480, Cr ); }
for ( int Y = 0; Y < 480; Y += 16 ) { DrawLine ( 0, Y, 640, Y, Cr ); }
DrawLine ( 320, 0, 320, 480, GetColor ( 0, 0, 255 ) );
DrawLine ( 0, 240, 640, 240, GetColor ( 0, 0, 255 ) );
return;
}
void Draw_Lissajous ( double Alpha, double Beta, double Delta, double Radius )
{
int Cr = GetColor ( 255, 255, 255 );
for ( int T = 0; T < 360; T += 3 ) {
DrawCircle ( 320 +cos ( Get_Angle_To_Radian ( Alpha *T ) )*Radius,
240 -sin ( Get_Angle_To_Radian ( Beta *T ) +Delta )*Radius,
5, Cr, FALSE );
}
return;
}
---------- ここまで ----------
本当にすみません・・・リンク先を見て、数式を当てはめただけです・・・
なので解説と言うほどのものも無いような・・・
「320」「240」という値は「とりあえずの画面中心の座標」です。
またRadiusは Alpha=1.0; Beta=1.0; Delta=0.0; 時に描かれる円の半径で、この値が小さいと画面中央に
白い塊が出来るだけです。
あと、T は1周描画する分の値です。T += 3 なのは++ T だと隙間がなく、白く塗りつぶしたようになるので
適当に設定した値です。
Y座標の所で、240 -sin・・・と符号が逆になっているのは、グラフの正負と画面の座標の正負が逆だからです。
プログラム的には、
1・定数でないグローバル変数は極力使わないように
2・関数は機能別に(今回は「グリッドの描画」と「リサージュ曲線の描画」)
を心がけると変更しやすいプログラムを書けると思います。
最後に、今回は変数の範囲チェックをしていません。
エラーは出ないと思いますが、必要と思うなら付けてみてください。
おやすみなさい。
960ポイント を手に入れた。
|
|
|
|
|
Name: Hajime ..かけだし(1,072ポイント)
Date: 2008/09/22(月) 23:34
No:21582
|
|
Title: Re:C言語でのリサージュ曲線軌跡の描き方
|
|
回答していただきましてありがとうございます。印刷してひとつひとつ検討させていただきます。
おそらく、またわからない点が出てくることになると思いますから、このトピックは残させていただきます。
94ポイント を手に入れた。
|
|
|
|
|
Name: Hajime ..かけだし(1,190ポイント)
Date: 2008/09/23(火) 22:38
No:21629
|
|
Title: Re:C言語でのリサージュ曲線軌跡の描き方
|
|
なんとかプログラムの仕組みを理解できたのですが、改造しようとするとうまくいきません。
Alpha Beta Delta Radiusの各値をキーの組み合わせで変更しさらにその状態で曲線を再表示するようにしたいのです。今回 // ------------------ ループ開始 このループ内を書き換えていきました。
Draw_Lissajous ( 1.0, 2.0, -PI/4.0, 100.0 );
私にはこの命令で各値が決定されてしまうような気がするのですが・・・
表示に関してもループ内でキーを設定しましたが、キーを押している間しかコマンドが反映されなくなりました(曲線が表示されつづけないです)。どうも混乱している感じです・・・ご助力お願いします。
118ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(17,002ポイント)
Date: 2008/09/23(火) 23:59
No:21631
|
|
Title: Re:C言語でのリサージュ曲線軌跡の描き方
|
|
>Draw_Lissajous ( 1.0, 2.0, -PI/4.0, 100.0 );
>私にはこの命令で各値が決定されてしまうような気がするのですが・・・
その通りです。
Hajimeさんのソースが分からないので推測になりますが、関数Draw_Lissajous内を改造してませんか?
この関数の引数を変えるようにして下さい。
// ループの外で変数を定義
double ALPHA = 1.0, BETA = 1.0, DELTA = 4.0, RADIUS = 100.0;
・・・
// ループの中で値を変更して関数を呼び出し
/* Hajimeさんの改造部分で各値を変更 */
Draw_Lissajous ( ALPHA, BETA, -PI /DELTA, RADIUS );
・・・
引数の値を使って計算をしているので、関数の呼び出しの際に引数の値を変えないと同じ結果になってしまいます。
送信した後に気付いたのですが、Radiusは数式内のラージAとラージBにあたるので2つ用意した方が、いいかも知れません。(引数を一つ増やす)
X = A *cos ( a *t ), Y = B *sin ( ( b *t ) -δ)
276ポイント を手に入れた。
|
|
|
|
|
Name: Hajime ..かけだし(1,270ポイント)
Date: 2008/09/24(水) 23:30
No:21646
| 解決!
|
Title: Re:C言語でのリサージュ曲線軌跡の描き方
|
|
そのとおりにループ内外を改造することと、キー操作関数を新たに作ることでうまく反映されるようになりました。また別種の曲線を描かせることも出来ました。
初心モノに教授してくださって本当にありがとうございました。解決とさせていただきます。
80ポイント を手に入れた。
|
|
|
|
Name: ibis ..中級者(14,371ポイント)
Date: 2008/09/24(水) 21:36
No:21639
|
|
Title: 【質問のような雑談】オブジェクトファイルが狂った?
|
|
今回はMinGW3.8.1を使用してます。
bcc愛用してたのですが、飽きたので乗り換え。
ちょっとリソースのオブジェクトファイル覗いてみたら「\:oDucemtn sna deSttnisg(以下略)」という奇怪な暗号が
・・・いや、これ「C:\Documents and Settings\(以下略)」ですよね?
正直どうでもいいんですが、なんか気になります。
何なんでしょね?
144ポイント を手に入れた。
|
|
|
|
Name: ibis ..中級者(14,584ポイント)
Date: 2008/09/24(水) 21:59
No:21644
| 解決!
|
Title: Re:【質問のような雑談】オブジェクトファイルが狂った?
|
|
あ、ほんとだ。
リトルエンディアンになってますね。
ありがとうございます。
メニューリソースのところとかはビッグエンディアンなんですがねぇ。
2倍のポイントを手に入れた! 118ポイント を手に入れた。
|
|
|
|
Name: 黒猫 ..入門者(2,883ポイント)
Date: 2008/09/24(水) 20:43
No:21636
|
|
Title: 無題
|
|
3dで当たり判定をやりたいです。
typedef struct{
float Px,Py,Pz; // 現在座標
int Lx,Ly,Lz; // 回転
}CHR;
CHR A;
CHR B;
AとBの当たり判定をしたいです。
よろしくお願いします。
99ポイント を手に入れた。
|
|
|
Name: デンマーク ..ぴよぴよ(629ポイント)
Date: 2008/09/23(火) 13:42
No:21612
|
|
Title: 構造体の初期化について
|
|
質問があります。
C言語の構造体の初期化についてですが
最初は※1のようにすれば構造体のメンバが全部初期化
されると思っていましたが、data_set[SIZE]の配列は
SIZE分だけ初期化する必要があるそうなのですが
どうすればいいのかわかりません。
どなたかアドバイスお願いします。
環境はボーランドを使っています。
typedef struct {
long data_set[SIZE];
long data_head;
long data_number;
long data_new;
long data_index;
long data_count;
long data_location ;
}DATA;
DATA data_data;//変数を使うために宣言 DATAは型でdata_dataは変数
void init(void)//初期化
{
DATA data_data = { 0,0,0,0,0,0 };※1 初期化
}
56ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(125,893ポイント)
Date: 2008/09/23(火) 17:32
No:21620
|
|
Title: Re:構造体の初期化について
|
|
変数 data_data を、関数の外で定義したいのですか?
それとも、init 関数の中で自動変数として定義したいのですか?
どちらの方法を採りたいかによって、明示的な初期化が
必要かそうでないかの違いがあります。
94ポイント を手に入れた。
|
|
|
|
|
Name: デンマーク ..ぴよぴよ(712ポイント)
Date: 2008/09/23(火) 18:57
No:21621
|
|
Title: Re:構造体の初期化について
|
|
すいません。。
説明不足でした。
変数 data_data を、関数の外で定義します。。
そして{{0, 0,・・・}, 0, 0, ・・・} のようにも
考えたのですがSIZEのところをfor文で回したいと考えています・・
83ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(125,953ポイント)
Date: 2008/09/23(火) 19:06
No:21622
|
|
Title: Re:構造体の初期化について
|
|
関数の外で定義するのであれば、明示的な初期化を行なわなくても
当該構造体の全メンバー(配列かどうかは無関係)をゼロで初期化します。
60ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(27,599ポイント)
Date: 2008/09/23(火) 19:14
No:21623
|
|
Title: Re:構造体の初期化について
|
|
> void init(void)//初期化
> {
> DATA data_data = { 0,0,0,0,0,0 };※1 初期化
> }
この場合だと、全てのメンバを 0 で初期化するなら、
DATA data_data = {0};
でいいです。
56ポイント を手に入れた。
|
|
|
|
|
Name: ななしさん ..ぴよぴよ(69ポイント)
Date: 2008/09/23(火) 21:19
No:21624
|
|
Title: Re:構造体の初期化について
|
|
一般的に構造体をとにかく0で初期化したいときは
ZeroMemory(data,sizeof(data))を使います
これがエラーを吐くようならmemset(data,0,sizeof(data))を利用してください
69ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(126,071ポイント)
Date: 2008/09/23(火) 21:30
No:21625
|
|
Title: Re:構造体の初期化について
|
|
ZeroMemory は Win32API に属しているんですよね?
ということは、環境によって使えない場合がありますので、
一般的とはいえないと思います。
一方、memset は C言語の標準関数です。
おそらくすべての Cコンパイラーで使えるはずです。
したがって、どちらが一般的かといえば、memset の方です。
118ポイント を手に入れた。
|
|
|
|
|
Name: デンマーク ..ぴよぴよ(749ポイント)
Date: 2008/09/24(水) 00:24
No:21633
| 解決!
|
Title: Re:構造体の初期化について
|
|
なるほど!!
ありがとうございます。
DATA data_data = {0}; でOKのようですね。
またなにかあったら宜しくお願いします
37ポイント を手に入れた。
|
|
|
|
Name: 鼓滝 ..ぴよぴよ(316ポイント)
Date: 2008/09/20(土) 21:41
No:21523
|
|
Title: 龍神録プログラミングの館 3のエラーに関して
|
|
はじめまして、鼓滝と言います。
龍神録プログラミングの館の3「グローバル変数の扱いに気を使ってみよう」で、key.cppとmain.cppに修正を加えると、次のエラーが発生してビルドができません。
その前の2ではうまくビルドできていました。
以前もゲームプログラミングの方で同じようなエラーに遭遇していたので、本文を丸々コピーしてみましたが、結果は同じでした。
使用ソフト:Visual C++ 2008 Express Edition
1>LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl GetHitKeyStateAll_2(void)" (?GetHitKeyStateAll_2@@YAHXZ) が関数 "int __cdecl ProcessLoop(void)" (?ProcessLoop@@YAHXZ) で参照されました。
316ポイント を手に入れた。
|
|
|
|
Name: 鼓滝 ..ぴよぴよ(338ポイント)
Date: 2008/09/23(火) 22:14
No:21628
| 解決!
|
Title: Re:管理人さんへ
|
|
解決しました;;
関数の名前に一部抜けが生じていたみたいで、それが引っ掛かっていたようです(汗)
ありがとうございました!
10ポイント を手に入れた。
|
|
|
|
Name: JugS ..入門者(4,188ポイント)
Date: 2008/09/23(火) 08:04
No:21600
|
|
Title: GetNowCount()について
|
|
クラスAのデータメンバ block[10][10] をすべて0で初期化したあとに
クラスAのコンストラクタ内で
A::A(){
int count=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(count < 10){
block[i][j] = GetNowCount()%2;
if(block[i][j] != 0)
count++;
}
}
}
というふうに
block[10][10]の中の要素10個にランダムで1を入れたいのですが、
何度実行してもblock[0][0]から block[0][9]までに
0か1が入ってしまうんです。
コンパイルし直すたびに0か1のどちらかに偏ります。
どうしてでしょうか?
155ポイント を手に入れた。
|
|
|
|
Name: JugS ..入門者(4,276ポイント)
Date: 2008/09/23(火) 11:40
No:21607
|
|
Title: Re:GetNowCount()について
|
|
あ、そういえばGetRandがありましたね。
すっかり忘れてました。
ですが、上記のプログラムの
block[i][j] = GetNowCount()%2は,
起動してからのミリ秒を2で割ったあまりを代入しているのだから、
0か1が入ると思うのですが、
実行するとblock[0][0]〜block[0][9]が、全て0か1に統一されてしまい、
block[1][0]以降には行かないのですが、
どうしてですか?
88ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(112,174ポイント)
Date: 2008/09/23(火) 12:57
No:21610
|
|
Title: Re:GetNowCount()について
|
|
そうですね、1ミリ秒よりも短い時間で処理が終了してしまえば、全て同じ数値になりますね。
仮に…
block[i][j] = GetNowCount()%2
この処理の前か後に
Sleep(1);
これを足してみてください。
これで変化があると思います。
39ポイント を手に入れた。
|
|
|
|
|
Name: JugS ..入門者(4,202ポイント)
Date: 2008/09/23(火) 15:46
No:21619
|
|
Title: Re:GetNowCount()について
|
|
指摘どおり、Sleep(1)をいれたらちゃんとばらけました。
いつもメインループ内で使っていたので、ループ処理の時間差を見落としてました。
ご指摘ありがとうございます。
74ポイント を落としてしまった。
|
|
|
|
Name: シルト ..ぴよぴよ(192ポイント)
Date: 2008/09/22(月) 20:15
No:21578
|
|
Title: for文の重複とprintfの表示について
|
|
初めまして。
粒子の流れを記述するプログラムを作りたいのですが、上手くいきません。
作りたいのは、一次元のサイト(マス)と粒子が左右に移動するモデルの時間発展を記述するプログラムです。両方の端からは粒子が流入、流出するようにしてあり、粒子数は一定ではありません。
サイトの間の壁(端も含む)を乱数で指定して、その左右の粒子を動かすようにしました。1が粒子がいる状態、0が粒子がない状態です。1Stepで全ての壁を一回ずつ指定して、それを10Step繰り返すようにしたいです。
この時、乱数で同じ壁を指定してしまう時があります。図で言えば[]の部分の重複を無くしたいです。
また、各ステップの最後だけをprintしたいです。しかし、両方上手くいかないので何かアドバイスを頂けないでしょうか?よろしくお願いします。
STEP 0
[5]:100011000
[2]:100011000
[0]:100011000→ここの[]の重複をなくしたい
[6]:100010100
[9]:100010100
[0]:100010100→ここの[]の重複をなくしたい
[4]:100100100
[3]:100100100
[9]:100100100
[2]:100100100→各Stepのこの行をプリントしたい。
・
・
・
+プログラム+
// Model.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
#define LAT_MAX 10
#define IV_DENS 40 //initial value of existence density
#define STEP 10 //step times
#define HR_L 60 //establishment of hop left
#define HR_R 100 //establishment of hop right
#define HR_IN 60 //establishment of boundary condition(IN)
#define HR_OUT 100 //establishment of boundary condition(OUT)
int lat[LAT_MAX];
bool q[LAT_MAX-1]={false};
srand((unsigned)time(NULL));
for(int i2=0; i2<STEP; i2++)
{
printf("STEP %d",i2);
printf("\n");
for(int i1=0; i1<LAT_MAX; i1++)
{ lat[i1]=rand()%(LAT_MAX); }
for(int i1=0; i1<LAT_MAX-1; i1++)//set existence density
{
if(IV_DENS < rand()%(100+1)){ q[i1]=0; }else{ q[i1]=1; }
}
for(int i1=0; i1<LAT_MAX; i1++)// one step
{
if(lat[i1]==0){ // boundaly condition of IN
if ( (q[lat[i1]]==0) ){
if(HR_IN >= rand()%(100+1)){ q[lat[i1]] =1; }
}else if( (q[lat[i1]]==1) ){
}
}else if( lat[i1]==(LAT_MAX-1) ){ // boundaly condition of OUT
if ( (q[lat[i1]-1]==0) ){
}else if( (q[lat[i1]-1]==1) ){
if(HR_OUT >= rand()%(100+1)){ q[lat[i1]-1] =0; }
}
}else{ // normal hop
if ( (q[lat[i1]-1]==0)&&(q[lat[i1]]==0) ){
}else if( (q[lat[i1]-1]==1)&&(q[lat[i1]]==1) ){
}else if( (q[lat[i1]-1]==1)&&(q[lat[i1]]==0) ){
if(HR_R >= rand()%(100+1)){
q[lat[i1]-1]=0;
q[lat[i1]] =1; }
}else if( (q[lat[i1]-1]==0)&&(q[lat[i1]]==1) ){
if(HR_L >= rand()%(100+1)){
q[lat[i1]-1]=1;
q[lat[i1]] =0; }
}
}
printf("[%d]:",lat[i1]);
for(int i5=0; i5<LAT_MAX-1; i5++)
{ printf("%d",q[i5]); }
printf("\n"); //line break
}
}
return 0;
}
192ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(801,393ポイント)
Date: 2008/09/23(火) 00:45
No:21584
|
|
Title: Re:for文の重複とprintfの表示について
|
|
つまり、重複した並びは表示したくないということですね。
それなら今調べている並びが、終わりの並びじゃない時、
次に並んでいる並びと異なっていたら表示したらいいのではないでしょうか。
サンプルを書いておきます。
#include <stdio.h>
#define X 6
#define Y 6
int q[Y][X]={
{0,0,0,1,1,1},//0
{0,0,0,1,1,1},//1
{0,1,0,1,1,1},//2
{0,0,0,1,1,1},//3
{0,0,0,0,0,1},//4
{0,0,0,0,0,1},//5
};
int main(){
int i,s;
for(s=0;s<Y;s++){//全部ループ
if(s<Y-1){//最後じゃない時
for(i=0;i<X;i++){//1行分ループ
if(q[s][i]!=q[s+1][i])//1つでも次の要素と違えば
break;
}
}
else
i=(!X);//下のif文の条件文を真にする
if(i!=X){//先ほど1つでも違うものがあれば表示
printf("%d:",s);
for(i=0;i<X;i++){
printf("%d",q[s][i]);
}
printf("\n");
}
}
return 0;
}
実行結果
1:000111
2:010111
3:000111
5:000001
qを見ると、うまく実行結果が重複をさけて重複した最後だけ表示しているのがわかると思います。
こういうことでしょうか?
533ポイント を手に入れた。
|
|
|
|
|
Name: シルト ..ぴよぴよ(193ポイント)
Date: 2008/09/23(火) 15:33
No:21618
|
|
Title: Re:for文の重複とprintfの表示について
|
|
管理人さんへ、アドバイスありがとうございます。
重複を表示したくないというより、重複しないようにしたいです。
{0,0,0,1,1,1},//0
{0,0,0,1,1,1},//1
{0,1,0,1,1,1},//2
{0,0,0,1,1,1},//3
{0,0,0,0,0,1},//4
{0,0,0,0,0,1},//5
この場合0,1,2,3,4,5を全て一回ずつランダムで動かしその最後だけを表示したい、という事です。
しかし今の場合、全て一回ずつではなく、同じものが複数出てしまうので、それを除く方法が分からないです。
質問をするのが初めてなので、分かりづらいかもしれませんが、よろしくお願いします。
1ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(26,368ポイント)
Date: 2008/09/23(火) 01:44
No:21586
|
|
Title: 文字列の'\0'以降について
|
|
お邪魔します。
例えばですが
char array[1000]
において[0][300]まで文字がはいっているとして
[299]と[300]の'\0'の境界を見つける関数を作ろうとしました。
この関数は引数として&array[0]を受けとり、出力に
char *reserch(char buffer[]){
int pl=0;
int pr=1000;
int pc;
while(1){
pc=(pl+pr)/2;
if(pr-pl==1)
return (&buffer[pl]);
if(buffer[pc=='(1)'])
pr=pc;
else
pl=pc;
}
}
この時、一回目にbuffer[500]を読みに行くことになるのですが
(1)に何を入れたらうまくいくのでしょうか?
(この関数自体怪しいですが・・・。)
これはやはり未定義なのでしょうか?('\n'以降は何があるか分からない)
文字列の長さを求めるのにstrlen関数が用意されています。
自分は上で示したほうの関数を使ったほうがちょっとは速くなるんじゃないかと思っていたのですが
strlenがどのように辿って行っているのかよくわからないので
なんとも言えない所です。。
だいたいの実現例はひたすらインクリメントをしていたので
かなり長い文字列よりはこっちのがいいのかなぁっと^^;
よろしくお願いします。
362ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(111,780ポイント)
Date: 2008/09/23(火) 02:09
No:21588
|
|
Title: Re:文字列の'\0'以降について
|
|
初期化されているのが保障されている訳ではありませんし、実際問題何が入っているか分からない領域を参照するのはどうかと思いますが…
55ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(801,674ポイント)
Date: 2008/09/23(火) 02:50
No:21591
|
|
Title: Re:文字列の'\0'以降について
|
|
>一回目にbuffer[500]を読みに行くことになるのですが
ならない・・のでは?
pc=(pl+pr)/2;
if(buffer[pc=='(1)'])
pcは最初500だと思いますが、
500=='(1)'
の条件式の評価の結果は0か0以外が返るわけですから、
また、文字コードに500番はありませんから常に儀、つまり0になるでしょうから
buffer[0]が参照されると思います。
ですから、この段階だけなら大丈夫でしょう。
きっと全体の半分、半分、半分と探していけば早いんじゃないかと仰っているのだと思いますが
文字列の終端以降全部\0が入ってるわけじゃないので、それじゃ難しいんじゃないですか?
例えば「hellow」の間にいくつも\0が紛れ込んでいる時、これは文字列としては「he」ですが
1 2 3 4 5 6 7 8 9 10 11 12
h e \0 l \0 \0 l o \0 w ! \0
正しく判定出来るでしょうか?
最初に\0があった場所までなのでやはり最初から探していくしかないのでは。
281ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(801,893ポイント)
Date: 2008/09/23(火) 02:57
No:21592
|
|
Title: Re:文字列の'\0'以降について
|
|
そのようなアルゴリズムを考えるのが好きでしたら、是非ソートアルゴリズムを考えてみてはどうでしょう。
もう世界中の人間が考えてるのでなかなか新たなソートアルゴリズムの発見は難しいでしょうけど、
結構面白かったりしますよ。
クイックソートやヒープソートとか勉強してもなかなか為になると思います。
後、strlenの実装例です。
#include <stdlib.h>
size_t my_strlen(const char *p){
size_t n = 0;
while (*p++)
n++;
return (n);
}
219ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(26,527ポイント)
Date: 2008/09/23(火) 03:02
No:21595
| 解決!
|
Title: Re:文字列の'\0'以降について
|
|
>if(buffer[pc=='(1)'])
でなく
if(buffer[pc]=='(1)')
でしたね^^;
いやーなかなか思った通りにいかないものですね。
バグさん、管理人さんご回答ありがとうございました。
PS、
過去ログでは2年ぐらい前から管理人さんは夜派だったような気がするのですが・・・
よく体がもつなぁと^^;
頭がカクカクしてきたので寝ます・・・(笑)
108ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,877ポイント)
Date: 2008/09/23(火) 03:07
No:21596
|
|
Title: Re:文字列の'\0'以降について
|
|
では便乗して、私も実装例を…(笑)
unsigned long long mystrlen(char* str)
{
unsigned long long count = 0;
for (count = 0; *str != '\0'; ++count, ++str);
return count;
}
97ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,947ポイント)
Date: 2008/09/23(火) 03:09
No:21597
|
|
Title: Re:文字列の'\0'以降について
|
|
あ、無駄な初期化をしてしまっている…ちょっと修正
unsigned long long mystrlen(char* str)
{
unsigned long long count = 0;
for (; *str != '\0'; ++count, ++str);
return count;
}
70ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(26,765ポイント)
Date: 2008/09/23(火) 03:16
No:21598
|
|
Title: Re:文字列の'\0'以降について
|
|
じゃあ自分も・・・(えっ?w
size_t Strlen(const char *pointer)
{
size_t length = 0;
while(*pointer++)
length++;
return length;
}
確か前はこれで動いたと思ったんですが^^;
2倍のポイントを手に入れた! 238ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(13,860ポイント)
Date: 2008/09/23(火) 10:49
No:21603
|
|
Title: Re:文字列の'\0'以降について
|
|
面白そうなので私も(笑
大きい文字列だとこっちの方が速いはず。多分。
int mystrlen(const char *begin){
const char *incremental = begin;
while(*incremental){
++ incremental;
}
return incremental - begin;
}
ついでに範囲を超えないことを保証してみます。
まぁ普通は必要ないでしょうけど。
なんか引数がSTLのアルゴリズムみたいですね。
int mystrlen(const char *begin, const char *end){
const char *incremental = begin;
while(*incremental && incremental != end){
++ incremental;
}
return incremental - begin;
}
133ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,971ポイント)
Date: 2008/09/23(火) 11:06
No:21605
|
|
Title: Re:文字列の'\0'以降について
|
|
>ibisさん
たしかに、beginやendというと、なんだかイテレータみたいですね(笑)
24ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(26,898ポイント)
Date: 2008/09/23(火) 11:39
No:21606
|
|
Title: Re:文字列の'\0'以降について
|
|
begin・・・
初めてみました^^;こんなのも使えるのですかっ。
これはCですか?
学校で触りだけやったpascalでなんだか使った記憶があります。
本当に表面だけだったのでpascalの書き方なんてもう覚えていませんが。。
78ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(112,135ポイント)
Date: 2008/09/23(火) 12:54
No:21609
|
|
Title: Re:文字列の'\0'以降について
|
|
>>kazuoniさん
ibisさんのサンプルは変数名にbeginとendというのを用いているだけで、名前自体に特別な意味がある訳ではありませんよ。STLというC++のライブラリの中にイテレータという考え方がありまして、『その使い方に似ていますね』という話をしていたんです(^-^)
で、ibisさんのサンプルですが、これはCで書かれていますね。
中身を簡単に解説すると、文字列の最初を示すポインタをbegin、文字列バッファの最後を示すポインタをendとして渡してやることで、バッファサイズをオーバーしないように書かれている訳です。
つまり、仮に文字列用の配列であるarrayの要素数を500とするならば、mystrlen(&array[0], &array[499])としてやれば、いいわけですね。
164ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(26,960ポイント)
Date: 2008/09/23(火) 13:13
No:21611
|
|
Title: Re:文字列の'\0'以降について
|
|
申し訳ありませんでした。。そのままでしたね。。
引数にbeginやendがありましたね。
コードをきちんと見直す癖をつけないとまずいですね・・・
いつもは(自分の環境では)型名などは色づけされており、パパッと判断してしまうのですが
こちらだとその区別が通用しないのに慣れていなくて。。
(本などでは型名等は太文字ですね)
失礼しました。
62ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(14,152ポイント)
Date: 2008/09/23(火) 13:42
No:21613
|
|
Title: Re:文字列の'\0'以降について
|
|
Pascalのbeginとendは、Cの{と}みたいなものですよね。
あれは関係ないです。
細かいことはバグさんが仰ってる通り。
バグさん、解説ありがとうございます。
>mystrlen(&array[0], &array[499])
うわ、使いにくいw
第二引数はサイズを整数型で渡す方が良いでしょうか。
引数名をsizeに、型をintに。
いや、戻り値もだけど、size_t型の方が良いのかな。
あとはポインタ型変数endを宣言して、endを(begin + size)で初期化して。
あ、mystrlen(array, array + 499)はどうでしょ。
・・・うん。可読性がちょっと。
やっぱりサイズ渡すしか。
270ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(225,643ポイント)
Date: 2008/09/23(火) 14:40
No:21616
|
|
Title: Re:文字列の'\0'以降について
|
|
>mystrlen(array, array + 499)はどうでしょ
あ、この begin/endって STLのとは違って、endの方は有効な領域の最後を渡すのですね。
>うわ、使いにくいw
>第二引数はサイズを整数型で渡す方が良いでしょうか。
個人的にはあんまり変わらないので、どっちでもいいと思うのですが、
サイズを渡した方がC言語しかやらない人には解りやすいかと思います。
>戻り値もだけど、size_t型の方が良いのかな。
どちらかといえば、size_tの方がいいのではないでしょうか。
符号が必要とも思えませんし、他の文字列関連の標準関数とも合いますし。
>うん。可読性がちょっと
与える引数がポインタならその方向で、配列ならマクロを経由して使うようにし
そのマクロで配列のサイズを計算して関数に入れるようにしてしまえば
多少使い勝手は向上するかも。
438ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(14,227ポイント)
Date: 2008/09/23(火) 14:53
No:21617
|
|
Title: Re:文字列の'\0'以降について
|
|
>あ、この begin/endって STLのとは違って、endの方は有効な領域の最後を渡すのですね。
あ、それは全く考えてなかったです。
自分でも「499」と書くときに違和感があったのですがスルーしてました。
なんかいろいろと考えが及んでなかったですね。
62ポイント を手に入れた。
|
|
|
|
Name: JugS ..入門者(4,049ポイント)
Date: 2008/09/15(月) 18:23
No:21311
|
|
Title: メンバ関数について
|
|
最近よく利用させて頂いてます。
あるクラスaで宣言、定義したメンバ関数faを、
別のクラスbのメンバ関数fb内で呼び出すことは出来ますか?
クラスaをクラスbに継承するしかないのでしょうか?
66ポイント を手に入れた。
|
|
|
|
Name: 組木紙織 ..比類無きプログラマー(60,437ポイント)
Date: 2008/09/15(月) 18:30
No:21312
|
|
Title: Re:メンバ関数について
|
|
>あるクラスaで宣言、定義したメンバ関数faを、
>別のクラスbのメンバ関数fb内で呼び出すことは出来ますか?
出来たりできなかったりするので、
自分で実際にやってみたらどうでしょうか?
97ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..かけだし(1,779ポイント)
Date: 2008/09/15(月) 18:40
No:21313
|
|
Title: Re:メンバ関数について
|
|
フレンドクラスなんてものがありませんでしたっけ?
class a {
friend b;
private:
fa();
}
とかやると、フレンドクラスbからはクラスaのメンバにアクセスできるはずです(多分・・・)
ちょっとクラスは苦手なので、自分で試してみて下さい・・・笑
168ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(9,417ポイント)
Date: 2008/09/15(月) 21:56
No:21321
|
|
Title: Re:メンバ関数について
|
|
staticな関数にするか参照渡しにするかですね。
12ポイント を手に入れた。
|
|
|
|
|
Name: JugS ..入門者(3,932ポイント)
Date: 2008/09/16(火) 20:27
No:21372
|
|
Title: Re:メンバ関数について
|
|
フレンドクラスにすると、カプセル化が意味をなさなくなる気がするので
極力使いたくはないですが、
オブジェクト指向で打ち始めたばかりなので、試しに打ってみようと思います。
今の私の知識では、フレンド以外では継承するぐらいしか思いつかないのですが、
継承も多用すると、手続き型のプログラムになってしまいそうなのですが、
どうなのでしょうか?
117ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(14,761ポイント)
Date: 2008/09/16(火) 20:35
No:21374
|
|
Title: Re:メンバ関数について
|
|
こうすれば良いのではないでしょうか?
class A{
public:
void fa(){
}
};
class B{
public:
void fb(){
a.fa();
}
private:
A a;
};
あるいは、
class A{
public:
void fa(){
}
};
class B : public A{
public:
void fb(){
fa();
}
};
カプセル化の意味なら後者だと思いますが、ご希望に合っていますでしょうか?
177ポイント を手に入れた。
|
|
|
|
|
Name: JugS ..入門者(4,007ポイント)
Date: 2008/09/16(火) 21:20
No:21379
|
|
Title: Re:メンバ関数について
|
|
まだ完全に構想が固まってないので、イメージしにくいのですが、
出来そうな気がするので、打ってみます。
御津凪さん
サンプルまで打っていただき、ありがとうございます。
75ポイント を手に入れた。
|
|
|
|
Name: DD SS ..ぴよぴよ(555ポイント)
Date: 2008/09/21(日) 03:26
No:21535
|
|
Title: シューティングにおける数学的計算について
|
|
いつもHPの方を参考にさせていただいてます^^
特に今STGの制作をしているので龍神録のほうを見ながら勉強をしているところです。
今回はその龍神録の 第12章、たくさんの敵の行動パターンを作ってみよう のsin,cos関数について質問を
しようと思います。
msdnの方や他の方々のHPを参考に
sin関数やcos関数の働きを見てるんですがどうして
■ラジアンを出すときにcosを使うのか
■Enemy_act関数の xには cos を yには sinを使うのか
というのがよくわかりません。
また
if (t % 60 == 0) {
int r = cos(enemy[i].ang) < 0 ? 0 : 1;
enemy[i].sp = 6 + rang(2);
enemy[i].ang = rang(PI / 4) + PI + r;
enemy[i].muki = 2 - 2 * r;
}
この一連の動作も良く分からないままです;
sinやcosに引数を0〜360まで渡してその戻り値を調べるっていう方法もやってみたのですが・・・
自分が思ってる値と異なる値が返ってきて余計に混乱してしまいます。↓がそのコードです。
#include <stdio.h>
#include <math.h>
int main(void) {
double s, c, t;
double i;
int w, k;
s = c = t = 0.0;
w = 1;
while (w) {
for (i = 0.0; i < 361; i++) {
s = sin(i);
c = cos(i);
t = tan(i);
printf("i = %lf sin = %lf cos = %lf tan = %lf \n",i , s, c, t);
}
w -= 1;
}
scanf("%d", &k);
return 0;
}
もしかしたら自分の数学に対しての努力と知識が足りないだけかもしれませんが、
何か助言をいただけると幸いです。
お忙しいとは思いますが、ご返答のほどよろしくお願いします。
龍神録の更新楽しみにしてます^^。 がんばってください!
555ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(799,195ポイント)
Date: 2008/09/21(日) 03:47
No:21536
|
|
Title: Re:シューティングにおける数学的計算について
|
|
こんにちは。
館の方参考にしてくださってありがとうございます。
>■ラジアンを出すときにcosを使うのか
>■Enemy_act関数の xには cos を yには sinを使うのか
ということですが、「ラジアンを出す時cosを使う」のではなく、
「sin,cosを使うとき、ラジアンを使う」ということでいいですか?
角度の用いた計算方法は弧度法と度数法がありますよね。
円一周を360°とする度数法に対し、弧度法は円一周を2πとします。
πは円周率ですね。
sin,cosなどの関数は弧度法の引数が要求されますから、
ラジアンで渡す必要があります。
どうしてもラジアンによる計算に抵抗があるようなら、自前でsin,cos関数を実装してはどうでしょうか。
0°は弧度法でも0です。360°が2*3.1415926535ですから、対応を考えれば実装出来ますよね。
for (i = 0.0; i < 361; i++) {
s = sin(i);
なので、弧度法、度数法の仕様にあっていないために、これが計算出来ないわけですが、
自前で度数法による引数が渡せる関数を作ればこれが渡せるようになりますね。
もしこの辺の話がよくわからなければ、
http://www.google.co.jp/search?hl=ja&q=%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0&lr=&aq=f&oq=
この辺で復習してみてはいかがでしょうか。
564ポイント を手に入れた。
|
|
|
|
|
Name: DDSS ..かけだし(1,250ポイント)
Date: 2008/09/21(日) 21:10
No:21553
|
|
Title: Re:シューティングにおける数学的計算について
|
|
返信ありがとうございます。
自分で作った方のプログラムについては
戻り値が期待通り戻ってこなかったかわかりました^^
>■ラジアンを出すときにcosを使うのか
なんですが ラジアンじゃなく半径かもしれません;
>int r = cos(enemy[i].ang) < 0 ? 0 : 1;
この部分のrなんですがラジアンと勘違いしてしまいました。
これで質問しようと思ったんですが勘違いで自分が持ってる質問とは違った質問をしてしまいました。
ここでまた質問なんですが
■rを出すときにcosを使うのか
ということです。
また
>■Enemy_act関数の xには cos を yには sinを使うのか
ということもまだちょっとわからないです。
何度もすみませんが、よろしくお願いします。
276ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(799,532ポイント)
Date: 2008/09/22(月) 00:03
No:21558
|
|
Title: Re:シューティングにおける数学的計算について
|
|
あぁ、これは確かにわかりにくいかき方ですね。
まず、条件演算子というものはご存知でしょうか。
(1)
int a=0;
int b;
b = a==0 ? 1 : 0;
(2)
int a=0;
int b;
if(a==0)
b=1;
else
b=0;
(1)と(2)は同じ意味です。よくわからなければ、「条件演算子」でググってみてください。
また、第一象限〜第四象限についてはご存知でしょうか?
原点を基準にangleの方向が第一象限、第四象限はcosがプラスになり、
第二象限、第三象限はマイナスになりますよね。
それを利用して、現在向いてる方向が第一象限か第四象限ならrを1にし、
違うなら0を代入しています。
なぜそんな事をしたいかというと、向いている向きを交互にさせたいからです。
→
←
→
←
→
と向かせたいのです。
単純にrang(PI/4)の計算結果は-PI/4〜PI/4ですから右側です。
もし現在向いている向きが右側なら左側に向かせ、左側なら右側にむかせたいのです。
ということは、右側なら、計算結果+PIすればよく、左側なら計算結果+0にすればよいです。
ということは
int r=cos(enemy[i].ang)< 0 ? 0 : 1;
//「左向き」の条件が正しければrに0をいれ、偽なら1を入れる
enemy[i].ang=rang(PI/4)+PI*r;
//左向きなら計算結果+0、右向きなら計算結果+PI
という計算式の意味がわかってきませんか?
enemy[i].muki=2-2*r;
これは単に敵の向きをセットしているだけですね。
238ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,086ポイント)
Date: 2008/09/22(月) 18:19
No:21575
|
|
Title: Re:シューティングにおける数学的計算について
|
|
sin,cos等の関数で度数で扱いたい場合
#define RAD(ang) ((ang)*3.14159/180.0)
とかを定義するのもありですね。
45ポイント を手に入れた。
|
|
|
|
|
Name: DDSS ..かけだし(1,385ポイント)
Date: 2008/09/22(月) 19:18
No:21576
| 解決!
|
Title: Re:シューティングにおける数学的計算について
|
|
管理人さん lbfuvabさん 返信ありがとうございます。
rの方ですがわかりやすい説明でとてもよくわかりました^^
x成分,y成分のほうは
まだちょっとわからない部分があるんですが、
↑のURLを参考に頭を整理してがんばって解いていきたいと思います。
ありがとうございました^^
またよろしくお願いします。
135ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(798,107ポイント)
Date: 2008/09/20(土) 23:08
No:21525
|
|
Title: 神曲と弾幕をシンクロさせてみた [萃夢想神アレンジ]
|
|
前回とは違い、発射音無しでもちょっと本格的に作りこみました。
↑ニコニコ動画(会員登録している人)はこちら↑
↓Zoome(誰でも見れる)はこちら(1500kbpsなので綺麗ですが、ちと重いです)↓
ニコニコ組曲の時のより更に大変でした^^;
215ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..初心者(5,041ポイント)
Date: 2008/09/21(日) 01:20
No:21528
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
これは、やば過ぎますね・・・
どうやって同期を取ったのかも疑問ですし、どうやったらそんなにぴったりな弾幕を思いつくかも分かりません(ノД`)シクシク
42ポイント を落としてしまった。
|
|
|
|
|
Name: array ..プログラマー(28,104ポイント)
Date: 2008/09/21(日) 01:38
No:21529
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
この上でシンクロしてるやつどうなってるんですか!!(まさか、面倒ながらも、それっぽく動かしてたりしませんよね)曲も神々しくて良いし、それに負けない演出をしてる所が凄いです。
弾幕の完成度が上がってる事は普通に凄いんですが、弾幕避けてる管理人さんにも驚きましたw
36ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説のハッカー(798,224ポイント)
Date: 2008/09/21(日) 02:12
No:21530
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
こんな時間に外出している管理人です。
>>arrayさん、lbさん
今回は館のコードで書いたので43章あたりに見るも無残なコードが公開されてますよw
登録を関数化せずにかいてるんでとんでもないコードになってます‥。
また帰ったらお返事します。
68ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(798,551ポイント)
Date: 2008/09/21(日) 02:53
No:21532
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
>>lbfuvabさん
ありがとうございます^^
同期の取り方は普通に再生してからのフレーム数と音楽の現在の再生時間を比較して、
差が0.05秒以上になったら修正するようにしてあります。
弾の発射のタイミングの合わせ方は、前回のトピで紹介した方法と同じく、
曲を聴きながらキーボードトントンたたいて、
何秒、何秒、というデータをはかせ、それを見ながら作りました。
これが結構大変で、一回挫折しかけました・・w
>>arrayさん
>この上でシンクロしてるやつどうなってるんですか!!
あのwindows media playerの視覚エフェクトみたいな奴ですよね?
>(まさか、面倒ながらも、それっぽく動かしてたりしませんよね)
まさかそんなわけが。まさしくそれっぽく動かしただけのウソ表現ですb
本当は波形データみたいなのとってきたかったんですが、よくわからなかったんで、諦めましたorz
う〜ん、こういうのどうやってデータ取得するんでしょうねぇ。
でも誰も気づいてくれないかなと思ってたので気づいていただけて嬉しいです^^
>避けてる私
何百回やったことかorz
327ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(10,435ポイント)
Date: 2008/09/21(日) 21:29
No:21554
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
もちろん見ました!!
嬉しいです!まさかあんな要望が実現されるとは!
結構レアな曲なんで曲データ自体手に入れられるかどうかと思ったのですが。
まあ最近はメドレーに入ってることもあって手に入りやすくなっていますからね。
いや〜感動です。あのフラッシュアウトの感じがいいですね。
暗くしないで明るくなるので”逆”みすちーですね(笑
いやはやこんなに早くできるとは思いませんでした。管理人さんはこういうのをプログラミングの練習として見てるのでしょうか?
それとも、実際に龍神録プロ館を詳しくは見てないので自信はありませんが、弾幕などのデータや関数はすべてリサイクルして使えるようにしてらっしゃると思うので、時間合わせの特訓・・・でしょうか?(笑
次もやるつもりでしたら、そうですね。。
みすちーで思い出しました。
DarkPHOENiXさんのもう歌しか聞こえないなんかどうでしょう。
こんな感じのもいいかも。。
飽くまでで、次もやるようであれば。ですからね。
p.s.
自分は避けるのは苦手ですが、やってみたくなってしまいました・・
もちろん曲データの配布は無理ですよね・・・
どうしたものか。。
437ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(800,253ポイント)
Date: 2008/09/22(月) 00:29
No:21561
|
|
Title: Re:神曲と弾幕をシンクロさせてみた
|
|
ご覧頂きありがとうございます^^
>管理人さんはこういうのをプログラミングの練習として見てるのでしょうか
いえいえ、純粋に好きだからやってます。
ゲームプログラム書いてるとき、練習だとか勉強だとか意識したことはないですねぇ。
だからこそ、新しい方向に成長しないんでしょうけど・・w
実は弾幕のリサイクルはしたことないです。
どんな似てるコードでもいちいち書いてますよ。
きっと再利用性を考えて行った方がいいのかもしれませんが、
Cの標準関数すら使うの嫌いで・・。
最初は標準関数に頼らずに自分で毎回実装した方が勉強になると聞いて、
それを繰り返していたんですが、もうそのスタイルが定着してしまいました^^;
なんていうか毎回全て自分で実装しないと自分の家に見ず知らずのお手伝いさんが入り込んでいるような
感じがしていや・・というか・・ん〜そんな感じです^^;
>もう歌しか聞こえない
いいですね〜。東方系のアレンジ曲は神曲多いですねw
ただ次作るなら配布出来る曲がいいなとか思ったりしてます^^;
343ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(110,719ポイント)
Date: 2008/09/17(水) 18:29
No:21424
|
|
Title: 【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
ここに来られる方々なら一度は経験があるのではないでしょうか…
完全なる自己満足でしかない関数やクラスを作って途方にくれたことが…(笑)
そんな関数やクラスでも、誰かが役に立ててくれるかもしません。
ここで紹介してみませんか?
ってな訳で、言いだしっぺの私が1つ紹介させていただきます。
Win32APIのコンソールアプリ作成時に便利な関数をまとめてクラス化したCConsoleクラスです。
これがあれば、味気ないコンソールアプリでも(少しだけ)色が使えます!!
これがあれば、(制限はあるけれど…)コンソールアプリのWindowのサイズを変更できます!!
これがあれば、自分の指定した場所にテキストを表示することができます!!
これがあれば、邪魔なカーソルを非表示にすることができます!!
ってな感じの自己満足クラスです。
希望があれば、リファレンスを作成しますが、そんな人は居ませんね(苦笑)
220ポイント を落としてしまった。
|
|
|
|
Name: lbfuvab ..入門者(4,996ポイント)
Date: 2008/09/17(水) 20:24
No:21425
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
CConsoleライブラリは結構需要ありそうですね。(扱うと楽しいですね)
そういえば私も昔(半年前)分数ライブラリっていうのを作った記憶があります。
57ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(13,716ポイント)
Date: 2008/09/17(水) 23:03
No:21440
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
WindowsAPIのAnimateWindow関数。
ただでさえ使うべき場面が少ないのに、ウィンドウリージョンと併用できないんですよね。
リージョン使うなら、WM_SHOWをトリガーにして自前で実装するとか?
標準ライブラリのgetenv、<stdarg.h>、<locale.h>等。
便利なのですが、使う機会はあまり無いですよね。
標準ライブラリの<setjmp.h>。
使いたくないってのを通り越して、存在自体を忘れてました。
167ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(222,872ポイント)
Date: 2008/09/17(水) 23:35
No:21444
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
要boostな二次元ベクトルクラス。
type_traitsの練習に作ったやつで、コンストラクタとかが変態です。
54ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,367ポイント)
Date: 2008/09/18(木) 13:45
No:21469
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
皆さん、なにげに色々と作ってますねぇ…(^_^;)
>>lbfuvabさん
コンソールアプリでも、意外に色々と遊べるんですよね。
分数ライブラリとは、どのようなものだったんですか?(?_?)
>>tkmakwins15さん
.NetやMFCには似たようなクラスがありますが、標準ではありそうでないですよね。
なんらかのログを残したい時なんかに、日付を添付したりする場合にはいいかも?
>>ibisさん
AnimateWindow…まぁ、その、あれです。
なんとなく派手にしたいかなー?とかそういう気分になった場合の為に(笑)
>>Justyさん
boostには興味があるものの、未だに触ったことがないので、分からない部分もありますが…
確かにコンストラクタが大変なことになってますね(笑)
>>組木紙織さん
なにげにBitmap操作って面白いですよね。
.NetにあるBitmapクラスのSetPixelが遅過ぎるので、どうにか速度アップできないかと自作したのが下記の関数です。(ちなみにC#です)
unsafeコードですが、スピードが一気に上がりました(笑)
public void SetPixelEx(ref Bitmap bitmap, int x, int y, Color color)
{
Rectangle angle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData data = bitmap.LockBits(angle, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = data.Stride;
unsafe
{
byte* p = (byte*)(void*)data.Scan0;
int count = 0;
int offset = stride - bitmap.Width * 3;
count = x * 3 + y * bitmap.Width * 3 + offset * y;
p[count] = color.B;
p[count + 1] = color.G;
p[count + 2] = color.R;
bitmap.UnlockBits(data);
}
}
648ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,051ポイント)
Date: 2008/09/19(金) 00:35
No:21487
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
分数ライブラリはCで組みました。
放置してたので動作確認してませんwww
29ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,442ポイント)
Date: 2008/09/19(金) 13:38
No:21501
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
>>lbfuvabさん
ほほう、なかなか面白いですね(^o^)
という訳で、C++でクラス化してみました♪(^-^)
計算用の関数は演算子を多重定義することで実装しています。
符号情報は分子用の変数をint型変更して変数自身に持たせる事にしました。
って、最早別物になってしまいましたね…(^_^;)
75ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,106ポイント)
Date: 2008/09/19(金) 18:01
No:21502
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
え〜と、自分のソースで
uint32 GetDCV(uint32 va,uint32 vb); //最小公倍数(内部で_DCVを呼ぶ)
って書いてましたけど
uint32 GetDCV(uint32 va,uint32 vb); //最大公約数(内部で_DCVを呼ぶ)
の間違いです。
サーセン。
24ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..初心者(8,613ポイント)
Date: 2008/09/19(金) 21:20
No:21503
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
>標準ライブラリの<setjmp.h>。
>使いたくないってのを通り越して、存在自体を忘れてました。
あまりにもインパクトが強すぎて、どういうわけだかいつも心の片隅にぽつねんと居座っています。
小さい頃からの数度の引っ越しに生き抜いた書籍やぬいぐるみのような存在です。
あるいはずっと昔に買った全く信じていないお守りのような物かもしれません。
とは言っても過去に1度しか使ったことはありませんが。
そんな経験ってありませんか?
120ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(13,727ポイント)
Date: 2008/09/20(土) 12:18
No:21514
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
そういえばこんなのがありました。
自作の型演算ライブラリ。
型の大きさの比較とか、その他いろいろ。
クラスの階層関係は、既にBoostにあったので割愛。
何故か整数拡張や通常の算術型変換も実装してますが、
用途を思いつかなくて苦悩。
bccで使えないっぽいので、long longとかは対応してません。
11ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,523ポイント)
Date: 2008/09/20(土) 13:38
No:21516
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
>>ibisさん
bccでlong longを使用する場合は、__int64型で代用されるのも1つの手かと思います(^-^)
あくまでも、long long型が64ビット整数だというのが前提ですが…(^_^;)
81ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..中級者(9,911ポイント)
Date: 2008/09/21(日) 19:37
No:21547
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
>>バグさん
コマンドプロンプト上で動くリバーシを作成しているのですが、
「少し色が変えられたら……」と思っていたのでこっそりCConsoleクラス(?)を使用させて頂きました。
クラス、ライブラリなどがどういったものかという知識も、
APIに関する知識もないのでどういう仕組みで動いているのかは分かりませんが、
とにかく白黒が当たり前だと思っていたコマンドプロンプトに色がついた時はちょっと感動しました^^;
この場を借りて御礼申し上げます。
2倍のポイントを手に入れた! 298ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(111,791ポイント)
Date: 2008/09/21(日) 23:23
No:21555
|
|
Title: Re:【雑談】こんなの使うのか?みたいな関数やクラスの紹介
|
|
>>柏
お役に立てたようでなによりでした(^-^)
私はコンソールアプリで落ち物パズルを作るのが好きなのですが、その際に描画関係の関数を毎回コピペするのが面倒に感じたのが、あのクラス作成の切っ掛けだったりします。
リバーシを作るのでしたら、前景を白or黒に、背景を緑色にするとそれっぽくなりそうですね。
2倍のポイントを手に入れた! 268ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(25,431ポイント)
Date: 2008/09/21(日) 17:18
No:21542
|
|
Title: 画像の挿入
|
|
お邪魔します。
連続投稿が規約違反になっていなかったので投稿しますが、もしだめならば削除をお願いします。
また改めて質問をさせていただきます。
さっそくなんですが、今画像を主に用いるツールを作ろうとしているのですが、DXライブラリ+C言語を用いれば以下のことができるのかっというちょっと漠然とした質問なんですが・・・
実行させた後に画像を読み込ませるにあたって、
1、ドラッグ&ドロップ
2、画像ファイルの参照(新規ウインドウ)
を用いて画像を挿入し、画像データとして扱う(例えば、後にその画像を移動させたり、その位置を出力したりなど)ようにしたいのです。
わかりにくい質問で申し訳ありません。。よろしくお願いします。
環境は
visual C++ 2008です。
186ポイント を手に入れた。
|
|
|
|
Name: J ..中級者(9,998ポイント)
Date: 2008/09/21(日) 17:41
No:21543
|
|
Title: Re:画像の挿入
|
|
うーん。DXライブラリとC言語だけではそれは難しい・・・のでは?
やるならVisual C++などでやるとよいでしょう。
Visual C++についてはあまり詳しくないので。。
でもC言語で画像の参照ウィンドウを生成するのは非常に面倒であるとは言っておきます。
67ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(223,059ポイント)
Date: 2008/09/21(日) 17:48
No:21544
|
|
Title: Re:画像の挿入
|
|
>ドラッグ&ドロップ
DxLib.hをそのワードで検索してみて下さい。
使い方も直ぐにわかるでしょう。
>画像ファイルの参照(新規ウインドウ)
これがどういうものなのか、今ひとつわからないのですが。
画像ファイルを参照すると新規ウインドウが現れるのか、
画像ファイルを参照ために新規ウインドウを表示する、のか・・・。
155ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(25,301ポイント)
Date: 2008/09/21(日) 19:47
No:21548
|
|
Title: Re:画像の挿入
|
|
Jさん、Justyさんご回答ありがとうございます。
ドラッグ&ドロップはちゃんと関数が用意されていたのですね。4つ確認できました。詳しい使い方は本家に聞いてきます。
2については
>画像ファイルを参照ために新規ウインドウを表示する
でした。。わかりにくい説明で申し訳ありませんでした。。目的のファイルをたどっていくやつです。
やはりJさんがおっしゃるように別の知識が必要になるのでしょうか^^;
130ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(223,759ポイント)
Date: 2008/09/21(日) 20:20
No:21549
|
|
Title: Re:画像の挿入
|
|
>ドラッグ&ドロップはちゃんと関数が用意されていたのですね。4つ確認できました。>詳しい使い方は本家に聞いてきます。
4つしかないので見ただけでわかるかな、と思ったのですが。
SetDragFileValidFlag(TRUE)でウインドウへのD&Dを有効にして、
あとは毎フレーム GetDragFilePath()を使い監視します。
D&Dされていなければ、-1が、されていれば 0が戻り、その場合引数 FilePathBufferの
文字列バッファにファイルへのパスが入りますので、パスが格納できるだけの十分な
スペースを持ったバッファを指定して下さい。
複数ファイルをドラッグした場合は GetDragFileNum()でその数を取得できるので
その数分だけ GetDragFilePath()を呼べば1つずつ取得できます。
>目的のファイルをたどっていくやつです
あー、つまるところファイルダイアログとかでしょうか。
簡単に済まそう、と思ったらDXライブラリだけでは無理で
Windows APIとかを使うしかないですね。
ファイル選択ダイアログの表示
http://www14.big.or.jp/~ken1/tech/tech14.html
ただ新規ウインドウではなく、同一ウインドウ内で良ければ
DXライブラリには FileRead_findFirst()/ FileRead_findNext() / FileRead_findClose()という
ディレクトリのファイルを列挙する関数もありますので、それらを使って
自分でファイルの階層構造を辿る為のインターフェースを作れば
DXライブラリだけでも出来るはずです。
700ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(25,323ポイント)
Date: 2008/09/21(日) 21:10
No:21552
| 解決!
|
Title: Re:画像の挿入
|
|
>D&Dされていなければ、-1が、されていれば 0が戻り、その場合引数 FilePathBufferの
>文字列バッファにファイルへのパスが入ります
この部分が分かれば使えます^^本当にありがとうございました。
ちょっと試しに作っていますが、うまくいくか心配です^^;ちょっと頑張ってきます。
本当にありがとうございました。
またよろしくお願いします。
22ポイント を手に入れた。
|
|
|
|
Name: DDSS ..ぴよぴよ(941ポイント)
Date: 2008/09/21(日) 20:50
No:21550
|
|
Title: sin関数,cos関数について
|
|
こんばんわ^^
今回は 龍神録 第12章 たくさん敵の行動パターンを作ってみよう
内のプログラムについてわからない内容があったため質問を書き込みました。
msdnや他の方々のHPを参考に
sin関数やcos関数の働きを見ているんですが どうして
■r(半径?)を出すときにcos関数を使うのか
■enemy_act関数のプレイヤー座標 x を出すときにcos yを出すときにsinを使うのか
というのがよくわかりません
また
int r = cos(enemy[i].ang) < 0 ? 0 : 1;
enemy[i].sp = 6 + rang(2);
enemy[i].ang = rang(PI / 4) + PI + r;
enemy[i].muki = 2 - 2 * r;
この一連の動作・結果もよくわからないままです;
自分の数学の知識が足りないだけかもしれませんが
何か助言をいただけると幸いです^^
よろしくお願いします。
267ポイント を手に入れた。
|
|
|
|
Name: DDSS ..ぴよぴよ(974ポイント)
Date: 2008/09/21(日) 20:55
No:21551
| 解決!
|
Title: Re:sin関数,cos関数について
|
|
申し訳ありません。
下のほうにスレが立ててありました;
ありがとうございます。
またよろしくお願いします。
33ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(17,836ポイント)
Date: 2008/09/20(土) 10:17
No:21510
|
|
Title: Re:落ち物ゲーム
|
|
ダウンロードしたので今からビルドしてみます。
あと添付するプロジェクトファイルは.slnと.vcprojだけでいいですよ。
.ncbはインテリセンスの情報なので自動で作成されますし容量もかなり大きくなるので配布時には削除したほうがアップロードやダウンロードが楽になります。
.userはユーザー毎に違うファイルが作成されるので他人のファイルは不要です。
85ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(18,352ポイント)
Date: 2008/09/20(土) 10:53
No:21511
|
|
Title: Re:落ち物ゲーム
|
|
BlockColor[ 0 ] の橙色が0なのでないものとして扱われています
graph.cppで
int BlockColor[ 8 ][ 3 ] =
{
{ 0 , 0 , 0 } ,//ダミーを追加
{ 255 , 174 , 38 } ,//橙
{ 255 , 255 , 255 } ,//白
{ 255 , 255 , 0 } ,//黄色
{ 200 , 0 , 255 } ,//紫
{ 0 , 255 , 255 } ,//水色
{ 58 , 138 , 44 } ,//緑
{ 0 , 0 , 255 } //青
} ;
にして
product.cppで
// 初回のみランダムに3つブロックをセット
if( FlugNewBlock != 0 )
{
for( i = 0 ; i < 3 ; i ++ )
{
//ActiveBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) ;
ActiveBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) + 1;
}
FlugNewBlock = 0;
}
for( i = 0 ; i < 3 ; i ++ )
{
//NextBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) ;
NextBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) + 1 ;
m[ i ] = NextBlock[ i ] ;
}
にしたらどうでしょう。
Debugフォルダも10MBあるので配布時には削除したほうがいいかも
516ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..上級者(18,042ポイント)
Date: 2008/09/20(土) 11:58
No:21512
|
|
Title: Re:落ち物ゲーム
|
|
ありがとうございます。ちょっと今忙しいのでこれからよく見てみます。
個人情報やっちまいましたね。
ちょっとすぐ消して上げなおします。
これからダウンされる方は少々お待ちを。
94ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..上級者(18,245ポイント)
Date: 2008/09/20(土) 12:15
No:21513
|
|
Title: Re:落ち物ゲーム
|
|
toyoさんありがとうございます。
ご指摘の方法で確かにオレンジのブロックが消えなくなったのですが、
理屈がどうしてもわかりません。
>BlockColor[ 0 ] の橙色が0なのでないものとして扱われています
どういうことでしょうか。
//ActiveBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) ;
ActiveBlock[ i ] = GetRand( BLOCKTYPE_NUM -1) + 1;
GetRamd()関数で0〜6を返して、それを代入することの何がいけないんでしょうか。
203ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..上級者(18,301ポイント)
Date: 2008/09/20(土) 13:07
No:21515
|
|
Title: Re:落ち物ゲーム
|
|
これからバイトなので返信は遅くなってしまいます。
プロジェクトアップし直しました、コードはそのままです。
56ポイント を手に入れた。
|
|
|
|
|
Name: 雷 ..プログラマー(34,954ポイント)
Date: 2008/09/20(土) 13:54
No:21517
|
|
Title: Re:落ち物ゲーム
|
|
多分背景用のブロックの番号が「0」でオレンジも「0」
って事じゃないかな?
// 空きを積める
あたりで、消されているのではないかな?って思いますが^^;
ブロックが無い状態を「-1」で処理するようにすれば解決可能じゃないかな〜と思ってますが、
先に示された方法のほうがお手軽ですね〜・・・
※背景用のブロックは無いかもですが、何も無いブロックということで・・・(゜Д゜;A
まちがってたらごめんなさい^^;
141ポイント を落としてしまった。
|
|
|
|
|
Name: こめかみ ..上級者(18,390ポイント)
Date: 2008/09/20(土) 14:02
No:21518
|
|
Title: Re:落ち物ゲーム
|
|
バイトのシフトが急に変わって夜になりました。
夜の方が急に辞めてしまわれたそうです。
迷惑なことです( ̄ー ̄ )
雷さんありがとうございます。
意味がすぐには飲み込めないのでこれからじっくり考えてみます。
89ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(18,590ポイント)
Date: 2008/09/20(土) 14:21
No:21520
|
|
Title: Re:落ち物ゲーム
|
|
// もしブロックがない場合は次に移る
if( Block[ j ][ i ] == 0 ) continue ;
とか
if( Block[ j ][ i ] != 0 )
を見るとBlock[ ][ ]が0の場合ブロックがないという処理をしています
オレンジのブロックは0になるのでブロックと認識されていないのです
別の方法として盤面を-1で初期化する方法もあります
消去や移動、終了処理で盤面データを0と比較している部分を-1との比較に変えればバグは取れるとおもいます。
2倍のポイントを手に入れた! 238ポイント を手に入れた。
|
|
|
|
Name: 藍 ..入門者(4,459ポイント)
Date: 2008/09/20(土) 14:42
No:21521
|
|
Title: 龍神録プログラミングの館39章
|
|
龍神録プログラミングの館39章で少し気になったことがありました。
//アイテムゲットボーダーライン
#define ITEM_GET_BORDER_LINE 100
//アイテムの吸収範囲
#define ITME_INDRAW_RANGE 70
の部分で、アイテム吸収範囲のほうだけ、ITEMでなくITMEになってるところです。
故意なのかそれとも誤字なのか少し気になりました。
まぁ、プログラムのほうでは全部ITME_INDRAW_RANGEで書かれているので問題はないですが。
183ポイント を手に入れた。
|
|
|
|
Name: 藍 ..入門者(4,472ポイント)
Date: 2008/09/21(日) 02:46
No:21531
|
|
Title: Re:龍神録プログラミングの館39章
|
|
あと、40章でプログラムのほうは大丈夫なのですが、40章の説明のところのプログラムソースを書いているところで、
//アイテムの当たり判定
#define ITME_HIT_BOX 20
と、なってますが、下の部分で使われているところでは
if(x*x+y*y<ITEM_HIT_BOX*ITEM_HIT_BOX){//当たり判定内なら
になってます。
13ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(793,005ポイント)
Date: 2008/09/17(水) 20:49
No:21427
|
|
Title: 音楽と弾幕をコラボしてみました。
|
|
ニコニコ動画組曲を弾幕で表現してみました。
↑動画はこちらをクリック↑
(低画質版はこちら↓)
149ポイント を手に入れた。
|
|
|
|
Name: J ..中級者(9,669ポイント)
Date: 2008/09/17(水) 21:01
No:21428
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
見てみました。
素晴らしいできです!感動しました!
>2.463(秒)
>2.732(秒)
>2.933(秒)
>3.123(秒)
それにしても凄まじい秒合わせですね。。
小数点下三ケタまで。。
これはFullを目指すのですか?
でもFullとなるとできたとしても避ける気力が(笑)
35ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(793,293ポイント)
Date: 2008/09/17(水) 21:09
No:21429
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
ん〜改めて聞いてみると前半が少々ずれてますね〜^^;
小数点下三桁なのは単にDXライブラリやその他で設定出来る時間がミリ秒だっていうだけですw
でも0.02秒ずれるとピッタリには聞こえないので思いの他人間の耳って正確なようです。
フルは避ける方も作る方も体力が持たないでしょうから作りませんw
思ったよりあまり人に受け入れられなかったようですし^^;
2倍のポイントを手に入れた! 288ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(9,707ポイント)
Date: 2008/09/17(水) 21:31
No:21432
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
>思ったよりあまり人に受け入れられなかったようですし^^;
どうしてそのような・・・?
私は面白いと思ったのですが。
38ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(27,564ポイント)
Date: 2008/09/17(水) 22:23
No:21436
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
今見てきましたけど、すごいですねw
サムネを見た瞬間凄そうなのは分かりましたが。
音とタイミングを同調させるのにツールを作ったと言っても
確認したら、やっぱりズレテルなどの修正が大変だったと思います。(どんなツールか分かりませんが
いや、それにしても色々やってそうな中で、さらにこんなのも密かに作っていたとは・・・w
スタートページ(ホーム)をニコニコに設定している自分にとっては良い選曲と言わざる(ry
54ポイント を落としてしまった。
|
|
|
|
|
Name: 柏 ..中級者(9,613ポイント)
Date: 2008/09/17(水) 23:13
No:21441
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
スレッドのタイトルを見たときはこちら↓
http://www.nicovideo.jp/watch/sm4572867
の動画の影響を受けたのかな? とも思いましたが、いやいやとんでもない、それ以上に発射音でリズムまで合わせるとは、、、さすがです。
弾幕もとても綺麗でした(特にレーザー、、、個人的にかなり好きです)
これをフルで作るのは確かに大変そうですね……龍神録のソースコードが一部オープンなのを利用して、複数人で組曲内の一曲ずつ作っていき、フルとして繋ぐというのも面白いかも、、、とプレイヤーの一人として思いました^^;
ある意味コラボ…?
201ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..かけだし(2,253ポイント)
Date: 2008/09/18(木) 01:14
No:21448
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
こんばんは。
音がずれているのには、気付きませんでした。^^;
私も面白い、と言いますか、すごいっ!と思いました。
あこがれます。(ストーカーしようとかでは無いですよ。w)
勉強させて頂きます。^^
83ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(795,267ポイント)
Date: 2008/09/18(木) 03:37
No:21453
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
沢山書いてたのにスレイプニルが突然落ちて消えてしまったorz
>arrayさん
同調させるツールというと偉そうですが、
単にキーボードでタンタン叩いたタイミングを記憶させるだけのツールです^^;
最初はAudacityで波形を拡大してみながら、
0.234秒で1回目
0.849秒で2回目・・・
みたいに延々とやってたんですが、途中できりがないことに気づき断念^^;
そこで、自分で演奏(?)したデータを記憶するツール作りました(・・と言っても製作時間10分w)
音楽流しといて、それにあわせてキーボードでタンタンたたくと
1回目の入力までは、再生されてから何.秒
2回目の入力までは、再生されてから何.秒・・
といったように記憶されるんですね。
最初は波形データから何とかならないかなぁ・・と考えたりしましたが、
私のスキルじゃ無理そうでした^^;
何ミリ秒でショットをうてばいいかという事がかかれたファイルが書き出されるので、
それを参考に作りました。
・・・が!
0.234
0.827
1.327
1.443
みたいなデータがずら〜〜〜っと何百も書き出されているわけですが、
これ見ても全くどの部分がどのメロディなのかわからないですよねw
そこでエクセルにはりつけて、前後の差分をそれぞれ計算して表示させました。
するとタタタタンみたいに連打になるところは数値が低く、
間があくところは数値が大きいのでだいたいのメロディが把握出来るようになりました。
忘れないように、そこに歌詞つけたりして・・・
いや〜思ったより大変でしたよ^^;
598ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(795,550ポイント)
Date: 2008/09/18(木) 03:42
No:21454
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
>>柏さん
まさしくw その動画みて作ろうと思いました。
私の基本スタイルはパクr・・いや参考なのでb
>龍神録のソースコードが一部オープンなのを利用して、複数人で組曲内の一曲ずつ作っていき、フルとして繋ぐというのも面白いかも、、、
おぉ!なんという名案♪
まぁこんなしょうもない事に付き合ってくださる方がいらっしゃるかどうかわかりませんが^^;
でもあまり評価されてないようですし、努力が報われるかわからないですね(汗
>>ムンバさん
音ズレ気づかなかったという感想はありがたいです。
・・そこがねっくだったので・・。
でもやっぱ気になります^^;
再生されているタイミングは上記のツールでヘッドホンで聞きながらキーボードを私が
叩いたタイミングなのでリズム感が無いと言う証拠ですw
283ポイント を手に入れた。
|
|
|
|
|
Name: wing ..ぴよぴよ(51ポイント)
Date: 2008/09/18(木) 06:33
No:21458
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
見てみました。すごいですね。
検討がつかないんですが
こういう弾幕は何日位で完成させるのでしょうか?
40ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(27,908ポイント)
Date: 2008/09/18(木) 07:22
No:21459
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
>音楽流しといて、それにあわせてキーボードでタンタンたたく
なるほど、どおりで、41秒あたりのリズムのノリが良いんですねw
>でもあまり評価されてないようですし、努力が報われるかわからないですね
正直ゲームカテゴリ見てる人はあまり居ないから評価されにくいですよね。
新着が流れたらそれでお終いってなっちゃいますし・・・公開マイリストを作れば更新チェックをしに来てくれる方も出てくるかもしれませんが。
柏さんの紹介されてる弾幕も良いですねw私も以前、東方弾幕風をDLしてみたのですが5分くらい中身を見てさっぱりだったので放置してました。
でも、東方弾幕風の動画を見るとエフェクトもしっかりしてるし、どんな構造になってるのか知りたいので暇ができれば、私も何か作ってみたいです。
344ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..入門者(2,592ポイント)
Date: 2008/09/19(金) 00:22
No:21486
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
管理人さんって、もしかして・・・
>再生されているタイミングは上記のツールでヘッドホンで聞きながらキーボードを私が
>叩いたタイミング(略)
管理人さんは、精密なロボットマンさん、とかですか〜〜〜?<ジョークです。^^
て、言いますか本職はドラマーだったりして?
1000分の1秒のタイミングですよ?
前半のずれを、後半で修正してるんですよ!それって。^^;
プロフィールに、そんなの書いてありませんでした。反則です。(爆
・・・やっぱり、ここでも負けました。(激爆
お世話になります。<(_ _)>
165ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,082ポイント)
Date: 2008/09/19(金) 00:45
No:21488
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
ktkrを通り越して背筋が寒くなるぐらい感動しました。
今度は流星群を頼みます(嘘です
31ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(797,543ポイント)
Date: 2008/09/19(金) 01:58
No:21490
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
>>wingさん
ありがとうございます。
これは〜。そうですね〜3時間位でしょうか?
多分音楽と同期する必要が無ければ1時間位だったと思いますが、
何しろ音と同期させるのがめんどくさくて^^;
ツール作ったり試したりした時間もあわせたらもうちょっとかもしれませんが、
夕飯の後から作り出して深夜までに出来たのでだいたいそんなもんだと思います。
今回複雑な起動計算もなく、単純に乱数で円形発射してるだけのようなものが多いので
実は対して大変な計算式じゃないんですよね^^;
>>arrayさん
>なるほど、どおりで、41秒あたりのリズムのノリが良いんですねw
ノリにムラがありますねぇ^^;
う〜ん、録音(?)を確認した時にはずれてなかったように思ったのに・・。
どこかでずれたかな??
>公開マイリスト
あ〜そうですね。そういえばカテゴリ別にしてみたことがないです・・。
>弾幕風の動画を見るとエフェクトもしっかりしてるし、どんな構造になってるのか知りたいので暇ができれば、私も何か作ってみたいです
私も以前気になってたんですよね。
きっとRPGツクールみたいなものよりよっぽど自由度は高いんだとは思いますが、
やっぱり箱庭の中でプラモデルを作るような印象があったので(いやホントの所はどうか全く知らないんですが)
きっと「ここは自分でこだわりたい!」ってことが出てきてもそこはどうにも変更出来なかったり
するんじゃないかと思って、弾幕風は(よく見もしないで)やめました^^;
どうなんですかね〜。確かにエフェクトとか綺麗ですよね。
>>ムンバさん
ピアノはやってましたが、ドラムはやってませんね〜^^;
結構本気でやってたんですが、思春期頃「男がピアノかよ!」ってやめました。
いや〜勿体無いことしたなぁと今更w
>>lbfuvabさん
ありがとうございます^^;
流星群も実は検討したんですけど、あの前奏がどうも弾幕とあわないんですよ^^;
やるとしたらロックアレンジの東方曲とかいいかもしれませんねぇ。
769ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(9,931ポイント)
Date: 2008/09/19(金) 05:14
No:21493
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
ロックアレンジの東方と聞いてやってまいりました。
>やるとしたらロックアレンジの東方曲とかいいかもしれませんねぇ。
GodspeedさんのRageというのをやってもらいたいです。
ニコで検索すればでてくると思います。萃香のアレンジ曲です。
かっこいいので大好きです。ラスボスチックなので弾幕に良く合うかもしれません。
157ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(797,830ポイント)
Date: 2008/09/19(金) 08:08
No:21494
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
おぉ!!これはいい!めっちゃツボりました♪
カッコいいですね〜!
さっそく携帯へ転送♪
聞いてると弾幕が頭の中をぐるぐるかけめぐります(病
ただ、曲としては最高の演出なんですが、
弾幕にあわせるとして考えると前奏がちょっと長いかもしれない・・・><
(あくまで弾幕とあわせるとってことですので)
後、また音楽は組曲のように各自ダウンロードしてもらう事になると思いますが、
この動画57分て^^;
どこかでダウンロード公開とかされていませんかね。
こっちで曲を編集してゲームに同梱させてもらうことができれば最高なんですが・・。
(ここで改めて2回聞き返しました)
感動して涙出てきました・・。
287ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(28,068ポイント)
Date: 2008/09/20(土) 21:59
No:21524
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
【ニコニコ動画】龍神録の館で
管理人さんの続き、作ろうと思って頑張ってたんですけど。かなり難しいですね。特に音楽と同期させる部分はPCの処理速度の関係などで、安定しない・・・。
やっと、同期したと思ってレコードすると、処理速度がさらに落ちて音ずれ・・・。
さっき43章が追加されてるのに気づいたので、参考にさせてもらいます^^
ちょっと追記を・・・。
動画の方をみても分かりませんが、音楽に合わせて発射タイミングを取って、発射タイミングで同期させようとしたんですけど、無理でした(x_x)
160ポイント を手に入れた。
|
|
|
|
|
Name: ね〜す ..入門者(2,939ポイント)
Date: 2008/09/20(土) 23:21
No:21526
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
BPMが180なのを利用して、リズム楽譜(4,8,8,8など)から、
発射する時間を計算で求めてみる・・・なんて、どうでしようか><
音楽と同期を取る。というと、Audiosurfというソフトが思いつきます。
http://www.nicovideo.jp/watch/sm4236735
シンバルやバスドラムなど、波形にぐっと来る(謎)タイミングを計測しているのでしょうか・・・
というか、処理速度での同期が取れない状況はこれでは解決できませんね><
137ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(798,156ポイント)
Date: 2008/09/20(土) 23:55
No:21527
|
|
Title: Re:音楽と弾幕をコラボしてみました。
|
|
>>arrayさん
おぉ〜♪拝見しました^^ すばらしい。
上のレーザーの波の動きがそっくりですw
>動画の方をみても分かりませんが、音楽に合わせて発射タイミングを取って、発射タイミングで同期させようとしたんですけど、無理でした(x_x)
結構難しいですよね^^;
理論的には出来そうだと思ってもいざやってみると結構難しいんですよねw
難しいというより、ややこしい?
あと、Jさんのご要望にお答えして、その曲でまた新しい弾幕作ってみたので、よければ別トピもどうぞ。
>>ね〜すさん
なるほど、リズムから計算するという方法もありですね。
ただニコニコは途中でコロコロ曲がかわるからその基準の取り方が重要そうですね。
動画おもしろいですねw
49ポイント を手に入れた。
|
|
|
|
Name: fight ..ぴよぴよ(163ポイント)
Date: 2008/09/20(土) 00:53
No:21504
|
|
Title: 悩んでいます
|
|
以下のソースプログラムは行列の成分を入力してエラー確率を入力すると、行列の成分ごとに考えてエラー確率で0と1を入れ替えることを意図しているプログラムです。実行は出来るのですが・・・結果が上手く出ません。アドバイスを頂きたくて投稿しました。よろしくお願いします。
#include <stdlib.h>
#include <time.h>
int main(void){
int a[100][100];
int i, j, m, n;
int pcnt, error;
srand(time(0));
printf("行列 a の行数を入力 : ");
scanf("%d", &m);
printf("行列 a の列数を入力 : ");
scanf("%d", &n);
printf("行列 a の成分を入力 : \n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
printf("Error Rate (%%) ? ");
scanf("%d", &pcnt);
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
error = (int)rand()%100 < pcnt;
if(error) {
if(a[i][j] == 0) a[i][j] = 1;
if(a[i][j] == 1) a[i][j] = 0;
}
}
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
</pre>
例えば#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int a[100][100];
int i, j, m, n;
int pcnt, error;
srand(time(0));
printf("行列 a の行数を入力 : ");
scanf("%d", &m);
printf("行列 a の列数を入力 : ");
scanf("%d", &n);
printf("行列 a の成分を入力 : \n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
printf("Error Rate (%%) ? ");
scanf("%d", &pcnt);
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
error = (int)rand()%100 < pcnt;
if(error) {
if(a[i][j] == 0) a[i][j] = 1;
if(a[i][j] == 1) a[i][j] = 0;
}
}
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
</pre>
例えば行列の成分を、
0 0 0 0 0 0 0 0 0 0
としてエラー確率を50%としても全く変わらないこともあります。
どこに原因があるのでしょうか?
926ポイント を落としてしまった。
|
|
|
|
Name: fight ..ぴよぴよ(200ポイント)
Date: 2008/09/20(土) 00:56
No:21505
|
|
Title: Re:悩んでいます
|
|
すみません。ソースコードをと で囲ったのですが字下げされて表示されませんでした(><)
37ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(125,799ポイント)
Date: 2008/09/20(土) 01:05
No:21506
|
|
Title: Re:悩んでいます
|
|
> if(a[i][j] == 0) a[i][j] = 1;
>
> if(a[i][j] == 1) a[i][j] = 0;
このif文たちによって何をしているかというと、
入力データが0だったらいったん1にしますが、0に戻しています。
つまり、入力データが0だったら、このif文たちによって
何もしていないことになっています。
78ポイント を手に入れた。
|
|
|
|
|
Name: fight ..ぴよぴよ(268ポイント)
Date: 2008/09/20(土) 14:19
No:21519
| 解決!
|
Title: Re:悩んでいます
|
|
>lbfuvabさん ありがとうございます!おかげで問題を解決することが出来ました!!
34ポイント を手に入れた。
|
|
|
|
Name: J ..中級者(9,873ポイント)
Date: 2008/09/18(木) 22:15
No:21481
|
|
Title: 【雑談】シスアドでのデータベースと表計算の問題について
|
|
こんにちは。今、シスアドに向けてデータベース(特にSQL)と表計算を勉強をしているのですが、
具体的にはどのような所を勉強すれば良いのでしょうか?(特にSQL)
学ぶなら実際に打ち込んでみないとなと思っています。
どなたかご指南してもらえると嬉いです。
p.s.
以前のように雑談マークがなくなってしまったのでニコ動みたいすることに。
166ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(17,632ポイント)
Date: 2008/09/18(木) 22:35
No:21482
|
|
Title: Re:【雑談】シスアドでのデータベースと表計算の問題について
|
|
私もSQLを学ぼうかなと思っていたところです。
ちなみに日検の表計算検定初段持ってます^^;
ので、ある程度なら表計算はアドバイスできるのですが。
SQLといえばWebデータベースの印象があるのですが、
ローカルでもデータベースを構築できるみたいですね。
(ゲームに使えるかも)
133ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(9,774ポイント)
Date: 2008/09/19(金) 05:10
No:21492
|
|
Title: Re:【雑談】シスアドでのデータベースと表計算の問題について
|
|
YuOさん、詳しいご回答ありがとうございます。
実はデータベース用にOpenOfficeのBaseをインスコしてあるんです。
これはどうでしょうか・・・?
>で,DBが必要になる程のゲームというのも,データ作るのが大変そうですね……。
ポケモンとかそんな感じのゲームに使うのでしょうかね。
99ポイント を落としてしまった。
|
|
|
|
|
Name: toyo ..上級者(17,751ポイント)
Date: 2008/09/19(金) 11:49
No:21497
|
|
Title: Re:【雑談】シスアドでのデータベースと表計算の問題について
|
|
WEBプログラムでいろいろ作ったことがありますがPHP + MySQLはかなり便利でしたね。
INSERTとSELECTしか使わないんですけど。
データベースは後でどんどんデータを追加して適宜選択、集計、ソートが出来るのが便利なところですよね。
ゲームだと固定データなのでデータベース使う意味はないような気がします。
普通に配列にして作るのが多いのでは。
139ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(17,920ポイント)
Date: 2008/09/19(金) 12:03
No:21498
|
|
Title: Re:【雑談】シスアドでのデータベースと表計算の問題について
|
|
> ゲームだと固定データなのでデータベース使う意味はないような気がします。
そういえばそうですね。
> 普通に配列にして作るのが多いのでは。
あるいは外部ファイル読み込みにしておくとか。
となると、ゲームに対するデータベースの使い道とすれば、
インターネットランキングぐらいなものでしょうかね?
…ゲームを作るソフトにも使えそうかな?
101ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,594ポイント)
Date: 2008/09/19(金) 12:44
No:21499
|
|
Title: Re:【雑談】シスアドでのデータベースと表計算の問題について
|
|
> 実はデータベース用にOpenOfficeのBaseをインスコしてあるんです。
基本的なDDLであるはずのCREATE TABLEすら受け付けないので,あまりお勧めはしないです。
あくまでシスアドの勉強用と割り切り,シスアドがDMLの範囲で済むのであれば,それでもよいですが。
# このあたりは,Accessと同じ。
先に挙げたDBは,場合によっては制限付き (SQL Serverの場合だと,DBが4GBまでとか) ではあるものの,業務でも利用可能な本格的なものです。
できればSQL Serverなどを使ってみた方がよいと思いますよ。
> WEBプログラムでいろいろ作ったことがありますがPHP + MySQLはかなり便利でしたね。
> INSERTとSELECTしか使わないんですけど。
ありがちですね。
かくいう私の場合も,裏側 (夜間バッチとか入稿システムとか) はともかく表側 (公開側) ではSELECTとINSERTでほぼ事が足りました。
# 会員ポイント制度の都合上,現在のスナップショットの更新のためにUPDATEが必要にはなりましたが。
まぁ,基本はSELECTでしたけどね。
> となると、ゲームに対するデータベースの使い道とすれば、
> インターネットランキングぐらいなものでしょうかね?
単純にゲームデータを最初に保持しておくために使う,というのはありでしょうね。
外部ファイルがRDBである,というだけで。
思考系ゲームでは,定跡/定石データベースなどの用途がありますし,過去の思考過程を保存するのにも使えます。
# 場面と手と結果をINSERTしておいて,次回からSELECTで取り出す,など。
400ポイント を手に入れた。
|
|
|
|
Name: ムンバ ..かけだし(2,170ポイント)
Date: 2008/09/18(木) 00:33
No:21446
|
|
Title: for について質問です
|
|
こんばんは。
先日は、ご迷惑をお掛けしまして、大変申し訳御座いませんでした。
ご丁重なご解説、どうもありがとう御座いました。
今日も「ゲームプログラミングの館」で勉強させて頂いてます。お世話になります。(謝
疑問に感じたので再度、質問させて頂きます。
(管理人様のソースや、ご解説に疑問を感じた訳では無いです。本当に勉強になってます。)
例えば、こちらのページのゲームプログラミングの館の「8. 時間を取得する。」の
for内の a++; なのですが・・・
i++; に変更して実行しても同じ値が表示されます。
この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
forより上の行のtime変数より、for内でのtime変数に時間が経過した分
1/1000単位でプラスされた値が表示されるのだと思います。
int i,a=0,time,White;
i はforの条件式を満たすと、終了する変数だと思うのですが
もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
うまく、お伝えできなければ申し訳御座いません。
i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
悩んでしまったので、お時間ある方、ご解説の程よろしくお願い致します。
170ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(796,052ポイント)
Date: 2008/09/18(木) 04:32
No:21457
|
|
Title: Re:for について質問です
|
|
まずコードを見ながら整理して回答してみます。
(1) for内の a++; なのですが・・i++; に変更して実行しても同じ値が表示されます。
(2) この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
(3) forより上の行のtime変数より、for内でのtime変数に時間が経過した分1/1000単位でプラスされた値が表示されるのだと思います。
(4) int i,a=0,time,White;
i はforの条件式を満たすと、終了する変数だと思うのですが もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
(5) i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
ということで一つずつ見て行きましょう。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int i,a=0,time,White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
time = GetNowCount() ; // 現在経過時間を得る
DrawFormatString(0, 0, White , "立ち上がってから%dミリ秒", time);//文字列表示
for(i=0;i<100000;i++) //10万回a++;を実行
a++;
time = GetNowCount() - time; //現在の経過時間から先ほどの経過時間を引く
DrawFormatString(0,100, White , "計算時間%dミリ秒" , time);//文字列表示
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
(1)
結論からいうと、この計算は省略されているせいでしょう。
実際計算されていないと思います。
何故かと言うと、10万回足し算しようが、100万回足し算しようが、
のちにaという値はどこにも使用されてないですよね?
計算結果使わないのに計算してもしょうがないじゃないか
ってことでコンパイラが「必要ない」と解釈して
この計算を行わなかったためと思います。
ですから、このaの値を表示するなどしてあとで使ってやれば計算されるはずです。
もし、a++をi++にすると、1回のループでi++が2回行われるわけですよね。
つまり10万回ループするはずが、5万回になるので、
単純に計算時間は半分になると思われます。
よって(2)(3)(5)はそれで解決しますね。
(4)
>もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
と言う部分がよくわかりません。
aが無かった場合ならaには何も代入されないですよね?
あまり番号付けた意味なかったですね^^;
1,115ポイント を落としてしまった。
|
|
|
|
|
Name: ムンバ ..かけだし(2,338ポイント)
Date: 2008/09/18(木) 23:45
No:21483
|
|
Title: Re:for について質問です
|
|
こんばんは。お世話になります。
お忙しい所、早速の丁重なご解説頂きましてありがとう御座います。
何度も申し訳御座いません。
せっかく付けて頂いたので、番号使わせて頂きますね。ありがとう御座います。^^
・・・(5)は自分の馬鹿さに、気付きましたので忘れて下さい。
って言いますか、(1)〜(4)も、って事に成りかねないので(自爆
これも、うまくお伝えできなければ申し訳ないです。
本当に食い付こうとか、そういう趣旨は有りませんので(もう2度と言いません。^^)
もう少しだけ、お時間御座いましたら、ご指導の程よろしくお願い致します。
このa++;が無いと(2)(1・3・5は無視して頂いて^^;)に なるのですが
実は、かじった程度ですが、Perl(CGI)の勉強もしてまして、CGIのforで例えますと。
(# はコメントで、C言語の // に相当します。$aは、aと言う名前の自由な変数です。for{}内が実行文です。)
Perlの呼び出しや終了などは、省略させて頂きます。
-----------------------------------------------------------------------------------------------
(前略)
$a=0; # $aを0に初期化(代入)
for($i=0;$i<100000;$i++) { #()内はforの条件式
# 条件式→iを0に初期化して、変数iが(インクリメントで)100000未満になるまで繰り返し処理をする
$a++;
print"$a行目です。<BR>"; # print は、ブラウザに表示する。と言う意味です。<BR>はHTMLタグです。
}
(後略)
-----------------------------------------------------------------------------------------------
これをPerlのサーバー上で(ブラウザが要求して)実行されますと、1行目から99999行目まで、つまり
1行目です。
2行目です。
3行目です。
・
・
・
99998行目です。
99999行目です。
と、ブラウザに表示されます。鯖に負担が掛かりそうなので、実際には試してません。
(ああっ!?自分の知識を公表しようとかC言語と比較しようとかの趣旨もありませんです。)
Perlでは上述のスクリプトですと
$a=0; の行を省略しても、それ以前に$a(変数)に値が代入されて無ければ$aには0が入りますので
「1行目です。」〜「99999行目です。」と同じ様に表示されます。
(↑これが、たぶん(3)に相当すると思います。)
$a++; の行を省略すると、(←これが(2)です。)
「0行目です。」〜「0行目です。」と99999行、表示されます。
$a++; の行を $i++; に変更すると。(←これが(1)ですね。^^;)
「0行目です。」〜「0行目です。」と、約(99999/2)行、表示されます。
そこで、(5)は無視して頂くとして <すみません。かなり赤面状態です。<自爆
(4)なのですが、このスクリプトで言う$a(変数)が
C言語で言う a に相当すると思ったんです。
この場合のa++;の a は、C言語では変数になるのですよね?
Perlでは $aと$i が、ここでの変数になります。
Perlでは、for文(繰り返し文)を使って、インクリメントされた$aを使い、この様に表示するのですが
Cでは、この a++;の a が何に使われている変数(インクリメントされていく値)なのか・・・
つまり、この a が、何処で使用されてるのか?
と、いう事をお聞きしたしたいのです。だと、思います。(自滅
すみません。本当にすみません。
自分では聞きたい事は解るのですが、うまく伝える事ができて無いんだと思います。
この a が、何を意味するのか(存在?)が、解らないのです。
aと、aをインクリメントされた値が、何処に使われるのでしょうか?
って事なんだと思います。(激涙
考えすぎなのでしょうか・・・?^^;
再度、宜しければ宜しくお願い致します。
85ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..かけだし(2,378ポイント)
Date: 2008/09/18(木) 23:50
No:21484
|
|
Title: Re:for について質問です
|
|
訂正:99999→100000に、1行目は0行目に訂正させて頂きます。(謝
2倍のポイントを手に入れた! 40ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..かけだし(2,427ポイント)
Date: 2008/09/18(木) 23:51
No:21485
|
|
Title: Re:for について質問です
|
|
何度もすみません。1行目は1行目のままで・・・。
もう、ごちゃごちゃで・・・。
本当に、ごめんなさい。<(_ _)>
49ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..入門者(2,753ポイント)
Date: 2008/09/19(金) 10:27
No:21495
| 解決!
|
Title: Re:for について質問です
|
|
早速のご解説、どうもありがとう御座います。
長々と申し訳御座いませんでした。
つまり「for文内のaの計算が何故あるのか?」ですね。
何処に行ってしまったのかと思いまして・・・。
思ったまま、素直にお聞きすれば良かったんですね。^^;
納得できました。ありがとう御座います。
本当に何度も、すみませんでした。(謝
引き続き、ゲームプログラミングの館で勉強させて頂きます。
できるだけご迷惑をお掛けしない様に気を付けますので
また何かあれば宜しくお願い致します。
(私、日本語の勉強もしないとですね。^^;)
ありがとう御座いました!
161ポイント を手に入れた。
|
|
|
|
Name: mi ..ぴよぴよ(793ポイント)
Date: 2008/09/17(水) 22:27
No:21437
|
|
Title: リンゴ落ちの向きについて
|
|
はじめまして。
管理人さんのリンゴ落ちゲー(?)を真似させてもらい、コードを書いていったのですが、
向きを右と左で変えてみようと思い、少しコードを変えてみたのですが変わらなく、私の力では
どこが間違ってるのかわからないので、質問させていただきます。
私は1ヶ月前からこのサイトを見つけ、勉強を始めたの初心者です。
C言語もぜんぜんやったこともなかったので、全く見当違い、また、理解が足りないからできない
と言うこともあると思います。その辺りはごめんなさい。
コンパイラはVC++でやってます。ゲームプログラミングの館。龍神録プログラミングの館の途中まで、読み進めた程度です(30章)
質問なのですが、管理人さんのリンゴの落ちゲー(?)
(http://www.play21.jp/board/formz.cgi?action=res&resno=20298&page=&id=dixq&lognum=64)
を見ながらコードを打っていって、その際に上でも記しましたが向きの反転をさせようと思い、
キャラクタの移動に
void char_ido(){
if(Key[KEY_INPUT_RIGHT]>0){//右向きが押されていたら
ch.muki=0;//向きヲセットする
ch.x+=4;}
if(Key[KEY_INPUT_LEFT]>0){//左
ch.muki=1;
ch.x-=4;}
}
とし、キャラクタの描画で
void char_graph(){
if(ch.muki==0){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,TRUE);
DrawRotaGraph(ch.x+50,ch.y,1.0f,0,img[2],TRUE);
}
if(ch.muki==1){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,FALSE);
DrawRotaGraph(ch.x-50,ch.y,1.0f,0,img[2],TRUE);
}
}
とし、実行すると常にどっちかしか向かない状態になって、反転してくれません。
DrawRotaGraph関数の反転が間違ってるのかと思い、画像を新たに反転しているのを用意し、
muki==0とmiku==1の画像ハンドルを新しいのにそれぞれ変え、実行しましたが、変わりませんでした。
コードは全部記した方がいいのでしょうか?
これは、どうしたら反転してくれるようになるのでしょうか?
やり方がそもそも間違っているとしたら、どのようにしてみるのがいいか、アドバイスを頂けたらと
思い質問させていただきます。
793ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(793,829ポイント)
Date: 2008/09/18(木) 02:54
No:21450
|
|
Title: Re:リンゴ落ちの向きについて
|
|
初めまして。
ターンフラグなどリファレンスに無い使い方も利用されてるとはすごいですね。
とりあえず足らないところは想像で補完してコンパイルは出来ました。
お書きになっているものとあっているかどうかはわかりませんが・・。
>常にどっちかしか向かない状態になって、反転してくれません
ということなんですが、どっちかしか向かないとは・・?
右か左かどっちかに向けばいいのではないでしょうか?
ごめんなさい、理解力低いせいでわかりません(_ _||)
実行したところ、添付ファイルのようになりましたが、
向きが逆では・・?という印象を受けますが、そのことでしょうか?
う〜ん、これは単にターンフラグを反対にすればいいだけだと思うので違うでしょうかね。
この辺少し補足していただけると助かります。
違う話ですが、カゴの表示位置と実際のカゴの位置が違うので、リンゴが見た目の位置に入らないことがありますね。
キャラの位置を基準に、現在の向きでカゴの位置を決めてみましょう。
新たに作ったサンプル以下に示しておきますね。
390ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(794,173ポイント)
Date: 2008/09/18(木) 03:14
No:21451
|
|
Title: Re:リンゴ落ちの向きについて
|
|
青い部分が変更点です。
今回、「カゴ」という概念を別にした方がよさそうだったので
kago_t型の構造体を用意し、kagoという変数を用いてカゴを一つの物体として計算しました。
処理はいたって簡単で、キャラの位置と向きを中心に、カゴの位置を決めているだけです。
#include "../lib/DxLib.h"
#include <math.h>
#define BULLET_MAX 1000
#define PI 3.141592653589793
//キャラクタデータの構造体
typedef struct{
int muki;
double x,y;
}ch_t;
typedef struct{
int flag,cnt;
double x,y,angle,spd;
}bullet_t;
//カゴの構造体☆1
typedef struct{
int x,y;
}kago_t;
int count;
int Key[256];//キーデータ
int img[10],img_bullet[3];//画像データ
int White;//白色データ
ch_t ch;//キャラデータ
bullet_t bullet[BULLET_MAX];
//カゴの変数宣言☆2
kago_t kago;
//キーがどれ位押されたかを判定する関数
//この関数は覚えなくていい。
//渡されたKeyStateBufにはキーの押されたカウンタ数が入るものだと知っているだけでOK
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1)KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
//データロード
void load(){
img[0]=LoadGraph( "img/haikei.jpg" );
img[1]=LoadGraph( "img/char.png" );
img[2]=LoadGraph( "img/kago.png" );
LoadDivGraph( "img/bullet.png" , 1 , 1 , 1 , 30 , 29 , img_bullet ) ;
White=GetColor(255,255,255);
}
//初期化
void ini(){
ch.x=320;
ch.y=360;
count=0;
}
void calc_kago(){//カゴの計算☆3
kago.x=ch.x;
kago.y=ch.y;
if(ch.muki==0)//右なら
kago.x += 30;//キャラより30右へ
if(ch.muki==1)//左なら
kago.x -= 30;//キャラより30左へ
}
//キャラクタ移動
void operate_char(){
if(Key[KEY_INPUT_RIGHT]>0){//右向きが押されていたら
ch.muki=0;//向きヲセットする
ch.x+=4;
}
if(Key[KEY_INPUT_LEFT]>0){//左
ch.muki=1;
ch.x-=4;
}
calc_kago();//カゴの計算関数の呼び出し☆4
}
//空いている弾情報格納要素番号を返す
int bullet_serch(){
int i;
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag==0)
return i;
}
return -1;
}
//弾を登録
void bullet_enter(){
int n;
n=bullet_serch();//空いている弾情報格納要素番号
if(n!=-1){
bullet[n].flag =1; //弾の存在フラグを立てる
bullet[n].cnt =0; //カウンタ初期化
bullet[n].spd =2; //発射スピードを2に
bullet[n].angle=PI/2; //角度は真下である90°
bullet[n].x =GetRand(640); //x座標は0〜640のランダムな値
bullet[n].y =0; //y座標は0
}
}
//i番の弾幕がかごの中にあるかどうかを判定する関数。
//1:ある 0:ない
int bullet_kago_exit(int i){
//もしカゴの中にあれば
//カゴに入るかどうかの判定文変更☆5
if(kago.x-25<bullet[i].x && bullet[i].x<kago.x+25
&& kago.y-25<bullet[i].y && bullet[i].y<kago.y+25)
return 1;
return 0;
}
//i番の弾幕が画面内にあるかどうかを判定する関数。
//1:画面外 0:画面内
int bullet_feeld_exit(int i){
//もし画面の中になければ
if(!(0<=bullet[i].x && bullet[i].x<=640 && 0<=bullet[i].y && bullet[i].y<=480))
return 1;
return 0;
}
//弾計算
void bullet_calc(){
int i;
if(count%60==0)//60カウントに一回(モニタが60Hzの場合、60カウントは1秒)
bullet_enter();//発射
//軌道計算
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag==1){
bullet[i].x += cos(bullet[i].angle) * bullet[i].spd;//x成分計算
bullet[i].y += sin(bullet[i].angle) * bullet[i].spd;//y成分計算
if(bullet_kago_exit(i)==1)//かごの中にあるか?
bullet[i].flag=0;//弾を消す
if(bullet_feeld_exit(i)==1)//画面の中にあるか?
bullet[i].flag=0;//弾を消す
}
}
}
//弾メイン
void bullet_main(){
bullet_calc();
}
//背景描画
void graph_background(){
DrawGraph(0,0,img[0],FALSE);
}
//キャラ描画
void graph_char(){
//カゴの位置による描画に変更☆6
DrawRotaGraph(kago.x, kago.y, 1.0f, 0, img[2],TRUE);
if(ch.muki==0){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,FALSE);
}
if(ch.muki==1){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,TRUE);
}
}
//弾の描画
void graph_bullet(){
int i;
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag>0){
DrawRotaGraphF( bullet[i].x, bullet[i].y, 1.0f,
bullet[i].angle-PI/2, img_bullet[0], TRUE );
//+PI/2は弾の向きを合わせるため
}
}
}
//描画処理メイン
void graph_main(){
graph_background();//背景描画
graph_char();//キャラ描画
graph_bullet();//弾描画
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0)
return -1;//初期化と裏画面化
load();//データロード
ini();//初期化
while(ProcessMessage()==0 && ClearDrawScreen()==0 &&
GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
operate_char();//キャラ操作
bullet_main();//弾メイン
graph_main();//描画処理メイン
count++;
ScreenFlip();//裏画面反映関数
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
344ポイント を手に入れた。
|
|
|
|
|
Name: mi ..ぴよぴよ(883ポイント)
Date: 2008/09/18(木) 17:43
No:21475
|
|
Title: Re:リンゴ落ちの向きについて
|
|
返答ありがとうございます。
>常にどっちかしか向かない状態になって、反転してくれません
言葉不足で申し訳ありません。右入力で右向きに、左入力で左向きにさせたいのに
最初に画面に表示された向きのままで、逆を押してもそっちに向きになってくれないということです。
(いろいろいじっていたら最初の向きが変わることもあったので
こういう表現にさせてもらいました)
自分のイメージでは、ch.muki==0で右向きの画像を、ch.muki==1で左向きの画像を表示させたかった
ので、ifを使い場合分けをし、左向き時は右向きの画像を反転させて左を表示させようとしましたが、
(上記のコード間違ってました。TRUEとFALSEが逆でした。)
できませんでした。ここからあれこれいじったのですが、どうして向いてくれないのかわからないので
質問させていただきました。
管理人さんのコード通りでやりたかったことは出来ました。ありがとうございます。
しかし、何が原因だったのか私なりに検討しましたが分かりませんでした。
変更点はカゴの構造体を作ってカゴを別に計算させたこと。、
ここら辺を見てみましたが、何がいけなかったのか。これがいまいちわかりません。
大元から私が変更した点は、上の記したキャラの移動と描画と
カゴの中にりんごがあるかどうかの判定関数くらいです。
//i番の弾幕がかごの中にあるかどうかを判定する関数
//1:ある 2:ない
int bullet_kago_exit(int i){
//もしカゴにあれば
if(ch.muki=0)
if(ch.x+25<bullet[i].x && bullet[i].x<ch.x+75 && ch.y-22<bullet[i].y && bullet[i].y<ch.y+22)
return 1;
if(ch.muki=1)
if(ch.x-75<bullet[i].x&&bullet[i].x<ch.x-25&&ch.y-22<bullet[i].y&&bullet[i].y<ch.y+22)
return 1;
return 0;
}
となっているところくらいしか変更をしてないのですが、
これらのせいで左右の方向転換をしてくれないというのはどうしてなのか、
どこを間違ったのかがわからないので、教えていただきたく質問させていただきます。
90ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(796,181ポイント)
Date: 2008/09/18(木) 19:38
No:21476
|
|
Title: Re:リンゴ落ちの向きについて
|
|
>最初に画面に表示された向きのままで、逆を押してもそっちに向かない
と言う事ですが、私がコンパイルした時には、押したキーと逆向きに向いていました。
添付ファイルのような感じです。
もしかしたら私が予測して補完した部分がそちらと違うのかもしれません。
もしよければこちらにコードを添付してもらえるでしょうか。
129ポイント を手に入れた。
|
|
|
|
|
Name: mi ..入門者(3,451ポイント)
Date: 2008/09/18(木) 19:57
No:21477
|
|
Title: Re:リンゴ落ちの向きについて
|
|
添付というのは、コードだけ記せばいいのでしょうか?
それとも、zipなどで上げるということでしょうか?
理解力不足ですみません。
わからないので、とりあえずコードを下に記したいと思います。
#include "DxLib.h"
#include <math.h>
#define BULLET_MAX 1000
#define PI 3.141592653589793
//キャラックタの構造体
typedef struct{
double x,y;//座標
int muki;
}ch_t;
typedef struct{
int cnt,flag;
double x,y,angle,spd;
}bullet_t;
int count;
int Key[256];//キーデータ
int img[10],img_bullet[3];//画像データ
int White;//白色データ
ch_t ch;
bullet_t bullet[BULLET_MAX];
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
//データロード
void load(){
img[0]=LoadGraph("img/haikei.jpg");
img[1]=LoadGraph("img/char_r.png");//右向き画像
img[2]=LoadGraph("img/char_l.png");//左向き画像
img[3]=LoadGraph( "img/kago.png" );
LoadDivGraph( "img/bullet.png" , 1 , 1 , 1 , 30 , 29 , img_bullet ) ;
White=GetColor(255,255,255);
}
//初期化
void ini(){
ch.x=320;
ch.y=360;
count=0;
ch.muki=0;
}
//キャラクタ移動
void char_ido(){
if(Key[KEY_INPUT_RIGHT]>0){//右向きが押されていたら
ch.muki=0;//向きヲセットする
ch.x+=4;}
if(Key[KEY_INPUT_LEFT]>0){//左
ch.muki=1;
ch.x-=4;}
}
//キャラの描画
void char_graph(){
if(ch.muki==0){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,FALSE);
DrawRotaGraph(ch.x+50,ch.y,1.0f,0,img[3],TRUE);
}
if(ch.muki==1){
DrawRotaGraph(ch.x,ch.y,1.0f,0,img[1],TRUE,TRUE);
DrawRotaGraph(ch.x-50,ch.y,1.0f,0,img[3],TRUE);
}
}
//空いている弾情報格納要素番号を返す
int bullet_serch(){
for(int i=0;i<BULLET_MAX;i++){
if(bullet[i].flag==0)
return i;
}
return -1;
}
//弾を登録
void bullet_enter(){
int n;
n=bullet_serch();//空いている弾幕情報格納要素番号
if(n!=-1){
bullet[n].flag=1;//弾の存在フラグをたてる
bullet[n].cnt=0;//カウンタの初期化
bullet[n].spd=2;//発射スピードを2に
bullet[n].angle=PI/2;//角度は真下
bullet[n].x=GetRand(640);
bullet[n].y=0;
}
}
//i番の弾幕がかごの中にあるかどうかを判定する関数
//1:ある 2:ない
int bullet_kago_exit(int i){
//もしカゴにあれば
if(ch.muki=0)
if(ch.x+25<bullet[i].x && bullet[i].x<ch.x+75 && ch.y-22<bullet[i].y && bullet[i].y<ch.y+22)
return 1;
if(ch.muki=1)
if(ch.x-75<bullet[i].x&&bullet[i].x<ch.x-25&&ch.y-22<bullet[i].y&&bullet[i].y<ch.y+22)
return 1;
return 0;
}
//i番の弾幕が画面内にあるかどうかを判定する関数。
//1:外 2:内
int bullet_feeld_exit(int i){
//もし画面内なら
if(!(0<=bullet[i].x &&bullet[i].x<=640&&0<=bullet[i].y&&bullet[i].y<=480))
return 1;
return 0;
}
//弾計算
void bullet_calc(){
int i;
if(count%60==0)//60カウントに一回(モニタが60Hzの場合、60カウントは1秒)
bullet_enter();//発射
//軌道計算
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag==1){
bullet[i].x+=cos(bullet[i].angle)*bullet[i].spd;
bullet[i].y+=sin(bullet[i].angle)*bullet[i].spd;
if(bullet_kago_exit(i)==1)//かごに入ってれば
bullet[i].flag=0;
if(bullet_feeld_exit(i)==1)//画面の中にあるか
bullet[i].flag=0;
}
}
}
//弾メイン
void bullet_main(){
bullet_calc();
}
//背景描画
void graph_background(){
DrawGraph(0,0,img[0],FALSE);
}
//弾の描画
void graph_bullet(){
int i;
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag>0){
DrawRotaGraphF(bullet[i].x,bullet[i].y, 1.0f, bullet[i].angle-PI/2, img_bullet[0], TRUE );
//+PI/2は弾の向きを合わせるため
}
}
}
//描画メイン
void graph_main(){
graph_background();
char_graph();
graph_bullet();
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
load();//データロード
ini();//初期化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
char_ido();//キャラ操作
bullet_main();//弾メイン
graph_main();//描画処理メイン
count++;
ScreenFlip();//裏画面反映関数
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
です。
2,568ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(796,684ポイント)
Date: 2008/09/18(木) 21:14
No:21478
|
|
Title: Re:リンゴ落ちの向きについて
|
|
あ〜これは見落としやすいかもしれませんね。
//キャラの描画
int bullet_kago_exit(int i){
//もしカゴにあれば
if(ch.muki=0)
if(ch.x+25<bullet[i].x && bullet[i].x<ch.x+75 && ch.y-22<bullet[i].y && bullet[i].y<ch.y+22)
return 1;
if(ch.muki=1)
if(ch.x-75<bullet[i].x&&bullet[i].x<ch.x-25&&ch.y-22<bullet[i].y&&bullet[i].y<ch.y+22)
return 1;
return 0;
}
ここは比較を行いたいのかもしれませんが、代入になっています。
a == 1
は比較ですが
a = 1
は代入です。aに1を代入します。
ここで、条件文の仕組みについて理解してみましょう。
int a=1;
if( a==1 )
みたいにかかれたとき、このa==1は具体的になんなのでしょうか。
条件文が「真」か「偽」かということはご存知でしょうか。
この時はaが1ですから「真」となります。「真」とは0以外を意味します。
試しにprintfでa==1を表示してみたら「1」を表示されました。
今度は
int a=2;
if( a==1 )
としたとき、a==1は偽となり、a==1は0と同じことになります。
つまり、条件文の中身が0なら処理されませんし、0以外なら処理されます。
だから
if( a=1 )
でも条件文としてはaが1だから0以外と解釈し、真として処理されるわけです。
ということで、
if( a=0 )
と
if( a=1 )
は比較ではないものの、ちゃんと条件式は評価されて期待しているのとは違えども処理されているのです。
まぁとりあえずイコール二つにすれば直ります。
503ポイント を手に入れた。
|
|
|
|
|
Name: mi ..入門者(3,553ポイント)
Date: 2008/09/18(木) 21:39
No:21480
| 解決!
|
Title: Re:リンゴ落ちの向きについて
|
|
ありがとうございます。
自分で見てて気づけなかったですが確かにあれじゃおかしいですね。
エラーの出てくれないミスは恐ろしいです。
とても解りやすく丁寧に説明していただき、本当にありがとうございます。
これからこのゲームに少しずついろいろ足していけたらと思って現在四苦八苦中です。
以後解らないところがあったら、またお願いしたいと思います。
どうもありがとうございました。
102ポイント を手に入れた。
|
|
|
|
Name: YH ..ぴよぴよ(37ポイント)
Date: 2008/09/18(木) 00:39
No:21447
|
|
Title: C言語と数学
|
|
初めまして。
ゲームを作りたくC言語の勉強をさせて頂いております。
入門に関してはコードを書きまくったり本等で勉強し理解したつもりなのですが、
当方文系頭な為、数学に関しては全くの無知です。
それ故色々と勉強になり、大変感謝しています。
然し、不安というのは憑き物でして、プログラムに関して数学はやはり重要な位置を占めるという事実に多少困惑しています。
ゲームプログラミングでは「余り」が重要であるとか、物理、数式等、殆ど知識がないのですが、どこから勉強すればいいのか迷ってしまいます。応用も利きません(たぶんですが・・)。
数学的知識は、プログラミングを続けるに従い、身につくものなのでしょうか?
或いは、オススメの書籍、問題等ありましたらご教授下さい。
(「プログラマの数学」は一通り読みました)
それでは、失礼致します。
37ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(797,167ポイント)
Date: 2008/09/18(木) 04:07
No:21456
|
|
Title: Re:C言語と数学
|
|
初めまして。
今どの位の数学の知識をお持ちでしょうか?
また、どの程度まで数学が必要になるようなプログラミングをされるのでしょうか?
それによって回答もかなり変わってくると思います。
物理演算や、物理現象のシミュレーションを行うとか、3Dモデルをガンガン使っていくような
プログラムを組まれる場合はそれなりの専門的な知識が豊富に必要だと思いますが、
単に趣味で普通のプログラム、例えば何らかの簡単な計算をするツールであったり、
簡単なエディタを作ってみたり、2DのFFのようなゲームを作ってみたりという程度であれば
大げさな話、小学校の算数がわかれば充分だと思います。
それでも、これからの色々な可能性を考えて、何でも勉強していきたいと言う事でしたら、
プログラミングに関係ありそうな数学の分野を勉強していくといいと思います。
恐らく大学で習う範囲の数学で必要なのは(一般的に)線形代数だけだと思いますから、
とりあえず高校の教科書で勉強すれば充分ですよ。
YHさんが今どの程度の数学の知識をお持ちかわからないので、
どこから勉強すればいいという回答が出来ませんが、
さしあたり、三角関数などはいろいろと役に立ちます。
円周率が、ラジアンで180度を表すことや、
sin,cosの使い方などがあやふやでしたらその辺を勉強されたらいいと思います。
シューティングゲームではこの辺をバリバリ使います。
1秒間に何十万回とこの計算をしていると思います。
>ゲームプログラミングでは「余り」が重要であるとか
とお書きになっていますが、「余り」の計算の仕方はOKということでいいでしょうか?
7÷4は1あまり3ですね。つまり余りは1
9÷4は2あまり1ですね。つまり余りは2。
何故余りが重要なのかというと、よく増加するカウンタをループで使えるからです。
・・・といってもわかりにくいでしょうから、例を出します。
2Dのマップをテクテク歩いている画像をそうぞうして下さい。
止まってる画像→
右足を出している画像→
止まっている画像→
左足を出している画像→・・・
これを何度も繰り返してやれば歩いているように見えそうですね。
この画像番号を上から0,1,2,3としてやります。
0,1,2,3という番号を繰り返し
0→1→2→3→0→1→2→3→0→1→2→3→
とループさせる事が出来ればこの処理がうまくいきそうです。
ではどうしたらこのループが表現できるでしょうか。
今、これとは別に、無限に増加しているカウンタがあったとします。
0→1→2→3→4→5→ ... →1000→
のような感じです。
これを使ってループを表現出来ないかと考えると、このカウンタをxとすると、
x%4
つまり4で割った余りで計算出来そうです。
0を4で割ったあまりは 0
1を4で割ったあまりは 1
2を4で割ったあまりは 2
3を4で割ったあまりは 3
4を4で割ったあまりは 0
5を4で割ったあまりは 1
6を4で割ったあまりは 2
7を4で割ったあまりは 3
8を4で割ったあまりは 0
9を4で割ったあまりは 1
右側の実際に計算したあまりは0から3でループしていますね。
こうしてカウンタを用いて画像番号をループさせる事が出来ました。
このように、割った余りという考え方は非常に便利なんですね。
・・ちと説明が長くなりすぎました。
もう「そんなこととうに知ってる!」ということでしたらごめんなさい。
>不安というのは憑き物でして
確かに付いて・・いや憑いてまわりますねw
いや冗談です。
>数学的知識は、プログラミングを続けるに従い、身につくものなのでしょうか?
自然に身に付くものじゃないのでやはり勉強しないと身に付かないでしょうね。
「必要な時に勉強するスタイル」を続ける事で、
自然に数学がみについていくという考え方であればそのとおりではあると思いますが、
やはりいつかは勉強しないとそれは身に付かないと思います。
私はアルゴリズム系の本を買って一通り勉強はしてみたものの、
やはり「必要な時に勉強するスタイル」というのが私は好きです。
私も一通り、基本的な知識はみにつけなければ、とそれ系の本を端から
よんでみた時、そこに「ベジェ曲線」
http://ja.wikipedia.org/wiki/%E3%83%99%E3%82%B8%E3%82%A7%E6%9B%B2%E7%B7%9A
なるものが書いてありましたが、その当時は「なんのこっちゃ」って感じで
読んだだけでした。
こういうのは読んだだけではどうにも理解しにくいですよね。
しかしシューティングを作るようになってからこの計算方法がすごく素晴らしいことがわかり、この計算式を勉強しました。
興味持って、「習得しよう!」と思って勉強したので身に付きも速かったと思います。
逆に言えば興味も特に無い分野の計算式見ても、身に付きが遅いように思います。
きっと使える使えないが別として「知っている」ということは非常に大事でしょうから、
色んな本を読んでみる事は大事だと思います。
知っていたら、使えなくとも「あぁ、あれを使えばよさそうだな」と思えますしね。
ただ、一通りそれが済んだら色々と自分の興味のあるソフトを作りながら勉強していくのが良いと思いますよ。
・ ・・って長くなりすぎましたね。
肝心な本の紹介は何も出来ていませんがこのへんで^^;
1,617ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(10,603ポイント)
Date: 2008/09/18(木) 14:30
No:21470
|
|
Title: Re:C言語と数学
|
|
勉強をしたければ興味のある分野を自分が理解できるところからすれば良いでしょう。
プログラミングと同じく、数学の勉強もそれ自体が楽しいことです(個人差がありますが)。
何かの役に立つとは限りませんが、有意義な時間を過ごせるでしょう。
一方、人生は有限です。比較的近くに何らかの形の納期があるかもしれません。
数学というのも道具ですので、理解しないでもとりあえずは使うことができます。
C言語の標準関数についても、正しい使い方さえできれば初心者には十分で、
標準関数の実装を知るよりも先にすべきことがごまんとあります。
数学についても、計算方法と有効範囲だけどこかから仕入れてきてプログラムを作れます。
計算方法の正しさについては、とりあえず仕入れ元を信頼してしまいましょう。
有効範囲についての前提がちょっと変わるだけで、計算方法が役に立たなくなることも
よくありますが、自分で理解していない場合は応用が利きません。
理解しない場合、自分と同じ前提の計算方法を調べたり(見つからないかも)、
掲示板で聞いたり(度が過ぎると迷惑がられる)する必要があります。
自分の作るプログラムで良く使う分野から手を付けるのも良いのではないでしょうか。
興味があれば吸収も早いし、勉強の成果もすぐに発揮できます。
何も一冊単位で勉強する必要もないですよ。
数学全般に自信がなく、数学力の底上げ図りたいという動機の場合、
社会人に対してはあまりお勧めできる方法を知りません。
プログラマに直接役に立ちそうな数学というと、高校の数学程度だと思いますが、
高校のときにできなかった(or やらなかった)からこそ自信がないのに、
そのとき以上の熱意で勉強ができる人は少ないのではないかと。
今、どの程度の必要性を感じているかにもよりますけどね。
やはり興味や必要性のある分野から各個撃破し、慣れてきたら
それ以外の分野に手を出す、ですかね。
最後に、数学で大事なのは教科書を一応理解することよりも、
問題が解けることだと思います。教科書は大体分かりやすいように書いてあるので、
読んだら何となく分かったような気になります。でも、だからといって
教科書の問題を解けるとは限りません。難問でなくても良いので、
自分の力で問題を解いてみましょう。
プログラミングも同じで、入門書を読んだら何となく分かったような気になりますが、
それと、自分で考えてプログラムを作るというのは違います。
もしかして、プログラムを作れない言い訳を数学に求めていませんか?
数学を必要としないプログラムならば自由に作れますか?
もしも心当たりがあるようでしたら、たまに立ち止まって、
自分に何が必要かを考えるのも有意義ではないでしょうか。
706ポイント を手に入れた。
|
|
|
|
Name: ゴリアス ..ぴよぴよ(484ポイント)
Date: 2008/09/18(木) 08:25
No:21460
|
|
Title: 引数のあるコンストラクタの継承について
|
|
はじめまして。ゴリアスと申します。
引数のあるコンストラクタの継承について調べたのですが、
期待する事柄を見つけ出すことができず基本的なことで申し訳ないですが質問させて頂きます。
OSはXP、コンパイラはBorland C++ 5.5.1、エディタはBCCディベロッパーを使ってます。
ただいま、Objectという基本クラスを継承したHeroというクラスを作成しています。
ObjectクラスとHeroクラスには両方とも引数のあるコンストラクタがあります。
この二つのクラスのコンストラクタの引数は数も型も全く違っています。
下のような感じです。
class Object{
public:
Object(int A);
};
class Hero:public Object{
public:
Hero(char* B,double C);
};
この場合にHeroクラスのインスタンスを生成しようとしたとき、例えば
Hero Hero1("abc",0.001);
という感じで渡した引数は親クラスと子クラスでどのように扱われるのでしょうか。
最初に親クラスのコンストラクタが呼び出されると思うのですが
親クラスのコンストラクタとは引数の数が違っていて・・・どうなるのでしょう。
基本的なことで本当にごめんなさい。
484ポイント を手に入れた。
|
|
|
|
Name: Mist ..上級者(22,589ポイント)
Date: 2008/09/18(木) 10:13
No:21462
|
|
Title: Re:引数のあるコンストラクタの継承について
|
|
HeroのコンストラクタでObjectの初期化を行っていない場合、引数なしのコンストラクタがコールされます。
なので、提示されたものは引数なしのコンストラクタが定義されていないのでコンパイルエラーになります。
サンプルを書いてみましたので実行してみてください。
(BCCで確認していますが特殊なことはしていないのでVCでも問題ないと思います)
// ソース修正
#include <iostream>
using namespace std;
class Object {
public:
Object(void) {
printf("デフォルトコンストラクタ\n");
};
Object(int a) {
printf("引数付きコンストラクタ1 %d\n", a);
};
Object(char *pc, double dval) {
printf("引数付きコンストラクタ2 %s %f\n", pc, dval);
};
};
class Hoge1 : public Object
{
public:
Hoge1(char *pc, double dval) {};
};
class Hoge2 : public Object
{
public:
Hoge2(char *pc, double dval) : Object(100) {};
};
class Hoge3 : public Object
{
public:
Hoge3(char *pc, double dval) : Object(pc, dval) {};
};
int main(void) {
Hoge1 c1("abc", 0.1);
Hoge2 c2("abc", 0.1);
Hoge3 c3("abc", 0.1);
return 0;
}
363ポイント を手に入れた。
|
|
|
|
|
Name: ゴリアス ..ぴよぴよ(592ポイント)
Date: 2008/09/18(木) 11:20
No:21466
| 解決!
|
Title: Re:引数のあるコンストラクタの継承について
|
|
Mistさん、お教えくださりありがとうございます!
なるほど、通常のコンストラクタの後ろに「:」をつければいいのですね。
このことを知らなくてずっと考えたり調べたりしておりました。
親切にコードまで書いていただき、感謝の言葉もございません!
本当にありがとうございます。
108ポイント を手に入れた。
|
|
|
|
Name: (ビルド F7) ..ぴよぴよ(86ポイント)
Date: 2008/09/17(水) 15:25
No:21409
|
|
Title: 変な質問ですが
|
|
以前使っていたVisual StudioのVC++ 2005の「ソリューションのビルド」にF7 に設定されて、
F7キーを押せば、ソリューションのビルドを実行します。
同じ VC++ 2005新しいPCにインストールしたら、F7キーが効かなくなってしまいます。
どっかで設定できるのでしょうか。
いくら捜しても見つかりませんでした。
どうぞ宜しくお願いします
86ポイント を手に入れた。
|
|
|
|
Name: ibis ..中級者(13,549ポイント)
Date: 2008/09/17(水) 15:44
No:21410
|
|
Title: Re:変な質問ですが
|
|
ツール->オプション->環境->キーボード
2008ではこれで設定できるのですが。
2005は手元にないのでわからないです。
でも多分、同じような感じではないでしょうか?
69ポイント を手に入れた。
|
|
|
|
|
Name: (ビルド F7) ..ぴよぴよ(83ポイント)
Date: 2008/09/17(水) 16:28
No:21415
|
|
Title: Re:変な質問ですが
|
|
ご返答ありがとうございます
>ツール->オプション->環境->キーボード
>2008ではこれで設定できるのですが。
F7になっているのですが、VC++に表示されないし効かないです。
また宜しくお願い致します
83ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(22,027ポイント)
Date: 2008/09/17(水) 16:43
No:21418
|
|
Title: Re:変な質問ですが
|
|
メニューの「ビルド」→「ソリューションのビルド」の右側にショートカットキーが表示されていると思いますが、そこにはなんと表示されていますか?
44ポイント を手に入れた。
|
|
|
|
|
Name: (ビルド F7) ..ぴよぴよ(56ポイント)
Date: 2008/09/17(水) 17:56
No:21422
|
|
Title: Re:変な質問ですが
|
|
ご支援ほんとうにありがとうございます
> F7以外に設定して、それで動作したら、
設定しても無視されているみたいですね。
> メニューの「ビルド」→「ソリューションのビルド」の右側にショートカットキーが表示されていると思いますが、そこにはなんと表示されていますか?
下線付きのU E Nが表示されています
何を意味するかはさっぱり分かりません
宜しくお願い致します
56ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(22,226ポイント)
Date: 2008/09/17(水) 18:17
No:21423
|
|
Title: Re:変な質問ですが
|
|
ビルドメニューを開いた状態でのスクリーンショットを撮って見せてもらえないでしょうか?
添付画像は私の環境でのものです。(VC++2008EEですけど)
「ソリューションのビルド」の横に「F7」と書いていますので、F7がショートカットであることを表しています。
> 下線付きのU E Nが表示されています
下線付き(U)とかはメニュー内のキーショートカットです。
メニューを開いている状態でSHIFTキーを押しながら対象文字キーを押すとその項目を実行できます。
「ソリューションのビルド(B)」は、ビルドメニューを開いた状態でSHIFT+Bで実行できます。
199ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(51,076ポイント)
Date: 2008/09/18(木) 03:56
No:21455
|
|
Title: Re:変な質問ですが
|
|
ツール->オプション->環境->キーボードにて
「次の追加キーボードマップスキームを適用」の項目が
「Visual C++ 6」になっていますか?
74ポイント を手に入れた。
|
|
|
|
|
Name: (ビルド F7) ..ぴよぴよ(277ポイント)
Date: 2008/09/18(木) 11:19
No:21465
| 解決!
|
Title: Re:変な質問ですが
|
|
皆さん大変助かりました!
Mist様
写真までご作成下さって感動致しました。
以前から下線付きの文字に不思議に思いました。
いろんなキーの組み合わせでやってみましたが、
全部失敗しました。
"メニューを開いた状態"でなければならないですね (=_:;
GPGA 様
>「Visual C++ 6」になっていますか?
Visual Studio 6 でした。
今度は「Visual C++ 6」にして、細い窓に超長いリストから、「ビルド.XXXXX」を捜し出して
「ショートカット」にF7 キーを押したら、うまくいきました。
最初は文字'F'のキーと文字'7'のキーで入力したけれども.....
皆さんに心からお礼を申し上げます。
191ポイント を手に入れた。
|
|
|
|
Name: パワ3 ..ぴよぴよ(10ポイント)
Date: 2008/09/12(金) 23:45
No:21235
|
|
Title: ゲームのサンプル
|
|
このサイトのどこかにゲームを作るサンプルがあったと思うのですが。あれをダウンロードして使うとVC++が立ち上がってしまいました。自分はBCCで作りたいのですが、どうしたらいいのですか?
教えてください。
10ポイント を手に入れた。
|
|
|
|
Name: J ..中級者(9,283ポイント)
Date: 2008/09/13(土) 10:54
No:21239
|
|
Title: Re:ゲームのサンプル
|
|
まずはBCCを起動してください。
メニューのファイルから開くでそのゲームのソースファイルを選択するか、
BCCにソースファイルをD&Dしてみてください。
また、このような場面が度々あるようなら、関連付けを変更なさってもいいような気がします。
75ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..ぴよぴよ(85ポイント)
Date: 2008/09/13(土) 23:26
No:21251
|
|
Title: Re:ゲームのサンプル
|
|
私もBCCで作っています。
私の場合、コピーではなく理解しながら手打ちしていったのでプロジェクトには触れませんでした(笑)
BCCということはやはりBCC Developerでしょうか?
コンパイルは通るので、プロジェクトファイルは自分で作成して見てはいかがでしょうか?
85ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..ぴよぴよ(503ポイント)
Date: 2008/09/14(日) 12:23
No:21257
|
|
Title: Re:ゲームのサンプル
|
|
ただ、せっかくVC++を持っているなら使ってみてもいいと思うんですけどねぇ。
私はお金かけたくないから無料で揃えていますが……
使いこなせればの話ですが、やはりIDEが全然違うので開発効率はVC++の方が数段上です。
また、ゆくゆくはDirectXをやるのでしたら、VC++なら導入が楽です。
BCCはCOFF(だったか?)形式のライブラリをリンクできないので(でもDirectX8までは使えたような)
と、長々と書きましたが、要はVC++がうらやましいのです(笑
203ポイント を手に入れた。
|
|
|
|
|
Name: パワ3 ..ぴよぴよ(147ポイント)
Date: 2008/09/17(水) 22:43
No:21438
|
|
Title: Re:ゲームのサンプル
|
|
BCCでないと出来ないんですよ。
一応PCには入ってるのですが事情がありまして(USB等に入れて持ち運べないなど
できましたら要約していただきたいのですが・・・
皆さんの回答を整理できるほど詳しくないので・・・
すいません
できたら管理人さんのみ回答願えますか?
137ポイント を手に入れた。
|
|
|
|
|
Name: パワ3 ..ぴよぴよ(212ポイント)
Date: 2008/09/18(木) 02:28
No:21449
|
|
Title: Re:ゲームのサンプル
|
|
失礼かもしれませんが分からないものを参考には出来ません・・・・
管理人さんが一番詳しいと思うのですが?
Rindyさん>
のってませんよ
ここのサイトの話ですから
65ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(794,669ポイント)
Date: 2008/09/18(木) 03:30
No:21452
|
|
Title: Re:ゲームのサンプル
|
|
私が一番詳しいなんてことは無いです。
ここにきてくださっている回答者の方々の中には先輩方も沢山いらっしゃいます。
逆に私はBCCはかなり昔に少し使った事がある位で詳しくありません。
コンパイラとしては同じような機能がそなわっているでしょうから、
同じようなものだとは思いますが。
また、わからない記述に対しては
自分で調べるか、補足をお願いするか、
または自分のほしい情報と違うと思ったら黙って読み飛ばすなどの方法があると思います。
さて、本題ですが、
Rindyさんの仰るとおり、DXライブラリのホームページにはBCCについての設定方法に関して
詳しく記載されています。
また、DXライブラリの本体をダウンロードした時にサンプルのプロジェクトも付いてくると思います。
それを見ながらやるか、サンプルのプロジェクトを使えばいいと思います。
それから、USBに入れて持ち歩けないということですが、
VC++のデータはUSBに入れて持ち歩けますよ。
コンパイラごと、ということなら、BCCであっても環境変数の設定やインストールは必要になるでしょうし、
BCCではないといけない理由がいまいちわからないです。
496ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(17,612ポイント)
Date: 2008/09/18(木) 09:17
No:21461
|
|
Title: Re:ゲームのサンプル
|
|
回答者を指定するのはマナー違反ですよ
指定された方に答える義務があるようにも取れますし
もちろん管理人さんに答える義務はないわけですが
個人的に連絡したいのならメールしましょう
でご指定を無視して回答します
BCCしかない環境でも使えるようにしたいということですよね
BCCの開発環境にもいろいろありますがパワ3さんはどうしていますか
1.BCCDeveloperを使っている
2.CPad for BCCを使っている
3.コマンドプロンプトから実行している
4.その他
123ポイント を手に入れた。
|
|
|
|
Name: 藍 ..入門者(4,190ポイント)
Date: 2008/09/17(水) 15:13
No:21408
|
|
Title: 龍神録プログラミングの館26章
|
|
龍神録プログラミングの館26章で抜けているところがありましたので、報告しておきます。
boss_shot.cppの中のvoid boss_shot_main()で
void boss_shot_main(){
if(stage_count==boss.appear_count[boss.knd] && boss.flag==0)//開始時間なら
enter_boss(boss.knd);//開始
if(boss.flag==0)//ボスが登録されて無ければ戻る
return;
calc_boss();←抜けてる部分
if(boss.phy.flag==1)//物理演算移動オンなら
以下省略
calc_boss();を追加する部分が抜けています。
あと、boss_shotH.cppの
extern int move_boss_pos(double x1,double y1,double x2,double y2,double dist, int t);
を追加するのも書かれていないので報告しておきます。
201ポイント を手に入れた。
|
|
|
|
Name: 藍 ..入門者(4,276ポイント)
Date: 2008/09/17(水) 17:04
No:21420
|
|
Title: Re:龍神録プログラミングの館26章
|
|
たぶん皆さん気づくと思いますが26章でもう少しあったので追記
struct.h内のボス情報boss_tの構造体で
double x,y,dx,dy,ang,spd;
dxとdyも26章から追加された部分ですね一応報告しておきます。
86ポイント を手に入れた。
|
|
|
|
Name: 秋鮭 ..ぴよぴよ(51ポイント)
Date: 2008/09/16(火) 03:39
No:21327
|
|
Title: コンボボックスの配置方法について
|
|
初めまして。
最近C言語を使い始めた者です。
win32apiを使って複数のテキストファイルを変換(例えば改行を削除する)するアプリケーションを作成したいと思っています。
シンプルに作ろうと思い、選択ボックス(コンボボックス)をダイアログボックスでなく、オーナーウィンドウに直接配置したいのですが、方法が分かりません。
リソースを作って読み込むのかと思うのですが・・・手元の本ではダイアログボックスの説明しかなく困っています。
ヒントや参考ページなどでも結構ですので、よろしくお願い致します。
<<作成環境>>
winxp sp2
visual c++ 2008 express edition
ResEdit.exe ver1.4.3.0
猫でもわかるWindowsプログラミング第3版を読みながら作業しています。
51ポイント を手に入れた。
|
|
|
|
Name: 秋鮭 ..ぴよぴよ(72ポイント)
Date: 2008/09/17(水) 13:33
No:21404
|
|
Title: Re:コンボボックスの配置方法について
|
|
ありがとうございます。
よく読んで試してみたいと思います。
21ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,022ポイント)
Date: 2008/09/17(水) 20:32
No:21426
|
|
Title: Re:コンボボックスの配置方法について
|
|
ダイアログ型アプリケーションにするのもありと思いますが・・・(WinMainではDialogBoxを呼ぶだけで済みますし)
26ポイント を手に入れた。
|
|
|
|
Name: Haru ..中級者(13,891ポイント)
Date: 2008/09/16(火) 14:28
No:21342
|
|
Title: 雑談です。
|
|
あれ?
雑談、質問のマークがなくなってますね?(^^;
雑談ですが、皆さんにお聞きしたいです。
ソース内で使う{}ですが、
やはり皆さん、
if(){
}
のように書きますか?
私はどうしても、
if()
{
}
のように書いたほうが自分的に見やすくて、良いんですが・・・。
皆さんのソースを見るとやはり前者のほうが圧倒的に多いですよね。
やはり前者のほうが見やすいのでしょうか?
もしそうなのであれば、今のうちに直してしまうかと思っているんですが。
187ポイント を手に入れた。
|
|
|
|
Name: yuuki++ ..入門者(2,924ポイント)
Date: 2008/09/16(火) 14:42
No:21347
|
|
Title: Re:雑談です。
|
|
私は「両方」という最悪のパターンです笑
関数定義では後者ですが、ifなどの制御文、structやclassとかの定義には前者を使ってます。
ソースコードに一貫性がないのはよくないとは思いますが、癖が付いてしまいました・・・
100ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(110,885ポイント)
Date: 2008/09/16(火) 14:53
No:21350
|
|
Title: Re:雑談です。
|
|
基本的には後者かなぁ…
ただし、MS-DOSみたいな古い環境だとテキストエディタの幅が狭いので、行数を減らす為に仕方なく前者を使用する事はあります。
111ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(222,540ポイント)
Date: 2008/09/16(火) 15:01
No:21351
|
|
Title: Re:雑談です。
|
|
後者ですね。
最初は前者だったのですが、括弧がらみのミスが後者だと防ぎやすい・気づきやすいので
途中から後者にしました。
行数が増えるのは最初は気になりましたが、ちょうどその頃からコードが簡潔に
書けるようになり始めた頃だったので直ぐに気にならなくなりました。
75ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(21,679ポイント)
Date: 2008/09/16(火) 15:02
No:21352
|
|
Title: Re:雑談です。
|
|
私は前者ですね。
仕事の場合、他社が作ったソースを改造する場合はそれに合わせるため後者を使用することもありますけど。
質問なんですが後者で書く人はelse文は下のように書くんでしょうか?
if ()
{
}
else
{
}
61ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(14,459ポイント)
Date: 2008/09/16(火) 15:10
No:21353
|
|
Title: Re:雑談です。
|
|
返信ありがとうございます!!
>御津凪さん
>私は前者ですね。
>コード行を減らす意味でもありますが。
>ただし、if の中の式がどうしても長くなってしまった場合は、後者を使いますね。
>後で付け足した時に間違えないように。
使い分けてる訳ですね!
私みたいな未熟者には、長くならなくても、間違えてしまうので、
やはり前者の方が良いですかね(汗
>yuuki++さん
> 私は「両方」という最悪のパターンです笑
私には、最悪なのかどうかの判断は出来ませんが、
yuuki++さんの中での決まり事はやはりあるみたいですね(^^;
>バグさん
>基本的には後者かなぁ…
>ただし、MS-DOSみたいな古い環境だとテキストエディタの幅が狭いので、
>行数を減らす為に仕方なく前者を使用する事はあります。
なるほど。。
私が思っていたよりも後者のタイプは多いんですかね?
それよりなりより、バグさんの「仕方なく」に自信をもらいました!
ちょうど3人の方から3様の回答を頂いてありがとうございます!
後者の書き方のせいで、他の方が自分のソースコードを読む時に
読みづらい、、と、言ったような事はなさそうなので、安心しました。
私の中ではこの疑問は解決しましたが、もしよろしければ、
どちらの書き方が多いのか参考までにお聞きしてみたいので、
よろしければ回答をお願いします!
568ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(14,575ポイント)
Date: 2008/09/16(火) 15:15
No:21354
|
|
Title: Re:雑談です。
|
|
>Justyさん
ありがとうございます!!
私も同じ理由で前者にしました。
・・・とは、いってもJustyさんのように簡潔なコードを書けるようになるのは
まだまだ先の話だと思いますが。。。(汗
>Mistさん
ありがとうございます!!
私はそのように書いてますね(^^;
116ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(59,078ポイント)
Date: 2008/09/16(火) 15:39
No:21357
|
|
Title: Re:雑談です。
|
|
私も後者です。
if文に関しては、
if (...)
{
}
else
{
}
です。
C++使いなので、1行がどうしても長くなりがちです。
例えば、
for (std::vector<std::string>::const_iterator first(v.begin()), last(v.end()); first != last; ++first)
{
}
とか。
std::for_eachなどが使えればよいのですが、ループを書かざるを得ないことも少なからずありますので。
それを除いても、経験上、後者の方が圧倒的にミスを少なくできます。
また、関数の長さを40行以内にしようといった場合でも、前者より後者の方が要求が厳しくなります。
簡潔なコードを書く力を磨く上でも、後者を採用しています。
ただし、他の人のコードにまでどうこういうつもりはありません。
この辺りは、『C++ Coding Standards』の「0. 些細なことにこだわるな(何を標準化しないかを知ろう)」で詳しく解説されています。
202ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(14,683ポイント)
Date: 2008/09/16(火) 16:03
No:21362
|
|
Title: Re:雑談です。
|
|
>たかぎさん
>ただし、他の人のコードにまでどうこういうつもりはありません。
>この辺りは、『C++ Coding Standards』の「0. 些細なことにこだわるな(何を標準化しないかを知ろう)」で>詳しく解説されています。
Amazonでそのページだけ閲覧してみました。
個人的な趣味や時代遅れの作法を強制してはいけない。
ということは、そんな神経質に気にするほどの事では無いと言うことですね!
勉強になります!
108ポイント を手に入れた。
|
|
|
|
|
Name: ま〜く ..初心者(7,398ポイント)
Date: 2008/09/16(火) 17:43
No:21365
|
|
Title: Re:雑談です。
|
|
ぼくも後者です^^
でも正確には'{'や'}'もインデントするので、GNUスタイルというヤツになるかな?
管理人さんにこーいうアンケート作ってもらうのも面白いかもしれませんね。
70ポイント を手に入れた。
|
|
|
|
|
Name: めいらる ..ぴよぴよ(966ポイント)
Date: 2008/09/16(火) 18:19
No:21366
|
|
Title: Re:雑談です。
|
|
私は前者ですね(・∀・)
{が先頭にあると何か落ち着かないのでww
if(???){
…;
…;
}
こんな感じになってますw
61ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..比類無きプログラマー(60,683ポイント)
Date: 2008/09/16(火) 19:24
No:21369
|
|
Title: Re:雑談です。
|
|
私は両方使います。
もう少し言うと、
関数、クラスの定義の時は後者、if(),for()などの時は前者を使います。
理由は、最初に買った入門書がそうなってたからだけです。
javaとか別の言語だったら後者ですね。
Haruさんへ
>個人的な趣味や時代遅れの作法を強制してはいけない。
>ということは、そんな神経質に気にするほどの事では無いと言うことですね!
いえそこはコーディング規約を作って神経質に気にしてください。
一つのプログラムを作る時には統一させてください。
気にしなくていいのは、自分が今までやってきたのと違うからという理由で周りとは別路線でいくことです。
246ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(9,634ポイント)
Date: 2008/09/16(火) 20:41
No:21375
|
|
Title: Re:雑談です。
|
|
私は
if()
{
//処理
}
派です。
こっちの方が皆さんの言ってるとおり条件式が長くなると、書き忘れのミスが分かりにくくなりますからね。
また、elseは
if()
{
//処理
}else{
//処理
}
と書いたりもします。特に理由はありませんが。
>ま〜くさん
>管理人さんにこーいうアンケート作ってもらうのも面白いかもしれませんね。
そうですね。こういうアンケートはあっても良いのではないのでしょか?
ま〜くさんに一票です。
217ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(59,155ポイント)
Date: 2008/09/16(火) 21:11
No:21377
|
|
Title: Re:雑談です。
|
|
組木紙織さん
> >個人的な趣味や時代遅れの作法を強制してはいけない。
> >ということは、そんな神経質に気にするほどの事では無いと言うことですね!
> いえそこはコーディング規約を作って神経質に気にしてください。
> 一つのプログラムを作る時には統一させてください。
ここは神経質になる必要はありません。
同じファイルの中では統一すべきですが、それ以上は無用でしょう。
必要ならindentなどのツールを使えば機械的に揃えられます。
厳密なルールを決める必要はなく、既存のコードにスタイルを合わせれば済む話です。
人間の注意力は有限ですので、本質ではない部分に力を割くべきではないのです。
21ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..比類無きプログラマー(60,835ポイント)
Date: 2008/09/16(火) 21:59
No:21382
|
|
Title: Re:雑談です。
|
|
神経質という言葉が悪かったのか、コーディング規約という言葉が悪かったのか、
私の想定より、強い意味にとられてしまったようなので少し追加で書きます。
複数人でコーディングをすることを前提に考えていたので、コーディング規約という言葉を使いましたが、
私が一番言いたいことは"統一性"です。
複数人でそれぞれ別々にしたり、その日の気分でインデントのルールを変えないように、
統一の仕方はどうれあれ、全体で統一してください。
というつもりで書きました。
152ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(58,984ポイント)
Date: 2008/09/16(火) 22:15
No:21383
|
|
Title: Re:雑談です。
|
|
> 複数人でそれぞれ別々にしたり、その日の気分でインデントのルールを変えないように、
> 統一の仕方はどうれあれ、全体で統一してください。
> というつもりで書きました。
その日の気分で変えるのは最悪として...
多人数で開発する場合でも、構成上近いソースファイルは同じ人が書くのが普通ですし、後から担当者が変わった場合でも以前のものに合わせれば済む話ですね。
担当者の境界はソースファイル構成上の境界に等しいことが多いでしょうから、構成上の境界を越えたときに少々(見た目の)スタイルが変わっても大した問題ではないはずです。
統一すべきなのは、括弧の位置やインデント幅のように、後から機械的に揃えられるようなことではなく、同じ概念を表すのに同じ用語を用いるとか、エラー処理の方針とか、そういったことです。
特に用語については、日本語の仕様書上の用語を、各担当者が勝手ばらばらに英訳して識別子を命名するようなことは避けなければなりません。
238ポイント を落としてしまった。
|
|
|
|
|
Name: Haru ..上級者(15,042ポイント)
Date: 2008/09/17(水) 13:16
No:21403
|
|
Title: Re:雑談です。
|
|
>ま〜くさん
>管理人さんにこーいうアンケート作ってもらうのも面白いかもしれませんね。
面白そうですね!私も一票です!
>組木紙織さん
>いえそこはコーディング規約を作って神経質に気にしてください。
>一つのプログラムを作る時には統一させてください。
>気にしなくていいのは、自分が今までやってきたのと違うからという理由で周りとは別路>線でいくことです。
>統一の仕方はどうれあれ、全体で統一してください。
>というつもりで書きました。
あ、説明がたりませんでしたね(^^;
今回の質問のような事は、あまり神経質にならなくても・・・。
という意味での発言でした。
とはいっても、まだまだ駆け出しの私なので、どんなに気をつけたつもりでも
ミスはあると思いますが。。。
自分の中では全体で統一しているつもりです!
というか、統一しないと混乱してしまうので(汗
>たかぎさん
>人間の注意力は有限ですので、本質ではない部分に力を割くべきではないのです。
無限の注意力があれば、どんなに素晴らしいでしょうね(^^;
359ポイント を手に入れた。
|
|
|
|
Name: わたねる ..ぴよぴよ(262ポイント)
Date: 2008/09/16(火) 12:14
No:21333
|
|
Title: 自己参照構造体(リスト構造)を使用した住所録の作成
|
|
はじめまして、ここを利用させていただくのは初めてとなります。
自身の持っている知識なのですが、基礎的なC言語の入門書は読み漁り、簡単なポインタ、構造体までは理解しているつもりです。
当方、C言語を覚え始めて1ヶ月の未熟者です。色々と至らない面があると思いますが、お手柔らかにお願い致します。
さて早速ですが質問に移りたいと思います。
現在、ポインタ、構造体の理解のために「住所録」の作成をしています。
仕様としましては、
「名前」「住所」「電話番号」を標準入力で入力させ、データの追加、参照、削除、検索を行えるようにする。
データの保存は配列ではなく自己参照構造体を使い、リスト構造として実現する。
fwrite、wreadを使用してファイルへの読み書きを行う。
データの追加、参照、削除、検索はそれぞれ別の関数で行えるようにする。
グローバルな構造体、変数は使わない。
以上を踏まえて製作しているのですが、手詰まりを起こしてしまいました。
まず、使用している構造体は
struct List:{char name[10] , char address[50] , char phone[15] , List *next_pointa}
これを踏まえて、*prev、*next、start_dmyの3つの構造体を作ります。
まず、データを入れないただのダミー構造体(start_dmy)を作ります。
このstart_dmyのnext_pointaが指しているアドレスから、リスト構造の読み込みを行います。
リスト構造の最後にはNULLを格納します。
[1000](start_dmy。データは空) ⇒ [1001](start_dmy.next_pointaの指すアドレス。ここからデータが入る) ⇒ [1002] ⇒ [1003] ⇒ [NULL]
イメージとしては、上のようなリスト構造を考えています。
for(prev = start_dmy.next_pointa ; prev != NULL ; prev = prev->next_pointa); ←つまり、データ読み込みにはこのような命令を行う。
まず、以上を踏まえて(簡素化した)メイン関数とデータの追加の関数を書いてみると
main(){
struct List *prev;
struct List start_dmy;
prev = &start_dmy;
prev->next_pointa = NULL;
for(;;){
prev = add(prev);
}
}
struct List *add(struct List prev){
struct List *next;
next = ( struct List * )malloc( sizeof ( struct List )); //データ領域の確保
printf("\nデータの追加を行います。以下に従って入力してください。\n登録する人の名前?:");//とりあえず名前だけ
scanf( "%s" , &next->name );
prev->next_pointa = next;
next->next_pointa = NULL;
prev = next;
return prev;
}
このような形でリスト構造を実現しようとしているのですが、初めにprevとstart_dmyを対応付けているので、
add関数内で、prev->next_pointaをnextで確保した領域のアドレスとしても、それはstart_dmyにも同期してしまいます。
つまり先ほどの例だと
[1000](start_dmy。データは空) ⇒ [1001] ⇒ [1002] ⇒ [1003](start_dmy.next_pointaの指すアドレス、prev->next_pointaの指すアドレス) ⇒ [NULL]
となってしまいます。(start_dmy.next_pointaはあくまで1001番地を指していたい。)
更に削除の際に、先頭のデータを削除・・・つまりstart_dmy.next_pointaを書き換えないといけない場合でも、
returnで指定するのが、prevとstart_dmyの2つの構造体を戻さないといけないため、上手く実装できません。
長くなりましたが、コレに対する対応策、
もしくはこのような方法を取らなくても(なるべくダミー構造体は使いたくない)良い案がありましたら是非ご教授お願いいたします。
262ポイント を手に入れた。
|
|
|
|
Name: yuuki++ ..かけだし(2,140ポイント)
Date: 2008/09/16(火) 12:54
No:21334
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
双方向リスト構造でいいんですよね?
一応、定石というかなんというか、「Headポインタ」「Tailポインタ」なんかを置くのが簡単ですね。
具体的には、構造体リストの先頭のアドレスを「Head」に、最後尾のアドレスを「Tail」に。
最初は両方ともNULLで初期化しておきます。
図を描くと分かりやすいですが、最後尾に追加するときには
・メモリ確保
・確保した構造体のprev、nextを更新(prev = pTail; next = NULL; とか)
削除するときには
・「prev」「next」があれば、それぞれつなぎかえる
というのが大体の手順なんですけど、この概念は掴めていますか?
176ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(13,309ポイント)
Date: 2008/09/16(火) 12:57
No:21335
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
少し分かりにくいところがありますが、こういうことでしょうか。
まず始めに、提示していただいたコードではエラーが発生します。
add 関数にポインタを渡していませんが、関数内部ではデータをポインタとして記述しています。
あと、main 関数に戻り値がありません。
あと、ちゃんとした住所録を作る場合、
struct List {
char name[10];
char address[50];
char phone[15];
struct List *next_pointa;
struct List *prev_pointa;
};
の、ように、前へのポインタも用意したほうが良いでしょう。
さて、本題ですが、
まず、ダミーはあったほうが処理がしやすいです。
リスト構造の最後の指す次のポインタをダミーとすることで、
リスト全体に何か施したりする時に、
struct List* list = start_dmy.next_pointa;
for(;list != &start_dmy;list = list->next_pointa){
// 何らかの処理
}
上記のようにするだけで全てのリストに対して処理が出来ます。
次に問題としている部分ですが、
add 関数で渡している引数がポインタだとしたら、正しく動作していると思うのですが。
一応この手の書き方は、結構こんがらがりやすいので、
上記の(前後を指すデータ構造)方法での追加、削除などを下記に提示しておきます。
// リストの初期化。list:初期化するデータ
void initList(struct List* list){
// 自身を指す。
list->prev_pointa = list;
list->next_pointa = list;
}
// リストに追加。top:リストの先頭(基本ダミー) addlist:追加するデータ
void addList(struct List* top,struct List* addlist){
addlist->prev_pointa = top->prev_pointa;
addlist->next_pointa = top;
top->prev_pointa->next_pointa = addlist;
top->prev_pointa-> = addlist;
}
// リストから除く。remlist:除くデータ
void remList(struct List* remlist){
if(addlist->next_pointa == addlist){
return;// 既にリストから外れている or リストが空
}
remlist->prev_pointa = remlist->next_pointa;
remlist->next_pointa = remlist->prev_pointa;
// 自身を指す。
remlist->prev_pointa = list;
remlist->next_pointa = list;
}
長くなりましたが、これを理解できれば解決できると思います。
(yuuki++さんと被りましたね)
683ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..ぴよぴよ(334ポイント)
Date: 2008/09/16(火) 13:25
No:21336
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
なるほど、双方向リストで実現するんですね。
単方向リストでしか実現することを考えていなかったので、以上のアドバイスを踏まえて一度製作してみます。
また行き詰ったところがあれば、質問させていただきますね。yuuki++さん、御津凪さん、分かりやすいご教授ありがとうございました。
・・・さて、御津凪さんのコードを理解しようと勤めているのですが、早速躓いてしまいました。
削除する関数のこの部分なのですが
remlist->prev_pointa = remlist->next_pointa;
remlist->next_pointa = remlist->prev_pointa;
// 自身を指す。
remlist->prev_pointa = list;
remlist->next_pointa = list;
仮に、
[1000]⇒[1001]⇒[1002](top) となっている構造体があるとします。(数字はアドレス番地)
ここから1001を削除する(remlistは1001に設定)と、
まず、remlist->prev_pointaは1000、remlist->next_pointaは1002を指していますよね。
1行目
remlist->prev_pointa = remlist->next_pointa;
により、
remlist->prev_pointaは1002、remlist->next_pointaは1002に変わりますよね。
そして2行目
remlist->next_pointa = remlist->prev_pointa;
により、remlist->prev_pointaは1002、remlist->next_pointaは1002と変わらない数字になります。
そして、3、4行目
remlist->prev_pointa = list;
remlist->next_pointa = list;
結局、先ほど変更したremlistのprev_pointaもnext_pointaもlistを指すようになったので、上記のように付け替えたのが無意味になってしまってならなく感じます。
そして、list構造体も、addlist構造体も、引数として削除関数に書かれていませんが、これはグローバルで宣言したものなのでしょうか。
お忙しいところ恐縮ですが、もう一度ご教授お願いいたします。
72ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..かけだし(2,380ポイント)
Date: 2008/09/16(火) 13:46
No:21337
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
単方向と双方向について補足です。
単方向の場合、前か次かどちらか1つの情報を持つことになります。
すると、データを削除する際に、前後の構造体をつなぐことができなくなってしまいます。
…□⇒□⇒□⇒…
真ん中を削除したら、1つ前が自分の次を指すようにしなければならないのですが、「1つ前」にアクセスするのが難しいですね(構造体のサイズを使ったアドレス演算が必要)。
逆方向だとしても同様です。
ただし削除ができなくなるわけではなくて、先頭の構造体を削除することのみ可能です(図で確認すると分かるかな)。
とすると、
・データの削除は先頭に対してのみ(スタックに近い)→単方向
・どのデータを削除するかはランダム→双方向
という使い分けができそうですね。
ちなみにシューティングの敵とかをリストで管理するとすれば、以上の理由から双方向になります(ランダムに消えていくので)。
240ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..ぴよぴよ(927ポイント)
Date: 2008/09/16(火) 14:14
No:21341
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
・・・さて、御津凪さんのコードを理解しようと勤めているのですが、早速躓いてしまいました。
削除する関数のこの部分なのですが
remlist->prev_pointa = remlist->next_pointa;
remlist->next_pointa = remlist->prev_pointa;
// 自身を指す。
remlist->prev_pointa = list;
remlist->next_pointa = list;
仮に、
[1000]⇒[1001]⇒[1002](top) となっている構造体があるとします。(数字はアドレス番地)
ここから1001を削除する(remlistは1001に設定)と、
まず、remlist->prev_pointaは1000、remlist->next_pointaは1002を指していますよね。
1行目
remlist->prev_pointa = remlist->next_pointa;
により、
remlist->prev_pointaは1002、remlist->next_pointaは1002に変わりますよね。
そして2行目
remlist->next_pointa = remlist->prev_pointa;
により、remlist->prev_pointaは1002、remlist->next_pointaは1002と変わらない数字になります。
そして、3、4行目
remlist->prev_pointa = list;
remlist->next_pointa = list;
結局、先ほど変更したremlistのprev_pointaもnext_pointaもlistを指すようになったので、上記のように付け替えたのが無意味になってしまってならなく感じます。
そして、list構造体も、addlist構造体も、引数として削除関数に書かれていませんが、これはグローバルで宣言したものなのでしょうか。
お忙しいところ恐縮ですが、もう一度ご教授お願いいたします。
593ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(2,824ポイント)
Date: 2008/09/16(火) 14:34
No:21344
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
ちょっと作ってみました。
//適当な構造体
typedef struct LIST {
struct LIST *pPrev, *pNext; //前と次の自己参照
int i;
} LIST, *PLIST;
//リストの最後尾に追加(リストのポインタのポインタを渡します)
PLIST Add(PLIST *pList)
{
int i = 0;
PLIST p = (PLIST)malloc(sizeof(LIST)); //確保
PLIST pcur = *pList; //カレントポジション
if (pcur) { //先頭が存在したら
i = 1;
while(pcur->pNext) { //最後尾まで移動(ループ)して(最後尾を保存しておいてもいいです)
pcur = pcur->pNext;
i++;
}
pcur->pNext = p; //新しい奴を追加
} else { //先頭がなかったら
*pList = p; //新しい奴を先頭に
}
//新しいデータを設定する
p->pPrev = pcur;
p->pNext = NULL;
p->i = i; //メンバiにはデータの個数を0から連番で入れるようしています
return p;
}
//リストから一個消す(ここも引数が・・・汗)
void Del(PLIST *pList, PLIST p)
{
//「自分(p)の次」があったら、「次の1つ前」を「自分の1つ前」に
if (p->pNext) p->pNext->pPrev = p->pPrev;
//「自分の前」があったら、「前の1つ次」を「自分の次」に
if (p->pPrev) p->pPrev->pNext = p->pNext;
else *pList = p->pNext; //なかったら自分の次を先頭にします
free(p); //自分を消す
}
で、main内で
PLIST pList = NULL;
として取り合えずポインタだけ宣言しておいて、Add()でガンガン追加します。
Del()で消せます。引数にはAddの返値が使えますね。
この方法だと、構造体そのものをダミーとかで用意する必要がなくなります。
ちょっといろいろ適当に作ったので自信ないですが、試してみてください。ってか分からなかったらまた聞いてください><
444ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(13,416ポイント)
Date: 2008/09/16(火) 14:35
No:21345
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
すいません。remList 関数は間違いがありました。
void remList(struct List* remlist){
if(addlist->next_pointa == addlist){
return;// 既にリストから外れている or リストが空
}
remlist->prev_pointa->next_pointa = remlist->next_pointa;
remlist->next_pointa->prev_pointa = remlist->prev_pointa;
// 自身を指す。
remlist->prev_pointa = list;
remlist->next_pointa = list;
}
こうでした。
赤色の部分は、remlistの前後のデータを抜いた後も属していたリストが正しく動作するようにするもので、
その下の部分は、どのリストにも属していないことを表します。
つまり、どちらか一つでも自分自身を指していれば、リストに追加していないということが分かります。
> list構造体も、addlist構造体も、引数として削除関数に書かれていませんが、これはグローバルで宣言したものなのでしょうか。
list 構造体ではなく、これは list という名前の変数です。
同じく addlist も変数です。
上記に書かれていた引数は全て List 構造体のポインタですよ。
struct List* が型の名前、その後に続く単語が変数名です。
お間違えの無いように。
あと、initList 関数と addList 関数は理解できたでしょうか?
273ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(13,695ポイント)
Date: 2008/09/16(火) 14:45
No:21348
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> yuuki++ さん
ダミーはあっても無くてもこのリスト構造は作れます。
しかし、ゲームなどで使用するタイプのリストだと、
ダミーを用意したほうが早くなります。
ダミーがないと、リストが空なのかを確認する処理や、追加時や削除時に空かを確認する処理が入るため、
どうしても処理が増えてしまいます。
もちろん、一つのデータが大きい場合はダミーを用意しないほうがメモリの節約にはなります。
処理時間を優先しなければ(住所録のように)ダミーが無いほうが良いと思います。
191ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..かけだし(2,445ポイント)
Date: 2008/09/16(火) 15:18
No:21355
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
実際にどれほどの遅延が発生しましたか?
おそらくループ移動とかでしょうが、あれはTailを保存すれば解消できますね。
>ダミーがないと、リストが空なのかを確認する処理や、追加時や削除時に空かを確認する処理が入るため、
>どうしても処理が増えてしまいます。
まさかこういう形で突っ込まれるとは思いませんでしたが笑
確かに、ポインタがNULLであるかのステップが入りますね。
では、
>void initList(struct List* list){
> // 自身を指す。
> list->prev_pointa = list;
> list->next_pointa = list;
>}
この直後にこの構造体にアクセスしてしまったらどうしますか?新たにカウンタ変数を持ちますか?
リストがダミーのみのときにアクセスしてしまったらどうしますか?
おそらく、実際に遅延を計測したのでしょうが、最近のマシンでは気になるほどではないと思います。
この速度差が気になる状況下ですと、リスト構造そのものが使えなくなりますね。
特に頻繁にデータを作る必要がある場合、動的なメモリ確保はむしろボトルネックになります。
特にポインタ関連のコーディングに関しては保守点検がしやすいことを重視すべきです。
479ポイント を落としてしまった。
|
|
|
|
|
Name: わたねる ..かけだし(1,241ポイント)
Date: 2008/09/16(火) 15:35
No:21356
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>>yuuki++さん、御津凪さん
うーん・・・紙に書いて追ってみたのですが、どうもいまいち理解が出来かねます・・・。
yuuki++さんのソースも拝見しましたが、main関数に何をさせればいいのか手を付けられません・・・。
もしお暇でしたら、>>1で書いたような仕様でmain関数も含めて書いてくださいませんか。
後これは、単方向リストでは実現不能ですかね・・・?
>>御津凪さん
initList 関数と addList 関数、理解できました。ありがとうございます。
初期化用の関数として用意したり、初めはダミーではなくて自身を指すことを思いつかなかったので驚きです。
構造体の件も、勘違いしていたことが改めて頭に入りました。構造体ではなく変数なのですね。
後、このaddlist、list変数は引数として持ってきていませんが、動作するのでしょうか。
314ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(14,206ポイント)
Date: 2008/09/16(火) 15:40
No:21358
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> 実際にどれほどの遅延が発生しましたか?
確認を取ってはいませんが、シューティングゲームなどに使用した場合、
毎フレームにNULLかどうかの確認処理が入るので、沢山弾を出している時に微妙に遅くなるタイミングが変わると思います。
yuuki++ さんのおっしゃる通り、その差は微々たるものですが、
処理の高速化はこのようなところまで気を配らないといけないような気がします。
> この直後にこの構造体にアクセスしてしまったらどうしますか?新たにカウンタ変数を持ちますか?
> リストがダミーのみのときにアクセスしてしまったらどうしますか?
たとえば、ゲームに使用した場合、
struct List{
struct List *next;
struct List *prev;
// 何らかのデータ
};
// 移動処理 list:対象となるリストのデータ(ダミー)
void move(struct List* list){
struct List* cur = list->next;
while(cur != list){ // 一周するまで。ダミーしかなかったらループされない
// cur について処理
cur = cur->next;
}
}
このようになり、関数に渡されたリスト構造は、
初期化直後であれば何もせずに返ってきますし、
リストを持っているならダミーを除く全てのリストを処理します。
initList 関数は、ただ前後のポインタのみを初期化しているので、
他の初期化を入れるならここに追記するなり後で初期化するようにすれば良いでしょう。
> 特にポインタ関連のコーディングに関しては保守点検がしやすいことを重視すべきです。
データの最大数が決まっていれば、あらかじめ一度に確保するのも一つの手ですし、
(別の話になりますが)スマートポインタのような参照カウンタを持つのもありだと思います。
ゲームならば、前者の方が多いかと思いますが。
511ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..かけだし(1,945ポイント)
Date: 2008/09/16(火) 15:42
No:21359
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>わたねるさん
では、例えばさっきのコードに追加でこれをためして見てください。
int main(void)
{
int i, j;
char str[64];
PLIST pList = NULL, p, pNext;
printf("データ数:");
gets(str);
i = atoi(str);
for (j = 0; j < i; j++) { //リスト作成と表示
p = Add(&pList);
printf("データ:%d\n", p->i);
}
printf("確保\n");
p = pList;
while (p) { //リストを使うときの常套手段
printf("データ:%d\n", p->i);
p = p->pNext;
}
p = pList;
while (p) { //消すときも同様ですが、pNextを先に取っておきましょう
pNext = p->pNext;
Del(&pList, p);
p = pNext;
}
printf("解放\n"); //要素の数だけ数字が表示され、ここまでくれば成功
return 0;
}
かなりやっつけ仕事ですが、単純に
・リストの個数を入力
・リストを作る
・表示と削除
をやっています。
単方向でも似たような処理になります(今回のは単方向でも可)
「途中の要素を消す」とかが必要なときには双方向ですね。
500ポイント を落としてしまった。
|
|
|
|
|
Name: yuuki++ ..かけだし(2,342ポイント)
Date: 2008/09/16(火) 15:50
No:21360
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
>確認を取ってはいませんが、シューティングゲームなどに使用した場合、
>毎フレームにNULLかどうかの確認処理が入るので、沢山弾を出している時に微妙に遅くなるタイミングが変わると思います。
>yuuki++ さんのおっしゃる通り、その差は微々たるものですが、
>処理の高速化はこのようなところまで気を配らないといけないような気がします。
確認を取っていないのに、なぜそう言えるのですか?
ちなみに実際にやってみましたが、2000発やそこらの弾幕では全然差はありませんでしたよ。
>初期化直後のアクセス云々
これはなるほど、いい方法です。ただし、これは「循環リスト」という線形リストとは別の構造をもっています。
配列やスマートポインタ、ハッシュなどに関してはその通りです。
しかし、これを気にせず行える環境というのは、すなわちリスト構造の処理数云々が気にならない程度になるということです。
コンパイラの最適化もだいぶ賢くなっているので、多少の論理演算ではビクともしません。
397ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(14,416ポイント)
Date: 2008/09/16(火) 16:03
No:21361
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> ちなみに実際にやってみましたが、2000発やそこらの弾幕では全然差はありませんでしたよ。
それは当然だと思います。
移動処理で一度だけしかその差となる処理を行っていないのですから。
一度に2000発の弾を出したり消したりした時に遅延が起こるのではないでしょうか?
(起こるかどうかはPC環境にもよりますが)
単純に考えれば2000回の判定処理が行われると思います。
(全消しなどの場合は専用の関数を用意すれば問題ないですが)
> ただし、これは「循環リスト」という線形リストとは別の構造をもっています。
循環リスト構造を使った線形リストの処理と思えばいいのではないでしょうか。
(いい加減かもしれませんが)
> コンパイラの最適化もだいぶ賢くなっているので、多少の論理演算ではビクともしません。
その通りです。
趣味で作るゲームなどはその辺はほとんど気にしなくてもいいのですが、
私はゲームプログラマ(ポータブル系)である以上、どうしても気になってしまうのです。
210ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..かけだし(1,619ポイント)
Date: 2008/09/16(火) 16:59
No:21363
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>>yuuki++さん
初歩的な質問で申し訳ないのですが、(typedefに慣れていないからなのか?)
typedef struct LIST {
struct LIST *pPrev, *pNext; //前と次の自己参照
int i;
} LIST, *PLIST;
LIST , *PLISTと、2つつなげて宣言?(意味が良く分かっていません
main関数の
PLIST pList = NULL, p, pNext;
add関数の
PLIST pcur = *pList; //カレントポジション
について、何をやっているのかいまいち分からないので、ここを詳しく説明お願いします。。
2倍のポイントを手に入れた! 378ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..中級者(14,537ポイント)
Date: 2008/09/16(火) 17:13
No:21364
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> LIST , *PLISTと、2つつなげて宣言?(意味が良く分かっていません
これは、 struct LIST という構造体の名前を別名で扱えるようにするものです。
前者の LIST は struct LIST の別名で、
*PLIST は struct LIST* の別名です。
これにより、いちいち struct を前につけなくても使用することが出来るようになります。
つまり、
PLIST pList = NULL, p, pNext;
は、別名で行わないようにすると、
struct LIST *pList = NULL, *p, *pNext;
となります。
後の説明は yuuki++ さんに任せます。(コードを良く見ていないので…)
121ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..かけだし(1,459ポイント)
Date: 2008/09/16(火) 21:32
No:21380
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
なるほど、LIST,*PLISTとすると、2タイプ宣言できるんですね。また一つ知識が増えました。
ただ、add関数の
PLIST pcur = *pList; //カレントポジション
の部分は理解できましたが、
struct LIST *pList = NULL, *p, *pNext;
のような命令は初めて見ました。
例えば
struct decoy List = {5 , "言葉" , 30.5};
のように{}で結ぶような使い方は分かるのですが・・・。
これは何を意味しているのでしょうか。
160ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(15,133ポイント)
Date: 2008/09/16(火) 21:47
No:21381
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> struct LIST *pList = NULL, *p, *pNext;
これは、
typedef struct LIST{
} LIST,*PLIST;
と同じように、一行で変数を複数宣言する記述です。
よく見ると分かるとおり、
pList には初期値(NULL)を、それ以外(p,pNext)の変数はそのままの状態で定義しています。
つまり、
int a,b,c,d,e,f,g,h,i,j,k,l,m,n;
こういうことも可能です。
ただし、ポインタ型の変数を複数定義する場合は、
int *a,*b,*c,*d,*e,*f,*g,*h,*i,*j,*k,*l,*m,*n;
と、変数の前に"*"をつけなければならない決まりのため、記述が面倒です。
(場合によっては見づらい)
この時に別名を定義しておけば見やすくなりますね。
typedef int *PINT; // int *型を PINT として定義
PINT a,b,c,d,e,f,g,h,i,j,k,l,m,n;
このように。
> struct decoy List = {5 , "言葉" , 30.5};
> のように{}で結ぶような使い方は分かるのですが・・・。
> これは何を意味しているのでしょうか。
{}で結ぶ使い方が出来るのは、配列を初期値付きで定義した時や、
構造体を初期値付きで定義する時です。
372ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(2,749ポイント)
Date: 2008/09/16(火) 23:13
No:21384
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
外出していました笑
>御津凪さん
>移動処理で一度だけしかその差となる処理を行っていないのですから。
>一度に2000発の弾を出したり消したりした時に遅延が起こるのではないでしょうか?
>(起こるかどうかはPC環境にもよりますが)
>単純に考えれば2000回の判定処理が行われると思います。
>(全消しなどの場合は専用の関数を用意すれば問題ないですが)
確かに実験の仕方がまずかったですね。しかしこれは、どんな構造のリストでも遅延が生じます。
これは判定の問題ではなく、動的メモリ確保によるボトルネックの問題です。
試しに、同時に2000発発射してみました。実際にやってみると分かりますが、遅延が生じるのは「メモリ確保」です。ボトルネックはここです。
>循環リスト構造を使った線形リストの処理と思えばいいのではないでしょうか。
自分で言っておきながら申し訳ないですが、この辺の定義は重要じゃなかったですね笑
ただ、入っているアドレスにNULLがあるかないかでこれらの違いはありますし、当然処理も異なります(が、これは些細なこと)
>私はゲームプログラマ(ポータブル系)である以上、どうしても気になってしまうのです。
商業ですか?だったらなおさら、どこがボトルネックになっているのかを見極めるのが必須なのでは?
企業では分業が基本だと思いますが、実験と保守点検は特に重視すべきでは。
わたねるさんへのレスも分けて書きますね。
407ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(125,748ポイント)
Date: 2008/09/16(火) 23:19
No:21386
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
今回の場合、双方向リスト構造を採用する必然性はどのあたりにありますか?
アプリケーションで、リスト構造を前へ前へとさかのぼっていく
機能が必要なのですか?
だとすれば双方向リスト構造を採用する意味は大いにあると思います。
そういう機能が必要ないのであれば、双方向リスト構造を採用すると
ポインターの張り替えの手間がかかります。
160ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(3,283ポイント)
Date: 2008/09/16(火) 23:29
No:21387
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>わたねるさん
コードの分かりにくさに関しては謝らなければなりません笑
手っ取り早く仕上げたので説明なしにtypedefとかつかってしまいました・・・
add関数についてですが(というか全体に渡って)pListというものはリストの先頭を表しています。
addの中のpcurというのは最後尾を見つけるためにリストの先頭から順番にアドレスを入れていくものです。
最後尾を保存しておくようにしておけば、この変数もその後のwhileもいらなくなります。
if (pcur) { //この時点でpcurにはpList(先頭)が入っています。
i = 1;
while(pcur->pNext) { //pcurの次が無くなる(NULLになる)までループして
pcur = pcur->pNext;
i++;
}
pcur->pNext = p; //最後尾になったら、その次に「新しく作った構造体のアドレス」を入れます。
} else { //もし先頭が無かったら
*pList = p; //新しい奴を先頭にします。
}
p->pPrev = pcur; //pcurは最後尾(なければNULL)
p->pNext = NULL; //今回は最後尾に追加するのでここは必ずNULLです
p->i = i;
return p; //アドレスを返します(動的確保だから可能。普通の変数ではできませんね)。
}
ばーっと書きましたが、この辺はリスト構造を扱う上での定石といった感じですね。
御津凪さんのコードも基本的には同じで、判定の仕方が異なるだけなので、リスト構造そのものの扱いについては結果的に同じことをしています。
typedefについては、別に使わなくてもいいんです汗
私がstructを書きたくないだけだったので・・・typedefや宣言についても詳しく触れますか?
534ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(3,199ポイント)
Date: 2008/09/16(火) 23:31
No:21388
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>boxさん
その通りですね。
そういえばいつの間にか双方向限定になってしまっていました。
詳しい仕様を聞いていないのに決め付けるのは良くなかったですね・・・
84ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(15,644ポイント)
Date: 2008/09/17(水) 02:39
No:21391
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> yuuki++ さん
リストへの追加に毎度メモリ確保をするならばそこがボトルネックでしょう。
私は確かにメモリ確保については書いてはいなかったのですが、考えていなかったわけではありません。
あらかじめ沢山のデータ分のメモリを確保して、
未使用リストと使用中リストを用意します。
(確保したデータをあらかじめ未使用リストに追加しておく)
使用するときに未使用リストからデータを取り出し、
使わなくなったら未使用リストに戻す、といった処理を行えば、
使用中のメモリ確保は一切なくなります。
ただし、このままでは固定サイズのため、いっぱいまで使った時、未使用リストから取れなくなります。
これをどうするかとかを書いていくと、どんどん長くなってしまいます(&話がそれる)ので割愛します。
コードも複雑化していきますし。
すでにこの時点でコードは多少複雑になっているはずです。
(C++のクラスを使用したとしても)
> わたねるさん
始めに提示してもらったように、住所録を追加する程度の処理なら、
今まで書いていた双方向リストは使わなくても問題ありません。
事実、 box さんの言う通り、単方向リストでも、
リストを操作する処理を書くことはできます。
私たちはおそらく「住所録」という、データの追加だけでなく、
ソートや入れ替え、挿入や削除など、
リストを容易に操作することを見据えた上で、
双方向リストについて書いてきたのだと思います。
わたねるさんはポインタと構造体の理解のための
「住所録」を作ろうとしていたのでしたね。
ポインタについて理解をするなら、
No:21359 の yuuki++ さんの書いていただいたコードが一番ではないでしょうか。
単方向リストとしてできない(もしくはできるが難しい)主な機能は、
・ソート
・入れ替え
などが挙げられます。
(挿入や任意のデータの削除は先頭から検索すれば処理できます)
511ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(125,721ポイント)
Date: 2008/09/17(水) 06:08
No:21392
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
単方向リスト構造でソートができない(あるいはむずかしい)というのは、
勘違いなさっているようです。
リストに挿入するタイミングで昇順または降順にしておけばよいだけのことです。
27ポイント を落としてしまった。
|
|
|
|
|
Name: yuuki++ ..入門者(3,317ポイント)
Date: 2008/09/17(水) 08:06
No:21393
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
そうなんですよ。
それで、今の話は構造の複雑化ではなく「毎回メモリ確保する上で、判定部分の違いによる遅延」でしたね。
これまでの簡単な実験結果から、速度に影響する部分は今回の場合まずメモリ確保が挙げられます。
またゲームに関して言えば、ここを解消したとしてもおそらく次に注意すべきは画像描画でしょうね。
論理演算とif文の判定が影響する前に、それほどの弾を出したらグラフィックが先に影響するのです。
これについては、1発の弾に対して200〜2000個の画像を描画するという簡単な実験を行いましたが、やはり思いっきり処理落ちします。
ソースの各部で行っている2^15〜2^16回ほどの判定処理よりもずっと重いですね(グラボの性能のせいでもありますが)。
単方向リストの「挿入」については説明不足でした・・・
なぜか削除の話ばっかりしていますね汗
2倍のポイントを手に入れた! 118ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(15,880ポイント)
Date: 2008/09/17(水) 10:17
No:21394
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> リストに挿入するタイミングで昇順または降順にしておけばよいだけのことです。
そうでした…。(汗
挿入のタイミングを忘れていましたね。
挿入時点でソートされているようにしておけば、
基本並べ替える必要はありませんし。
> yuuki++ さん
一発の弾にどれだけの画像を使うんだというのは置いといて。
DirectXならば、全ての弾を書き込んだテクスチャ画像を用意して(デバイスへの登録回数を抑えるため)、
頂点バッファとインデックスバッファを使用して描画命令の呼び出しを一回に抑えれば、
処理落ちは最小限に抑えられるはずです。
(DXライブラリは使ったことが無いので、そちらの方での高速化はわかりません)
236ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(3,399ポイント)
Date: 2008/09/17(水) 10:36
No:21396
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
そういうことではないですよ笑
「何をループするか」ということで描画をループしたのです。
弾の画像云々や描画に関する最適化は「この話題では」まったく無関係ですよ。
何度も言いますが、話の本筋は「毎回メモリ確保する上で、判定部分の違いによる遅延」です。
82ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(16,134ポイント)
Date: 2008/09/17(水) 11:23
No:21397
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
求めていた回答ではありませんでしたね。すいませんでした。
> 何度も言いますが、話の本筋は「毎回メモリ確保する上で、判定部分の違いによる遅延」です。
では、例を「住所録」に変えてみましょう。
たとえば、役所のように万単位のデータが存在するとします。
この沢山のデータから任意のデータを1個ずつ削除する時、
全て削除し終えた時の処理時間が、
ダミーが存在するかしないかで判定部分の違いによる差が出るかと思います。
今までもそうでしたが実験できる環境にいないので、
確証はありませんが、まず差は出ると思います。
この差を気にする必要があるのかといわれれば無いかもしれませんが。
(ゲームでも)速度を気にしないならダミーは無くても良いです。
しかし、微々たる物であっても判定部分の違いで速度が変わるのは事実です。
(ちなみに、if文は論理演算より遅いはずです)
ところで、「毎回メモリ確保する上で」というのは今回の話に必要でしょうか?
追加時に動的にメモリ確保する必然性が無ければ、事前にバッファとして確保しておけば、
少なくともリスト操作には影響が少ないですし。
254ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(4,786ポイント)
Date: 2008/09/17(水) 12:15
No:21399
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
>ダミーが存在するかしないかで判定部分の違いによる差が出るかと思います。
>今までもそうでしたが実験できる環境にいないので、
>確証はありませんが、まず差は出ると思います。
これは当然です。たとえまったく同じアルゴリズムだったとしてもプロセッサの違いで差がでます。
というか、私は差が出ないとまでは言っていません。
どういうスタイルでコーディングするのか、その上で重視すべき点は速度だけではなく、速度遅延のオーダーと他の仕様設計との重みを考察すべきだと思っています。
また、ある現象について論理的結論を下すには、資料収集・実験・整理・報告の繰り返しで、統計データを取る場合は標本数の妥当性について論じますよね。
が、そんなのは公式データ作成におけるプロセスなので無視していいですが、最低限簡単な実験が可能なら実行して結果を考察してから論ずるべきです。
もしくは数値的解析を行ってオーダーを求めるのもいいでしょうね(面倒ですが)
>では、例を「住所録」に変えてみましょう。
>処理時間を優先しなければ(住所録のように)ダミーが無いほうが良いと思います。
う〜ん笑
>しかし、ゲームなどで使用するタイプのリストだと、
一応、この発言を受けてベースにしていたつもりでしたが、見当違いでしたね・・・
また
>毎フレームにNULLかどうかの確認処理が入るので
フレーム内でループとかいろいろやってみましたが、よく考えたらこの部分「フレーム毎」なのでさらに微小になりますね。
この「微小」という現実を一体どれほどの精度で取り扱うかというのは仕様次第ですね。
それを踏まえた上で
>最近のマシンでは気になるほどではないと思います。
と発言したのですが、まさかここまで延長するとは思いませんでしたよ笑
>ところで、「毎回メモリ確保する上で」というのは今回の話に必要でしょうか?
これは今の話題に出てきているリスト構造を指した言葉です。上のほうのレスではリスト構造のコードは2つしか出てきていませんね。
そして今はそれらについて話をしていますね。
>追加時に動的にメモリ確保する必然性が無ければ、事前にバッファとして確保しておけば、
話題には上がっていましたが、本格的にこれを盛り込んで話を拡大する必要があるのですか?
バッファの確保がより高速なのは普通に考えればほぼ自明ですけど。
さらに言ってしまうと(元も子もないですが笑)、仕様の確定していない対象について極小レベルの速度差について論ずることに何か狙いがあるのでしょうか?
私はリスト構造の(とりあえずの)ソースを提示し、(御津凪さんのソースをあまり見ていなかったので)「ダミーなしのやり方です」と事実に即し発言しました。
それについて処理速度について言及されたので、とりあえず測定結果が気になったわけですが、私自身あまり重要視していなかったので「気にならない」というスタンスでいましたが。
もちろんあのソースについて言えば、あれは「とりあえず作ったもの」ですので、私自身が何の最適化も考えないわけではないですよ笑
安定したコードをとりあえず作って、最適化の段階で循環リストに落ち着くかも知れません。
あるいは別の形に発展していくかもしれません。
という見解ですが、もしかしてこの場で最善・最速のコードを生み出す必要がありましたか?
1,387ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがりの者 ..ぴよぴよ(539ポイント)
Date: 2008/09/17(水) 12:31
No:21400
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
このスレッドは「住所録をリスト構造で実装する」件についてのものです。
ゲームプログラムの作り方は、この際どうでもいい話。
41ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(16,209ポイント)
Date: 2008/09/17(水) 12:42
No:21401
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
> もしかしてこの場で最善・最速のコードを生み出す必要がありましたか?
はっきりと言ってしまえば、必要ありません。
> ダミーはあっても無くてもこのリスト構造は作れます。
> しかし、ゲームなどで使用するタイプのリストだと、
> ダミーを用意したほうが早くなります。
yuuki++ さんに対してのこの発言は頭の片隅に覚えておく程度に捉えてほしかったのですが。
(それ以降の発言も同意義です)
まあ、そういう風に書いていなかった自分が一番悪いのですが…。
> ゲームプログラムの作り方は、この際どうでもいい話。
その通りです。
脱線してすみませんでした。
75ポイント を手に入れた。
|
|
|
|
|
Name: yuuki++ ..入門者(4,867ポイント)
Date: 2008/09/17(水) 12:54
No:21402
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>御津凪さん
>頭の片隅に覚えておく程度に捉えてほしかったのですが。
忠告、ということですか・・・
私は事実に即して発言してきたまでですが、ゲームプログラマーの世界というのは想像以上に厳格な考えがあるのですね。
長くなりました。確かに脱線しすぎなのでこの話は終わらせましょう。
81ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..かけだし(1,678ポイント)
Date: 2008/09/17(水) 14:06
No:21405
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
>> struct LIST *pList = NULL, *p, *pNext;
>これは、
>typedef struct LIST{
>} LIST,*PLIST;
>と同じように、一行で変数を複数宣言する記述です。
>よく見ると分かるとおり、
>pList には初期値(NULL)を、それ以外(p,pNext)の変数はそのままの状態で定義しています。
御津凪さんのこの説明なんですが、理解しきれていません・・・。
構造体についての知識が足りないからなのでしょうか。
struct List *pListで、List構造体から*pList変数を生み出した(上手い表現が出来ない)というところまでは分かりましたが、
やはり、{NULL , *p , *pNext}と、括弧でつながっていないことが気になり、*pList変数に対して何を定義し、何を代入しているのか良く分かりかねます・・・。
面倒でなければ、もう少し細かい説明をお願いします・・。
219ポイント を手に入れた。
|
|
|
|
|
Name: わたねる ..かけだし(1,780ポイント)
Date: 2008/09/17(水) 14:12
No:21406
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
そして、単方向リストで実現するべきか、双方向リストで実現するべきか、についても混乱しています。
一応単方向リストで作ったことがあるのですが、「削除」で手詰まりを起こしてしまいました。
お暇な方がいらっしゃれば、ソースをチェックしていただくと嬉しいです。
cppファイルを貼り付けておきます。
102ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(16,915ポイント)
Date: 2008/09/17(水) 15:05
No:21407
|
|
Title: Re:自己参照構造体(リスト構造)を使用した住所録の作成
|
|
struct LIST *pList = NULL, *p, *pNext;
これは、
struct LIST *pList = NULL;
struct LIST *p;
struct LIST *pNext;
と同じです。
typedef struct LIST{
} LIST,*PLIST;
これも、
typedef struct LIST{
};
typedef struct LIST LIST;
typedef struct LIST *PLIST;
と同じです。
(こっちの方で書いたほうが分かりやすかったですね^^;)
括弧でつなぐのは変数の値を一度に指定する時です。
変数を一度に定義するには使いません。
あと、添付されたソースを拝見しました。
さくっと読んだ限りですが…。
・2回実行されるとというのは、直前に似た出力(85行目)があるからではないでしょうか。
・データの最後尾のデータを選んだときの部分では、現在では、先頭から次のポインタを NULL にしてしまっています。
それと、条件部分の delete_number +1 は delete_number -1 ではないでしょうか。
・次の次のデータのポインタを指定するのは、
[0]->[1]->[2]->[3]
(1が削除するデータとして)
このとき、1の前にあるデータ(0)の指す次のデータを、「次の次(2)」としているからです。
これをj実行すると、
[0]->[2]->[3]
となります。
今回の例では、追加ごとにデータ領域を確保しているので、アドレスが連続しないことがあります。
なので、(prev->next_pointa)+2 ではなく、
prev->next_pointa->next_pointa と表記したほうが安全だと思います。
むしろ、"(prev->next_pointa)+2"では希望通りの動作をしません。
これだと、「prev の指すポインタの二つ先(アドレス上)のポインタ」となり、
多分「次の次の次」になっているような…。
706ポイント を手に入れた。
|
|
|
|
|