[過去ログ] ゲームプログラミング相談室【Part5】 (970レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
389: 03/08/16 10:03 ID:2rCICvIn(1/2) AAS
atan2用のテーブルの作り方がわかりません(涙
cos,sinは角度を使って作ればいいのはわかるんですが、
atanの添え字って一体何を基準に用意しているんでしょうか?

tanの逆関数なのでsin/cos(?)と思っても、
どんな範囲で値を用意すればいいのか。

ここを参考にしてるのですが、
外部リンク[html]:www.sun-inet.or.jp
肝心のテーブルが作れないのです。

0〜1までの範囲で自分の好きな少数で
<math.h>のatan()から求めて256段階に
スケーリングすればいいだけでしょうか?

頭が悪いのは重々承知しておりますので、
何卒ヒントを(;´Д`)
390: 03/08/16 10:06 ID:2rCICvIn(2/2) AAS
>0〜1までの範囲で自分の好きな少数で

すみません好きとか関係ないですね。
0〜1までの256段階の少数(float 0/255〜255/255)で、
という意味で受け取ってください。
391: 03/08/16 13:23 ID:dCYb1D0y(1) AAS
まず、0度〜45度の範囲に限定してテーブル化してみるべし。
この範囲ではθとtan(θ)はほぼ比例関係にあるから、単純な補間ですむ。
残りの角度についてはこのテーブルの参照方法を工夫するだけ。
392: 03/08/17 09:28 ID:jm7zYaU+(1) AAS
>>387
そうそれそれ!
そのネットソケットに関する、なにか参考書ないですか?
393
(6): 03/11/08 21:38 ID:eeIVVo6R(1/4) AAS
質問です。

timeGetTimeの返す値って、PC起動してから時間が立つほど不正確になるもんなんですか?

Cで音ゲーを作っていて、メッセージループはポーリングにしてます。
で、降ってくるモノとかの移動距離を
「(今のtimeGetTime()の値 - 前回ループ時のtimeGetTimeの値)/1000*1秒間に移動したい距離」
のようにして算出しているのですが、
PC起動してから長時間たっていると、動きがガクガクするのです。

ポーリングの場合の移動量の算出方法って、↑以外にもあるんでしょうか?
394
(1): 03/11/08 21:54 ID:5O2oS72Q(1/3) AAS
>timeGetTimeの返す値って、PC起動してから時間が立つほど不正確になるもんなんですか?
そんなことはないはず。

>ガクガク
それって、PC立ち上げて全く何もせずに(触らずに)しばらく置いておいて、
ゲームを立ち上げると、「最初か」らガクガクしてしまうってこと?
395
(1): 03/11/08 22:03 ID:eeIVVo6R(2/4) AAS
>>394
いえ、PCを立ち上げてから何をしていたかは関係なさそうです。
現に今、PC起動後20時間半たってますが、そのexeを起動するとやっぱりガクガクします。

PC再起動すると、スムーズに降ってくるんですよ。ちょっと念のため確認すます。
396
(1): 03/11/08 22:16 ID:5O2oS72Q(2/3) AAS
本当にtimeGetTime()が原因なの?
描画が遅くなってるとか無い?

たとえば、ハードウェアで描画してたものが、(リソースが足りなくて?)ソフトウェア
エミュレーションになってしまっているとか。
397: 03/11/08 22:30 ID:eeIVVo6R(3/4) AAS
変なこと言ってしまった…。>>395を言い直し。

現に今、PC起動後20時間半たっていて、janeとかメディアプレーヤーとか、いろいろ操作をしていて、
起動してもガクガクです。 と言いたかった。

で、新たに気が付いたことがあるんですが、
ガクガクの時に、起動していた他のアプリ(msnメッセンジャー、覚え書、UD)をいろいろ落としてから、
自分の作ったゲームを起動してみたんです。
するとガクガクがひどくなり、降ってくる一方のはずのオブジェが、逆行する始末。
振ってきたり上がったりしながら、徐々に落ちてくる感じになりました。

そして今再起動したんですが、よく見ると完全にスムーズじゃないです。
体感で、300ms毎くらいに少し「カクッ」とします。

ちなみにwin2000です。

>>396
あくまで今の知識で考えうる範囲から、timeGetTimeのせいなのかなーと思っただけです。
原因がどこにあるかまだはっきりとはわからず。
398
(1): 03/11/08 22:59 ID:5O2oS72Q(3/3) AAS
なんかありえないなぁ。
逆行したってことは、timeGetTime()の値が逆行したってことだよね?>>393の計算方式なら。
とりあえず、timeGetTime()のログでも取っておいて本当に逆行してるのかを確かめたほうがいいね。
(違うところが原因のような気がするけど…)

>ポーリングの場合の移動量の算出方法って、↑以外にもあるんでしょうか?
1秒あたりの画面更新回数を一定に保って(60回とか)、
毎回「1秒間に移動したい距離/更新回数」を座標に足すという方法。
というか、こっちのほうが一般的。
399
(2): 393 03/11/08 23:10 ID:eeIVVo6R(4/4) AAS
今、
timeGetTime()の値が前回と同じなら"a"を、
値がければ改行とその値をログに出すようにしたところ、

tgt=[3113327.000000]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
tgt=[3113343.000000]aaaaaaaaaaaaaaaaaaaaa
tgt=[3113390.000000]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
tgt=[3113405.000000]aaaaaaaaaaaaaaaaaaaaa
tgt=[3113421.000000]aaaaaaaaaaaaaaaaaaa
tgt=[3113437.000000]aaaaaaaaaaaaaaaaaaaaaaa
tgt=[3113452.000000]aaaaaaaaaaaaaaaaaaaaa
tgt=[3113468.000000]aaaaaaaaaaaaaaaaaaaaa
tgt=[3113483.000000]aaaaaaaaaaaaaaaaaa
tgt=[3113515.000000]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
tgt=[3113530.000000]aaaaaaaaaaaaaaaaaaaaa

こんな感じでした。そんなに頑張って回っていてくれたとは。
たまに長いところでカクッときてるのかなぁ…。

>>398
>1秒あたりの画面更新回数を一定に保って(60回とか)、
>毎回「1秒間に移動したい距離/更新回数」を座標に足すという方法。
その方法にしたいのですが、参考リンクとか教えていただけるとありがたいです…。
ぐぐってみたのですがいまいちうまく見つからず。
400
(2): 03/11/08 23:23 ID:/QRkzjvM(1) AAS
>393
ム板からこんにちわ

とりあえず
>「(今のtimeGetTime()の値 - 前回ループ時のtimeGetTimeの値)/1000*1秒間に移動したい距離」
このあたりの完全なソースを晒すべし。

ひとつだけ言えるのは、直線を移動するだけなら
「ある時間(今-前)で移動する距離」を加算していくより、
絶対時刻(今-基準時間)から位置を計算した方が誤差が少ないかと。

あと個人的には、そもそも音ゲーなら、
表示位置はサウンドデータの再生位置を取得した方が正しいように思える。
再生位置取得関数の精度がどうなのかと言う問題もあるけど。
401
(2): 03/11/08 23:36 ID:+YvtntdZ(1) AAS
>>399
あー。
CPU使用率100%だからうまくカウントできないんだろうか。
メインループのどこかでSleep(1)とか入れとくともう少しスムーズになるかも。
応急処置的な対処法だけど。

あと、フレームレート固定の方は、いいページ知らないのでURL提供は出来ない。
基本的には、1回の描画が早く終わりすぎたなら、その分Sleepするってことなんだけど…
位置の出し方は、>>400の方法のほうがいいと思う。
402
(1): 393 03/11/09 11:53 ID:WRV9yPc0(1/3) AA×
>>399>>401

403: 393 03/11/09 12:25 ID:WRV9yPc0(2/3) AAS
現在、起動後13時間ほどたっているがカクカク具合は起動時と大してかわらず…。
UD起動してなかったのが関係ありそう。

>>400
わざわざム板からありがとうございます。
>絶対時刻(今-基準時間)から位置を計算した方が誤差が少ないかと。
やってみます。オブジェを最初に表示したとこを基準にするか。

>表示位置はサウンドデータの再生位置を取得した方が正しいように思える。
いまいち意味がわからないんですが…。
いまのところ、譜面データとしては1小節毎に文字列(可変)を持ち、
その文字数がその小節の最大分解能で、1ならオブジェ有り、0ならオブジェなし。
例えば"10101011"だったら4分・4分・4分・8分・8分("ドンドンドンドド")といった感じです。

で、例えばBPM120(1分間に4分が120個来るスピード)なら、
1小節の長さ(2000ms) / 文字数(上の例なら8) = 250ms
250msごとに、オブジェを降らすかどうか判定する、と。

>>401
sleepじゃなくてSleepでした。おかしいと思った。
CPU使用率は4%になりましたが、やっぱりカクカクします。
フレームレート固定方法、自分で考えるand調べてみます…。
404
(1): 03/11/09 12:35 ID:6q71izTr(1) AAS
>402
>fTgt = (float)timeGetTime();
ポカーン

ものですな。
DWORDのまま計算しなさい。

>コンパイラがおかしい?
環境のせいにするのは、ギリギリまで頑張った者のみが許される事です。
限界まで自分を疑うべし。
405
(1): 03/11/09 13:07 ID:VyHZekEO(1) AAS
float型で表現できるのは、±10-38〜1038の範囲で、有効桁は7桁です。
double型では、±10-308〜10308の範囲で、有効桁は15桁です。
406: 393 03/11/09 13:23 ID:WRV9yPc0(3/3) AAS
>>404
最終的に座標(floatで持っている)の計算に使うから、最初からfloatにしてしまっていました。
ソース見直して、timeGetTime関係はすべてDROWDに直し、float使うのは座標の計算のときだけにして、
Sleep(1)もいれると、カクカクがだいぶ改善されました(完全になくなってはいない。)

>環境のせい
おっしゃるとおりです…。まだまだヘボプログラマーだなぁ。
sleepとSleepがあるとは知りませんでしたよ。

>>405
わざわざありがとうございます。
407
(1): 03/11/09 23:52 ID:P9DM5A3l(1) AAS
現在3DRPG風のマップを歩き回るプログラムを作るために、それ専用の3Dマップのデータ形式を吐ける
マップエディターを作ろうとしているんですが、いきなり行き詰まってしまいました。
3Dのマップってどういう風な形式にすればいいのでしょうか?
2Dではマップチップを用意してマップデータファイルから、必要な範囲(画面の範囲)だけを抜き出して
それを並べるだけでしたが、3Dの場合どうしたらいいのか思いつきません。
検索しても解説しているページを見つけられず、困っています。

まず、無い知恵を必死に絞って考えたのが、マップデータを、
固定物マップ(地面、建物、動かせない机・椅子)
準固定物マップ(動かせる机・椅子、アイテム)
自動物マップ(生き物、風車)
の三つにわけて、
固定物マップを2Dのようなマス目方式で主人公の座標をマス目と普通の座標で管理し、
普通の座標でマス目一個分進むごとにマップチップを読み込む方式に。
準固定物・自動物マップをマス目で管理しない方式に。
とここまで考えて主人公が視点を回したときのマス目の読み込みをどうするのか、
準固定物・自動物マップをマス目で管理しないとすればどういう方式にしたらいいのか、
など分からないことだらけになってしまいました。
どなたか解決法、もしくは基本的な3Dマップの構成を知っておられましたら
ご教示ください。

ああ、なんだかとんちんかんなことを書いてしまったかも・・・。
408: 03/11/10 03:37 ID:+mkdtdCz(1) AAS
>>407
マップだろうがobjectだろうが自分で使ってる形式でいいじゃんよ。
モデルデータと配置(シーン)データを混同してる。
カメラのカリング描画と配置(データ)を混同してる。

ポータルシステム、オクトツリーなんかで検索でもしてみれば。
つーか、そのレベルじゃ自分でtool作って3Dは無理じゃない?
409
(1): 03/11/15 00:36 ID:0SKvPsYa(1/2) AAS
キーの押し離しがイベントで飛んでくる処理系があります。
(具体的にはLinuxの/dev/input/js0)

こういう環境での同時押し検出(誤差の単独押しは無視)する際の定石などあるのでしょうか?

現在は下のようにしていますが、100000usecでは早すぎて1重押しを検出。
150000usecでは遅すぎて使えないという悲しい状態になっています。

int main(int argc,char *argv[]){
fd = open("/dev/input/js0",O_RDONLY);
ioctl(fd,JSIOCGBUTTONS,&buttons);
while(true){
 FD_ZERO(&fds);
 FD_SET(fd,&fds);
 tim.tv_usec = 100000;
 tim.tv_sec = 0;
 if(select(fd + 1,&fds,NULL,NULL,timeout)){
  read(fd,&js,sizeof(js));
 if(js.type == 1){
  button[js.number] = js.value;
  timeout = &tim;
}
 }else{ for(int i = 0;i < buttons;i++){
printf("button%d:%d ",i,button[i]);
}
printf("\n"); fflush(stdout); timeout = NULL;
}
}
return 0;
}
410
(1): [んんんんん] 03/11/15 03:25 ID:TJ14D+B6(1) AAS
C++初心者ですが・・・RPGのモンスターのステータスの初期化の仕方を教えてください。
HP,攻撃力、防御力、素早さ、exp、お金・・・
どうか皆様お願いいたします
411: 03/11/15 04:56 ID:hXpTaJGx(1) AAS
>>410
struct Teki
{
char name[17];int hp;
int atc;int def;int spd;
int exp;int money;
};

Teki teki[3]=
{
{"スライム",8,8,4,6,1,2},
{"ドラキー",10,10,5,6,2,3},
{"ドラゴン",50,80,50,30,200,100},
};
412
(1): 03/11/15 08:12 ID:QbqUtBsl(1/4) AAS
>>409
たとえばABボタン同時押しで発動するアクションがあって、Aボタンが押されその直後に
Bボタンが押されてもABボタンアクションが発動されてほしいってことかな?
(そして現状は↑の場合だとAのアクションが発動してしまうと。)

単純に、Aアクション発動中でもABが押されたらAアクションをキャンセルして、
ABアクションに移行してしまう、でいいんじゃない?
キャンセルの仕方は作ってるプログラムによるので一概には言えない。

マウスの3ボタンエミュレーションみたいにAアクションの発動を遅延させてBが入力される
かどうかを待つという方法もあるが、レスポンス悪くなるしね。
413: 03/11/15 09:25 ID:0SKvPsYa(2/2) AAS
>>412
なるほど。
ゲームというかコントローラを使ったランチャー的な物を作成しようとしているので
どちらかというと後者の発想の方がしっくり来そうです。

しかしながら、16ボタンのすべての組み合わせをチェックするとかは現実的では
無いため、どうしようかなと思案中です。
414
(1): 03/11/15 10:31 ID:QbqUtBsl(2/4) AAS
簡単に実装するなら、
・ボタン押下イベント発生したら一定時間待って
・その間に発生したイベントがあるかチェックして、あるなら読み出して
・最終的に押されたボタンの組み合わせのアプリを起動する
あたりでOKじゃないかな?

必ず遅延が発生するってのが気持ち悪いなら、もう少し工夫する必要アリ。
415
(22): 03/11/15 16:51 ID:JXJsuPxy(1/5) AAS
議論白熱中のところお邪魔します

この度アクション系ゲームを作ろうと思い立ちました
これまではボード系ゲームのリアルタイム性の少ないプログラムしかしたことのないため
複数のキャラが同時に動いて判定をする、そんな仕組みの作り方に戸惑いを覚えています

そこで質問なのですが、開発環境の関係からこのプログラムにC言語を使っています
メモリ管理が不十分な動作環境なのでに動的なメモリの確保、開放を行うと
意図しない領域へのメモリアクセスが起こりハングする可能性を考えて
オブジェクト指向の言語を使わないようにしています

しかし、このようなオブジェクトが多いプログラムの場合
やはり各キャラ毎にオブジェクトを作成しながら出ないと、個々の動作制御や
判定、動作制限などの関連付けが上手くできません
なにか良い方法、教科書、参考書などありましたらお教えください
416
(1): 03/11/15 17:42 ID:cjiALARP(1) AAS
「動的なメモリの確保、開放を行う」と
「意図しない領域へのメモリアクセスが起こりハングする」は
関係ないだろ。
417
(1): 03/11/15 18:37 ID:NMwl6EHM(1/2) AAS
オブジェクト指向の言語を使わないってのも意味不明

C++で開発できるのにC使うのはアホらしい
418
(1): 03/11/15 18:51 ID:ptxA9sKP(1/4) AAS
>>415
ぜひJavaで
>意図しない領域へのメモリアクセスが起こりハングする
プログラムを書いてみてください。
提出期限はおとといということでお願いします。
1-
あと 552 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.045s