久しぶりに龍神録の館更新

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

久しぶりに龍神録の館更新

#1

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

龍神録プログラミングの館を久しぶりに更新しました。
http://dixq.net/rp/

わざわざ報告するほど変化は無いんですが、「もう更新しないの?」って声があったので、一応まだまだ作り続けますという報告です^^;

後、ゲームプログラミングの館も久しぶりに1章だけ追加しました。

------

18:30現在、今日はすごくうちのHP重い気がするんですが、気のせいですかね・・。
しかも前のHPも重い・・。

もし直らないようならサーバーレンタル元に問い合わせようと思ったんですが「12/27~1/4は休み」って書いてあったんで、最悪このまま1週間以上・・。う~ん、困った;

array

Re:久しぶりに龍神録の館更新

#2

投稿記事 by array » 16年前

文字弾幕楽しみです^^
そういえば2か月ぶりの更新になるんですね。


私も【にわかの俺が】に感化されて、また色々プログラムに触れてるのですが
やっぱりゲームを作るのは楽しいですね。私も東方にどこまで似せられるかを
目標にして頑張ってみたくなりました。

yu

Re:久しぶりに龍神録の館更新

#3

投稿記事 by yu » 16年前

更新お疲れ様です。


>18:30現在、今日はすごくうちのHP重い気がするんですが、気のせいですかね・・。

自分もすごく・・・おもいです・・・。
朝は大丈夫だったんですけどね~


【にわかの俺が】を見ましたがクオリティ高いですね。
スペカ発動のエフェクトとかほとんど同じでしたね。本家と
動画みててこの弾幕データ使ったんだな~とか思ったりw

自分が作ってる東方もどきと比べるとクオリティの差で悲しくなってきます・・・;

きらりん

Re:久しぶりに龍神録の館更新

#4

投稿記事 by きらりん » 16年前

>>18:30現在、今日はすごくうちのHP重い気がするんですが、気のせいですかね・・。
>>しかも前のHPも重い・・。

僕のPCだと縦長のホームページは嫌ってくらい重いです・・・。ページをPC内に保存してみてみても重かったのでスペックが悪いんでしょうね・・・。

縦長と言えばDXlibのヘルプの中のサンプルプログラムのところも重いですね。僕だけなんでしょうか?

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#5

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

>>arrayさん

すっかり放置ですみません^^;
やはり時間を見つけてなるべくコンスタントに作っていくよう頑張ります!
実は私も【にわかの俺が】に影響されましたw
作るなら妖々夢のファンタズムのコピー作りたいな・・。
※メール送ったんでお願いします~☆

>>yuさん

今はアクセスが重いの直ってるみたいですね。
う~ん、昨日のトップページの累計アクセスがいつもの1/4しかない。
そのわりには7500アクセスある・・。
ほとんど【にわかの俺が】動画から探してきてくださった方々だと思いますが、
せっかく来て下さったのに重くて帰っちゃったかな・・。
はぁ~、でもこのサーバーレンタル月200円の破格だからあまり文句言えないな・・。

>自分が作ってる東方もどきと比べると

作っていくうちになれますよ^^
エフェクト系を忠実に再現するようにすると見栄えがグッと上がりますよw

>>きらりんさん

ということはゲームプログラミングの館とか重いですか?
スレイプニルとかIEとか使ってる人は縦長のHP読みづらいようですね。
そういう時はGoogleChromeオススメです。
http://www.google.com/chrome/?hl=ja
とっても軽いですよ。うちのパソコンだと、ようこそ画面から切り替わって2秒以内に立ち上がるんですが、
かつてそんなブラウザありませんでしたw
重いページもどういう仕組みなのか、メモリ食わずに見ることが出来るみたいです。

kazuoni

Re:久しぶりに龍神録の館更新

#6

投稿記事 by kazuoni » 16年前

>GoogleChrome

感動しました。。軽っ!!
IEはすぐに引退しますw

感動したので横からコメントさせてもらいましたー。

きらりん

Re:久しぶりに龍神録の館更新

#7

投稿記事 by きらりん » 16年前

>>ということはゲームプログラミングの館とか重いですか?

そうですね;
pagedownを押しっ放しでスクロールしようとしてもスクロール一回分が0.5秒くらいかかります。
コピーして貼り付けなどもそのくらいかかりますね・・・w
タスクマネージャーによるとメモリをすごい食っているようです。


>>そういう時はGoogleChromeオススメです。

これすごかったですw
重さをまったく感じませんでした。むしろ限界まで軽い・・・w

>>エフェクト系を忠実に再現するようにすると見栄えがグッと上がりますよw

・・・ちょっと気になったんでw
エフェクト系ってどんなツールを使って作ってるんですか?自分ノーマルペイントとsaiくらいしか使ったことないのであんな綺麗なエフェクトどうやって作ってるのかなーって気になってましたw

御津凪

Re:久しぶりに龍神録の館更新

#8

投稿記事 by 御津凪 » 16年前

> エフェクト系ってどんなツールを使って作ってるんですか?

東方のほとんどのエフェクトはDXライブラリのブレンド処理と素材の透明度を利用することで再現可能です。
(つまり、エフェクトもプログラミングできる)
ただし、DXライブラリでは(DirectDrawを使っている場合)ブレンドを多用すると重くなりますが。

桃印

Re:久しぶりに龍神録の館更新

#9

投稿記事 by 桃印 » 16年前

>エフェクト系ってどんなツールを使って作ってるんですか?
 これは、エフェクトで使ってる画像はどうやって作ってるってことでしょうか。
 東方を解析・抽出したら分かりますが、実はあの美麗なエフェクトもちょちょっと画像加工したら作れるぐらいの、わりと簡単なものだったりします(それでも数は膨大ですがw)。
 それらの画像を、御津凪の言うとおりブレンド等や変形処理でエフェクトとしているのです。
 個人での使用が原則ですが、東方の画像をそのまま引用してエフェクトのコピーを実装してみるというのも一つの手かもしれません。エフェクトが完成したら、画像を差し替えたら良いのですしね~。

 横から失礼しましたっ。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#10

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

>>kazuoniさん

それはよかったです^^
ただクロムはつい先日正式版が公開されたばかりで、拡張性も低く、メニューとか最低限しかないので、
その辺はFireFoxで色々便利機能使ってた人には物足りないかもしれません。
遅いパソコンだと、どうしても拡張性よりレスポンの速さが欲しいですけどねw

>>きらりんさん

ゲームの館、やはり龍神録の館みたいに別々に書いたほうがよさそうですね。
IEだと130Mもかかるんですね・・。クロムだと10Mのようですが、色々と効率的に表示されてるんでしょうね。
エフェクトはよく見てみると、そんなに大げさなものじゃない場合が多いんですよ。
例えば龍神録のボムで言えば、
\dat\img\effect\に入っているbom画像を単に円形に動かしてドーンという効果音つけてるだけです。
http://dixq.net/rp/22.html
こちらの実行結果を見ていただければ、すごく簡単な処理を重ねてるだけだとわかると思います。
自分が「いいな~」と思うエフェクトが何かあれば、それはどうやって実装されているのか予想し、
そっくりに作ってみること、勉強になりますよ。
何かゲームを忠実にコピーすることって楽しくもあり、勉強になるので、もし力がついてきたらチャレンジしてみてはどうでしょう。

karasu

Re:久しぶりに龍神録の館更新

#11

投稿記事 by karasu » 16年前

更新分読ませていただきました。
説明が詳しくてわかりやすかったです。

エフェクトの話を読んでいたら作ってみたくなりましたw
今作っている分が完成したら私もエフェクト作っていってみたいですw

Justy

Re:久しぶりに龍神録の館更新

#12

投稿記事 by Justy » 16年前

 DLできるプロジェクトの設定でちょっと気になったので、ご報告を。

□ Debug
・ リンクの追加のディレクトリパスに余計なパスが入っています。
 あっても問題はないのですが……。

□ Release
・ ランタイムライブラリが MTdになっています。
 リンク時に競合しますので、MTにしておいた方がいいかと思います。

□ その他
・ 64ビットへの移植への対応が「はい」になっています。
 このオプションは現在推奨されておらず、将来削除される予定なので「いいえ」に
しておいた方がいいかと思います。
(VC++2008では Wp64オプションをつけると D9035の警告が出ます)

・ ソリューションエクスプローラにライブラリファイルが含まれています。 
 この状態ですと、登録されているライブラリファイル全てがリンク対象になります。
 その為デバッグビルドなのに *_d.libの方ではなく *.libの方がリンクされ
crt周りがリンク時に競合し、警告が出ることがあります。

http://www.play21.jp/board/formz.cgi?ac ... &rln=20924

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#13

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

>>karasuさん

ありがとうございます^^
わかりにくいところも多いと思うので、読んでて「この辺もうちょっと解説してよ!」ってとこあったら
気軽に言って下さい☆

>>Justyさん

いつもありがとうございます。
全部修正するのは難しいので一応50~52章を修正しました。
また何か直すべき点があれば些細な事でも教えていただけると幸いです。
・・・って言い出したら挙げられないほど列挙されるかもしれませんが^^;
とりあえずdoubleを全部floatにして、多重定義関数を消したい今日この頃・・orz

Justy

Re:久しぶりに龍神録の館更新

#14

投稿記事 by Justy » 16年前


>また何か直すべき点があれば些細な事でも教えていただけると幸いです

 そうですね、プロジェクトの設定は先の件が直っていれば問題はないはずです。
 ソースの方は……うーん、メールでもいいでしょうか?



>とりあえずdoubleを全部floatにして、多重定義関数を消したい今日この頃・・orz

 あれはあれでいいような気もしますw

 でも一番の問題はDXライブラリでは位置が floatで、角度やスケールが doubleと
分かれていることですね。
 かと思えば、一部は角度やスケールであっても floatだったり。

 どういう基準があるんでしょうか……。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#15

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

ありがとうございます。お世話になります。お願いします^^;

>でも一番の問題はDXライブラリでは位置が floatで、角度やスケールが doubleと分かれていることですね。

そういえばそうですね・・。
何か深い意味があるのでしょうか・・。

SCI

Re:久しぶりに龍神録の館更新

#16

投稿記事 by SCI » 16年前

DirectXはテクスチャやポリゴンの座標情報をfloatで扱うからではないでしょうか。
なので、位置やサイズといったものはDirectXに合わせてfloatにした方がキャストが不要に・・・
一方(想像ですが)、角度やスケールを処理しているのはDXライブラリなんじゃないですか?
角度やスケールはDirectXに直接渡さないのでdoubleで実装している、というようなことは考えられないでしょうか。
内部を詳しく見たわけではないので推測ですが・・・

Justy

Re:久しぶりに龍神録の館更新

#17

投稿記事 by Justy » 16年前


>DirectXはテクスチャやポリゴンの座標情報をfloatで扱うからではないでしょうか。

 こちらはそうでしょうね。



>角度やスケールを処理しているのはDXライブラリなんじゃないですか

 これもそうです。
 ただ、角度やスケールを処理すると言うことは頂点を生成しなければならないわけですが、
その元となっている座標が floatですし、実は内部でも角度やスケール値は
普通に floatにキャストしてから計算していたりします。

 そうなると、普通に考えれば全て floatか全て doubleのどちらかで良さそうなのですが
何故混在しているのかが謎になります。

 まぁきっと何か歴史的な事情があるのでしょう・・・。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#18

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

そう考えるとそのように考えられますね。
ただDirectXを使うとdoubleの精度が悪くなる(floatと同じになる?)ということがあるようでして
[以下記事25684のJustyさんの記事より抜粋]

[color=Tea[/url] そもそもあれなんですよ。
 DXライブラリを使うと、計算精度が悪くなるんですよね。

 知っている人は知っている話なのですが

#define PI 3.141592653589793
volatile double add = 0;
double value1 = PI + add;

ChangeWindowMode(TRUE);
DxLib_Init();

double value2 = PI + add;

とすると value1と value2の値が微妙に異なるんですよ。

 本来、addは 0なので value1も value2も PIの値になるはずなのですが、
value2は 3.1415927410...と小数点以下6桁目までしか一致しません。

 そうなる理由はDXライブラリ、というか内部で使っている DirectXが
高速化の為に単精度まで精度を下げている為なのですが、こういうこともあるので
doubleを使うなら、精度を元に戻さないとあまり意味はないかな、と思うわけです。
[/color]


なのでdoubleを使う意味があるのだろうか・・という話になっています。
う~ん、、。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#19

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

被った・・^^;

あれ・・、今問題となっているのは↑の記事の件ではありませんでした?

SCI

Re:久しぶりに龍神録の館更新

#20

投稿記事 by SCI » 16年前

あ、やはりDXライブラリを使うと精度が落ちるのは事実なんですか?
というのも、以前簡単な惑星シミュレータを作ったんですが、3Dモードの有無によって惑星の軌道が微妙に異なるという結果があったんです。
3Dモード有りで実行すると、惑星たちは周回運動をするのに、無しで実行すると軌道が少しズレて発散してしまうんです。

これは、思わぬ収穫ですよ、Justyさん管理人さん(笑

Justy

Re:久しぶりに龍神録の館更新

#21

投稿記事 by Justy » 16年前


管理人さん
>あれ・・、今問題となっているのは↑の記事の件ではありませんでした?

 それもありますね。
 でも、それが無かったとして dobleが本来の精度を持っていたとしても、
結局内部で doubleを floatにキャストしてから各種計算をしているようなので……。



SCIさん
>あ、やはりDXライブラリを使うと精度が落ちるのは事実なんですか?

 最新のテスト版のライブラリではそれを回避する関数が増えていますけどね。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#22

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

おぉ!
ちょっと試してみたんですが
#include "DxLib.h" 

#define PI 3.1415926535 
volatile double Add = 0; 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	double pi1 = PI + Add; 
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;
	double pi2 = PI + Add; 
	printfDx("pi1 = %.10f\npi2 = %.10f",pi1,pi2); 
	ScreenFlip(); 
	WaitKey(); 
	DxLib_End(); 
	return 0; 
}

実行結果

pi1 = 3.1415926535
pi2 = 3.1415927410


#include "DxLib.h" 

#define PI 3.1415926535 
volatile double Add = 0; 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	double pi1 = PI + Add; 
	SetUse3DFlag(FALSE);
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;
	double pi2 = PI + Add; 
	SetUse3DFlag(TRUE);
	double pi3 = PI + Add; 
	printfDx("pi1 = %.10f\npi2 = %.10f\npi3 = %.10f",pi1,pi2,pi3); 
	ScreenFlip(); 
	WaitKey(); 
	DxLib_End(); 
	return 0; 
}

実行結果

pi1 = 3.1415926535
pi2 = 3.1415926535
pi3 = 3.1415926535
 

つまり3D機能を使わない設定にすれば精度は落ちず、後から使う設定にしても精度が落ちないと・・。
・・・何か私誤解してますかね^^;

Justy

Re:久しぶりに龍神録の館更新

#23

投稿記事 by Justy » 16年前


>つまり3D機能を使わない設定にすれば精度は落ちず、後から使う設定にしても精度が落ちないと・

 いえ、合ってますよ。
 Direct3Dデバイスの初期化と同時に精度の設定が変更されますが、そのフラグがあると
Direct3Dデバイスを使わないので設定は変更されなくなります。


 ちなみに精度の確認方法ですが VisualStudioのレジスタウインドウを表示して、
右クリックのコンテキストメニューから浮動小数点を選択肢したときに表示される
文字の中で CTRLのところの数値をみます。

 その数値が 0x300のビットがあると仮数部の精度は 64bit(拡張倍精度)、
0x200のビットがあると53bit(倍精度)、どちらも無いと 24bit(単精度)になります。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#24

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

おぉ!ということは,フラグをオフにして初期化し,その後でフラグをオンにしたら
いつも通りDXライブラリが使え,なおかつ精度の高い計算が出来るということですか?

Justy

Re:久しぶりに龍神録の館更新

#25

投稿記事 by Justy » 16年前


>いつも通りDXライブラリが使え,なおかつ精度の高い計算が出来るということですか?

 あ、すみません。
 後から設定した場合はダメだと思います。
 SetUse3DFlag()ってフラグを変更するだけなので・・
(そのフラグをみて DXLib_Initが Direct3Dを使うかを決める、と)


 なので、そのテスト版で追加された関数を使うか、明示的に fldcw/fnstcwの命令を
使って直接 FPUのレジスタの値にビットを設定するしかないと思います。

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#26

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

なるほど,では上のサンプルでpi3まで正常に表示されているのは
SetUse3DFlag(TRUE);を行っていても
初期化関数の前に呼ばないといけないとか何かの原因で,Direct3Dが使用可能になっていない・・?って事でしょうか?

SCI

Re:久しぶりに龍神録の館更新

#27

投稿記事 by SCI » 16年前

あ、補足ですけど、私も「精度の問題」が発現したときは確か3DFlagを初期化前に行うか後に行うかで結果が変わりました。
参考までに・・・

Dixq (管理人)

Re:久しぶりに龍神録の館更新

#28

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

なるほど・・,ということは,設定後,初期化関数を呼ばないと反映されない・・ってことですかね?

Justy

Re:久しぶりに龍神録の館更新

#29

投稿記事 by Justy » 16年前


>初期化関数の前に呼ばないといけないとか何かの原因で,Direct3Dが使用可能になっていない・・?って事でしょうか?

 なっていない、と思います。

 DXLib_Initの段階で Direct3Dを使わないという選択をした時点で、
SetGraphMode()とかSetScreenMemToVramFlag(TRUE)等で内部的に再初期化を行わない限り、
Direct3Dは使えないと思います。

きらりん

Re:久しぶりに龍神録の館更新

#30

投稿記事 by きらりん » 16年前

>>No:26140
>>管理人様
 ちょうど帰省があるのを忘れていて返信遅れました;
 エフェクトのページ参考になりましたw
 今自分の作っているゲームでも何か少しでもエフェクトを入れて見たいなと思いますb

 >>自分が「いいな~」と思うエフェクトが何かあれば、それはどうやって実装されているのか予想し、
 >>そっくりに作ってみること、勉強になりますよ。
 これから力をつけるためにやっていこうと思います^^
 まだまだ力不足なのでまずは基礎からですが><

現行スレッドからみると、返信が遅くなってしまったため場違いなレスになってしまいすみませんorz

閉鎖

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