[表示 : 全て 最新50 1-99 101- 201- 301- 2ch.scのread.cgiへ]
Update time : 11/05 08:46 / Filesize : 87 KB / Number-of Response : 302
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

厨房なおいらにプログラム教えるスレ



1 名前: [02/05/28 20:36 ID:pts0IQX6.net]
ゲームの改造、製作等のプログラムに興味をもっています。
厨房に分かる程度優しく教えてくれた方にはお礼をイイマス

152 名前:社内ニート ◆OpY5DDvqSw [2011/01/31(月) 23:56:32 ID:XYfTEsg4.net]
あるホームページで、以下の様な説明がありました。


> まず適当なグラフィックファイルを以下のフォルダにコピー等で入れてください。
>
>    VisualC++6.0 又は VisualStudio.net の場合
>       サンプルプログラム用フォルダ( DxSample ) の中の『VC』というフォルダ。


VisualC++2010Expressの場合、どこのフォルダに画像を入れればいいですか?

153 名前:115 mailto:sage [2011/02/01(火) 00:10:29 ID:7s78HQyQ.net]
>>151
作られたexeファイルのあるフォルダに入れて実行すればいいんじゃない?

あとDXライブラリ使うならやり方しらないからアドバイス出来ないな
俺はPCでのゲーム作りはdirectX9のコピペから初めた。
まあコピペだからdirectXの本質はあまり理解してないが
とりあえず形あるゲームは作れた。

154 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 00:37:51 ID:rB9l6gPH.net]
DXライブラリうめぇwww
これなら俺にもなんとかなるんじゃねw
>>151にあるような『VC』とかいうフォルダ探すのをあきらめて
ためしにプロジェクトフォルダに入れてみたら出来た。
でも画像サイズがでかすぎる。
調節しないと。
ってか、説明ページを読みながらやったら、
ウィンドウじゃなくて全画面表示されるようになったし。
次はウィンドウを表示させよう。

155 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 00:38:59 ID:rB9l6gPH.net]
>>152
せっかくだけど、DXライブラリでやるわ。
わるいね。
協力ありがとう。

156 名前:115 mailto:sage [2011/02/01(火) 00:41:18 ID:7s78HQyQ.net]
ちゃんとお礼を言えたのか
とりあえず傍観しようかな

157 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 00:48:18 ID:rB9l6gPH.net]
>>155
お前の書き込みは一切役に立ってねぇんだよ。
いてもいなくても同じだからとっととうせろwww
とか言ったら荒れるからな。
俺大人すぎwww

158 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 01:47:16 ID:rB9l6gPH.net]
というのは冗談です。

水平な地形を表示して、
自機を表示して、
自機が左右に動くようにしました。

自機が残像みたいになるので、
1ループするごとに画像が消えるようにしました。
そうしたら地形も消えました。

地形画像と自機を別のレイヤーに表示させることって出来ませんか?
レイヤーってのがないんでしょうか。

159 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 02:28:37 ID:rB9l6gPH.net]
>>145の、水平な地面を移動させるのと、地面と画面の端の当たり判定はできた。

160 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 02:31:32 ID:rB9l6gPH.net]
次は、ぎざぎざの絵との当たり判定をつけることだな。

しかし、関係ないが腕が痛い。腱鞘炎?
力が入らん。



161 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 03:01:59 ID:rB9l6gPH.net]
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110201025729.jpg

右のような画像との当たり判定をつけるにはどうすればいいの。
DXライブラリで使用するべき関数とか教えて。

162 名前:名前は開発中のものです。 mailto:sage [2011/02/01(火) 10:05:09 ID:XHAImUt7.net]
>>160
透明な小さい四角をギザギザと同じような形に並べといて
その四角と当たり判定つける

163 名前:115 mailto:sage [2011/02/01(火) 12:56:55 ID:7s78HQyQ.net]
>>160
int grandY[地面の幅]; //地面のY座標
getGrandY(grandY); //地面のY座標取得
//当たり判定:charactorXは地面の左端からの座標 charactorYはキャラの下側の座標
if(charactorY>grandY[charactorX])charactorY=grandY[charactorX];


void getGrandY(int *grandY)
{
地面のY座標取得の方法
案@(難易度大、スマートさ大)
地面の画像ファイル(jpg?)を解析して座標を求める。
案A(難易度中、スマートさ中)
地形が記憶された白黒のビットマップを用意して、そこから座標を求める。
案B(難易度小、スマートさ小)
手で入力
}

164 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 20:01:32 ID:rB9l6gPH.net]
>>161
縦×横 1x1ピクセル の画像を並べるというような手作業はムリ。
もっとおおざっぱでもいいんじゃないかって思うかもしれないけど、
ミリ単位の地形の凹凸が戦略に影響するゲームだから、それはちょっと困る。

>>162
肝心の部分が分からないんですが

案@ 画像ファイルを解析して座標を求める
って具体的に何をするんですか?

案A
こういう方法を今日思いつきました。同じことですか?

今日の勤務中に、 GetPixel という関数を発見しました。
指定点の色を取得できるらしい。
これを利用して、自機の下の座標が白なら当たってる。
黒なら当たってない。
というふうにやれば複雑な地形でも当たり判定をつけることが出来ると思ったんですが、
レイヤ表示させることができないとこの方法は無理です。
白黒の地形画像の上に本物の地形画像を重ねるわけですから。
逆に言えば、レイヤ表示ができればなんとかなると思うんで、どうにかできる人がいたらどうにかしてください。

B
>>161と同じ方法ですか?
そういう書き方されても分かりません。


165 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 20:15:27 ID:rB9l6gPH.net]
レイヤ表示の仕方はお前らがどうにかしてくれるだろうから、
白黒画像の地形に当たり判定をつける作業に入る。

166 名前:115 mailto:sage [2011/02/01(火) 20:55:51 ID:7s78HQyQ.net]
>>164
@のやり方
http://ex.osaka-kyoiku.ac.jp/~j099608/test/text11.html
ここを参考にして考えよう。
ただし俺も分からんから頑張れ。
まあこの方法が完成したら白黒画像作る必要がなくなる。

Aのやり方
http://www.kk.iij4u.or.jp/~kondo/bmp/
ここを参考にして考えよう。
@より簡単だけど結構むずかしいと思うよ。

Bのやり方
grandY[0]=1px目の地面のY座標
grandY[1]=2px目の地面のY座標
.....
地面の幅の分だけこれを繰り返して入力しろ。

1番簡単だからおすすめはBだよ []
[ここ壊れてます]

168 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 21:02:22 ID:rB9l6gPH.net]
>>165
ほんとに分かってんの?

169 名前:115 mailto:sage [2011/02/01(火) 21:04:29 ID:7s78HQyQ.net]
>>163
getPixcel調べたらGDIの関数みたいだね。
GDI使ったことないから使えるか分からん。

170 名前:115 mailto:sage [2011/02/01(火) 21:06:30 ID:7s78HQyQ.net]
>>166
@は俺にも分からんって言ってるじゃん
Bがお前が1番できる確率が高い方法



171 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 21:13:29 ID:rB9l6gPH.net]
Bは>>161と同じ理由で却下。
ネコ戦車であそびおわったからそろそろ作業開始するわ。

172 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 22:39:05 ID:rB9l6gPH.net]
 //色コードを取得 
 int Cr ;
 Cr = GetPixel( tankX , tankY ) ;


GetPixelで取得した 色コード ってのがどういうもんなのかよくわからん。
#FFFFFF とかってやつかと思ったんだけど、良く分からん。

なので、取得した色コードがどんな物なのか、表示させてみたい。
どんなふうに書けばいい?

それか、白の色コードをいきなり教えてくれてもいい。


173 名前:名前は開発中のものです。 mailto:sage [2011/02/01(火) 22:50:51 ID:OfaZ5sGu.net]
>>162
上4行の方法だと水平な洞穴は作れないのと違う?

>>163
白黒画像を地形画像のαチャネル扱いしておけばレイヤー合成できるよ。

っていうか、着弾するごとに地形が変化するようにしたければ
仮想画面の取り扱いは必須だと思うよ。

>>170
COLORREFで検索するといいよ。

174 名前:115 mailto:sage [2011/02/01(火) 23:10:20 ID:7s78HQyQ.net]
>>171
>>108に洞穴作るなんて情報書いて無いじゃん

175 名前:社内ニート ◆OpY5DDvqSw [2011/02/01(火) 23:24:11 ID:rB9l6gPH.net]
>>171
ありがとうございます。
さっそくCOLORREFで調べてみます。

今現在、白黒画像をαチャンネルとして用意して、
背景が見えるようにしてるんですが、
getpicxelでαチャンネル画像の色コードを取得することは出来ないので・・・
まあ、これについては後でかんがえます。

176 名前:社内ニート ◆OpY5DDvqSw [2011/02/02(水) 01:29:59 ID:QU1cQpLp.net]
>>171
ありがとうございました。
DXライブラリ総合スレをみたり、いろいろ試して、
なんとか地形の上を動くようになりました。

方法は、
自機の下の座標の色を取得して、
黒(地形以外の場所)なら自機の位地を下げる。
白なら(地形の中にめりこんだら)自機の位地を上げる。
というものです。
一応地形の上を動いてはいますが、まったく納得がいかないので
しばらくは地形の当たり判定をうまくする方法と画像をレイヤ化する方法を探します。

それと、ここに居てもあまり有用な情報が得られ無いので
今後はDXライブラリ総合で名無しとして質問しながら製作を進めます。
進展があれば報告くらいにはきます。

ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110202012444.jpg

177 名前:115 mailto:sage [2011/02/02(水) 08:15:48 ID:XeB+1toB.net]
せっかく俺が教えてゲーム完成させようと思ってたのに詰まらん奴

178 名前:社内ニート ◆OpY5DDvqSw [2011/02/02(水) 20:03:29 ID:QU1cQpLp.net]
>>175
いや、まじでちゃんと教えてくれよ。
教えてくれるならここでやる意味もあるってもんだけどよ・・・。


ところで、今日の16時30分ころにひらめいた。
仕事中だったのでメモ帳に書いて自宅にメールを送って、今実行。
こういうふうにやった。

なお、
機体の下の地形の当たり判定を調べる座標のことは 接地判定点 と呼ぶことにします。
用意した画像は @背景 A地形 B地形とそれ以外の部分の白黒画像 Cタンク

-----------------------------------------------------------------
・描画先を裏画面にする

以下ループ
・B白黒地形を読み込む
・接地判定点の色を得る。
・画像を消す
・@背景、A地形画像を読み込む。
・接地判定点の色が黒ならタンクの座標Yを下にすこし移動させる。
・Cタンクを表示する。


ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110202200118.jpg

179 名前:名前は開発中のものです。 [2011/02/03(木) 02:38:59 ID:twk/nf1h.net]
これが人にモノを聞く奴の態度かよ
クズ過ぎワロタ

180 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 08:46:28 ID:/1zp6P08.net]
じゃあ、態度を改めるのでちゃんと教えてください。

接地している地形に応じて機体の角度を細かく変更させたい場合はどうすればいいですか。



181 名前:115 mailto:sage [2011/02/03(木) 10:57:46 ID:UjEDRWhX.net]
>>178
atanで地面の傾きの角度を求めてそれを機体の角度に反映させる。

182 名前:名前は開発中のものです。 mailto:sage [2011/02/03(木) 15:01:09 ID:vhC2F1F2.net]
設置点を2点にする。

183 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 19:23:19 ID:/1zp6P08.net]
ただいま。巻き寿司かってきたぞ。恵方向きながら食おう。
ところで恵方ってどっちだ。

>>179
atanの存在を教えてくれてありがとう。
でも、角度を求めるには2つの点が必要だけど、
それをどうやって求めるかってところでなやんでる。

>>180
 おれもそれを考えた。
でも、getpixelって重いらしいから、多様しちゃだめだって書いてたので気になる。
しかも、実はこれが3つ目の接地点。
 いつの間に2つ目の点を作ったかっていうと、
接地点が黒の場合、機体の位地はどんどん下がって、白に1ドットめり込んだ状態でとまる。
その後、横に移動して、山みたいな地形にぶつかると、中にもぐりこんでしまうので、
今度は接地店が白の場合、機体の位置をどんどん上げていくようにする。
そうすると、接地店が白と黒の間でいったり来たりする結果になるので、
接地点を縦に2つ並べて、上の点が黒で下の点が白なら機体の上下を中止するっていうふうにした。
 これで、タンク1つにつき3つのgetpixel。
4:4の対戦なら12のgetpixel。
……
まあ、かんがえても仕方ないから、接地点とタンクを増やしてやってみる。
これでだめなら、当たり判定のしかたを根本的に改める必要がある。

184 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 19:52:37 ID:/1zp6P08.net]
あと、総合スレで

Getpixel より GetPixelSoftImage のほうがいけてるぜぇ〜。

との助言をいただいたので、そっちに変更しました。
GetPixelSoftImage って、 赤 緑 青 透過度 の4つを得ることが出来ますが、
これらのうち、一つだけを得ることってできるんでしょうか。
1つだけなら処理も軽くなる気がするんですが。

185 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 19:58:52 ID:/1zp6P08.net]
後一つ、
atanを使うには、一番最初に

#include "math.h"

って書けばいい?
必須ヘッ

186 名前:_とか書いてたけど、良く分からん。 []
[ここ壊れてます]

187 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 20:00:57 ID:/1zp6P08.net]
さらに質問。
while
{ }

の中に、さらにwhileって入れていい?

188 名前:115 mailto:sage [2011/02/03(木) 20:27:36 ID:UjEDRWhX.net]
>>182
GetPixelSoftImageの重さが気になるなら
配列用意してロード時に読み込んじゃえばいい

>>183
#include <math.h>
標準ライブラリだからこう書く

>>184
自分でややこしくならないなら入れてもいい

189 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 20:38:59 ID:/1zp6P08.net]
whileの中にwhile入れてもいいのか。
じゃあ、エラーが起こってる理由は別だな。

配列って、
000000000000000
000011111100000
001100000011000
001100000011000
000011111100000
000000000000000
みたいな感じで構造体ってのを並べてマップ表示するやつだろ?
構造体の縦×横が1ドットのものを全部並べるとしんどいからだめだって
>>161の時に言ったじゃん。

190 名前:社内ニート ◆OpY5DDvqSw [2011/02/03(木) 23:15:39 ID:/1zp6P08.net]
地表での上下動をふせぐために、
接地点を縦に2つ増やし、
タンクを8つに増やした。
Getpixelは全部で16個。
5ミリ秒ごとに16のGetpixelをやったけど特に問題なかった。

地形との接触角度を求めるために1タンクごとにGetpixelを3つにするのは問題なさそうだぁ!

というか、やりながら思いついたんだけど、
各タンクの角度を1台のPCにやらせる必要はない。
それぞれのプレーヤーのPCに自分のタンクの角度を計算させ、
計算後の機体角度と位地座標を他のプレーヤーに渡せばいい。



191 名前:115 mailto:sage [2011/02/04(金) 00:15:14 ID:zvmJIej4.net]
>>187
www.kk.iij4u.or.jp/~kondo/bmp/
ここを見て作れって言っても全然理解できてないみたいだったから
しょうないから俺が白黒画像読み込み関数を作ってやった。
俺も情報系じゃない大学生だけどC言語の基本をちゃんと勉強すれば
このくらい作れるんだよ。
www.nigauri.sakura.ne.jp/src/up17895.zip.html

192 名前:名前は開発中のものです。 mailto:sage [2011/02/04(金) 00:15:33 ID:kBxB8dJD.net]
技術的に面白そうなので、自分も同じゲームを作ってみようかな

193 名前:115 mailto:sage [2011/02/04(金) 00:21:25 ID:zvmJIej4.net]
>>188
ミスってた
fp=fopen(fileName,"r");
をfp=fopen(fileName,"rb");に直して使ってくれ。

194 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 00:59:07 ID:3/Y06AUg.net]
>>189
ポトリス系のゲームはやったことある?
プログラムできるんなら君に任せて、
俺が画像や音の素材作りをして、共同制作しませんか?

>>188
それを使えばだいぶ軽くなりそうだな。
実際使ってみてどうなるか分からないけどわざわざありがとう。


195 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 01:05:30 ID:3/Y06AUg.net]
>>188でいただいた物の中身を見たら、
getImagePixel(x,y)

196 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 01:10:44 ID:3/Y06AUg.net]
失礼、途中で書き込んでしまった。

>>188でいただいた物の中身を見たら、
getImagePixel(x,y)
って言う物があったんですが、これって
getpixelみたいに重くないんですか?
弾が当たったら、その部分が大きく円形にえぐれるんで、
着弾するごとにそのマップデータを書き換える必要があるんですが、

白黒画像に塗りつぶした円を描画

getimagepixelを利用して配列を作る

ってやってたら死ねると思うんですが、
1と0で出来た配列に、直接円形に変化させることもできますか?
できたらかなり助かりますが。

197 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 01:51:38 ID:3/Y06AUg.net]
          /|
         /  |
       /   |
      /     | x
    /      |
   /        |
 /θ        |
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
      y        

この角度、θを求めるためには

θ = atan2 ( y , x ) ;

って書けばいけるかと思ったんですが、だめでした。
どう修正すればいいですか?

198 名前:名前は開発中のものです。 mailto:sage [2011/02/04(金) 03:33:52 ID:IKXR4Y/u.net]
ぶっちゃけ、重いかどうか考えずに作ったほうがいいよ。
今のマシンじゃちょっとやそっとじゃ重くならないし。
速度が気になるんなら関数をラップして、
完成して余裕ができたら速い処理に置き換えるよう工夫するとかしたほうがいい。

199 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 03:43:43 ID:3/Y06AUg.net]
>>195
初心者に分かるように言えYo!ファッキュー!
でも、重いかどうか考えずに作ったほうがいいってのはそうだな。
人間の感覚で重いと思っても、コンピューターにとってはそれほどでもなかったりするし。
思い切って、getpixelいっぱい使っても平気だった。
どんどん作っていったほうがいい。
それで動かなかったらそのとき考えよう。

で、>>194は?

200 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 03:46:24 ID:3/Y06AUg.net]
あとよ、こういう企画してると、神みたいなタイミングで

「PC壊れちゃったんでしばらく作業できません」

ってことがよくあるが、ほんとにあるんだな。
俺は風呂が壊れた。
水風呂だ。



201 名前:名前は開発中のものです。 mailto:sage [2011/02/04(金) 03:49:52 ID:cMbvhy2t.net]
ATAN2 関数
excel.ara3.net/func/atan2.htm

202 名前:名前は開発中のものです。 mailto:sage [2011/02/04(金) 05:11:15 ID:IKXR4Y/u.net]
>>194
斜辺と接辺の内積を取る。単位はcosθ。
ラジアンとかで取得したかったら、内積値に逆三角関数で求められる。

203 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 08:49:52 ID:3/Y06AUg.net]
630
事故解決しました。
XとYに(double)つけたらよかった

204 名前:115 mailto:sage [2011/02/04(金) 15:21:47 ID:zvmJIej4.net]
>>193
getImagePixelはメモリから直接読みだしてるんだからgetpixeより全然軽いはず。
www.nigauri.sakura.ne.jp/src/up17897.zip.html
↑は円と四角形を描画するプログラムも入れた奴
テストをあまり行ってないからバグがあったら教えてくれ

205 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 19:52:36 ID:3/Y06AUg.net]
ありがとうございます。
これで描く塗りつぶし円は、ビットマップ画像に描画して、その後再び
getImagePixelでビットマップを0と1の配列にするんですか?

206 名前:115 mailto:sage [2011/02/04(金) 20:33:30 ID:zvmJIej4.net]
>>202
言ってることが良く分からんが
このプログラムはloadImageでファイルから配列bufに画像を読み込む。
fillRect、drawCircle、fillCircleでbuf内に入ってる画像に書き込む。
getImagePixelでbuf内の画像の色を取得出来る。

お前はgetPixelで白黒画像を読み込んでるみたいだからgetImagePixelに
置きかえれるはず。

207 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 20:57:47 ID:3/Y06AUg.net]
それじゃ、ゲーム内にそのまま使うことはできないですね。
着弾して地形がえぐれるたびにgetimagepixelを桁違いに多用することになるから。

fillCircleでbuf内に入ってる画像に書き込んでからgetImagePixelで画像の色を取得
というのが、無駄が多すぎる気がする。

ただ、ゲーム開始時のステージデータ読み込みにはすごく有効だと思う。
あとは、着弾点をどうやって変形させるかさえなんとかなればいける。

というか、あらかじめgetpixelを使って配列を作っておけばいいね。

208 名前:115 mailto:sage [2011/02/04(金) 21:04:55 ID:zvmJIej4.net]
>>207
fillCircleは地形を変化させる時に使えばいいだけで
getImagePixelは1回loadImageで白黒画像を読み込んじゃえば使えるよ。

209 名前:115 mailto:sage [2011/02/04(金) 21:06:05 ID:zvmJIej4.net]
>>204

210 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 21:13:55 ID:3/Y06AUg.net]
んん?
fillCircleを使った後にgetimagePixelを使わないと、
配列はfillCircleを使った前と後で変わらないんじゃない?って話なんだけど。





211 名前:115 mailto:sage [2011/02/04(金) 21:18:30 ID:zvmJIej4.net]
>>207
配列の中身はfillCircleを使わないと元の画像のままだけど
何か問題あるの?

212 名前:社内ニート ◆OpY5DDvqSw [2011/02/04(金) 21:21:22 ID:3/Y06AUg.net]
fillCircke使っただけで配列の中身が変わるの?

213 名前:115 mailto:sage [2011/02/04(金) 21:21:53 ID:zvmJIej4.net]
>>209
変わるよ

214 名前:115 mailto:sage [2011/02/04(金) 21:30:10 ID:zvmJIej4.net]
てかgetImagePixelはただの配列から値を読み取るだけの関数だよ

215 名前:名前は開発中のものです。 mailto:sage [2011/02/05(土) 01:18:30 ID:fuYn973K.net]
作ってみました。
amadela.web.fc2.com/tank/

マシンスペックによっては、ちょっと重いかも。

216 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 08:16:34 ID:LqlwHybZ.net]
昨日の続きだけど、
>>211
getImagePixelは

配列から値を読み取る 
じゃなくて、画像から値を読み取る
じゃないの?


217 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 08:21:18 ID:LqlwHybZ.net]
BMP画像を
getImagePixelで読み取り、
putImagePixelで0と1の配列に書き出す。

0と1の配列が出来上がる。

地形を変形させたいので、
fillCirkleでBMP画像に円を描く

BMP画像は変形したが、この

218 名前:状態ではまだ0と1の配列はさっきと同じ状況。

getImagePixelで読み取り、
putImagePixelで0と1の配列に書き出す。

変形後の0と1の配列が出来上がる。

じゃないの?
[]
[ここ壊れてます]

219 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 08:27:12 ID:LqlwHybZ.net]
>>212
すばらしい!
まさに基本はこれです。
地形との当たり判定はどうやってますか?
機体の角度はどうやって測定してますか?
急斜面を上れないようにするのは機体の角度で制限ですか?


220 名前:115 mailto:sage [2011/02/05(土) 10:14:06 ID:RD4qllhr.net]
>>214
全然違う。ちゃんとプログラム読みなさい。

loadImageでファイルからBMP画像を配列bufに読み込む。
(0と1の配列が出来上がる。起動時に1回読み込めばいい。)

地形を変化させたい時はfillCircleで配列内の画像に円を描きだす。
(putImagePixel、drawCircle、fillRectは書き出す形が違うだけでやってることは一緒)

getPixelImageで配列bufからデータを読み取ることができる。
(配列から読み取っていて軽いので当たり判定に多用出来る。)

saveImageでbuf内の画像をファイルへ出力することもできるが、
デバッグ用のおまけなので使う必要はない。


つまり画像ファイルにアクセスする関数は
loadImageとsaveImageだけだよ。



221 名前:名前は開発中のものです。 mailto:sage [2011/02/05(土) 10:26:39 ID:fuYn973K.net]
戦車の足元3点(中心と前後の角。回転後で計算)の有無を調べて、
・中心が地面 or 前後両方地面 → 真上に持ち上げる
・中心も前後とも空間 → 真下に落ちる
・前が地面で後ろが空間(もしくはその逆) → 回転させる
でやっています。
マウスホイールで画面を拡大できるので、凸凹の上で少しずつ
動かして観察するとわかりやすいと思います。

戦車を移動させるときは、単純にX軸方向に動かすのではなくて、
戦車の前後方向(回転後)の移動量を足しこむのと、
回転させたときの角度も±60度程度で制限しているのの両方で、
一定以上の傾斜が上らなくなりました。
この辺、調整が微妙なので、時々妙な挙動をするけれど実装は簡単です。

222 名前:名前は開発中のものです。 mailto:sage [2011/02/05(土) 10:37:29 ID:fuYn973K.net]
あ、違った。

> 回転させたときの角度も±60度程度で制限している
ではうまくいかなかったので、
「+(−)60度を超えているときは前(後)の移動操作入力を中止する」
方法に変えたのでした。

角度制限を外したので、時々絶壁に張り付いて動けなくなるみたいです。

223 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 11:22:52 ID:LqlwHybZ.net]
>>216
やっぱり納得いきません。
>fillCircleで配列内の画像に円を描きだす。
fillCircleはやっぱり 画像に円を描き出す んでしょ?
配列の一部を直接変化させるわけじゃないんじゃ・・・。
ちょっと良く分からないのでこの話はいったんここまでにします。
画像を0と1の配列に直すアイディアをありがとうございました。

>>217
ほぼ理想どおりの動きです。
マウス操作での画面拡大や画像のスクロールはアサルトギアでもありました。
これが有るか無いかで操作性がずいぶん変わるんです。

接地を判定する点が合計3つ、
□□□ こんなふうに並んでるわけですね。

■■■なら下降
□□□なら上昇
■□□なら、反時計回りに回転。

では、回転した後の判定点は
   ◆
  ◆

こんなふうに斜めになるんですか?

224 名前:115 mailto:sage [2011/02/05(土) 11:45:43 ID:RD4qllhr.net]
>>219
俺が頑張って作ったのに使ってくれないのかよ

>画像を0と1の配列に直すアイディアをありがとうございました。
白黒画像ファイルが01の集合だってのは分かってる?
それをloadImageで配列にぶち込んでるだけだから
配列の中身は元の画像ファイルと同じまま。
だからsaveImageで配列の中身をそのまま画像ファイルに書き出すこともできる。
fillCircleは配列の中の01を書き換える関数だよ。

225 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 12:24:41 ID:LqlwHybZ.net]
白黒画像がそもそも01の集合ってのはモノクロビットマップの場合の話なのかな?
まあ、その辺は弾を打ち出す段階になってから詳しく考えます。
今回は非常に助かりました。

226 名前:名前は開発中のものです。 mailto:sage [2011/02/05(土) 12:44:04 ID:fuYn973K.net]
3地点は並んでいる(隣接する)ピクセルとは限らなくて、
単純に画像配列から判定点3箇所をサンプルしてるだけです。

したがって、戦車の幅は1ピクセルよりも大きいので、多少の凹凸は無視されます。
それが良いか悪いかは今の時点ではわかりません。

また、回転後の判定点も、斜めに並んでいるとは限らなくて、このプログラムでは、
(-w*cos(R),-w*sin(R))、 (0,0)、 (+w*cos(R),+w*sin(R))
    ※ wは戦車の幅半分の定数、Rは現在の回転角度変数
で計算しています。

>>219
115氏の作成したプログラムはメモリ上に確保している仮想VRAM(=配列)に、
初期状態での地面の有無を読み込み、任意点の有無判定および地形の更新をするもので、
実画面(ハードウェア)に絵を描くものではないようです。
しかし地面形状を調べる際、実画面(ハードウェア)をアクセスするよりも遥かに効率的にできます。

私も実装方法は違いますが、同じような仕組みを使っています。
ソースを丁寧に読めば、きっと参考になりますよ。

227 名前:社内ニート ◆OpY5DDvqSw [2011/02/05(土) 14:13:31 ID:LqlwHybZ.net]
>>222
参考になります。
また質問に来ると思うので、暇があったらよろしくお願いします。


228 名前:社内ニート ◆OpY5DDvqSw [2011/02/07(月) 03:59:38 ID:NY8MUqMx.net]
当たり判定がなんとかうまくいきました。
>>222の書き込みを参考に機体の角度を計算させようと思います。
そのまえに、floatとか、doubleとか、intについて調べないとうまいことラジアンを計算できないっぽいですが。


229 名前:名前は開発中のものです。 mailto:sage [2011/02/07(月) 18:13:40 ID:xx8Zf2kq.net]
なんかすごいな

>>212
面白かった

230 名前:社内ニート ◆OpY5DDvqSw [2011/02/07(月) 20:38:17 ID:NY8MUqMx.net]
では!本日の作業に移る!
各員気合を入れておれに教えるように!
なお、難しいことはわからないのでできるだけ噛み砕いて説明するように!

まずはID:fuYn973Kの書き込みを見直して意味を考えよう。



231 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 00:05:23 ID:0uhgadeq.net]
ちょっと寝てた。
さっぱりわからん。
まあ、じっくり考えよう。

232 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 00:15:20 ID:0uhgadeq.net]
>>212がパーフェクトだと思って、>>217の「横に3つの判定点」について考えてたんだけど、
どうも>>212もパーフェクトってわけじゃなかったみたい。
拡大してよく見ると、角度によっては機体が上下にぶるぶる震えてる。
とはいえ、ほぼ理想どおりだし、引き続きこれを参考に考える。

233 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 02:24:13 ID:0uhgadeq.net]
cos(r)って浮動少数点ってやつで計算されるよね?
それを整数に直したかったら、別に int x とか作って、
その中に代入すればおk?
四捨五入されて整数になる?

234 名前:115 mailto:sage [2011/02/08(火) 02:37:27 ID:pf+y4WIG.net]
少数を整数に変換したら少数部は切り捨てされるよ

235 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 03:13:50 ID:0uhgadeq.net]
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110208025900.jpg

点@とAは中心を( x , y )とする円周上の点であり、地表と円が交わる点である。
なので、半径を 5 とするとそれぞれの点は
( -5*cos(r1) , -5*sin(r1) ) 、 ( 5*cos(r2) , 5*sin(r2) )
という座標であらわせるのかと思う。
点@とAの座標がわかれば、atanを使って r3(タンクの角度)が計算できる。

ではそもそも、円と地表が交わる点のラジアン、r1とr2はどうやってもとめるのか。
点@と点Aが空と地面の間にぴったりはまるまで、ラジアンをちょっとずつ変えて
繰り返し試行させる?

ちょっとごちゃごちゃしすぎてる。
>>222で言ってるのはもっと単純なことのような気がする。
そもそも角度が3つも出てくるなんて言ってないし。

236 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 03:15:08 ID:0uhgadeq.net]
>>230
そうですか。勉強になりました。

237 名前:社内ニート ◆OpY5DDvqSw [2011/02/08(火) 04:22:46 ID:0uhgadeq.net]
近似的に角度を得ることができました。
継続的に落下しているときだけ機体を水平に保つとかもやらせたいけど、それはまた次の機会に。
次は玉を発射させることと、地形を変化させることに挑戦です。
というか、いったい何時までおきてるんだおれ。

238 名前:社内ニート ◆OpY5DDvqSw [2011/02/16(水) 20:17:05 ID:6gCXsN0z.net]
テス

239 名前:社内ニート ◆OpY5DDvqSw [2011/02/16(水) 20:23:46 ID:6gCXsN0z.net]
なんかアク禁食らってたらしい。
引き続きよろしくお願いします。

では、質問行きます。

弾飛ばしたいんだけど、弾の軌道と位置はどういう式で表せばいい?
弾は左右に吹く風でながされます。
それと、高速で弾を飛ばすと当たり判定を突き抜けることがあるかもしれない。
そのあたり考えてください。

あと、ここで人に聞くこともできず、自分で考えてもわからないのでインターフェイスつくったりしてました。
ttp://218.219.242.231/~kuroneko/imgboard1/img-box/img20110216201831.jpg

射撃角度を変えたり、発射ボタン(スペース)を押しつづけると下のバーが伸び縮みするようにもなりました。

240 名前:名前は開発中のものです。 mailto:sage [2011/02/17(木) 07:41:33 ID:jsy99J9k.net]
通りすがったが、面白そうなので首を突っ込んでみる。
DirectXや関連ライブラリの知識はないのでアルゴリズムの基本を地でいく。

>弾の軌道と位置はどういう式で
x方向:横からの風は弾のx方向の速度に風速の値を加減すればOKっしょ。
y方向:弾が重力で落ちる→放物線→2次関数という連想を出来るようになるべし。

>当たり判定を突き抜けることがあるかもしれない
基本は、弾が今ある座標と次に移動する座標を結ぶ直線(線分)を考えて、
その間に障害物があるかを判定していく。(中学〜高校レベルの代数幾何)
高速/低速の判断なく常時やっても問題ないだろう。(効率の良いやり方は
パフォーマンスがネックになってから考えろ)
でもこれはライブラリにありそうだな。(真偽はエライ人に聞いてくれ)

精進するでござる。ニンニン



241 名前:社内ニート ◆OpY5DDvqSw [2011/02/18(金) 01:08:24 ID:2Ex7ENec.net]
通りすがりの方。今後ともよろしくお願いします。
弾の軌道は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
もっときれいに滑らかに表示されるように調整します。
その上で問題になるのが、やはり地形との当たり判定です。
どこで当たるのか、どのタイミングで当たるのか。それが問題です。

242 名前:名前は開発中のものです。 mailto:sage [2011/02/18(金) 02:09:02 ID:FPQVKYtr.net]
>そこに時間の概念も加えないといけません。
惜しい。というか、ソース上は考え方はあってる。
普通2次関数を思い浮かべるときはxy座標系が基本だが、重力はy方向にのみ
影響するパラメータで時間tに伴う変化なので、ty座標系になる。つまり
y=at^2+bt+c (^2は階乗)
になるわけだな。これをtで微分(つまり速度)すると
cy1=2at+b (cy1は>>237 の変数ね)
となる。

243 名前:名前は開発中のものです。 mailto:sage [2011/02/18(金) 02:10:04 ID:FPQVKYtr.net]
これを >>237のソース cy1=cy1+1 に当てはめると
右辺のcy1→b
右辺の1→2a
「tはどこ行った?」と思うかもしれないが、cy1は累積して加算しているので
while()をまわして+1していることがすなわちtを掛けていることになる。
つまり無意識のうちに2次関数を使っていることになるのだ(考え方が一足飛びだけどね)。
「言葉で言うと小難しいが、ソースに落とすと結構あっさり」というのは
わりとある。(逆も然りw)

x方向にも変な加速度をつけたり、弾の座標によって+1の値を変えたりすると、
異常重力っぽくなってゲームとしてのバリエーションが増えて面白いのだが、
それはまた先の話。

この調子でどんどん行くでござる。ニンニン

244 名前:名前は開発中のものです。 [2011/02/18(金) 07:17:22 ID:FPQVKYtr.net]
誤記ってた。

誤) 重力はy方向にのみ影響するパラメータで時間tに伴う変化なので、
正) 重力はy方向にのみ影響するパラメータでy方向は時間tに伴う変化なので、

誤) y=at^2+bt+c (^2は階乗)
正) y=at^2+bt+c (^2はべき乗)

245 名前:名前は開発中のものです。 mailto:sage [2011/02/18(金) 12:16:32 ID:ZrrW6s/S.net]
考え方としては

0ほとんどの空間 1地表にものすごく近い空間 2地面

で移動後が0の時は高頻度なので実行速度を稼ぐためスルーし
1の時は2を通過したかを調べて突き抜けを判断し
2の時は通過した地表の点を求める

246 名前:社内ニート ◆OpY5DDvqSw [2011/02/19(土) 10:08:49 ID:XjdQQ+3S.net]
xとtの二次関数 yとtの二次関数にすればよかったのか。
言われてみれば当たり前のことだけど気づかなかった。
つーか、二次関数とか三角関数とか高校以来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 )}

247 名前:社内ニート ◆OpY5DDvqSw [2011/02/19(土) 10:13:15 ID:XjdQQ+3S.net]
↑の式では
t++で
tが1増加するごとに弾の表示位置を計算させているけど、
その間に t をもっと小刻みに増やして、当たり判定を計算すればなんとかなりそう

>>238-240
助かった。
ありがとう〜。

248 名前:名前は開発中のものです。 mailto:sage [2011/02/19(土) 12:35:32 ID:BPXTZO+O.net]
>>242
>二次関数とか三角関数とか高校以来10年ぶりぐらいでなつかしいw
上記に複素数と行列を加えれば、今あるほぼすべてのゲームの数学的要素はコンプリート。
全部高校までに習う内容で充分。
3Dゲーム(擬似/ポリゴン)もこれらの要素だけで出来る。四元数の話があるけど、ゲームで
あればこれは各要素の組み合わせで充分。

あとはOS(Windows/DirectX等)の使い方を知ればゲームプログラマとしては一人前。
ネットワーク使うとなると、さらにその先やね。
これらのほうが数学云々よりも何倍も面倒くさい。(あまり難しくはない)
ある程度いくと Don't think, FEEL!な世界になってくる。

それとx方向の話や当たり判定についてはあえて突っ込まない。(細かいことだし、一概に間違いとも言えないので)
いろいろ試して自分がやりたいことを表現できるようになるべし。

さて、長々と書いたが拙者の講義はここまで。以降は適当にROMって
ニヤニヤしているので、踊りまくるでござる。ニンニン

249 名前:社内ニート ◆OpY5DDvqSw [2011/02/19(土) 15:14:22 ID:XjdQQ+3S.net]
次は当たったところを変形させるほうほうだな〜。
>>201でうpされたようなやり方に変えてみたほうがいいかな。

250 名前:社内ニート ◆OpY5DDvqSw [2011/02/19(土) 15:20:39 ID:XjdQQ+3S.net]
でも今日はやらねーけどな!



251 名前:名前は開発中のものです。 mailto:sage [2011/02/19(土) 23:41:27.07 ID:UpL2Vi1Q.net]
アク禁がやっと解除されたようなので今更ですが、参考までに、>>212では、

@弾の位置を(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は漸近化係数)で更新します。



252 名前:社内ニート ◆OpY5DDvqSw [2011/02/21(月) 21:43:01.40 ID:3YAa7u9w.net]
おお、あんたもアク禁くらってたんですか。
何ででしょうね。
例の、通り魔予告兄弟の関係で広範囲にアク禁かかってたんでしょうか。

まあ、なんにしろ、ほんの1週間程度で解除されてよかったです。

それで、次にやってみようと思うのは、
弾の当たった地形が円形にえぐれるってことです。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<87KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef