トップページ⇒tech
44コメント23KB

DelphiでOLIONモドキ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
DelphiでOLIONモドキ作ってみました。
まだαバージョンですが。
http://zurubon.virtualave.net/source.cgi
上記の132.lzhに入ってます。
Delphiの環境を持っててOLIONを知ってるひとだけ落として
遊んでみて。

OOPは初めてなので、クラスの作り方がいいかげんです。
ひまな人に添削してもらえるとうれしい。

それにしても、下記の注意書きはどういうこと?
(消されるの、やだなぁ)

「※今後、2ちゃんねるに関係していると思われるファイルは見つけ次第削除します。」

なにか事件があったの?どんな基準で消されるの?
そこあたりのことも教えてクンです。

どうぞ、よろしく。

以上
0002デフォルトの名無しさんNGNG
そこは2chと敵対関係にある「あやしぃわーるど」系列の
「@プログラマ板」のアプロダなんだよ。
「厨房」も「ゴルァ」も「オマエモナー」もみんな「あやしぃ」
が最初。その上アプロダまで勝手に使われちゃぁな。
まぁ、「あやしぃ」と住人がかぶってるからしょうが無いけどな。
0003デフォルトの名無しさんNGNG
1>2
うむむむむ。
調べて見ます。
情報、ありがとうございました。

OLIONモドキはけっこうマジにつくったもんなんで、ちょっと煽りが
入っててもいいから感想が聞きたかったとこです。

それにしても、OOPって、私は旧来の関数分けをし終わってから
しぶしぶクラスを作りましたが、ほんとに最初からクラスをつかった
設計をしてる人なんて、どれくらいいるんでしょ???

いまのところ、クラスを作るメリットがいまいちわかりません。
0004デフォルトの名無しさんNGNG
とりあえず dfm ファイルがテキスト形式になっていたので困った。
Delphi 4 を使っているからコンパイルするのに苦労したよ。

OLIONって知らないんだけどサクサク動いて気持ちいいね。1600x1200の
フルスクリーンで動かしても非常にスムーズに動くのは感動したな。
ついでに難易度が俺には高すぎた…

ソースの事だけど FuncsUnit に Delphi の不満なところがだらだら綴ってあったね。
ハッキリって突っ込みどころ満載なんだけど。
0005デフォルトの名無しさんNGNG
うちDelphi5だけどコンパイルできないな。
しかし酷いソースだね。
メソッドの引数は値渡しばっかだし、
列挙型をIntegerにキャストしてるし、
イマドキ構造体だらけで全然クラスのありがたみがわかってないし・・・。

> いまのところ、クラスを作るメリットがいまいちわかりません。

って書いてあるとおりだね。OOPに関しては一から勉強してください。
ソースに書いてあるDelphiへの不満のほとんどはあなたの勉強不足から来ています。
もちろんDelphiが悪いところもあるけどね。

本当はね、動いてる中身を評価してあげたかったんだけど、ゴメンね。
00065NGNG
ごめんコンパイルできた。
やってみたけど、どう評価していいかもわからないや。
00075NGNG
あと、
>メソッドの引数は値渡しばっかだし、
そんなことはなかったね。ゴメソ
0008デフォルトの名無しさんNGNG
>>5
一応彼のため、というかDelphiのためにつっこみを入れたほうがよいのでは
00098NGNG
>>5でなく、>>4 やね…鬱だし能
0010デフォルトの名無しさんNGNG
>列挙型からIntegerへの暗黙の型変換くらいして欲しいものだ
反:列挙型のまま使うべきです
 まるで5年前のCのソースを見てるようです

>配列を初期化するとき、いちいち要素数を明示しなくちゃならんのが
反:初期化はコンポーネントにしてプロパティに埋め込みましょう
  そしてプロパティエディタを作れればスマートにゆきますよ
  あるいはスクリプト式のテキスト形式にしてTStrings型のプロパティ
  にすればもっと綺麗です。


> 右詰入力域ひとつ作るのに裏技をつかわんといかん処理系
反:こういう場合は裏技ではなく正面突破を心がけるべし
 VBは確かにもっと奥迄色々な仕掛けを勉強せずに入れますが、
 だから少しでも壁にあたるとその手の裏技的方向に走る癖が
 ついてしまいます。
 1 ”フォーカスを受け取らないラジオボタン”
2 ”右詰入力が出来て、かつフォーカスを受け取らない入力域”
 どちらもTGraphicControlから派生してコンポーネントを自作
 すれば簡単です。具体的には 1はITems:TStringとItemIndex:integer
 プロパティを持たせて Paintで描画するだけ
 2 も同じで、単にフォームのキー入力を渡せば処理するように
  少しコードを書けばOK

これらは少し慣れればVBのように広大な機能から必要な機能を探すよりも
自作した方が早い程度の機能だと思いますよ
0011デフォルトの名無しさんNGNG
OLIONってなんなんだ?
このスレ読んでてもさっぱりわからん。
00125NGNG
自分の頭の悪さを棚に上げてDelphiのせいにするやつなんてほっとけよ
俺もOLIONはしらないけど、1がつくったやつは15年くらい前のゲームみたいだったよ
00134NGNG
>用意しとけばいい、どうせ誰も使わないだろうけどな...)前方参照くらい
>させて欲しいもんである。プログラムをトップダウンで書くことが出来なく

forward 宣言を使うことで前方参照出来ます。以下は使用例。

procedure test1(val: Integer); forward;

procedure test2;
begin
 test(0, 1);
end;

procedure test1(val: Integer);
begin
 何かやっている
end;

>同じ名前の関数があった場合、プロジェクト内の関数を優先的に使うのが
>普通だろ!!

スコープを勉強しましょう。複数のユニットで同名の識別子(この場合、関数)が
定義されていた場合、Uses 節で最後に宣言したユニットの関数が優先で使われます。
各ユニットの同名の関数を呼び出したい場合以下のようにします。

Windows.Sleep(560); とか Unit1.Sleep(560); とか。

>ウィンドウを最大化するとなぜかForm.WidthがScreen.Widthより
>大きくなってしまう
>こういう細かいところの挙動不審が目に余る

当たり前。Windowsは最大化をするとデフォルトでウィンドウの左上の位置を
-4,-4にセットし、右下も同様に+4,+4する。よってForm.WidthはScreen.Width+8になる。

Width,Heightプロパティはウィンドウの枠も含めた幅・高さを返すので枠を除いた
ウィンドウのサイズを知りたいときはClientWidth,ClientHeightプロパティを使うこと。
00144NGNG
forward宣言の例が間違っていた…

procedure test1(val: Integer); forward;
procedure test2;
begin
 test1(1234);
end;
procedure test1(val: Integer);
begin
 何かやっている
end;
00151NGNG
1です。
みなさん、ご指導ありがとうございます。
(もっとひどい煽りがあるかと思っていましたが、皆さん紳士的ですね)

大変勉強になりました。
ヒントをいろいろもらえましたので活用させていただきます。
0016デフォルトの名無しさんNGNG
>>1
あんまりそこに迷惑かけないようにね
こことか使ってみたら?
http://www.geocities.co.jp/SiliconValley-Oakland/8522/

まあ自分で適当な捨メールアドレス取って作った方がいいかもしれないけど
0017デフォルトの名無しさんNGNG
オブジェクト指向は”複雑さに対処する”ための技術だからねえ、
こんくらいのゲームには向かないかも。あとTFormのメソッドには
あまりロジックは書かないほうがいいよ。
0018デフォルトの名無しさんNGNG
FuncsUnit のコメントは、Delphi使い始めの自分を思い出して、
なんだかほほえましかったよ…。
0019デフォルトの名無しさんNGNG
>>1なかなかがんばってるやない。

だが
>>5 ほどいう気はないが
>>13とか>>10とか
言う事をまじめに聞いたほうがいい。

>>1の多くのDelphi批判は完全にスジ違い。
DelphiMLで全部解決してきたことだ。
過去ログ検索して読め。

わからなかったらMLで聞け。
勘違い批判してると嫌われるけどな。

右寄せEditって、環境依存するVBならそりゃ簡単だろうて。
0020デフォルトの名無しさんNGNG
>>17
TFormに書かない方がいいっていうとどんな感じになるの?
綺麗に書かれてる、勉強になるソースとかあったら教えて。
0021デフォルトの名無しさんNGNG
これ自体はいちいちlzhを開いて見る気にはならんが、
>>13に引用されている部分は、ちと気になるな。
前方参照できるかどうかと、トップダウンと何の関係があるんだろ。
0022デフォルトの名無しさんNGNG
>>21
だからfowardを知らないから
関数の並び順が制限されていやだって
勘違いしてしまってるわけだ。

まさか全部interface部に記述するわけにいくまい?
ってか、記述してもいいんだけどね。

>>20ない。
>>17の言いたいのは"なるべくそうしたほうが"
って事だから意識してればいいだけ。
0023VBスレ出張NGNG
VBが嫌いな人は覗いてください。
http://geocities.com/morning21uk/garally/otakara/nono02.jpg
0024デフォルトの名無しさんNGNG
>>23
3回抜いたよ。
0025デフォルトの名無しさんNGNG
>>23
ブラクラ
002621ではないがNGNG
>だからfowardを知らないから
>関数の並び順が制限されていやだって
>勘違いしてしまってるわけだ。

これとトップダウンと何の関係があるんだ、
って21は言うておるのではないの。

そうだね、トップダウン/ボトムアップって、
記法じゃなくて設計の概念だものね。
00271NGNG
んあー、
1です。

「トップダウンうんぬん」は記法のつもりで書きました。
main() 関数を一番てっぺんに書きたいくらいの意味です。

けっこう付き合ってくれる御仁がいらっしゃいましたので、ありがたく思ってます。
(単純に質問しても、なかなか教えてもらえないですから、ネタ振りとしては
 結構効果がありました)

慣性の効いたゲームは好き嫌いが激しく出るもんなんで、今度はインベーダーでも
作りますか。

もっと煽られれば煽られたで、
「おまえ、そんなエラソーなこといって、口先ばかりだろ」
とやって、情報を引き出そうかと思ってましたが...

Delphiで作るWindowsGameとかいう本を買ったのですが、データの初期化
回りは、参考にする気にならないくらいイヤなコーディングだったので、
他の人は大量のデータを初期化するのに、どうやるのか知りたかったのです。
(大量のデータをプロパティで設定する...? やってみますが、
 プロパティって、そんな使い方も出来るんだ...)

どれ、もうちょっとがんばってみますか。

皆さん、ご指導ありがとうございました。
0028デフォルトの名無しさんNGNG
> 大量のデータの初期化
外部データファイルの読み込みでやってる。
必要なら、データファイル生成用のツールも作る。

小さなゲームには向かない方法かもしれんが、
データロード部はライブラリ化しておけば次回からラクだよ。
0029デフォルトの名無しさんNGNG
OnPaintを使わずタイマー割込みで描画するのは、まあゲームだから
しょうがないかもしれない。

でも、最低、ダブルバッファ(オフスクリーン描画)にするべきだろう
OffScreen: TBitmap;を作っておいて
OffScreen.Width とかを フォームと同じに設定

表示命令は OffScreenにする

画面に実際に出すのは Canvas.Draw(0, 0, OffScreen) で一度に行う

これでチラツキが無くなるから、まず試してくれ。 他の悪い点はまあそれからだ。
0030デフォルトの名無しさんNGNG
ゲーム製作入門スレに化けそうな予感(藁

いや、よいことだ。
0031デフォルトの名無しさんNGNG
コード詳しくて見てないからわからんが
配列の大量初期化なら
型宣言してconstで定義しておいてそれを
普通の変数に代入が一番だと思うよ。>>意味わかるか?

あとね。>>27のあおりながら情報を得るっていう
やり方は関心せんな。
きみぐらいの煽り方ならまだいいが
エスカレートすると気分悪いからな。

Boland連中はうまくやれば強力な助っ人になってくれるんだから
雑談してるような雰囲気でもっと聞き出せよ。
ML過去ログのポインタでも教えてほしけりゃ
出してやるよ。

腰を低くしろって事がいいたいわけじゃないんだがな。
0032陰陽(5)NGNG
> オブジェクト指向は”複雑さに対処する”ための技術だからねえ、
> こんくらいのゲームには向かないかも。

オブジェクト指向が万能技術だと言う気はないけど、
こんくらいのゲームに適用するのは、練習にもなってちょうどいいと思うぞ。
問題領域
自機クラス、敵機クラス、ミサイルクラス、宇宙クラス
アプリケーション領域
アプリケーションクラス(=画面クラス?),敵機コントロールクラス
くらいで、見やすいソースで開発できるでしょ。
0033陰陽NGNG
> まさか全部interface部に記述するわけにいくまい?
> ってか、記述してもいいんだけどね。

普通はinteface部にプロトタイプ宣言を全部書いておく。
クラスじゃなくて、unitに直に関数を列挙する場合でもそう。
forward宣言はクラスのinterface部で、ユニット内の別クラスを
参照するようなときに使う。

type
 TClass1=class; forward; // TClass2のinterfaceの中でTClass1を使うため。
 // TClass2のインターフェース定義
 TClass2=class
  class1: TClass1;
procedure ・・・・;
 end;
 // TClass1のインターフェース定義
 TClass1=class
end;
0034陰陽NGNG
ああ、インデントおかしい。ゴメソ。

あと追加
> 普通はinteface部にプロトタイプ宣言を全部書いておく。
だから、関数の前方参照とかを気にしなきゃいけないことは
まずあり得ないってことね。
0035デフォルトの名無しさんNGNG
>陰陽
いいこというね。ただ>>33interface部に書くときはforwardはいらないよ。
003635NGNG
追加:
33のような場合でも。
0037陰陽NGNG
>>27 >>31
煽りで情報を引き出すっていうこと自体は、いい方法だと思うよ。
実際俺もひっかかってこうやって出てきてるわけだし。
でも相手の発言が、こっちの発言に難癖をつけてきたり、見下した発言だけで
中身が無い場合にとても有効なのであって、始めの発言者(この場合1)が
煽りから始めるのはよくない。話を聞いてくれるであろう人まで
引いちゃうから。

>>35
forwardの件その通りでした。サンクス。
003831NGNG
最初に完成したソースアップっていうのは
非常によいな。
00391NGNG
ああっ。
ぁゃιぃソースアップから消されてしまいました。
(自分で消したんじゃないよ)
べつに、損したわけじゃないけど、ちょっとくやしい。
ま、もうちょっといじった後で他の場所で公開します。
(金なんか、とんねぇよ)

ジョイスティック対応と、初心者向けに慣性がなく、敵へのあたり判定を
大きくしたバージョンも用意しましょう。
(オプション画面作るの、結構メンドイな)
0040デフォルトの名無しさんNGNG
ソースアップしておまえの勉強となっていて
よし、とは思うが

だれもショーモなーイ
おまえのソフトで遊びたいとは思ってないよ(w

技術的なスキルアップとゲームクリエイタのセンス磨きな。
00411>40NGNG
おっしゃる通り!

事実に気づかせてくれて、ありがとう。
感謝しています。

わたしの精神状態はちょっと普通じゃありませんでしたね。
舞い上がってました。
(疲れていたのかもしれません)

ただ、他のことなら直しようもあるし、学びようもあるけど、
センスがないという事実はなかなか直すのが難しいところ
です。

とりあえずしばらくおとなしくしています。

ご縁があったらまた会いましょう。

さようなら。
0042デフォルトの名無しさんNGNG
何を納得しているんだ?

センスは磨ける。
作りつづけろ。

上で言われた変なコーディングはすべて改善したら
よりコーディングがうまくなるから
ゲームをおもしろくする改造も可能
0043デフォルトの名無しさんNGNG
こんなもんあげんなゴルァ
00441NGNG
私は自分をさらし過ぎた。無防備だった。
40さんのカキコで気づいた。(最初は正直ムカついたケド)
これ以上ここにいるとあやうい。
かまってくれた皆さん。ありがとう。
ちょっとヒキョーだけど、40さんに言われてイジけたふりしていなくなります。
(当初の目的は果したのだし、深みにはまった状態から足抜けするのに
 渡りに船だったのだ)

ゴメソ(静かにsage)
■ このスレッドは過去ログ倉庫に格納されています