厨房なおいらにプログラム教えるスレat GAMEDEV
厨房なおいらにプログラム教えるスレ - 暇つぶし2ch256:社内ニート ◆OpY5DDvqSw
11/02/21 22:28:33.49 3YAa7u9w.net
>>249-259は無視してください。

257:社内ニート ◆OpY5DDvqSw
11/02/21 22:29:14.08 3YAa7u9w.net
>>249-250です。すみません。

258:名前は開発中のものです。
11/02/21 22:57:16.81 N0QjpwZi.net
BMPファイルには、白黒(2値)、16色、256色、フルカラーなどの種類があります。
それによってカラーパレットがあったり、なかったりします。
本題のイメージデータですが、やはり種類ごとに格納形式が違います。
この部分を2次元配列に直接読み込んで使おうとするなら、
256色無圧縮のファイルであることを前提に、配列はchar型で確保しておくことになります。
メモリの使用量を考えると非効率的なので、あれこれ検討していくと、
>>201の方式を含めて、なんらかの方法で2次元配列を用意することになるんじゃないかと思います。
ちなみに現時点で戦車の傾きを求めるとき、ピクセルの有無の参照には何を使っていますか?

259:社内ニート ◆OpY5DDvqSw
11/02/21 23:44:32.25 3YAa7u9w.net
>>254
ピクセル有無の判定のために、
白黒画像とは別に用意した、2次元配列を使っています。
この配列は、
GetPixelSoftImage で、白黒画像のピクセルを一つずつ調べて、
黒なら 0、白なら 1、といった風に、fprintf でファイルに書き出していきます。
そうやって作っておいた0と1のテキストファイルを
ゲーム開始時にマップデータとして読み込んでいます。
ファイルに書き出したりしないで、
GetPixelSoftImage で、ピクセルが白か黒か調べて、いきなり配列 『map[640][2400]』 に、0と1を入れていってもよかったんですけど。

260:名前は開発中のものです。
11/02/22 00:06:54.21 vXGD/Huf.net
この場合、白黒画像のBMPファイルと、0/1のテキストファイルの両方は、重複するんないんじゃないかと思いますが、
ここまでの実装をそのようにしてきて、うまく進んでいるのなら、とりあえずそのまま進めるといいと思います。
確認ですが、戦車を処理するときは、GetPixelSoftImage(x,y)ではなく、map[y][x]でアクセスしてるのですか?
もしそうだとするなら、着弾地点を中心にmapの配列を書き換え、かつ画面表示も同じようにすれば、
所望の動作をすると思います。

261:社内ニート ◆OpY5DDvqSw
11/02/22 00:21:48.52 s/YhWNAt.net
>>256
そう思ったんですが、
白黒BMPにDrawCircleの塗りつぶしで描いた円と、
配列内に0と1で描いた円が、1ドットでもずれていたら、
何も見えないところに地形が存在したり、
見えている地形を突き抜けてしまったりということがおきると思いますし、
どうやって配列内に円形の変化をつけるかっていうところも、シンプルにまとまった方法が思い浮かばないので。


262:社内ニート ◆OpY5DDvqSw
11/02/22 00:27:20.13 s/YhWNAt.net
追記、
戦車を処理するときはmap[y][x]を使っています。

263:社内ニート ◆OpY5DDvqSw
11/02/22 00:38:03.69 s/YhWNAt.net
今すぐ手っ取り早くできそうなのは>>256のいうとおり、
画面表示とmapの配列を同じように行うのが一番簡単な方法なんですけどねぇ。
できれば、
アルファチャンネル用の白黒画像と、
map[y][x]を連動させるって言うか、
白黒画像そのものがmap[y][x]、
みたいなやり方にしたい。
ゲームの土台になる部分は、ちゃんとしたものにしたいんです。
タンクの画像とか演出は多少陳腐でもでもかまわないけれど。


264:名前は開発中のものです。
11/02/22 00:56:35.31 vXGD/Huf.net
配列と画面を円でえぐる処理は、こんな方法はどうでしょうか?
void 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]を参照する方法は使えませんか?

265:社内ニート ◆OpY5DDvqSw
11/02/22 22:31:11.81 s/YhWNAt.net
>>260
おお、さすがです。
2つも解決法をありがとうございます。
1つ目の方法も完璧だと思うのですが、
2つ目の方法の、αチャンネルを使った画像のグラフィックハンドルを配列として使う(?)
方法も興味深いです。
ためしに、地形画像のグラフィックハンドルを配列として扱ってみたら、
なにかエラーが出てしまいましたが、もう少しαチャンネルについて調べてみたいと思います。
ありがとうございました。

266:社内ニート ◆OpY5DDvqSw
11/02/22 22:38:21.20 s/YhWNAt.net
ご存知かと思いますが、DXライブラリでは、
指定のファイル名の末端に『_a』が付く画像ファイルを透明情報として自動的に読み込んでくれる
ということで、アルファチャンネルについてまったく何も知らずに使っていたので、
これを機会にすこしだけ勉強します。
たぶん、DXライブラリを使わずにアルファチャンネルを使うには
けっこう複雑なことをしないといけないんだろうなぁ。

267:社内ニート ◆OpY5DDvqSw
11/02/22 23:46:04.34 s/YhWNAt.net
なかなか、望みの情報が見つかりませんが、
引き続き、map[y][x]の代わりにgroundimage[y][x][3]を参照する方法を考えていきます。
なにか、役に立ちそうなホームページとかありましたらまた教えてください。
ではまた。


268:名前は開発中のものです。
11/02/24 00:22:24.50 o93X2te6.net
DxLibは使ったことが無いのですが、リファレンスページを読んだところ、
(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は使ったことがありません。
詳しい人、フォロー願います。

269:社内ニート ◆OpY5DDvqSw
11/02/25 01:28:00.44 gNKYJQnb.net
いろいろとアイディアを出していただいてありがとうございます。
とりあえずは、配列で当たり判定をするのにこだわらず、製作をつづけてみます。
日曜あたりに、
弾の当たった地形がえぐれるのと、
そこの当たり判定がなくなるようになるのを作ってみます。
その次は、一気に難しくなりそうですが、
ネットで対戦することを考えてみたいと思います。

270:社内ニート ◆OpY5DDvqSw
11/02/27 18:19:36.84 BoOhxSt8.net
URLリンク(218.219.242.231)
>>260の上の方法で地形の変形はうまくいきました。
DXライブラリのリファレンスを見たところ、ネット対戦を取り入れるのはやっぱり難しそうですね。
どうも、IPアドレスとか調べるのはDXライブラリだけじゃできないっぽいし。

271:社内ニート ◆OpY5DDvqSw
11/02/27 18:27:45.42 BoOhxSt8.net
プレイヤーがホストを立てて、2~8人までの対戦をできるようにします。
ホストを探したり、プレーヤー同士の交流を行うロビーみたいなものを
無料サーバーを借りて作ろうと思います。

272:名前は開発中のものです。
11/02/28 22:28:30.01 g0je8oOR.net
先に、通信抜きで2人対戦できるようにすべきじゃないのかな?

273:社内ニート ◆OpY5DDvqSw
11/03/01 23:45:55.00 uZgo1Fuw.net
通信抜きでって、ひとつのパソコンで対戦ってこと?
絶対やるべきっていうならそうするけど、
ネット対戦前提で2人対戦ってところから作ったほうがよくない?
ひとつのパソコンで対戦って、ターンが交互に回ってくるようにするだけでいいし。

274:名前は開発中のものです。
11/03/02 00:52:26.76 jsVU/WxL.net
ひと通りのゲームの流れ(スタート画面->ゲームプレイ->勝敗処理->ゲーム終了)を単一PC内で
実現するのが一般的なひと区切り。
TCP/IPの基礎知識(socket利用あたりまで)があるのならこの時点でネット対応やっちゃってもいいけどその力量がワカラン。
ロビーサーバ構築となるとさらに別世界。規模/機能にもよるけどね

275:名前は開発中のものです。
11/03/02 13:34:35.92 BF83P3je.net
とりあえず、ネトゲ制作のスレとか、DXライブラリのリファレンスを読んで勉強しながら、余裕があればダメージ計算とか細かいとこも作ってみます。

276:名前は開発中のものです。
11/03/02 21:25:02.39 /NOpHlDA.net
ちゃんとゲームとして成り立つところまで作ってからネット対戦を考えたら?
戦車が2台出るだけでも色々問題が出てくるだろうし。
それと、とりあえず>>108まで完成したのなら一度見てみたい。

277:社内ニート ◆OpY5DDvqSw
11/03/03 19:44:40.68 eZVnKNXf.net
>>272
F5押したらデバッグはできるけど、
アプリケーションに作り上げる方法教えてください。

278:名前は開発中のものです。
11/03/03 22:11:29.10 k5LomlRL.net
VC++でF5押したら普通に実行ファイルがビルドされてると思うが?
デフォルトならプロジェクトフォルダ内にReleaseかDebugのフォルダがあるでしょ。

279:社内ニート ◆OpY5DDvqSw
11/03/04 20:02:56.37 Vy+gp0Dp.net
Debugのフォルダはあったんですが、その中に入っているものをダブルクリックしても
ゲームが起動するものはありませんでした。
方法がわかったらうpすることがあるかもしれません。
それで、もっと細部まで作ってからネット対戦を考えたらどうかという意見ばかりのようですが、
後の細かいところというのは、一つ一つやっていけば自分だけでもできそうなことだと思うので
ネット対戦の部分をどういう風に作るのか、考えていきたいと思います。

280:社内ニート ◆OpY5DDvqSw
11/03/04 20:31:56.59 Vy+gp0Dp.net
IPアドレスは各自が調べて、ゲームルームに入室したときに
他のプレーヤーたちと自分のIPを教えあう。
DXライブラリの ConnectNetWork と、IPアドレスを使って相互にPCを接続する。
って感じでいいんじゃないかとおもう。
しかし、サーバーってのはどういう風に扱えばいいんだろ。
各プレーヤーのPCにDLするゲームソフト以外に、
仲介するためのソフトを作って、それをサーバーにおく必要があるってことかな。

281:名前は開発中のものです。
11/03/04 22:18:57.26 e0BGDa4h.net
>仲介するためのソフトを作って、それをサーバーにおく必要があるってことかな。
これについては既存のネトゲでも各種方式がある。
1)サーバプロセスが常にデータを中継する
 たいていの本格的MMOはこれ。データを随時中継する際に中身をチェックしてチートを防ぐ効果もある。
 プレイ規模にもよるが、サーバのパワー(ハード、ソフト共)がある程度高くないとプレイに支障が生じる。
 例:UO、EQ、WoW
2)ロビーサーバのみ独立させ、プレイ中はプレイヤー間で直接通信をする。
 MO的なネトゲはこれ。ロビーサーバで各プレイヤーのIPをクライアントに通知して
 プレイ中はロービーサーバを経由せずクライアント間で直接通信する。所謂P2Pに近い。
 リアルタイム的な要素に左右されるゲームに有利。
 商用のネトゲはチート対策や同期ためにサーバにも随時データを送ってチェックするのが一般的。
 例:Diablo(クライアントがゲームサーバの役割も持つ)、各種FPS系
例は古典的な有名どころ。
他にもありそうだけど、大抵はこれら2つの方式をいろいろな組み合わせで実装している。
最近の商用ネトゲだと「MOだけど1)方式」ってのも多い。
IPアドレス情報の交換についてはロビー(ゲームルーム)に入室した時点でロビーサーバがクライアントのIPを
分かっていることになるのでユーザが直に調べる必要は必ずしもない。(そういうつくりにしないといけないけど)
むしろロビーのチャット等で直にIPを教えあうと、いたずら好きなバカがDOS攻撃対象にしたりする可能性もあるので
あまり好ましくない。
システムを一般に公開しないのであればあまり問題はないと思うけどね。
その昔、インターネットでの掲示板も一般的じゃない頃は電話やメールで互いのIPを教えあったものさ・・・。

282:名前は開発中のものです。
11/03/05 11:23:37.39 1BoPAtkM.net
ってか普通にクライアント同士1:1でちゃんと動くかってところを確認してからだろ

283:社内ニート ◆OpY5DDvqSw
11/03/05 14:02:05.82 ytiYcFyh.net
>>277
(2)の方法って、つまり>>267と同じことだよね?



285:社内ニート ◆OpY5DDvqSw
11/03/05 14:04:21.14 ytiYcFyh.net
とりあえず、ロビーで対戦相手を探すというところをはぶいて、
クライアント同士1:1で動かせるように作ってみます。

286:社内ニート ◆OpY5DDvqSw
11/03/05 14:15:44.76 ytiYcFyh.net
自分のIPアドレスを調べるのってどんな方法がおすすめ?
winsockというものを使ったこんな方法がみつかったんですけど、これでいい?
URLリンク(members.jcom.home.ne.jp)

287:名前は開発中のものです。
11/03/05 18:38:05.45 1BoPAtkM.net
>>281
足元を固めていくという意味ではとりあえずはいいんじゃね?
ipconfigキックで出力をリダイレクト→リダイレクト結果を文字列検索とかのシンプルな方法もアリだろう
複数枚NICがある場合考えるとめんどいがそこはWINSOCK使ってもも同じこと
インターネット経由にする場合はローカル/グローバルの話があるので(一般的には)上記だけでは足りないってのは分かるよな?
分からなければ ローカルアドレス グローバルアドレスでググれ
もっともロビーサーバをグローバルに立てればこれらの話は全部要らなくなるが


288:名前は開発中のものです。
11/03/06 07:27:32.42 PFbDBYwQ.net
>>275
起動に必要なデータファイル(画像とか)が同じフォルダに入っていないんじゃないかと思う。

289:社内ニート ◆OpY5DDvqSw
11/03/08 22:14:18.79 O4hW3e3n.net
>>283
そのとおりみたいでした。
ためしに画像とか適当にぶっこんだら動きました。
URLリンク(www.dotup.org)
パス
1111
ネットへの対応はまったく進んでません。勉強もしてません。

290:115
11/03/09 02:02:38.65 YYc1MNQ1.net
>>284
遂にここまでできたのか
暫くROMってたけど俺も完成期待してるから
頑張って下さい

291:社内ニート ◆OpY5DDvqSw
11/03/09 19:33:20.78 d+SmmaqK.net
>115
一人の応援だけでだいぶやる気が出た。
おひさしぶり。
元気ですか?
私は相変わらず暇人です。


292:115
11/03/10 22:24:04.84 xJ6VL23e.net
風邪ひいてきつかったけどやっと直ってきた
ネットワークの実装やったことないからアドバイス出来なくて残念だ

293:社内ニート ◆OpY5DDvqSw
11/04/04 03:21:23.76 hNri2z03.net
地震で死んだわけじゃないけどね。
何をしていいかわからなくなったんで放置。
MMORPGの作り方を書いた本でも買ってみようかな。
まあ、うちの近所に大きな本屋がないんで中身を見て確かめられないのは痛いけど。

294:名前は開発中のものです。
11/04/04 20:57:43.80 p78/gdyh.net
1) ネット通信なしで、2P対戦を実装する
2) 次に2PをCPU制御で実現する
3) CPU制御の機体数を増やす
4) 通信プロトコルを設計する
5) 通信処理を実装する
この順でやるといいよ。

295:名前は開発中のものです。
11/06/22 00:51:57.57 mdgs9SFK.net
ワロタ

296: ◆hUczjzHQ1.
12/01/30 00:07:24.07 WlPxsZ4g.net
基礎から学んで行こうと思います
分からない事がまだまだ沢山ありますが
ご指導ご鞭撻の方宜しくお願いします
c/c++の勉強をして行きたいです。
でもまずはCからお願いします。
基礎からみっちり叩き込んで下さい
ボクも頑張って行きたいと思います。

297: ◆ibj3Ub6oRZ3m
13/09/28 01:01:50.70 eY+hrwyk.net
基礎から学んで行こうと思います
分からない事がまだまだ沢山ありますが
ご指導ご鞭撻の方宜しくお願いします
c/c++の勉強をして行きたいです。
でもまずはCからお願いします。
基礎からみっちり叩き込んで下さい
ボクも頑張って行きたいと思います。

298:名前は開発中のものです。
15/08/31 13:58:00.57 0xjlLWq1.net
もうすぐ専門学校の学園祭の季節になるから見学に行くと良いかも。

299:名前は開発中のものです。
15/09/22 17:20:40.99 J5BSdRWA.net
c言語の参考書ORサイトを読破する

300:名前は開発中のものです。
15/09/22 17:21:18.98 J5BSdRWA.net
そしてDXライブラリでもいじりながら作りなさい

301:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch