トップページ⇒tech
1001コメント487KB

貴様ら!ブロック崩し作るので見てください

■ このスレッドは過去ログ倉庫に格納されています
0001ヒッキー@プログラミングNGNG
VBでWinAPIを使う方法がわかってきたので
作りたくなりました。

Bitbltなど使う予定ですが、細かい技術がないので、
小出しにプログラムしようと思います。
(タマが動くだけとか、キーボードで自機を動かすだけとか)

オナーニスレだけどよろしくね。
0002デフォルトの名無しさんNGNG
名スレの予感!
0003デフォルトの名無しさんNGNG
オナニでもがんばれYO!
0004デフォルトの名無しさんNGNG
「完成しない」に3万5000薬師丸ひろ子
0005ヒッキー@プログラミングNGNG
この前、軽くやってみたんですが、
タマが45度以外の方向に進むのがどうやればいいのか考え中です。

三角関数使って、傾き計算するだけでいいですかね?
とりあえず今からやってみます。
0006デフォルトの名無しさんNGNG
がんばれ。
ただ、その前に物理の勉強が必要だな。(藁
0007ヒッキー@プログラミングNGNG
あ、ヤパーリ物理の勉強しないとダメですか。

高校の数学もろくにできてないんで、難しいです。
0008デフォルトの名無しさんNGNG
三角関数?簡単なブロック崩しだったらそんなの使わんぞ
壁の反射のヒントは「ビリヤード」かな?
0009デフォルトの名無しさんNGNG
ヒント:直角で構成された世界では、玉の角度が変化するのは動いている物体に
あたった瞬間だけ。
0010デフォルトの名無しさんNGNG
てめぇ!拝見させていただきますゴルァ
00118NGNG
つーか、玉の軌道をX軸で反転すれば問題なし。
0012ヒッキー@プログラミングNGNG
>>8
ビリヤードですか…苦手です。反射がイメージできない…。

>>9
角度の変化は動いている物体にあたった瞬間だけですか。
ほおほお。

>>10
ゴルァ!よろしくお願いします。
00138NGNG
あ、Y軸軌道であればX軸を中心に軌道反転、
X軸軌道であれば、Y軸を中心に反転だな。

誤りゴメソ
00148NGNG
ttp://www2.makani.to/akutoku/upload/dat/1004858247.bmp

こんな漢字?>1氏
0015ヒッキー@プログラミングNGNG
>>14
おお、すばらしい手書きの画像をありがとうございます!
そういえばそういうの習いました…。

www.geocities.co.jp/SiliconValley/2530/block01.zip
↑ちょっと埋まってしまっておかしいですが、
 評価よろしくお願いします。ソース付き。
 いまんとこ45度です…
0016デフォルトの名無しさんNGNG
 まあ、ビリヤードは跳ね返り係数を考慮しないといけないけど、ブロック
崩しならいらないかな。
 なので、>>13に加えて動いてる自機にあたったときに、どういう処理を
するかだね。
0017デフォルトの名無しさんNGNG
>>15
ど、どうって。もっとおっきくしよーよ。
くらいしか・・・(汗
00188NGNG
いやーVBワカンネ(藁

しかし、頑張ってプログラム作っている1氏に漏れはカンドーした!
Cが少しでもわかるなら、直線描画のソースやるけどいるか?
始点と終点入れるとライン描画する関数なんだけどさ、
ブロック崩し作るなら、この知識は絶対必要にナルヨ!
Cわからんっていうなら、文章形式で説明スルヨ
0019ヒッキー@プログラミングNGNG
>>16
跳ね返り係数ですか。あとでビリヤード系のページ探して
見てみますね。ありがとう。

>>17
たしかに小さすぎた。でかくしてみます。

>>18
おー、ありがとうございます。
実は、Cはちょこっとやってるのですが、なにぶん、DOS窓で
動くのしか作れないもので…VESAのライブラリ拾って16bit色
出してみたいと思いましたが、英語の文書が読めなくて挫折しました。
ソースいただけるならかなり嬉しいです!
0020デフォルトの名無しさんNGNG
「貴様ら!」と来て、「見てください」と突然丁寧になるのにワロタ
0021デフォルトの名無しさんNGNG
つぎはとりあえず、キーボード入力でバーを動かすプログラムかな?
00228NGNG
>1氏

ttp://www2.makani.to/akutoku/upload/dat/1004860590.txt

これね。10分後には削除するのでお早めに。
0023ヒッキー@プログラミングNGNG
>>22
いただきました。どもども。
じっくり読ませていただきます。

>>21
今がんばって製作しております。
0024ヒッキー@プログラミングNGNG
www.geocities.co.jp/SiliconValley/2530/block02.zip

一応キーボードで動くようになりました。
しかしZキーとXキーです。
当たったときの跳ね返り処理はまだないです。
00258NGNG
次はバーの当たり判定とバー移動の狡猾化だな。

当たり判定は、最初は難しく考えずに、ボール画像の底辺の座標とバー画像の上辺が
交わっている時に、ボール軌道を壁と同じ処理にぶち込めばいいだけだ。

ガンバレ
0026デフォルトの名無しさんNGNG
玉の速度をX成分Y成分に分ければヨシ。
考え方の詳細は物理の教科書で力学部分を参照。
跳ね返り係数はまず跳ね返り出来たときでいいんじゃない?
0027デフォルトの名無しさんNGNG
跳ね返りのとき、単に速度符号を反転するだけだと
振動しまくって壁から抜けられなくなるときがあるので注意。
0028デフォルトの名無しさんNGNG
http://www.geocities.co.jp/HeartLand-Keyaki/7104/oha/free_8.htm
ここの、タキオンブロックっていうのを参考にしてみてください。面白いですよ。
0029デフォルトの名無しさんNGNG
お前頑張ってるので鯖を提供してやる。
ttp://takuomix.homeip.net/
0030ヒッキー@プログラミングNGNG
www.geocities.co.jp/SiliconValley/2530/block03.zip
次、うぷしました。なんとかバーから跳ね返ることに成功。
しかしたまに失敗します…

>>25
参考にさせていただきました。

>>26
ほおほお。了解しました。
物理の教科書…あるかな。

>>27
うい〜。次に実行ファイル作るとに考えてみます。

>>28
DLしてみますね。

>>29
まじですか?ありがとう。

ちょっと飯食ってきます
0031仕様書無しさんNGNG
>>5
> この前、軽くやってみたんですが、
> タマが45度以外の方向に進むのがどうやればいいのか考え中です。

http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html
を参考にせよ。(digital-devide line drawingとか呼ばれたalgorithm)

それから、90度(縦にまっすぐ)と45度の二つで、同じ速度で玉動かす事考えろや。
45度の時、1.414倍の速度になったら駄目だぞ。
時間軸と玉の移動も、線を書く時のx軸y軸と同じような間引きを考えないというこった。
0032デフォルトの名無しさんNGNG
>>1
とりあえず、「ブレセンハム」って言葉を検索してみろ。
0033デフォルトの名無しさんNGNG
ん。スレタイトルとは裏腹に良スレage
0034爺NGNG
>>31
昔の元祖ブロック崩しはそんな高尚なことやってなかったと思うが、、、
0035デフォルトの名無しさんNGNG
>>34
それは、ただ貴方が知らなかっただけだと思われ(w
0036  NGNG
>>31
それ、全然参考にならんって。(ワラ
玉の動きは角度とスピードから計算するのがヨロシ。
x = x + speed * cos(angle)
y = y + speed * sin(angle)
floatで保存しておいて、画面に描く時にintに変換せよ。
0037デフォルトの名無しさんNGNG
>1
テメェ!早く拝見させてください
0038デフォルトの名無しさんNGNG
考えてるはずだ!
角度とか。



ごめん。言ってみたかった。
0039デフォルトの名無しさんNGNG
うおぉ・・・・、初めてこのスレに気づいたが、
なんだかプログラム始めたばかりの自分を思い出すぜー!
アップしてあるアプリとか見ても、なんだか初々しくて感動するぜ!
俺にもこんな時代があったなぁ。
1さん頑張れよぉ。
0040デフォルトの名無しさんNGNG
俺もVBで肩身が狭いので、1を何気に応援したい。

キー入力について(既に知ってたらごめんね)

Private Sub Form_keydown(KeyCode As Integer, Shift As Integer)

Ebd Sub
でキー入力イベントつかってるよね?

ここで引数の KeyCode に入力されたキーが入ってて、
上下左右のキーを押した場合、
vbKeyUp
vbKeyDown
vbKeyLeft
vbKeyRight
っていう値がそれぞれ入ることになってる。

だから、
If KeyCode = vbKeyUp Then 何他羅漢多良
っていう判別式をかけば、上下左右のキーで移動処理が可能になるよ。
ほかの動作キーにもそういう値があるからヘルプで確認してみて。
ついでに俺も初心者だ。
0041ヒッキー@プログラミングNGNG
>>31
ほお、そうですよね。XとYを同時に足したら1.414倍になりますね…。
リンク先のページ、参考にさせていただきます…が、読めるかな。
あ、ソースはCか(藁

>>32
検索してみました。
割り算使わない&整数のみで可能ですか。ゲームに向いてそうですね〜。
できたら実装したいです。それにしても意外とブロック崩しって難解なんですね…。
ゲームってそういうもんでしょうか。

>>36
おお、めちゃくちゃ分かりやすいです。
ひとまず、36さんの方向で…

>>37
漏れも早く次うぷしたいんだモルァ!

>>38
計算してます。角度とか。
0042デフォルトの名無しさんNGNG
ブロック崩しの場合
横方向の速度は一定でよかったんじゃなかったっけか
0043デフォルトの名無しさんNGNG
ゲームとして成立させるためには、
キーボードのオートリピートの対策も絶対必要だな。
0044デフォルトの名無しさんNGNG
>43
メッセージキューにキー入力が残る事?
0045デフォルトの名無しさんNGNG
というかブロック崩しならマウスにすれば?
0046デフォルトの名無しさんNGNG
おいおい、意外にも名スレだな。最近珍しいぞ。
0047デフォルトの名無しさんNGNG
いやぁ、VBでやるよりC++でやるほうが手軽で簡単だと思うぞ。
一回、DirectXのライブラリ組んでしまえば、アルゴリズムは全く同じなんだから。
VBの見えないフォームにビットマップ読み込んでデバコンを指定して・・・なんてかっこ悪いからな。
0048 デフォルトの名無しさん NGNG
スレタイトルに好感が持てタ
0049デフォルトの名無しさんNGNG
衝突は
点でやるなよ
線でやれ
0050デフォルトの名無しさんNGNG
>47
VBでDirectX使えば良いのでは?
0051デフォルトの名無しさんNGNG
ブロックは4つに分解して飛び散り、その
破片にも当たり判定つけてください。
0052デフォルトの名無しさんNGNG
美女を背景にしてください。
0053デフォルトの名無しさんNGNG
自前で用意したバッファにボールからバーまで全部
自力で描画したりして、基礎を覚えるのも良いよ。
VBやDirectXのインターフェース覚えるのを頑張ってもいいが、
こっちは一生使える知識だし。
時代錯誤か?
0054デフォルトの名無しさんNGNG
>49
俺が昔VBで作ったブロック崩しが変な動作だったのは点で判定したせいだったのか。
0055デフォルトの名無しさんNGNG
4人対戦できる様にしてください。
画面を正方形にして、上下左右の各辺にプレイヤーを配置する形で。
005640=44=50NGNG
>53
連続書き込みで悪いけど、やり方教えて。
特に、自前でバッファを用意するってとこ。
VBだけで可能なの?
0057デフォルトの名無しさんNGNG
どうせAPIつかうんならCでやった方が良いと思うけど。
VBでやる利点無いよね?
0058 NGNG
>>51
中々面白そうなので、俺が作る事にした(w
剛体力学ブロック崩し。
005940=44=50=56NGNG
>57
初心者がプログラミングを勉強しやすいのが利点。
なんてったって、インタプリタだし。
0060デフォルトの名無しさんNGNG
衝突は
線でもダメなら
面でやれ
0061デフォルトの名無しさんNGNG
あれ?
1は?
0062ヒッキー@プログラミングNGNG
>>39
ありがとうございます。がんばります。
>>40
うい〜。vbKeyLeftとかで矢印つかえるようになりました!
>>47
C++ですか…MFCというのがどうもよく分からなくて放置してました。
>>49
線で衝突というのはどうしましょう?四角く範囲区切るということですか?
>>51
難しいです…
>>52
完成したあかつきにはどっかから画像探して貼り付けます。
>>53
はーい。がんばりたいと思います。
>>55
Winsockコントロール使ったことがあるので、何とかなるかも。
最後に考えます
>>61
帰ってきました。
0063デフォルトの名無しさんNGNG
ネットワーク対戦可にしてください
0064ヒッキー@プログラミングNGNG
http://www.geocities.co.jp/SiliconValley/2530/
↑次のファイルうぷしました。
 とりあえず、Y軸方向へ進むときに角度を計算しました。
 >>36氏に感謝。

>>63
なるだけがんばります。
006540NGNG
>61
あと、タイマーコントロールを使わないで、
代わりにループさせると処理が安定して早くなる。
VBのタイマーコントロールは優先度が一番低いらしいから。
で、ループ処理のなかに DoEvents と sleep をいれると、
うまくOSにも制御が戻るから。
sleep はAPIで、使い方は sleep(100)とか。
括弧の中の数字が、アプリの実行の停止時間で、1=0.001秒だったはず。
0066デフォルトの名無しさんNGNG
背景の美女を脱がしてください。
0067デフォルトの名無しさんNGNG
口調が変わってるじゃねーかゴルァ!!

似たスレどこかで見ました。
006840NGNG
バグ報告

右に移動中、右からきた玉が自機を透ける。
0069ヒッキー@プログラミングNGNG
>>65
ほおほお。sleep入れてみました。
VBのタイマーコントロールは怪しいらしいですね。
APIのGetTickCount使うようにしました。

>>66
脱がしたいです。

>>67
おもしろかったので真似しましたゴルァ!
0070ヒッキー@プログラミングNGNG
>>68
ありがとうございます。
なんか、あまり考えずに書いたので、右側が跳ね返るときも
左側が跳ね返るときも同じ処理を書いていたようです…鬱

04を再アップしました
007140NGNG
>70
了解!
俺は初心者だし、お互いがんばろう。
ついでに言うと、GetTickCountの使い方がわからん(ー_ー;
0072デフォルトの名無しさんNGNG
>>1
スレタイトルの最初が>貴様ら<で、最後が>ください<になってるので
思わずみてしまった。

伽藍とバザール的良スレ。最後までやりとげてほしい。
このスレと結果報告を兼ねるHPで有意義な情報を公開にょ
0073デフォルトの名無しさんNGNG
1、flag_x,flag_yは不要
  毎回SIN/COSを計算させずに 変数VX,VYを使う事
    ball_x = ball_x + VX;
    ball_y = ball_y + VY
  そして、壁にあたれば VX,VYを
    左右壁なら VX = -1*VX 上の壁がラケットなら VY=-1*VY と符号を変更する
  その場合-1ではなく -1.0001 のようにするとだんだん速度が大きくなって面白い


2、あたり判定は ball_x/y と VX/Y を足した後の線分との距離を使う事
   ラケットとなら線分の交差と点との距離を使え
  交差なら 交差判定で検索しろ
  点と線分の距離は
  http://pc.2ch.net/test/read.cgi/tech/1003559977/3
0074 NGNG
遅レスですまんが、
>>36
角度でやると、衝突後の反射ベクトル求めるのが大変だから、
素直にxyのベクトルでやった方がいいのでは?
応用(たとえば重力とか)やろうとしたときも、角度と長さでやると
後々困難になるしー。

>>62
線での衝突判定というのは、ボールのすり抜け防止の策です。
現在の位置と次ステップの位置の二点を結ぶ直線として、目的の線分との
交差判定を行います。
こうすると、どんなに速いボールでもブロックすり抜けなどの検出エラーは
出ませんぜ。
まあ今は壁だけの段階だからまだ関係ないけどね。
頑張ってね。
0075 NGNG
>>73
あらら、かぶった。ごめん
0076ヒッキー@プログラミングNGNG
>>71
GetTickCountは、Windowsが起動してからの時間をミリ秒単位で
返す関数のようです。引数は無しです。
で、10ms経った時間を計ろうと思ったら、現在時間から前に計った時間を
引いて、10を超えたら…みたいに書いたらいいみたいです。

>>72
はい、なんとかHPにまとめてみたいと思います。
有意義な意見をくださる方がイパーイいらっしゃるので、
僕の為にだけではもったいないです。

>>73
そうですよね。Sinとか毎回計算してたら遅くなりそうですしね。
んで、線分の交差を検索したところ、外積やら知らない単語が
出てきたので、それを調べようとして泥沼状態です…
>その場合-1ではなく -1.0001 のようにするとだんだん…
ほおほお、たしかに(藁 取り入れてみたいです。

>>74
そういうことでしたか。ようやく納得できました。
ありがとうございます!
0077デフォルトの名無しさんNGNG
線分の交差
http://piza2.2ch.net/tech/kako/996/996157997.html
0078デフォルトの名無しさんNGNG
普通のブロック崩しって、
バーの端っこにぶつかったら急角度で跳ね返る、
要するに物理法則を無視した動きをするけどその辺はどのように解決する?

その辺をどうにかしないと、
バーやブロックや壁の垂直面・水平面が全て水平だったらボールの動く角度は
常に一定になるけど……。
0079デフォルトの名無しさんNGNG
スライスで軌道が変わったりすると面白そう。
アナログなコントローラでないと無理だけど。
008040NGNG
ボールの運動量とバーの摩擦係数から、反射後のx成分を求めるの?
俺としては、物理学的なものは無視して、まずは形にすることをお勧めする。
0081デフォルトの名無しさんNGNG
そこらへんは作って楽しい所だから好きにやればいいんじゃないの?
 単純に端に8ピクセルより近ければ 端からの距離を Dとして
 VY:=-VT : VX=VX*D/8 とかでもそれなり
0082デフォルトの名無しさんNGNG
>>81
それじゃボールのスピードが変わっちゃうYO!
0083デフォルトの名無しさんNGNG
キー入力はAPIを使うこと(GetAsyncKeyState)
リアルタイムゲームでキー押下イベントを使うVBアプリは糞と呼ばれます

描画はバックバッファを使うこと
非表示のPictureコントロール(AutoRedraw=True)に全部描いてから
FromにPictureコントロールの内容をコピーしよう
0084デフォルトの名無しさんNGNG
s/From/Form/
0085デフォルトの名無しさんNGNG
貴様、ShiftKeyでバーの移動速度を倍くらいにしてください(w
>>83
キーコード
カーソルキー左 37 、カーソルキー上 38、シフトキー 16
だっけ?左右逆かも。
008685NGNG
>>85
右39だ。上は関係ないや。
逝ってくる。
0087デフォルトの名無しさんNGNG
キーコードはキー入力定数を使えば間違いない
vbKeyLeftとかってやつな
0088デフォルトの名無しさんNGNG
ところで1さんはいつプログラミング始めたの?
0089デフォルトの名無しさんNGNG
新しいファイルがアップされてた。
0090ヒッキー@プログラミングNGNG
http://www.geocities.co.jp/SiliconValley/2530/block05.zip
↑次のファイルうぷしました。なんか、めり込みます…
 線で跳ね返る処理をコピペしたら、おかしくなりました。
 タマに、斜め方向に線をいれてます。(X状に)

>>77
リンク先、参考にさせてもらいます。どもです。
>>78
そうですね〜。完成が見えてきたら考えてみます。
>>79
アルカノイドのコンパネみたいなやつあったら嬉しいんですけどね(藁
>>80
うい〜。形を作ることを考えます。
>>81
そうですね〜。まずは好きにやってみます。
>>83
う…今回うぷした分でキー入力は修正しました。さんくす。
>>85
うい。してみました。
>>87
APIでキー入力の処理をしたので、VK_LEFTに変わってしまいました。
>>88
う〜ん、どのくらいでしょう。
趣味でたまにちょくちょくするくらいで、
期間的にはだいぶ長いことやってます…。
最初はファミリーベーシックで挫折(小学生時代)
ポケコンのベーシックにはまる(中学3年〜高校生)
CとVB勉強(高校〜)みたいな。
0091デフォルトの名無しさんNGNG
>90
バグが酷いんだが、なんとかならんか?
激しく酷いぞ。
0092デフォルトの名無しさんNGNG
まだ次期尚早かもしれないけど、マスクパターンを使った
擬似スプライト処理をしたほうがいいね。ボールのフチが見えて萎える。

それからバックバッファを使わないと後々困ると思うよ。
いまのままだと、ボールやバーの移動量をふやすと軌跡がのこっちゃうでしょ。
0093デフォルトの名無しさんNGNG
それから、FormをUnloadしたときに正しく終了してないので
これは今すぐ直しなさい。
Form1_Unloadイベントに一行End書くだけでしょ。
タスクマネージャ見て驚いたよ。
0094ヒッキー@プログラミングNGNG
>>91
すいません、徐々に直していきます。
>>92
うい。了解。
前にフチを消す処理を書いたような覚えが…探してみます。
バックバッファですか。そこに書いてから実際の画面に転送ですよね。
やってみます。
>>93
ごめんなさい…ウチでもタスクマネージャ見たら溜まってたんで
焦りました。05を再アップしました。
今まで試してくださった方、大変申し訳ないです。
0095ヒッキー@プログラミングNGNG
http://www.geocities.co.jp/SiliconValley/2530/block06.zip
↑次うぷしました。
 背景になじませてみました
0096 NGNG
ちょっとおかしい部分あるけど、昨日に比べて格段に出来上がってるじゃん。
覚えるの早いねー。
ブロックの管理あたりで一騒動ありそう・・・。
何か考えてる?
0097デフォルトの名無しさんNGNG
なんかペースが早いな。
消化できてても吸収できてないと後々にひびく。
1が無理してなきゃいいが・・・
0098デフォルトの名無しさんNGNG
こんぐらいで消化不良起こすようじゃ・・・
0099デフォルトの名無しさんNGNG
>98
消化はできてるだろ。
問題は、覚えたかどうかだ。
0100デフォルトの名無しさんNGNG
100ゲット!
0101デフォルトの名無しさんNGNG
名スレ!
このスレをヴァカ学生どものテキストに使いたいくらいじゃよ。
結局GDI描画にしたのねん。
メモリ上に仮想VRAMおったてて、スクリーンにBitBltかけるライブラリとか
なら探せばいくらでもありそう。
でも、プログラム的にはGDIのBitBltと同じような処理になっちまうだがな。
まあ、ともかく1よ、テキトーにがんばってくれや。
燃え尽きんようにな。
■ このスレッドは過去ログ倉庫に格納されています