トップページgamedev
1001コメント347KB

DXライブラリ 総合スレッド その5

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2009/12/04(金) 16:49:13ID:7SKA4I5z
Cを習得した程度のスキルでも、
GUIのゲームを比較的容易に作成する事を可能にする、
「DXライブラリ」に関するスレッドです。
DXライブラリに関するテクニックなどの情報交換などを行う事で、
多くのDXライブラリユーザのスキルの向上に役立てたら幸いです。

【公式】
http://homepage2.nifty.com/natupaji/DxLib/

【過去スレ】
DXライブラリ 総合スレッド
http://pc11.2ch.net/test/read.cgi/gamedev/1197468399/
DXライブラリ 総合スレッド 2008
http://pc11.2ch.net/test/read.cgi/gamedev/1224923873/
DXライブラリ 総合スレッド その3
http://pc11.2ch.net/test/read.cgi/gamedev/1238429676/
DXライブラリ 総合スレッド その4
http://pc11.2ch.net/test/read.cgi/gamedev/1249822550/
03883732009/12/28(月) 18:48:57ID:yuCthtY8
>>387
ありがとうございます。
SetDrawScreen関数はMakeGraph関数で作成したグラフィックも指定できるんですね。
リファレンスに書かれていない機能だったとは・・・
0389名前は開発中のものです。2009/12/28(月) 18:52:49ID:dBTW62Xp
ほうほうそれは知らんかった
なんで隠すんだろうな
0390名前は開発中のものです。2009/12/29(火) 00:11:37ID:MjH8+OO8
関係ないスレだろうけど、ぐぐって検索したらここが見つかったのでここで書く。

「ゲームプログラマになる前に覚えておきたい技術」のシングルトンが変

普通シングルトンといったらpublic static getInstance()内部で初回呼び出し時に
インスタンスを作成するのに、別にインスタンス作成のためのpublic static create()というメソッドがある。

そして、クラス外部のどこかでcreate()を呼び出してインスタンスを作成している。
二回createしたら落ちるだとさ。つまり複数インスタンスをcreateするコードをかけてしまう。
これでは、実行時に落ちるとはいえ、コンパイル時にエラーを検出できない。

たとえば、複数のプログラマが、コードの一部分を分担してそれぞれ作っているときに
それぞれがcreate()していると、コードを分けている段階では問題なくても
一つにマージしたときにエラーが発生するというシナリオが起きてしまう。
0391名前は開発中のものです。2009/12/29(火) 00:18:26ID:IYgt3GZP
あの本は結構適当だからな
0392名前は開発中のものです。2009/12/29(火) 01:19:32ID:0CS2MVBj
セガの限界です
教育担当者ですらその程度
だからあそこまで落ちぶれた
0393名前は開発中のものです。2009/12/29(火) 02:24:27ID:RokfBydo
Singleton の構築|Code++
ttp://ameblo.jp/woooh-p/entry-10031871696.html

2回create()を呼び出すと落ちるのは問題だが
初期化関数を別に用意したほうがいい場合もある
0394名前は開発中のものです。2009/12/29(火) 10:12:58ID:Mul0eZVk
まあシングルトンなんか使う時点で…
0395名前は開発中のものです。2009/12/29(火) 10:14:09ID:qD3DEd6e
シングルトンは普通に使うだろ
0396名前は開発中のものです。2009/12/29(火) 10:31:45ID:Mul0eZVk
とりあえずシングルトンにしとけばオブジェクト指向っぽいしどこからでもアクセスできて便利と思ってる奴が多すぎる
グローバル変数だと意識して使うのは勝手だけどさ
0397名前は開発中のものです。2009/12/29(火) 11:41:51ID:4TKwhtv1
SEGAはプログラマが悪いんじゃなくて企画が悪いんじゃね?
0398名前は開発中のものです。2009/12/29(火) 12:33:29ID:MJuE+QA3
宣伝が悪い
0399名前は開発中のものです。2009/12/29(火) 12:33:57ID:IYgt3GZP
つまりなにもかも悪いのか
0400名前は開発中のものです。2009/12/30(水) 18:16:44ID:UY2bjnZL
ChangeFontType(DX_FONTTYPE_ANTIALIASING_EDGE);
↑でフォントを変更すると異常に重くなる。
これ以外で文字も目立たせる方法ってあります?
たくさんの色つかってる背景なので、文字が目立たなくて見にくい
0401名前は開発中のものです。2009/12/30(水) 18:19:27ID:61sxYcJT
CreateFontToHandle
0402名前は開発中のものです。2010/01/01(金) 10:45:01ID:OYP4V88L
VC++確かにべんりだーー。
{}のつながりがわかるじゃないか。
bccのときはこめんとひっつでした。
ただぎょうがわかればいいな〜〜
0403名前は開発中のものです。2010/01/01(金) 10:49:31ID:usKzGBmk
一度VC#やVB触ったらVC++なんかゴミにしか感じられなくなるけどな
0404名前は開発中のものです。2010/01/01(金) 10:52:44ID:tpzydI5S
VC#やVBも機械語と比べたらゴミにしか感じられないけどな
0405名前は開発中のものです。2010/01/01(金) 12:36:09ID:WC0TdB7O
>>402
メニューの[ツール]->[オプション]->[テキストエディタ]->[C/C++]->[全般]
で行番号をチェック
0406名前は開発中のものです。2010/01/01(金) 13:08:58ID:/td8CeQE
>>402
それはお前のインデントが悪い
0407名前は開発中のものです。2010/01/01(金) 15:11:34ID:7pzjYUfB
VC#やVBってVC++より遅いんだろ?
それにVC#はガベジなんちゃらというので急に重くなるそうじゃないか
アクションとかシューティングに向くの?
0408名前は開発中のものです。2010/01/01(金) 15:26:26ID:rtNA4Eqo
その通りだからC++でやりなよ
0409名前は開発中のものです。2010/01/01(金) 16:19:43ID:oXGgPpta
>>407
.NETのガベージコレクションは優秀だから重くなることは無いよ
Xbox360では多少難あるけどね
実行速度遅くて困るなんてことは今の時代のPCスペックじゃ有り得ないそ
Javaのゲームも余裕で動く時代だし
アクション、シューティングもネットブックで動かせたよ
0410名前は開発中のものです。2010/01/01(金) 16:32:52ID:i5316gGW
勝手に動いたガベコレが2フレームくらい時を止めても困る
0411名前は開発中のものです。2010/01/01(金) 16:44:58ID:usKzGBmk
今時そんな細かい処理速度が表に出てくるほどのゲームを作るのは大変だぞ
そんなカツカツの高負荷のゲーム作るんだったらそもそもDXライブラリなんか使うべきじゃないしな
それはともかく>>403は単にIDEの出来だけを言ったつもりだった
0412名前は開発中のものです。2010/01/01(金) 16:48:57ID:qgsN6nSc
VC#()笑 VB()爆
0413名前は開発中のものです。2010/01/01(金) 17:46:25ID:+lDteCCN
ゼタセカンドでさえ遅れるのを許されない設計の場合

まず
・設計を改める
 削れる処理はないか。
 もっと速い処理はないか。  特に算術演算はコンパイラでさえ最適化しきれない「なにがやりてーんだタココラ」って効率の悪いコードになりがち。
 セオリーから外れてないか。 ウェイトを「カウントアップ」でやろうとしてないか。

などを見直し、それでもダメだ!1ヨクトセカンドでも遅れるのは許されぬ!ってとき

ハードウェアとダチ公になる


のだ。
遅れるってのは結局「OSのスリープに頼っているから」である。
OSのスリープはもちろんOSがやることなので「今は特に眠くないです。」といったらスリープしてもらえない。
そこをハードウェアとダチトモコレクションすることで、強制的にスリープするのだ。
0414名前は開発中のものです。2010/01/01(金) 17:52:47ID:+lDteCCN
格闘ゲームだったら体力が0になったとき義塾大学になるのはもちろんだが、
気絶などのステータスもある。何のモーションのとき何が何でキャンセルできるのか

そういうことも常に演算する対象だが、これを

if(cancell_OK == 1)

とかやってるやつは基本がなってない。

char  cancell_OK, cancell_NG, cancell_only_special・・・・・・・

などと延々必要になるではないか。
ステータス管理の変数は1つにまとめろ。それは可能である。


というふうに、効率の悪いコードになっているのを改めることでだいぶ良くなる。

0415名前は開発中のものです。2010/01/01(金) 18:19:25ID:Xn7CcDBA
>ステータス管理の変数は1つにまとめろ。それは可能である。
へぇ〜どうなるの 40文字以内で教えてください
0416名前は開発中のものです。2010/01/01(金) 18:20:21ID:ulJ3MFDL
>ウェイトを「カウントアップ」でやろうとしてないか。
これについて教えて下さい
0417名前は開発中のものです。2010/01/01(金) 18:20:50ID:+lDteCCN
結局のところ、格闘ゲームにおけるステータスってのは0か1しかない。
分かるだろ。の
0418名前は開発中のものです。2010/01/01(金) 18:22:58ID:qgsN6nSc
>>414
cancell…

ステータスはビット演算でやってもいいが可読性が著しく低いから、
boolの配列作って0〜nの数字をそれぞれステータス名でenumしてる
スパゲッティどころか脳髄の如く絡まってるコード持って自慢げにメモリ使用量が〜〜とか言ってる奴いるとぶん殴りたくなる
というかぶん殴る
0419名前は開発中のものです。2010/01/01(金) 18:23:47ID:+lDteCCN
カウントアップウェイト

信じられないことに、いまだに良く見るんだが
for(i=0, i < During; i++)

のこと。逆も然り。
for(i=During; i !=0; i--)

のような


これ数えてる間、CPUがずっとそれに占有されるだろ
これじゃウェイト、スリープの意味がない。
0420名前は開発中のものです。2010/01/01(金) 18:25:49ID:ulJ3MFDL
>>419
これ駄目なの?普通に使ってた
代わりにどう書けばいいの?
0421名前は開発中のものです。2010/01/01(金) 18:27:56ID:+lDteCCN
ウェイトやスリープってのは、

「何もしないんだから、その間他の処理をさせよう」

ってのが基本だ。また、そうでないとウェイトしてる間他の何の処理もできないから
極端に言えば画面が停止することになる。


普通は、OS越しに駆動するゲームだったらOSに用意されるスリープ命令を使う。
OSがない組み込みなどで動かすゲームなら、割り込みを使う。
0422名前は開発中のものです。2010/01/01(金) 18:38:45ID:ulJ3MFDL
0423名前は開発中のものです。2010/01/01(金) 19:16:43ID:CHW7ms0X
ループ処理の話かと思った
0424名前は開発中のものです。2010/01/01(金) 19:24:26ID:Xn7CcDBA
unsigned long stat;
#define CANCEL_OK 0x00000001
,,,
 if (stat & CANCEL_OK)
 ...
 else if (stat & CANCEL_NG)
 ...
とか書くのかな

>boolの配列作って0〜nの数字をそれぞれステータス名でenumしてる
みたいなほうが好きだ
ただ例にあげてるとおりに格闘ゲームだとするとキャラクターの1フレームごとの変数の数が増えるのをきらうのはわかる
0425名前は開発中のものです。2010/01/01(金) 19:28:11ID:DuVCrQzJ
>OSがない組み込みなどで動かすゲームなら、割り込みを使う。

GBAとかMSXとか古いゲーム機の時のことでしょ
懐かしいな
0426名前は開発中のものです。2010/01/01(金) 19:28:36ID:+lDteCCN
時間軸で考えると、
例えば「1時間後に働けよ」というのがスリープの考え方。

「じゃあその1時間何をするか」。
1時間、ずーっと1,2,3,4,5,6,7,8,・・・・と声に出して数え上げるとする。
これじゃ、なんか用事があっても何も出来ない。

「じゃあ本でも読むか」となれば、別の処理(本を読んで知識を得る)が出来る。

どっちやっててもシステム時間として1時間は過ぎるが
片方は「実質的に意味のあることを何もしてないのにパワーだけ食う」
片方は「実質的に何もしないんだから別のことをする」

どっちが効率的か分かるだろう
0427名前は開発中のものです。2010/01/01(金) 19:31:29ID:+lDteCCN
また、ループも

for(i=0; i < During; i++){
 Plus += Exactly;
}

ではなく、
if(During == FuckingAss){
 Plus += Exactly;
 Plus += Exactly;
 Plus += Exactly;
 Plus += Exactly;
 Plus += Exactly;
 Plus += Exactly;
}

などとしたりすることがある。
基本的にコッチのほうが速いからだ。
CPUとコンパイラにもよるが。
0428名前は開発中のものです。2010/01/01(金) 19:32:53ID:ulJ3MFDL
>>427
へー
0429名前は開発中のものです。2010/01/01(金) 19:35:16ID:ulJ3MFDL
でも1000回のループとかだと、1000行書いてたらさすがにソース長くなって鬱陶しいよね
大体何回までのループなら>>427の↓のパターンで書いてもいいの?
0430名前は開発中のものです。2010/01/01(金) 19:37:18ID:+lDteCCN
デッドライン、つまりここまでに必ず処理終えろ!っていう最終期限が決まってるシステムでは
forループではなく、こういうふうな展開したループもどきが使われることも多い。

難点は、見た目素人っぽいこと

それ以外は何してるか分かりやすくていいのだが
「こっちのほうが速いよ」ってことをなかなか認めてもらえないのが難といえば難


これを、デッドラインまで繰り返す
デッドラインが決まっているということはおおよそのアタリがつくし、
そんなに長いループにもならない。なってはいけない。
0431名前は開発中のものです。2010/01/01(金) 19:42:28ID:+lDteCCN
まあこういう小ネタは
「もっと軽くしたい」ってときの最終手段なので

根本から遅いのであれば設計を見直したほうがいいよ
0432名前は開発中のものです。2010/01/01(金) 19:44:49ID:Xn7CcDBA
>ID:+lDteCCNが考える中で
じゃあWindowsのDXライブラリで
たとえば1フレーム50ミリ秒にするのにSleepを使わない最適なメインループはどういうの
公式のサンプルがいいのなら「それ」といってくれればいいです
0433名前は開発中のものです。2010/01/01(金) 19:46:30ID:qgsN6nSc
マジレスするとDXライブラリ使うような環境でこんな事を考える必要は無い
0434名前は開発中のものです。2010/01/01(金) 19:48:17ID:ulJ3MFDL
>boolの配列作って0〜nの数字をそれぞれステータス名でenumしてる
これ具体的にどんな感じで書けばいいの?
0435名前は開発中のものです。2010/01/01(金) 19:50:56ID:+lDteCCN
俺やったら、スリープはCPUに直結する。
例えばPowerPCはタイマユニットを持っているので
これに値を入れてカウントさせる。アンダーフローと同時に割り込みが入る。
その割り込みでタスクを駆動させる。

こういうハード寄りもいいとこのタイマ管理ってのはアプリで使うもんじゃないというし、
まあそれもそうだろうが実現する場合これが一番いいのだ。

ハードウェアのタイマクロック計上はタスクじゃないので、一切影響を及ぼさない。
普通OSのスリープは多かれ少なかれCPUのパワーを食うが
俺のやるタイマは一切食わない。割り込み処理のオーバーヘッドは微々たるもの。
0436名前は開発中のものです。2010/01/01(金) 19:52:10ID:ulJ3MFDL
>>435
全然わからんからサンプルソースで説明しておくれ
0437名前は開発中のものです。2010/01/01(金) 19:54:51ID:OvIEzR2y
wwwwww
DXライブラリのスレでPowerPCwwww

面白いヤツだなお前
0438名前は開発中のものです。2010/01/01(金) 20:05:29ID:+lDteCCN
PowerPCは例えだし
サンプルといっても、やりたい事を記した関数しかないのだがw

割り込みはソフトウェアじゃない。
割り込みは、ベクタ方式の場合ベクタベースからオフセットしたところにプログラムカウンタが来るだけだから
別にソースで表すもんじゃない。
また、PowerPCならベクタじゃない。
0439名前は開発中のものです。2010/01/01(金) 20:07:18ID:rctl5BXb
割り込みベクタとか。正月でやっぱらったロートルPGが集まるスレはここか?
0440名前は開発中のものです。2010/01/01(金) 20:08:35ID:rctl5BXb
やっぱらったって酔っぱらったなw
俺も飲んでるがなww
0441名前は開発中のものです。2010/01/01(金) 20:10:31ID:+lDteCCN
でもハード寄りプログラムは面白い。
普通あんまり使わないウォッチドッグタイマ

どうしても更新したいのに処理が終わらなかったとき
これで強制的に更新したりできる
たまにはハード寄りのオブジェクトを作ってみても面白い
0442名前は開発中のものです。2010/01/01(金) 20:42:23ID:WC0TdB7O
>413で間違えて書き込んだのか知らないけど
ここは主にDXライブラリやそれに関する話をするスレなので
DXライブラリに全く関係ないPowerPCの話はやめてほしい

あとゲームではあまり意味の無い、
>427のような時期尚早な最適化を進めるのはどうかと思う
今のVC++の無償版には最適化機能が付いているし
0443名前は開発中のものです。2010/01/01(金) 20:50:31ID:+lDteCCN
考え方はx86系統でも同じなのに・・・w
0444名前は開発中のものです。2010/01/01(金) 22:16:35ID:yLIIIbHt
>>434
横レスだが、たぶんこんなかんじじゃないの

enum StatusSet{
Stat_POINSON,
Stat_PARALYSIS,
Stat_DISEASE,
Stat_CURSE,
Stat_NUM
};

bool phys_stat[Stat_NUM];
for(int i=0;i<Stat_Num;++i) phys_stat[i] = false;

あとはif( phys_stat[Stat_POISON] )とかでもswitchで振り分けてもいいし
STLのbitsetは役に立たないかな?使ったことないけど
0445名前は開発中のものです。2010/01/01(金) 22:41:12ID:qgsN6nSc
>>444
意図してたのはちょっと違った
enum StatusSet{
JUMP,
WALK,
DASH,
ATTACK,
};

bool stat[5];
if (stat[JUMP]) { 〜〜 }

という。
#まあjumpとかwalkは色々やるべきなのでintで管理すべきだが……
0446名前は開発中のものです。2010/01/01(金) 22:49:37ID:ulJ3MFDL
>>444-445
ありがとん
0447名前は開発中のものです。2010/01/01(金) 23:18:29ID:4nYhycH7
ID:+lDteCCNみたいなオナニーはブログででもやってくれ
0448名前は開発中のものです。2010/01/01(金) 23:28:38ID:/td8CeQE
私はステータスはビット演算派だ。
可読性が指摘されているが、
やり方が悪いくせに可読性が低いと決めつける奴に進歩はない。

#define JUMP (1 << 0)
#define WALK (1 << 1)
#define DASH (1 << 2)
#define ATTACK (1 << 3)

unsigned long stat;

if (stat & WALK) { 〜〜 }

↓ジャンプアタック
if (stat & (JUMP | ATTACK)) { 〜〜 }

-----------------------------------------------

Cをアセンブラ視点で見られるかどうかは重要だと思うが、
今は最適化のレベルが上がっているので、
>>427のようなロートルな話は意味がないと思う。
0449名前は開発中のものです。2010/01/01(金) 23:30:56ID:+lDteCCN
なんかコンパイラを優秀な最適化屋と思ってるのがいるが、

logとビットシフトでは10秒も差がある。
0450名前は開発中のものです。2010/01/01(金) 23:57:47ID:1cbp2whq
言ってることの半分もわからないけど
DXライブラリと無関係なのはわかる
0451名前は開発中のものです。2010/01/02(土) 00:16:20ID:ek4oo2Ge
まあこいつプログラム板ゲ製板どこにでも湧くキチガイなんだけどな
0452名前は開発中のものです。2010/01/02(土) 00:26:34ID:08xjavwk
どうせたいがい描画がボトルネックになるから細かいことを気にしてもほとんど意味がない
0453名前は開発中のものです。2010/01/02(土) 00:27:36ID:HeY6umvi
>logとビットシフトでは10秒も差がある。
0454名前は開発中のものです。2010/01/02(土) 00:33:31ID:08xjavwk
実際に表に出てくるパフォーマンスっていうのは「積み重ね」じゃないからな
細かいことはIOや描画の桁違いのコストで吹き飛ぶ
0455名前は開発中のものです。2010/01/02(土) 00:36:42ID:txdXna1V
コミケ終わったとたん速度はえ〜〜〜w
>>405
ありがとです
行表示できました
まだ、便利な機能があればおしえてほしいです。
0456名前は開発中のものです。2010/01/02(土) 11:44:35ID:Ab6bZvqB
>logとビットシフトでは10秒も差がある。

10秒って・・・・・・Z80とかクロック4Mhzの時代の話ですか?
0457ひらしょ2010/01/02(土) 13:50:19ID:xqJ6LKWH
流れさえぎってすまないが、ゲームプログラマになる前に云々の著者です。
シングルトンがああなのは、getInstanceの速度をあげるため。
if一回減らせる。描画APIラッパとかだとここ重要。
create二回で死ぬのも「二回呼んじゃダメ!」と言いながら
assertで死ぬわけで、意味のある死に方。
ゲームにおいては、
間違ったコードを書いても動き続けることは重要ではない。
間違った、あるいは非効率なコードを書いたら
すぐわかるようにしておいて、出荷までに直すべき。
0458名前は開発中のものです。2010/01/02(土) 14:03:41ID:+OdFeBMV
平山さん?SE-GA-♪
0459名前は開発中のものです。2010/01/02(土) 14:09:07ID:X1WEcwoJ
うわ、こんなスレまで見てんのかよ
老いぼれセガ社員必死だな
Seleneスレ荒したのお前だろ
0460名前は開発中のものです。2010/01/02(土) 14:09:36ID:7cOQTtto
>>459
Selene作者帰れよ
0461名前は開発中のものです。2010/01/02(土) 14:38:27ID:Y2eIfDvE
ここは有名人の集うインターネッツですね
0462名前は開発中のものです。2010/01/02(土) 14:41:47ID:+OdFeBMV
証拠うpまだー?
0463名前は開発中のものです。2010/01/02(土) 15:39:32ID:HeY6umvi
>>457>>390の書き込みに対してか

>>390はassertが何のためにあるのかも知らないただのプログラム初心者だな
スレ違いでチラシの裏にでも書くような内容を堂々と書くくらいだしな

>>459
Seleneの現行スレ、過去スレ見たけど全然荒れてないぞ
あと、お前はアンチSEGAのスレにでもいけ
0464名前は開発中のものです。2010/01/02(土) 18:47:34ID:US5QyJsT
3.01きたな
0465名前は開発中のものです。2010/01/03(日) 09:52:26ID:uXTT7Kpp
>>457 ゲームならその仕様で良いだろうね。
”ゲームプログラマになった後の〜”の執筆もよろしくお願いします
0466名前は開発中のものです。2010/01/03(日) 11:10:30ID:WXd0Gz3I
ちょっと相談なのですが、座標はfloat型で取得していて、
マップは20×15で通れるところが0、通れないところが1で2次元配列読み込み済。
自キャラは32×32の場合、DXライブラリのサンプルにあったマップとのあたり判定の例に従って

float oldX,oldY;//移動前の座標

int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);

oldX = (*it).x ;//移動前のX座標
oldY = (*it).y ;//移動前のY座標
    int x1 = (*it).x , y1 = (*it).y;
int x2 = (*it).x+32 , y2 = (*it).y+32; //右下の座標(どこで使うか考えている)

printfDx("%d,%d,%d,%d\n",x1,y1,x2,y2);

0467名前は開発中のものです。2010/01/03(日) 11:12:21ID:WXd0Gz3I
float df = GameFrame::IdouHosei(4);
if(key & PAD_INPUT_UP) (*it).y = (*it).y - df;
if(key & PAD_INPUT_DOWN) (*it).y = (*it).y + df;
if(key & PAD_INPUT_LEFT) (*it).x = (*it).x - df;
if(key & PAD_INPUT_RIGHT) (*it).x = (*it).x + df;
if((*it).x<0) (*it).x=0;
if((*it).x>608) (*it).x=608;
if((*it).y<0) (*it).y=0;
if((*it).y>448) (*it).y=448;

       x=x1/32;
y=y1/32;

if(map[y][x]==1){
(*it).x = oldX ;
(*it).y = oldY ;
}

(*it).anim->draw(0, (*it).x, (*it).y);

こんな感じにすると若干思っているのとずれるんですよね…。
当たり判定なので左上の座標と右下の座標を取得するところまでは考えたのですが、
どのようにしたら実情にあったマップとのあたり判定になると思いますか?
0468名前は開発中のものです。2010/01/03(日) 11:25:02ID:CHMCqqiY
とりあえず見難いから->使っとけよ

移動させてから戻すんじゃなくて、二次元配列のマップチップなら移動先が0かどうか判定するほうがいいんじゃね
0469名前は開発中のものです。2010/01/03(日) 11:26:09ID:mNxKxxAQ
>>467
>こんな感じにすると若干思っているのとずれるんですよね…。
ちょっと分かりづらいので、何が原因でどういう風にずれるのか詳しく教えて。
0470名前は開発中のものです。2010/01/03(日) 11:44:39ID:WXd0Gz3I
>>469
うまく言えないのですが、ぶつかるべきところでぶつからないで食い込んで止まったりする、という感じでしょうか・・・。
あと、通行可のはずのところに入れなかったり。
マップに入れるところ、入れないところを作りたいのですが。
0471名前は開発中のものです。2010/01/03(日) 11:52:19ID:v00n4e/G


何でもそうだが、

条件判定は少なければ少ないほどよい。
っていうか現場でifififififififififififififififif重ねる奴は怒られる。

switch-caseで済む場合もあれば
ビットシフトで済む場合もある

俺はswitch-case大嫌い
下に来るまでクロックを食いながら来るからだ
だから個人的にはビット演算以外認めない
ビット演算なら、立てておけば何が来ても一瞬だからだ
0472名前は開発中のものです。2010/01/03(日) 12:06:18ID:v00n4e/G
ビット演算が嫌いだったり何らかの理由でどうしてもswitch-caseにしなければならないのなら
ステータスに数字を割り振って、その値が指すものに直に飛ばしてもよい

擬似テーブル方式だな
内心嫌だった

とにかく、ifififififififififififififififififififififififififififififififififififififififififififififififififififififififififififififififififififififif重ねるのは見た目にもよくないし
実行速度的にも良くないので絶対に改めるべきだ。
単純なswitch-caseも絶対に避けるべきだ。10項目あったら10項目めに来るまで最低11クロックかかる。
11クロックもあったらシェーダを3回も回せる。
じつにもったいない話だ。
0473名前は開発中のものです。2010/01/03(日) 12:07:15ID:aWVerO1p
まず

x=x1/32;
y=y1/32;

x=x1/20;
y=y1/15;

じゃないか?

その上でマップに当たった場合、
ギリギリまでキャラクタを移動させる処理が足りない。
それをやらないと、キャラクタがブルブル震える。

あと変数の名前をもうちょっと考えてやろうな。
配列の引数に渡すセル番号の値がキャラ座標と同じx,yはひどい。
規格が違う。
0474名前は開発中のものです。2010/01/03(日) 12:10:36ID:CHMCqqiY
とりあえずマップが格子状ならキャラクターのx,yも同じ値で管理すべき
実際の位置は表示部分で考えるか、滑らかな動きがいいなら別途キャラクター表示x,yを用意して補正してやる
0475名前は開発中のものです。2010/01/03(日) 12:15:25ID:mNxKxxAQ
>ちょっと相談なのですが
という言い回しだったので「アルゴリズムを提案してほしい」ということかと思ったのに、実は「バグを見つけて下さい」ということだったとは・・・
>>473で解決だな。
0476名前は開発中のものです。2010/01/03(日) 13:43:46ID:+Y7mHkgr
お前ら馬鹿か
自キャラは32×32だから/32でいいだろ
出鱈目教えんなよw

それと
if(map[y][x]==1){
(*it).x = oldX ;
(*it).y = oldY ;
}
となってるが
それはキャラの左上しか減り込みチェックしてないから
int x2 = (*it).x+32 , y2 = (*it).y+32 は
int x2 = (*it).x+31 , y2 = (*it).y+31 に変えて
map[y1][x1], map[y1][x2], map[y2][x1], map[y2][x2] をチェックしてやらんといかん
他も変えるべき個所はあるがとりあえずここまで
0477名前は開発中のものです。2010/01/03(日) 13:47:15ID:+Y7mHkgr
間違えたw
>map[y1][x1], map[y1][x2], map[y2][x1], map[y2][x2] をチェックしてやらんといかん
はなかったことね
取りあえず4隅をチェックするということ
0478名前は開発中のものです。2010/01/03(日) 14:02:44ID:+Y7mHkgr
あとね、ID:WXd0Gz3I のことやろうとするとね、結構大変だから、俺もやったけど
引き返すなら今のうちかも、特に初心者は
ある程度慣れた人ならできるだろうけど

俺の場合は下行くか上行くか左行くか右行くかによって場合わけで上の人が嫌いって言ってたswitch-caseでやったけど
まあ上手いことやればswitch-case使わなくてもできるんだろうけど
俺の場合は上行った場合は左上と右上の2隅チェック、
右行った場合は右上と右下の2隅チェック、以下略
ってやってったと思ったんだけど
0479名前は開発中のものです。2010/01/03(日) 14:31:11ID:CHMCqqiY
初心者が誤解するとアレだから一応言っておくけどswitch-caseは基本JMPだから。
0480名前は開発中のものです。2010/01/03(日) 15:24:02ID:WXd0Gz3I
あたり判定みたいに右下と左上のみの判定じゃ難しいみたいですね。
なんとなくそれっぽい動きができればそれでいいのですが…。
switch-caseも一度考えてみます。
0481名前は開発中のものです。2010/01/03(日) 16:42:55ID:TuIYpr0P
>>480
スレ斜め読みのおいらが答えると、まず、floatは辞めよう。
一度、float型で、単純な計算をさせると分るけど、floatは精度的に難がありすぎる。
使うなら、intかdoubleを。(特に今回は浮動小数点が必要なさそうだからintで十分)

あと、値が何を示しているのか?をきっちりと考える事。
(x2が、自キャラがギリギリ外れてる位置なのか?ギリギリ入っている位置なのか?)
可能なら、それぞれの名前をx1=>x_top x2=>x_under y1=>y_left y2=>y_rightとか、
ちゃんと意味する名前に・・・。

また、無意味なマジックナンバーはさっさと定数に。
static const int SQUARE_SIZE=32;とかにする。

さらに、一般的にキャラと通路がほとんど同じ大きさだと、
将棋みたいなマス目管理じゃないと、操作不可能になりやすい。
(何か絶対の理由が無ければ、キャラの処理的な大きさは7割で処理していっても問題無い。)

めんどくさいんで、人の書いたモノの紹介で濁すけど、
今回は、基本ただの四角形と四角形の判定辺りで行ける。
http://marupeke296.com/COL_main.html
の その4 のはじめの所を読めば問題解決するだろう。

0482名前は開発中のものです。2010/01/03(日) 18:04:43ID:smx+9BoV
宇宙船を舞台にしたFPSゲームを作ろうと思っています。
次のような要素を実現したいのですが・・・
@エイリアンを倒した数によって、ヒロインのおっぱいが大きくなる。
Aステージをクリアしたあと、ヒロインのおっぱいを揉める。
@に関しては、おっぱいの大きさごとのモデルを作るのではなく、DXライブラリの
プログラムで、おっぱいだけを大きくしたいです。
Aに関しては、プレイヤーの動きに応じてちゃんとおっぱいがもにもにするようにしたいです。
DXライブラリで可能でしょうか?
0483名前は開発中のものです。2010/01/03(日) 18:10:25ID:Cn7qbODV
3D?
おっぱい以前に,さすがにFPSならDXライブラリじゃなくてもっとちゃんとした3Dゲームエンジン使った方が結果的にずっと楽だよ
0484名前は開発中のものです。2010/01/03(日) 18:12:54ID:FbdCmvgh
        ,,,      ,,,,,,         : .と お 大 お エ
       _ = ~~ ``ヽ_,=''~´  ´~ヽ    :  は こ き .っ イ
    _= ~               ヽ   : 思 が く  ぱ リ
    ~=、    ミゞ、  , -彡     ヽ.  : わ ま .し. い ア
       ~=、、、Cl~evj <e~}6)_   、、、ミ : ん  し  よ を .ン
        ミ.~~ /', ゚ ;'7  ミ7ヾ~- 、  : か  い う    の
       ≡   (','゚, '.人  ゝ |  ヽ  : ね     な    命
        `=  `ー'   iノ'  | / |          ん    で
         ~ーノノノノノ'′               て



  _  ∩ピタ
(; ゚д゚)
し   |
|   |
し ⌒J



   ( ;´゚д゚)     ・・・・・・・・・
  c(,_U_U ガク



            ( ;´゚Д゚)   おっぱいは何のためにあるんだー
           c(,_U_U
 _,,..-―'"⌒"~⌒"~ ゙゙̄"'''ョ
゙~,,,....-=-‐√"゙゙T"~ ̄Y"゙=ミ
T  |   l,_,,/\ ,,/\
0485名前は開発中のものです。2010/01/03(日) 20:05:43ID:wq7ATXDp
>>482
3Dメッシュの1部分の頂点座標を変更することが出来れば可能ではないだろうか
DXLibではメッシュの中の1点の頂点情報を変更する関数が見当たりませんでした
直DirectXではLockVertexBufferで頂点情報を抜き出し、一部変更してからUnlockすれば書き換えできる
その他知る限りだとDarkBasicのSET VERTEXDATAがそれらしき機能かもしれない
自分はボーンの使い方わかないので、頂点書き換え方式でキャラのモーション作ってます
0486名前は開発中のものです。2010/01/03(日) 21:49:29ID:v00n4e/G
シェーダでやったほうが1000倍ラクだと言っておく
0487名前は開発中のものです。2010/01/04(月) 00:50:49ID:96m9JQJM
おっぱいシェーダw
■ このスレッドは過去ログ倉庫に格納されています