厨房なおいらにプログラム教えるスレ
■ このスレッドは過去ログ倉庫に格納されています
00011
02/05/28 20:36ID:pts0IQX6厨房に分かる程度優しく教えてくれた方にはお礼をイイマス
0176社内ニート ◆OpY5DDvqSw
2011/02/02(水) 20:03:29ID:QU1cQpLpいや、まじでちゃんと教えてくれよ。
教えてくれるならここでやる意味もあるってもんだけどよ・・・。
ところで、今日の16時30分ころにひらめいた。
仕事中だったのでメモ帳に書いて自宅にメールを送って、今実行。
こういうふうにやった。
なお、
機体の下の地形の当たり判定を調べる座標のことは 接地判定点 と呼ぶことにします。
用意した画像は @背景 A地形 B地形とそれ以外の部分の白黒画像 Cタンク
-----------------------------------------------------------------
・描画先を裏画面にする
以下ループ
・B白黒地形を読み込む
・接地判定点の色を得る。
・画像を消す
・@背景、A地形画像を読み込む。
・接地判定点の色が黒ならタンクの座標Yを下にすこし移動させる。
・Cタンクを表示する。
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110202200118.jpg
0177名前は開発中のものです。
2011/02/03(木) 02:38:59ID:twk/nf1hクズ過ぎワロタ
0178社内ニート ◆OpY5DDvqSw
2011/02/03(木) 08:46:28ID:/1zp6P08接地している地形に応じて機体の角度を細かく変更させたい場合はどうすればいいですか。
0180名前は開発中のものです。
2011/02/03(木) 15:01:09ID:vhC2F1F20181社内ニート ◆OpY5DDvqSw
2011/02/03(木) 19:23:19ID:/1zp6P08ところで恵方ってどっちだ。
>>179
atanの存在を教えてくれてありがとう。
でも、角度を求めるには2つの点が必要だけど、
それをどうやって求めるかってところでなやんでる。
>>180
おれもそれを考えた。
でも、getpixelって重いらしいから、多様しちゃだめだって書いてたので気になる。
しかも、実はこれが3つ目の接地点。
いつの間に2つ目の点を作ったかっていうと、
接地点が黒の場合、機体の位地はどんどん下がって、白に1ドットめり込んだ状態でとまる。
その後、横に移動して、山みたいな地形にぶつかると、中にもぐりこんでしまうので、
今度は接地店が白の場合、機体の位置をどんどん上げていくようにする。
そうすると、接地店が白と黒の間でいったり来たりする結果になるので、
接地点を縦に2つ並べて、上の点が黒で下の点が白なら機体の上下を中止するっていうふうにした。
これで、タンク1つにつき3つのgetpixel。
4:4の対戦なら12のgetpixel。
……
まあ、かんがえても仕方ないから、接地点とタンクを増やしてやってみる。
これでだめなら、当たり判定のしかたを根本的に改める必要がある。
0182社内ニート ◆OpY5DDvqSw
2011/02/03(木) 19:52:37ID:/1zp6P08Getpixel より GetPixelSoftImage のほうがいけてるぜぇ〜。
との助言をいただいたので、そっちに変更しました。
GetPixelSoftImage って、 赤 緑 青 透過度 の4つを得ることが出来ますが、
これらのうち、一つだけを得ることってできるんでしょうか。
1つだけなら処理も軽くなる気がするんですが。
0183社内ニート ◆OpY5DDvqSw
2011/02/03(木) 19:58:52ID:/1zp6P08atanを使うには、一番最初に
#include "math.h"
って書けばいい?
必須ヘッダとか書いてたけど、良く分からん。
0184社内ニート ◆OpY5DDvqSw
2011/02/03(木) 20:00:57ID:/1zp6P08while
{ }
の中に、さらにwhileって入れていい?
0185115
2011/02/03(木) 20:27:36ID:UjEDRWhXGetPixelSoftImageの重さが気になるなら
配列用意してロード時に読み込んじゃえばいい
>>183
#include <math.h>
標準ライブラリだからこう書く
>>184
自分でややこしくならないなら入れてもいい
0186社内ニート ◆OpY5DDvqSw
2011/02/03(木) 20:38:59ID:/1zp6P08じゃあ、エラーが起こってる理由は別だな。
配列って、
000000000000000
000011111100000
001100000011000
001100000011000
000011111100000
000000000000000
みたいな感じで構造体ってのを並べてマップ表示するやつだろ?
構造体の縦×横が1ドットのものを全部並べるとしんどいからだめだって
>>161の時に言ったじゃん。
0187社内ニート ◆OpY5DDvqSw
2011/02/03(木) 23:15:39ID:/1zp6P08接地点を縦に2つ増やし、
タンクを8つに増やした。
Getpixelは全部で16個。
5ミリ秒ごとに16のGetpixelをやったけど特に問題なかった。
地形との接触角度を求めるために1タンクごとにGetpixelを3つにするのは問題なさそうだぁ!
というか、やりながら思いついたんだけど、
各タンクの角度を1台のPCにやらせる必要はない。
それぞれのプレーヤーのPCに自分のタンクの角度を計算させ、
計算後の機体角度と位地座標を他のプレーヤーに渡せばいい。
0188115
2011/02/04(金) 00:15:14ID:zvmJIej4http://www.kk.iij4u.or.jp/~kondo/bmp/
ここを見て作れって言っても全然理解できてないみたいだったから
しょうないから俺が白黒画像読み込み関数を作ってやった。
俺も情報系じゃない大学生だけどC言語の基本をちゃんと勉強すれば
このくらい作れるんだよ。
http://www.nigauri.sakura.ne.jp/src/up17895.zip.html
0189名前は開発中のものです。
2011/02/04(金) 00:15:33ID:kBxB8dJD0190115
2011/02/04(金) 00:21:25ID:zvmJIej4ミスってた
fp=fopen(fileName,"r");
をfp=fopen(fileName,"rb");に直して使ってくれ。
0191社内ニート ◆OpY5DDvqSw
2011/02/04(金) 00:59:07ID:3/Y06AUgポトリス系のゲームはやったことある?
プログラムできるんなら君に任せて、
俺が画像や音の素材作りをして、共同制作しませんか?
>>188
それを使えばだいぶ軽くなりそうだな。
実際使ってみてどうなるか分からないけどわざわざありがとう。
0192社内ニート ◆OpY5DDvqSw
2011/02/04(金) 01:05:30ID:3/Y06AUggetImagePixel(x,y)
0193社内ニート ◆OpY5DDvqSw
2011/02/04(金) 01:10:44ID:3/Y06AUg>>188でいただいた物の中身を見たら、
getImagePixel(x,y)
って言う物があったんですが、これって
getpixelみたいに重くないんですか?
弾が当たったら、その部分が大きく円形にえぐれるんで、
着弾するごとにそのマップデータを書き換える必要があるんですが、
白黒画像に塗りつぶした円を描画
↓
getimagepixelを利用して配列を作る
ってやってたら死ねると思うんですが、
1と0で出来た配列に、直接円形に変化させることもできますか?
できたらかなり助かりますが。
0194社内ニート ◆OpY5DDvqSw
2011/02/04(金) 01:51:38ID:3/Y06AUg/ |
/ |
/ | x
/ |
/ |
/θ |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
y
この角度、θを求めるためには
θ = atan2 ( y , x ) ;
って書けばいけるかと思ったんですが、だめでした。
どう修正すればいいですか?
0195名前は開発中のものです。
2011/02/04(金) 03:33:52ID:IKXR4Y/u今のマシンじゃちょっとやそっとじゃ重くならないし。
速度が気になるんなら関数をラップして、
完成して余裕ができたら速い処理に置き換えるよう工夫するとかしたほうがいい。
0196社内ニート ◆OpY5DDvqSw
2011/02/04(金) 03:43:43ID:3/Y06AUg初心者に分かるように言えYo!ファッキュー!
でも、重いかどうか考えずに作ったほうがいいってのはそうだな。
人間の感覚で重いと思っても、コンピューターにとってはそれほどでもなかったりするし。
思い切って、getpixelいっぱい使っても平気だった。
どんどん作っていったほうがいい。
それで動かなかったらそのとき考えよう。
で、>>194は?
0197社内ニート ◆OpY5DDvqSw
2011/02/04(金) 03:46:24ID:3/Y06AUg「PC壊れちゃったんでしばらく作業できません」
ってことがよくあるが、ほんとにあるんだな。
俺は風呂が壊れた。
水風呂だ。
0198名前は開発中のものです。
2011/02/04(金) 03:49:52ID:cMbvhy2thttp://excel.ara3.net/func/atan2.htm
0199名前は開発中のものです。
2011/02/04(金) 05:11:15ID:IKXR4Y/u斜辺と接辺の内積を取る。単位はcosθ。
ラジアンとかで取得したかったら、内積値に逆三角関数で求められる。
0200社内ニート ◆OpY5DDvqSw
2011/02/04(金) 08:49:52ID:3/Y06AUg事故解決しました。
XとYに(double)つけたらよかった
0201115
2011/02/04(金) 15:21:47ID:zvmJIej4getImagePixelはメモリから直接読みだしてるんだからgetpixeより全然軽いはず。
http://www.nigauri.sakura.ne.jp/src/up17897.zip.html
↑は円と四角形を描画するプログラムも入れた奴
テストをあまり行ってないからバグがあったら教えてくれ
0202社内ニート ◆OpY5DDvqSw
2011/02/04(金) 19:52:36ID:3/Y06AUgこれで描く塗りつぶし円は、ビットマップ画像に描画して、その後再び
getImagePixelでビットマップを0と1の配列にするんですか?
0203115
2011/02/04(金) 20:33:30ID:zvmJIej4言ってることが良く分からんが
このプログラムはloadImageでファイルから配列bufに画像を読み込む。
fillRect、drawCircle、fillCircleでbuf内に入ってる画像に書き込む。
getImagePixelでbuf内の画像の色を取得出来る。
お前はgetPixelで白黒画像を読み込んでるみたいだからgetImagePixelに
置きかえれるはず。
0204社内ニート ◆OpY5DDvqSw
2011/02/04(金) 20:57:47ID:3/Y06AUg着弾して地形がえぐれるたびにgetimagepixelを桁違いに多用することになるから。
fillCircleでbuf内に入ってる画像に書き込んでからgetImagePixelで画像の色を取得
というのが、無駄が多すぎる気がする。
ただ、ゲーム開始時のステージデータ読み込みにはすごく有効だと思う。
あとは、着弾点をどうやって変形させるかさえなんとかなればいける。
というか、あらかじめgetpixelを使って配列を作っておけばいいね。
0205115
2011/02/04(金) 21:04:55ID:zvmJIej4fillCircleは地形を変化させる時に使えばいいだけで
getImagePixelは1回loadImageで白黒画像を読み込んじゃえば使えるよ。
0207社内ニート ◆OpY5DDvqSw
2011/02/04(金) 21:13:55ID:3/Y06AUgfillCircleを使った後にgetimagePixelを使わないと、
配列はfillCircleを使った前と後で変わらないんじゃない?って話なんだけど。
0209社内ニート ◆OpY5DDvqSw
2011/02/04(金) 21:21:22ID:3/Y06AUg0211115
2011/02/04(金) 21:30:10ID:zvmJIej40212名前は開発中のものです。
2011/02/05(土) 01:18:30ID:fuYn973Khttp://amadela.web.fc2.com/tank/
マシンスペックによっては、ちょっと重いかも。
0213社内ニート ◆OpY5DDvqSw
2011/02/05(土) 08:16:34ID:LqlwHybZ>>211
getImagePixelは
配列から値を読み取る
じゃなくて、画像から値を読み取る
じゃないの?
0214社内ニート ◆OpY5DDvqSw
2011/02/05(土) 08:21:18ID:LqlwHybZgetImagePixelで読み取り、
putImagePixelで0と1の配列に書き出す。
↓
0と1の配列が出来上がる。
↓
地形を変形させたいので、
fillCirkleでBMP画像に円を描く
↓
BMP画像は変形したが、この状態ではまだ0と1の配列はさっきと同じ状況。
↓
getImagePixelで読み取り、
putImagePixelで0と1の配列に書き出す。
↓
変形後の0と1の配列が出来上がる。
じゃないの?
0215社内ニート ◆OpY5DDvqSw
2011/02/05(土) 08:27:12ID:LqlwHybZすばらしい!
まさに基本はこれです。
地形との当たり判定はどうやってますか?
機体の角度はどうやって測定してますか?
急斜面を上れないようにするのは機体の角度で制限ですか?
0216115
2011/02/05(土) 10:14:06ID:RD4qllhr全然違う。ちゃんとプログラム読みなさい。
loadImageでファイルからBMP画像を配列bufに読み込む。
(0と1の配列が出来上がる。起動時に1回読み込めばいい。)
↓
地形を変化させたい時はfillCircleで配列内の画像に円を描きだす。
(putImagePixel、drawCircle、fillRectは書き出す形が違うだけでやってることは一緒)
↓
getPixelImageで配列bufからデータを読み取ることができる。
(配列から読み取っていて軽いので当たり判定に多用出来る。)
↓
saveImageでbuf内の画像をファイルへ出力することもできるが、
デバッグ用のおまけなので使う必要はない。
つまり画像ファイルにアクセスする関数は
loadImageとsaveImageだけだよ。
0217名前は開発中のものです。
2011/02/05(土) 10:26:39ID:fuYn973K・中心が地面 or 前後両方地面 → 真上に持ち上げる
・中心も前後とも空間 → 真下に落ちる
・前が地面で後ろが空間(もしくはその逆) → 回転させる
でやっています。
マウスホイールで画面を拡大できるので、凸凹の上で少しずつ
動かして観察するとわかりやすいと思います。
戦車を移動させるときは、単純にX軸方向に動かすのではなくて、
戦車の前後方向(回転後)の移動量を足しこむのと、
回転させたときの角度も±60度程度で制限しているのの両方で、
一定以上の傾斜が上らなくなりました。
この辺、調整が微妙なので、時々妙な挙動をするけれど実装は簡単です。
0218名前は開発中のものです。
2011/02/05(土) 10:37:29ID:fuYn973K> 回転させたときの角度も±60度程度で制限している
ではうまくいかなかったので、
「+(−)60度を超えているときは前(後)の移動操作入力を中止する」
方法に変えたのでした。
角度制限を外したので、時々絶壁に張り付いて動けなくなるみたいです。
0219社内ニート ◆OpY5DDvqSw
2011/02/05(土) 11:22:52ID:LqlwHybZやっぱり納得いきません。
>fillCircleで配列内の画像に円を描きだす。
fillCircleはやっぱり 画像に円を描き出す んでしょ?
配列の一部を直接変化させるわけじゃないんじゃ・・・。
ちょっと良く分からないのでこの話はいったんここまでにします。
画像を0と1の配列に直すアイディアをありがとうございました。
>>217
ほぼ理想どおりの動きです。
マウス操作での画面拡大や画像のスクロールはアサルトギアでもありました。
これが有るか無いかで操作性がずいぶん変わるんです。
接地を判定する点が合計3つ、
□□□ こんなふうに並んでるわけですね。
■■■なら下降
□□□なら上昇
■□□なら、反時計回りに回転。
では、回転した後の判定点は
◆
◆
◆
こんなふうに斜めになるんですか?
0220115
2011/02/05(土) 11:45:43ID:RD4qllhr俺が頑張って作ったのに使ってくれないのかよ
>画像を0と1の配列に直すアイディアをありがとうございました。
白黒画像ファイルが01の集合だってのは分かってる?
それをloadImageで配列にぶち込んでるだけだから
配列の中身は元の画像ファイルと同じまま。
だからsaveImageで配列の中身をそのまま画像ファイルに書き出すこともできる。
fillCircleは配列の中の01を書き換える関数だよ。
0221社内ニート ◆OpY5DDvqSw
2011/02/05(土) 12:24:41ID:LqlwHybZまあ、その辺は弾を打ち出す段階になってから詳しく考えます。
今回は非常に助かりました。
0222名前は開発中のものです。
2011/02/05(土) 12:44:04ID:fuYn973K単純に画像配列から判定点3箇所をサンプルしてるだけです。
したがって、戦車の幅は1ピクセルよりも大きいので、多少の凹凸は無視されます。
それが良いか悪いかは今の時点ではわかりません。
また、回転後の判定点も、斜めに並んでいるとは限らなくて、このプログラムでは、
(-w*cos(R),-w*sin(R))、 (0,0)、 (+w*cos(R),+w*sin(R))
※ wは戦車の幅半分の定数、Rは現在の回転角度変数
で計算しています。
>>219
115氏の作成したプログラムはメモリ上に確保している仮想VRAM(=配列)に、
初期状態での地面の有無を読み込み、任意点の有無判定および地形の更新をするもので、
実画面(ハードウェア)に絵を描くものではないようです。
しかし地面形状を調べる際、実画面(ハードウェア)をアクセスするよりも遥かに効率的にできます。
私も実装方法は違いますが、同じような仕組みを使っています。
ソースを丁寧に読めば、きっと参考になりますよ。
0223社内ニート ◆OpY5DDvqSw
2011/02/05(土) 14:13:31ID:LqlwHybZ参考になります。
また質問に来ると思うので、暇があったらよろしくお願いします。
0224社内ニート ◆OpY5DDvqSw
2011/02/07(月) 03:59:38ID:NY8MUqMx>>222の書き込みを参考に機体の角度を計算させようと思います。
そのまえに、floatとか、doubleとか、intについて調べないとうまいことラジアンを計算できないっぽいですが。
0225名前は開発中のものです。
2011/02/07(月) 18:13:40ID:xx8Zf2kq>>212
面白かった
0226社内ニート ◆OpY5DDvqSw
2011/02/07(月) 20:38:17ID:NY8MUqMx各員気合を入れておれに教えるように!
なお、難しいことはわからないのでできるだけ噛み砕いて説明するように!
まずはID:fuYn973Kの書き込みを見直して意味を考えよう。
0227社内ニート ◆OpY5DDvqSw
2011/02/08(火) 00:05:23ID:0uhgadeqさっぱりわからん。
まあ、じっくり考えよう。
0228社内ニート ◆OpY5DDvqSw
2011/02/08(火) 00:15:20ID:0uhgadeqどうも>>212もパーフェクトってわけじゃなかったみたい。
拡大してよく見ると、角度によっては機体が上下にぶるぶる震えてる。
とはいえ、ほぼ理想どおりだし、引き続きこれを参考に考える。
0229社内ニート ◆OpY5DDvqSw
2011/02/08(火) 02:24:13ID:0uhgadeqそれを整数に直したかったら、別に int x とか作って、
その中に代入すればおk?
四捨五入されて整数になる?
0230115
2011/02/08(火) 02:37:27ID:pf+y4WIG0231社内ニート ◆OpY5DDvqSw
2011/02/08(火) 03:13:50ID:0uhgadeq点@とAは中心を( x , y )とする円周上の点であり、地表と円が交わる点である。
なので、半径を 5 とするとそれぞれの点は
( -5*cos(r1) , -5*sin(r1) ) 、 ( 5*cos(r2) , 5*sin(r2) )
という座標であらわせるのかと思う。
点@とAの座標がわかれば、atanを使って r3(タンクの角度)が計算できる。
ではそもそも、円と地表が交わる点のラジアン、r1とr2はどうやってもとめるのか。
点@と点Aが空と地面の間にぴったりはまるまで、ラジアンをちょっとずつ変えて
繰り返し試行させる?
ちょっとごちゃごちゃしすぎてる。
>>222で言ってるのはもっと単純なことのような気がする。
そもそも角度が3つも出てくるなんて言ってないし。
0232社内ニート ◆OpY5DDvqSw
2011/02/08(火) 03:15:08ID:0uhgadeqそうですか。勉強になりました。
0233社内ニート ◆OpY5DDvqSw
2011/02/08(火) 04:22:46ID:0uhgadeq継続的に落下しているときだけ機体を水平に保つとかもやらせたいけど、それはまた次の機会に。
次は玉を発射させることと、地形を変化させることに挑戦です。
というか、いったい何時までおきてるんだおれ。
0234社内ニート ◆OpY5DDvqSw
2011/02/16(水) 20:17:05ID:6gCXsN0z0235社内ニート ◆OpY5DDvqSw
2011/02/16(水) 20:23:46ID:6gCXsN0z引き続きよろしくお願いします。
では、質問行きます。
弾飛ばしたいんだけど、弾の軌道と位置はどういう式で表せばいい?
弾は左右に吹く風でながされます。
それと、高速で弾を飛ばすと当たり判定を突き抜けることがあるかもしれない。
そのあたり考えてください。
あと、ここで人に聞くこともできず、自分で考えてもわからないのでインターフェイスつくったりしてました。
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110216201831.jpg
射撃角度を変えたり、発射ボタン(スペース)を押しつづけると下のバーが伸び縮みするようにもなりました。
0236名前は開発中のものです。
2011/02/17(木) 07:41:33ID:jsy99J9kDirectXや関連ライブラリの知識はないのでアルゴリズムの基本を地でいく。
>弾の軌道と位置はどういう式で
x方向:横からの風は弾のx方向の速度に風速の値を加減すればOKっしょ。
y方向:弾が重力で落ちる→放物線→2次関数という連想を出来るようになるべし。
>当たり判定を突き抜けることがあるかもしれない
基本は、弾が今ある座標と次に移動する座標を結ぶ直線(線分)を考えて、
その間に障害物があるかを判定していく。(中学〜高校レベルの代数幾何)
高速/低速の判断なく常時やっても問題ないだろう。(効率の良いやり方は
パフォーマンスがネックになってから考えろ)
でもこれはライブラリにありそうだな。(真偽はエライ人に聞いてくれ)
精進するでござる。ニンニン
0237社内ニート ◆OpY5DDvqSw
2011/02/18(金) 01:08:24ID:2Ex7ENec弾の軌道は2時関数の放物線軌道といっていますが、
そこに時間の概念も加えないといけません。
弾が等速で動くわけではないということが重要です。
私が最初に考えていたのは、
x=0、y=0の座標を発射地点
発射角度を r (ラジアン)
発射パワーを p
重力は 1
cx1,cy1は時間(1ループ)ごとの増加座標
cx2,cy2は弾の存在位置です
cx1=p*cos( r );
cy1=-p*sin( r );
while(以下、座標計算と表示を繰り返す)
{
cy1=cy1+1; //時間当たりの増加分、重力を加算し続ける
cx2=cx1+cx2; cy2=cy1+cy2; //弾の存在位置、cx1,cy1の累積
x=cx2 , y=cy2 に弾を表示
}
これに、重力と同じように風の影響も加えたものは以下のような結果になりました。
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110218003141.jpg
もっときれいに滑らかに表示されるように調整します。
その上で問題になるのが、やはり地形との当たり判定です。
どこで当たるのか、どのタイミングで当たるのか。それが問題です。
0238名前は開発中のものです。
2011/02/18(金) 02:09:02ID:FPQVKYtr惜しい。というか、ソース上は考え方はあってる。
普通2次関数を思い浮かべるときはxy座標系が基本だが、重力はy方向にのみ
影響するパラメータで時間tに伴う変化なので、ty座標系になる。つまり
y=at^2+bt+c (^2は階乗)
になるわけだな。これをtで微分(つまり速度)すると
cy1=2at+b (cy1は>>237 の変数ね)
となる。
0239名前は開発中のものです。
2011/02/18(金) 02:10:04ID:FPQVKYtr右辺のcy1→b
右辺の1→2a
「tはどこ行った?」と思うかもしれないが、cy1は累積して加算しているので
while()をまわして+1していることがすなわちtを掛けていることになる。
つまり無意識のうちに2次関数を使っていることになるのだ(考え方が一足飛びだけどね)。
「言葉で言うと小難しいが、ソースに落とすと結構あっさり」というのは
わりとある。(逆も然りw)
x方向にも変な加速度をつけたり、弾の座標によって+1の値を変えたりすると、
異常重力っぽくなってゲームとしてのバリエーションが増えて面白いのだが、
それはまた先の話。
この調子でどんどん行くでござる。ニンニン
0240名前は開発中のものです。
2011/02/18(金) 07:17:22ID:FPQVKYtr誤) 重力はy方向にのみ影響するパラメータで時間tに伴う変化なので、
正) 重力はy方向にのみ影響するパラメータでy方向は時間tに伴う変化なので、
誤) y=at^2+bt+c (^2は階乗)
正) y=at^2+bt+c (^2はべき乗)
0241名前は開発中のものです。
2011/02/18(金) 12:16:32ID:ZrrW6s/S0ほとんどの空間 1地表にものすごく近い空間 2地面
で移動後が0の時は高頻度なので実行速度を稼ぐためスルーし
1の時は2を通過したかを調べて突き抜けを判断し
2の時は通過した地表の点を求める
0242社内ニート ◆OpY5DDvqSw
2011/02/19(土) 10:08:49ID:XjdQQ+3S言われてみれば当たり前のことだけど気づかなかった。
つーか、二次関数とか三角関数とか高校以来10年ぶりぐらいでなつかしいw
これでうまくいきそうだ。
あと、重力加速度の単位って m/s^2 だったんだな。
最初からこれをググってれば迷わなかったかも。
風の影響も重力とまったく同じやりかたでいいや。
ということで、こういう式で弾の表示位置を計算
pはパワー rは角度 wは風 gは重力 tは時間
a = p*cos(r) b = -p*sin(r)
while()
{t++
x = t*( a + w*t )
y = t*( b + g*t )}
0243社内ニート ◆OpY5DDvqSw
2011/02/19(土) 10:13:15ID:XjdQQ+3St++で
tが1増加するごとに弾の表示位置を計算させているけど、
その間に t をもっと小刻みに増やして、当たり判定を計算すればなんとかなりそう
>>238-240
助かった。
ありがとう〜。
0244名前は開発中のものです。
2011/02/19(土) 12:35:32ID:BPXTZO+O>二次関数とか三角関数とか高校以来10年ぶりぐらいでなつかしいw
上記に複素数と行列を加えれば、今あるほぼすべてのゲームの数学的要素はコンプリート。
全部高校までに習う内容で充分。
3Dゲーム(擬似/ポリゴン)もこれらの要素だけで出来る。四元数の話があるけど、ゲームで
あればこれは各要素の組み合わせで充分。
あとはOS(Windows/DirectX等)の使い方を知ればゲームプログラマとしては一人前。
ネットワーク使うとなると、さらにその先やね。
これらのほうが数学云々よりも何倍も面倒くさい。(あまり難しくはない)
ある程度いくと Don't think, FEEL!な世界になってくる。
それとx方向の話や当たり判定についてはあえて突っ込まない。(細かいことだし、一概に間違いとも言えないので)
いろいろ試して自分がやりたいことを表現できるようになるべし。
さて、長々と書いたが拙者の講義はここまで。以降は適当にROMって
ニヤニヤしているので、踊りまくるでござる。ニンニン
0245社内ニート ◆OpY5DDvqSw
2011/02/19(土) 15:14:22ID:XjdQQ+3S>>201でうpされたようなやり方に変えてみたほうがいいかな。
0246社内ニート ◆OpY5DDvqSw
2011/02/19(土) 15:20:39ID:XjdQQ+3S0247名前は開発中のものです。
2011/02/19(土) 23:41:27.07ID:UpL2Vi1Q@弾の位置を(x,y)、弾の発射速度を(vx,vy)とする。
※(x,y)は砲台の位置から、(vx,vy)は砲台の角度から計算する。
考え方は>>242のa,bの計算方法と一緒ですが、pは1フレーム期間を基準にしています
A1回の計算ごとに、
- vyに重力加速度gyを足す(gも1フレーム期間あたりの加速度です)
-足し終えた(vx,vy)を(x,y)に加算する
-(x,y)の地面を判定する/および描画更新
を繰り返しています。
風は考慮してませんでしたが、
いくら追い風でも風速より弾丸が早くなるのは不自然かと思うので、
水平方向に加速するのではなく相対速度が一致させるように漸近させる方法にします。
つまり、毎ループごとに vx= (1-k)*vx + k*windx (kは漸近化係数)で更新します。
0248社内ニート ◆OpY5DDvqSw
2011/02/21(月) 21:43:01.40ID:3YAa7u9w何ででしょうね。
例の、通り魔予告兄弟の関係で広範囲にアク禁かかってたんでしょうか。
まあ、なんにしろ、ほんの1週間程度で解除されてよかったです。
それで、次にやってみようと思うのは、
弾の当たった地形が円形にえぐれるってことです。
0249社内ニート ◆OpY5DDvqSw
2011/02/21(月) 21:44:08.08ID:3YAa7u9wまず、地形画像(地形.bmp)と、それと同じ形の白黒画像(地形_a.bmp)を用意します。
白黒画像をアルファチャンネルとして、地形画像の何も無いところを透明にします。
さらに、白黒画像と同じ形の二次元配列を別に用意して、それで当たり判定を行います。
この配列内に直接円形の変化をつけたいんです。
[0000000111110000000]
[0000011111111100000]
[0000111111111110000]
[0000111111111110000]
[0000011111111100000]
[0000000111110000000]
[0000000000000000000]
こんな感じ。
0250社内ニート ◆OpY5DDvqSw
2011/02/21(月) 21:57:39.46ID:3YAa7u9w結論だけいいます。
白黒BMPファイルを当たり判定に利用したいので
BMPファイルなどについて質問させてください。
当たり判定用に、画像と別に2次元配列を用意するのは中止します。
0251社内ニート ◆OpY5DDvqSw
2011/02/21(月) 22:13:55.56ID:3YAa7u9w1.ファイルヘッダ
2.情報ヘッダ
3.ビットフィールド
4.カラーパレット
5.イメージデータ
というものの集まりだということはわかりました。
そして、5.イメージデータっていうのが2次元配列になってるんだろうってこともわかりました。
ここまで合ってますか?
そして、イメージデータに、 『map[640][2400]』 みたいなハンドルをつけてしまえば、
BMPファイル内のイメージデータを当たり判定用の配列としてそのまま利用できるんじゃないかと。
>>201のやってることってそういうことですか?DXライブラリじゃない書き方なんでいまいちわかりませんでした。
0252社内ニート ◆OpY5DDvqSw
2011/02/21(月) 22:28:33.49ID:3YAa7u9w0253社内ニート ◆OpY5DDvqSw
2011/02/21(月) 22:29:14.08ID:3YAa7u9w0254名前は開発中のものです。
2011/02/21(月) 22:57:16.81ID:N0QjpwZiそれによってカラーパレットがあったり、なかったりします。
本題のイメージデータですが、やはり種類ごとに格納形式が違います。
この部分を2次元配列に直接読み込んで使おうとするなら、
256色無圧縮のファイルであることを前提に、配列はchar型で確保しておくことになります。
メモリの使用量を考えると非効率的なので、あれこれ検討していくと、
>>201の方式を含めて、なんらかの方法で2次元配列を用意することになるんじゃないかと思います。
ちなみに現時点で戦車の傾きを求めるとき、ピクセルの有無の参照には何を使っていますか?
0255社内ニート ◆OpY5DDvqSw
2011/02/21(月) 23:44:32.25ID:3YAa7u9wピクセル有無の判定のために、
白黒画像とは別に用意した、2次元配列を使っています。
この配列は、
GetPixelSoftImage で、白黒画像のピクセルを一つずつ調べて、
黒なら 0、白なら 1、といった風に、fprintf でファイルに書き出していきます。
そうやって作っておいた0と1のテキストファイルを
ゲーム開始時にマップデータとして読み込んでいます。
ファイルに書き出したりしないで、
GetPixelSoftImage で、ピクセルが白か黒か調べて、いきなり配列 『map[640][2400]』 に、0と1を入れていってもよかったんですけど。
0256名前は開発中のものです。
2011/02/22(火) 00:06:54.21ID:vXGD/Hufここまでの実装をそのようにしてきて、うまく進んでいるのなら、とりあえずそのまま進めるといいと思います。
確認ですが、戦車を処理するときは、GetPixelSoftImage(x,y)ではなく、map[y][x]でアクセスしてるのですか?
もしそうだとするなら、着弾地点を中心にmapの配列を書き換え、かつ画面表示も同じようにすれば、
所望の動作をすると思います。
0257社内ニート ◆OpY5DDvqSw
2011/02/22(火) 00:21:48.52ID:s/YhWNAtそう思ったんですが、
白黒BMPにDrawCircleの塗りつぶしで描いた円と、
配列内に0と1で描いた円が、1ドットでもずれていたら、
何も見えないところに地形が存在したり、
見えている地形を突き抜けてしまったりということがおきると思いますし、
どうやって配列内に円形の変化をつけるかっていうところも、シンプルにまとまった方法が思い浮かばないので。
0258社内ニート ◆OpY5DDvqSw
2011/02/22(火) 00:27:20.13ID:s/YhWNAt戦車を処理するときはmap[y][x]を使っています。
0259社内ニート ◆OpY5DDvqSw
2011/02/22(火) 00:38:03.69ID:s/YhWNAt画面表示とmapの配列を同じように行うのが一番簡単な方法なんですけどねぇ。
できれば、
アルファチャンネル用の白黒画像と、
map[y][x]を連動させるって言うか、
白黒画像そのものがmap[y][x]、
みたいなやり方にしたい。
ゲームの土台になる部分は、ちゃんとしたものにしたいんです。
タンクの画像とか演出は多少陳腐でもでもかまわないけれど。
0260名前は開発中のものです。
2011/02/22(火) 00:56:35.31ID:vXGD/Hufvoid FillCircle(int Xc,int Yc,int R){
for(int x=-R; x<=R; x++) for(int y=-R;y<=R; y++) if(x*x+y*y<=R*R){
if(Xc+x>=0 && Xc+x<2400 && Yc+y>=0 && Yc<640){
map[Yc+y][Xc+x]= 0; // 地面判定用配列の加工
SetPixel(Xc+x,Yc+y,背景色); // 画面の(Xc+x, Yc+y)のピクセルを抜く処理
}
}
}
SetPixelと書いた部分は適宜実装する必要がありますが、
配列の0/1と画面のピクセル状態がずれる心配はないと思います。
ところで、そもそも背景に地面を重ねる処理にαチャネルを使っているなら、
地面の画像は[640][2400][4] (R,G,B,A/pixel)の配列じゃないでしょうか?
map[y][x]の代わりに、groundimage[y][x][3]を参照する方法は使えませんか?
0261社内ニート ◆OpY5DDvqSw
2011/02/22(火) 22:31:11.81ID:s/YhWNAtおお、さすがです。
2つも解決法をありがとうございます。
1つ目の方法も完璧だと思うのですが、
2つ目の方法の、αチャンネルを使った画像のグラフィックハンドルを配列として使う(?)
方法も興味深いです。
ためしに、地形画像のグラフィックハンドルを配列として扱ってみたら、
なにかエラーが出てしまいましたが、もう少しαチャンネルについて調べてみたいと思います。
ありがとうございました。
0262社内ニート ◆OpY5DDvqSw
2011/02/22(火) 22:38:21.20ID:s/YhWNAt指定のファイル名の末端に『_a』が付く画像ファイルを透明情報として自動的に読み込んでくれる
ということで、アルファチャンネルについてまったく何も知らずに使っていたので、
これを機会にすこしだけ勉強します。
たぶん、DXライブラリを使わずにアルファチャンネルを使うには
けっこう複雑なことをしないといけないんだろうなぁ。
0263社内ニート ◆OpY5DDvqSw
2011/02/22(火) 23:46:04.34ID:s/YhWNAt引き続き、map[y][x]の代わりにgroundimage[y][x][3]を参照する方法を考えていきます。
なにか、役に立ちそうなホームページとかありましたらまた教えてください。
ではまた。
0264名前は開発中のものです。
2011/02/24(木) 00:22:24.50ID:o93X2te6(1) 地表画像(RGB)および山形状(A)をLoadSoftImageで読み込む
(2) GetPixelSoftImage(handle, x,y, &r,&g,&b,&ground)で、
x.,y地点の地面の有無を判定する
(3) 地形の更新は、GetPixelSoftImageに引き続き、groundを0にして、
DrawPixelSoftImage(handle, x,y, r,g,b,ground); で書き戻す。
という手順が考えられます。
SoftImageのアルファを判定用にし、かつ地形の変形にも利用します。
敢えて配列を使わなくても、これで、事足りるのではないかと思います。
問題は更新結果を画面に反映させる方法なのですが、
リファレンスによれば、DrawSoftImageを使うか、
GreateGraphFromSoftImageでグラフィックハンドルを作ってから、
DrawGraphで描画するべきではないかと思われます。
DrawSoftImageの説明には負荷が高いようなことが書いてあるので、
いったんグラフィックハンドルを作るのが正式な手続きなのかもしれません。
また、地形の画像が2400x640と比較的大きいので、そういう時は、
CreateDivGraphFromSoftImageを使うべきなのかもしれません。
長々書いていますが、冒頭に書いたとおり、DxLibは使ったことがありません。
詳しい人、フォロー願います。
0265社内ニート ◆OpY5DDvqSw
2011/02/25(金) 01:28:00.44ID:gNKYJQnbとりあえずは、配列で当たり判定をするのにこだわらず、製作をつづけてみます。
日曜あたりに、
弾の当たった地形がえぐれるのと、
そこの当たり判定がなくなるようになるのを作ってみます。
その次は、一気に難しくなりそうですが、
ネットで対戦することを考えてみたいと思います。
0266社内ニート ◆OpY5DDvqSw
2011/02/27(日) 18:19:36.84ID:BoOhxSt8>>260の上の方法で地形の変形はうまくいきました。
DXライブラリのリファレンスを見たところ、ネット対戦を取り入れるのはやっぱり難しそうですね。
どうも、IPアドレスとか調べるのはDXライブラリだけじゃできないっぽいし。
0267社内ニート ◆OpY5DDvqSw
2011/02/27(日) 18:27:45.42ID:BoOhxSt8ホストを探したり、プレーヤー同士の交流を行うロビーみたいなものを
無料サーバーを借りて作ろうと思います。
0268名前は開発中のものです。
2011/02/28(月) 22:28:30.01ID:g0je8oOR0269社内ニート ◆OpY5DDvqSw
2011/03/01(火) 23:45:55.00ID:uZgo1Fuw絶対やるべきっていうならそうするけど、
ネット対戦前提で2人対戦ってところから作ったほうがよくない?
ひとつのパソコンで対戦って、ターンが交互に回ってくるようにするだけでいいし。
0270名前は開発中のものです。
2011/03/02(水) 00:52:26.76ID:jsVU/WxL実現するのが一般的なひと区切り。
TCP/IPの基礎知識(socket利用あたりまで)があるのならこの時点でネット対応やっちゃってもいいけどその力量がワカラン。
ロビーサーバ構築となるとさらに別世界。規模/機能にもよるけどね
0271名前は開発中のものです。
2011/03/02(水) 13:34:35.92ID:BF83P3je0272名前は開発中のものです。
2011/03/02(水) 21:25:02.39ID:/NOpHlDA戦車が2台出るだけでも色々問題が出てくるだろうし。
それと、とりあえず>>108まで完成したのなら一度見てみたい。
0273社内ニート ◆OpY5DDvqSw
2011/03/03(木) 19:44:40.68ID:eZVnKNXfF5押したらデバッグはできるけど、
アプリケーションに作り上げる方法教えてください。
0274名前は開発中のものです。
2011/03/03(木) 22:11:29.10ID:k5LomlRLデフォルトならプロジェクトフォルダ内にReleaseかDebugのフォルダがあるでしょ。
0275社内ニート ◆OpY5DDvqSw
2011/03/04(金) 20:02:56.37ID:Vy+gp0Dpゲームが起動するものはありませんでした。
方法がわかったらうpすることがあるかもしれません。
それで、もっと細部まで作ってからネット対戦を考えたらどうかという意見ばかりのようですが、
後の細かいところというのは、一つ一つやっていけば自分だけでもできそうなことだと思うので
ネット対戦の部分をどういう風に作るのか、考えていきたいと思います。
■ このスレッドは過去ログ倉庫に格納されています