ファミコンのプログラム4 (567レス)
上下前次1-新
240(1): 2014/06/04(水)21:11 ID:Wpb6i0Ha(1) AAS
RevolvingGemsのゲーム本体部分が出来ましたので公開します。
外部リンク[zip]:homepage3.nifty.com
残りはタイトル画面と遊び方画面を実装して終わる予定。
241: 2014/06/04(水)21:35 ID:EpTIlg4F(1) AAS
すげー
242(1): 2014/06/04(水)23:51 ID:78Tpkbjc(1) AAS
商用レベルのできだと思う。
気になるのは、連鎖がどんどん発生しやすすぎではないのかなと
243(1): 2014/06/05(木)01:19 ID:9NxYghum(1) AAS
>>242
連鎖しやすいのは、6方向に対して6種類の駒しかないので
仕様上、確率的につながり易いのが原因です。
駒の種類を増やせれば良いのですが、パレットが足りないw
最初は3個つながったらで実装していたのですが、
あまりにも連鎖が続くので4個にしています。
それでも消せなくなることが無く延々と続けられるので、時間制に逃げました。
作って思ったのは、ぷよぷよの仕様は絶妙なバランスなんだなぁと。
244(1): 2014/06/05(木)23:11 ID:hfWG3l/O(1) AAS
追加された音楽がスタートで変更できるのは、個人的にうれしいですね!
後、セレクトボタンはどんな効果があるのでしょうか?(効果音だけ?)
245(3): 131 2014/06/06(金)19:17 ID:5n3Zcu9W(1/2) AAS
131です。あの後、
いろいろ注意深く書き込みを見ていたのですが
人に意見されるってすごく大事だと思いました。
ちなみに、cc65でオセロとShootingGameSampleを作ったのと、
nesasmでブロック崩しを作ったのも
自分です。
今までは自分はチキンで人に意見言われるだけで、
むっつりと黙っていましたが、これからは
もっと能動的に動きたいです。
ファミコンのブロック崩しをソース付きで晒すので
汚いし、ロジック的におかしいところばかりですが、
見てやってください。
僕はカービィやマリオ、くにおくんのファミコン少年の一人の
つもりなのでファミコンは、ホント好きですし、このスレッド
を最初から見ています
外部リンク[zip]:www1.axfc.net
246(3): 131 2014/06/06(金)21:24 ID:5n3Zcu9W(2/2) AAS
こんな事書き込みたくて書き込むわけじゃないですけど、
ファミコンの正常動作って何ですか?
どうすれば正常動作っていうんですか?
いつまにか、このスレッドは本物のROMと同じように動かす為に努力してる
人たちを称え、褒めてきました。
正常動作って定義がどこにあるかはファミコンで動作すれば分かるんじゃないですかね。
それ以外を異常動作というなら、エミュレータはほぼ全て異常動作ですよ。
247(1): 2014/06/06(金)22:02 ID:4Zl9JWw3(1) AAS
>>243
始まった瞬間操作する前に勝手に連鎖するってのだけでも
どうにかならないかな
初期配置のみパターンで持つとか
248: 2014/06/06(金)22:51 ID:kdjIsC0c(1) AAS
>>246
そうですよエミュは異常動作ですよ
実機で動かないのを言い訳してるだけにしか聞こえませんね
249(1): 131 2014/06/07(土)03:42 ID:hwRmu2MG(1/8) AAS
本当に実機で試したのか知りたいですが、
自分の言いたい事は実機で動かない事の言い訳じゃなくて、
ファミコンのプログラミングが1つの古代技術でそれが通用するのはあくまでファミコンのみ
という事なんですが**が素晴らしいとか**の技術は優れているとかのある意味
マニアックな話の流れになっているというか、
ぶっちゃけ、自分の作ったファミコンゲームは技術的には全然優れてないので、
優れた技術を持った人たちに憧れたみたいなところがあります。
250: 131 2014/06/07(土)03:52 ID:hwRmu2MG(2/8) AAS
**には、ラスタースクロールやスプライトダブラー、
FFの高速スクロール、BGの高速書き換え、パレットアニメーション
を入れてください。
251: 131 2014/06/07(土)09:33 ID:hwRmu2MG(3/8) AAS
cc65の作ったやつは(REVERSI,SHOOTING GAME SAMPLE)動く自信がないですが、
nesasmで作ったやつも(IWA WO OTOSE,BLOCK)動かないんですかね。
252(1): 2014/06/07(土)10:52 ID:0OqTmEOh(1/5) AAS
>>244
スタートとセレクトは、サウンド系の開発用にテストできるように追加していた機能で
今回スタートを少し改良して選曲出来るようにしました。
セレクトは、効果音を作る時以外は意味を成さないので、次の完成版では削除する予定です。
253: 2014/06/07(土)11:09 ID:0OqTmEOh(2/5) AAS
>>247
初期配置をパターンで持つのは、バリエーションを作るのが大変なので、
採択したくないですね。
代わりに内部で連鎖が止まるまで処理を繰り返して、
そこからゲーム開始するよう実装してみます。
254(1): 2014/06/07(土)11:18 ID:0OqTmEOh(3/5) AAS
>>249
私も最終目標は実機で動作させてみることなのですが、
そこまでの道が遠い状態です。
一応、動作させるための目処は立っていて、材料とかもそろえたのですが
ROMライターから自作せねばならないため、いつになるかわかりません。
実機で動作したのを確認して初めて、ファミコンのプログラムを作ったと、
胸張って言えるかと個人的には思っています。
255: 131 2014/06/07(土)14:24 ID:HAL7UNXv(1/2) AAS
>>254
ネットカフェから書き込みです。
そうですね。ファミコンの実機で動いたら感動しますし、
実機で動かしたいです。
ファミコンの実機は持っているのですが、ROMライターや
EEPROM、同軸ケーブル、ビデオデッキ、自分用のテレビ
256: 131 2014/06/07(土)14:27 ID:HAL7UNXv(2/2) AAS
など問題が山積しているので、現段階では難しいです。
257(2): 2014/06/07(土)15:48 ID:0OqTmEOh(4/5) AAS
>>245
一通り読んでみました。
.bank 0 ; バンク0
.org $0300 ; $0300から開始、スプライトDMAデータ配置
Paddle00_Y: .db 0 ; スプライト#1 Y座標
Paddle00_T: .db 0 ; スプライト#1 ナンバー
WRAM領域の$0300にデータ定義の記述があるが、
ビルド出来ているのであろうが、記述としてはまぎわらしいので
Paddle00_Y = $0300
Paddle00_T = $0301
と記述した方が良い
.memclearloop
sta [$00],y
iny
cpy #255
bne .memclearloop
254までしかループしていない。cpy #255が不要
258(1): 2014/06/07(土)15:49 ID:0OqTmEOh(5/5) AAS
>>257
続き
VBlank直後に行うべき処理と、ゲーム本体の処理を分離したほうが良い。
パッドとボールの座標と、スプライトの座標は別に持っておき、
パッドとボールの座標をスプライトデータに反映するにように
実装した方が、プログラムの書き方としては綺麗だと思う。
VBlankのタイミングを考えずに、スプライトとBGの表示をOFF/ONにして
VRAMを書き換えるのはやめた方が良いと思う。
nestopiaとかでも普通に表示できていたけど、書き換え量が多くなると
画面がちらつくのでは?
jsr Pad_Check
ソース上に Pad_Check が見つからない。
lda #0 ;これはROMなので出来ないので、こうする
sta STAGE1,x ;〃
ROMに0を書き込む意図がわからない。
VRAM書き込み先のアドレスをブロックの座標から
計算しているが、ブロックの配置位置が有限個であれば
表引きで求める方法もある。
(Y座標だけでも表引きにすると処理が結構簡素化します)
259: 131 2014/06/07(土)17:02 ID:hwRmu2MG(4/8) AAS
ギコ猫さんのところで、覚えた技術ばかりという理由は
英語が出来ないという理由なのですが、これは理由になってないみたいですね。
?英語が出来ない
↓
?英語の技術情報が分からない
↓
?日本語だけの技術情報に頼る
の無限ループなので、英語を中学英語から
やり直したいと思います。
ちょうど良い本がアマゾンで見つかったので
外部リンク:www.amazon.co.jp
あと、スプライトの定義のその定義の仕方は知らなかったです。
でも、ある意味スプライトDMAのアドレスを考えれば当たり前なんでしょうけど。
iny cpy bneの間違いは、間違えて覚えていました。
ギコ猫さんとこはパレットの読み込み時に
ldx #0
.loop
lda ourpal,x
sta $2007
inx
cpx #32
bne .loop
みたいにやっていたのですがよく考えれば、0-31までを読み込んでいたんですね。
これは、引き算の小学一年レベルの間違えですね。差がNの時、合計数は、N+1になるという事なんでしょう。
つづく
260(1): 131 2014/06/07(土)17:29 ID:hwRmu2MG(5/8) AAS
>>257-258
VBlankとゲーム本体処理を分離ということはNMIを使うって事ですね。他の方も言ってましたが
スプライトと実際の座標を別に持つというのは、以前やったことがあるのですが、クソ汚いソースになってしまいましたが、少しだけわかってきた気がします。こんな感じですかね。
>>261に書きます。
VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。
Pad_Checkは、他の方が作られたソースなので、あえて外しました。ROMに0を書き込んだ意図は、恐らくないです。気づかないまま放置してしまいました。
ブロックの配置位置が有限個ならテーブル化できるんですか?今度やってみます。
アドバイスありがとうございます!!ホント助かりました。知らなかった事や理解出来なかった事が分かってよかったです。
261(1): 131 2014/06/07(土)17:30 ID:hwRmu2MG(6/8) AAS
.org $300 ;データ定義
Sprite:
Sp00_Y: $0300
Sp00_T: $0301
Sp00_S: $0302
Sp00_X: $0303
01_Y: $0304
01_T: $0305
01_S: $0306
01_X: $0307
...
ldx #0
.SetObjAxis2RealAxis ;スプライト座標を実際の座標に代入する
lda Sprite+0,x
sta Real_Y,x
lda Sprite+3,x
sta Real_X,x
inx
inx
inx
inx
cpx #(4*4) ;4つのスプライトを代入する
bne .SetObjAxis2RealAxis
262: 131 2014/06/07(土)17:32 ID:hwRmu2MG(7/8) AAS
間違えました。
.org $300 ;データ定義
Sprite:
Sp00_Y= $0300
Sp00_T= $0301
Sp00_S= $0302
Sp00_X= $0303
01_Y= $0304
01_T= $0305
01_S= $0306
01_X= $0307
...
ldx #0
.SetObjAxis2RealAxis ;スプライト座標を実際の座標に代入する
lda Sprite+0,x
sta Real_Y,x
lda Sprite+3,x
sta Real_X,x
inx
inx
inx
inx
cpx #(4*4) ;4つのスプライトを代入する
bne .SetObjAxis2RealAxis
263(1): 2014/06/07(土)17:38 ID:YYdbZPoT(1) AAS
英検三級、即ち中学卒業程度の英語力とgoogle翻訳があれば十分。
海外サイトの情報も何も全部理解する必要はないし、図、表、技術用語さえわかれば殆ど問題ない。
それに今では日本語資料も充実していると思うし、あえてギコ猫のところだけを参考にすることもないだろう。
初心者のうちは他人が作ったソースを見てよく理解し、そこからいろいろ学ぶのもいいだろう。
公開されているソースによっては丁寧に説明が細かく書いてあるものもある。
264: 131 2014/06/07(土)18:21 ID:hwRmu2MG(8/8) AAS
>>263
英検3級は持ってますが、かなり文法が怪しいです。単語に関しては最も初期の「萌えたん」を
P-StudySystemを自作問題集を作って覚えた程度です。
1つ1つの単語が読めても何を言いたいのかわからないので、今持っているくもん中学英文法
という本をゆっくりと確実にやる事にします。
初心者というにも、初めてから時間がかかり過ぎてる面はあるのですが、
恐らく他の方の作ったソースを断片的にしか分かっていないというのはあると思います。
google翻訳に関しては、使うブラウザがchromeなので、標準で使えます。
265: 2014/06/07(土)19:18 ID:2SsDMldn(1) AAS
>>252
セレクトは効果音テストだったのね。疑問解消しました
ソフトの完成楽しみにしてます
266(5): 2014/06/08(日)02:10 ID:CkZRo6BG(1/4) AAS
>>260
> VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。
VBlankの意味を理解していない節があるので、まずは、ブラウン管の話からします。
機知の情報かも知れませんが聞いてください。
ブラウン管の裏から電子銃で電子を飛ばし、ブラウン管表の蛍光面を発光します。
真っ直ぐ飛ばしただけでは、ただの点なので、磁界をかけて電子が飛ぶ方向を変えて
左上から右へ水平方向に線を書くように発光させ、再び左端に戻ってさっきより
ちょっと下の位置で同じように水平方向の線を発光させます。
これを画面下まで繰り返して、再び左上に戻ります。
これをすばやく繰り返すことで、ブラウン管の蛍光面全体に画像を表示します。(ラスタスキャン方式)
電子の飛ばし先が右端から左端に戻る期間を水平帰線消去期間(HBlank期間)、
下端から上端に戻る期間を垂直帰線消去期間(VBlank期間)と呼びます。
267(1): 2014/06/08(日)02:12 ID:CkZRo6BG(2/4) AAS
>>266
続き
VBlank期間は、一瞬で戻るのではなく、NTSC(日本のアナログ放送の信号規格)の場合
20本分の横線を描くぐらいの時間があります。この間、電子銃から電子は飛びません。
非VBlank期間は、ファミコンのPPUは画像の信号を作るため、
CHR-ROMからパターンを読み込んだり、VRAMからネームテーブルや
属性情報を読み込んでいて、PPUの信号線(PPUバス)を占有しています。
VBlank期間は、PPUが画像の信号を作らないので、PPUバスは開放されており
CPUはPPUを介してPPUバスにつながっているVRAMにアクセスできます。
「VBlank待ちの直後にVRAMの書き換えを行え」というのは、PPUが映像信号を
作るのに邪魔にならないタイミングでVRAMにアクセスしなさいということです。
268(1): 2014/06/08(日)02:53 ID:CkZRo6BG(3/4) AAS
>>267
続き
非VBlank期間中にCPUがVRAMにアクセスできる方法があります。
PPUレジスタ $2001 のbit3とbit4を0にして、BGとスプライトを非表示にすることです。
画像の信号を作るためのPPUのCHR-ROMやVRAMへのアクセスが止まるので
PPUバスが開放され、CPUはPPUを介してVRAMにアクセスできます。
代わりに、画面に何も表示されない箇所が現れることになります。
BGとスプライトを非表示にするタイミングにばらつきがあると、
画面がちらつく現象となります。
> VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。
ファミコンの設計による制限であるため、仕様と言えば、その通りです。
269(1): 2014/06/08(日)02:54 ID:CkZRo6BG(4/4) AAS
>>268
続き
同世代の他のパソコンとかでは、表示中にもCPUからVRAMにアクセスできるものが
あるのに、ファミコンで出来ないのはなぜ?
→画面表示用の信号線とCPUからVRAMにアクセスする信号線が別になっているためです。
VRAMもデュアルポートメモリという、アクセスの口が2つある特別なRAMを使っています。
ファミコンのWRAMやVRAMに使われているのは、アクセスの口が1つのシングルポートメモリです。
→信号線も増えるため、基板上の配線が複雑化し、基板のサイズや層が増えてコスト増になる可能性があります。
ファミコンのVRAMにデュアルポートメモリを使わなかったのはなぜ?
→コスト削減のためです。
一般的にアクセスポートが余分にあるデュアルポートメモリの方がシングルポートメモリより部品代が高くなります。
また、WRAMとVRAMに同じ部品を使うことで、大量に発注し部品メーカーに単価の引き下げを交渉できます。
とりあえず、わかりやすく説明したつもりですが、間違いなどがありましたら
フォローお願いします。>All
上下前次1-新書関写板覧索設栞歴
あと 298 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.012s