テトリスのブロックロックまでのスライドや落下
テトリスのブロックロックまでのスライドや落下
どうやって制御するんですか?
コード眺めてても分りません。
http://homepage2.nifty.com/natupaji/DxL ... m.html#N10
の落ちものゲームです。
着地してもブロックがしばらくスライドできるブロックがもう動かせない→ブロック削除処理→新しいブロック落とす。
それにスライドした結果落ちた時などもあり、複雑でこの制御が分りません。
このコードにはそれがあるんですが、どれに当たりますか?
っていうかんじなんですけど、この動かせない判定が分りません。
コード眺めてても分りません。
http://homepage2.nifty.com/natupaji/DxL ... m.html#N10
の落ちものゲームです。
着地してもブロックがしばらくスライドできるブロックがもう動かせない→ブロック削除処理→新しいブロック落とす。
それにスライドした結果落ちた時などもあり、複雑でこの制御が分りません。
このコードにはそれがあるんですが、どれに当たりますか?
っていうかんじなんですけど、この動かせない判定が分りません。
Re: テトリスのブロックロックまでのスライドや落下
かなり細かくコード内に日本語で説明が書かれてありますよ?メリモ さんが書きました:どうやって制御するんですか?
コード眺めてても分りません。
http://homepage2.nifty.com/natupaji/DxL ... m.html#N10
の落ちものゲームです。
着地してもブロックがしばらくスライドできるブロックがもう動かせない→ブロック削除処理→新しいブロック落とす。
それにスライドした結果落ちた時などもあり、複雑でこの制御が分りません。
このコードにはそれがあるんですが、どれに当たりますか?
っていうかんじなんですけど、この動かせない判定が分りません。
「動かせない判定」ではなく、「落下しようとしてできない状態」と発想を変えてみてください。
そしてその、「落下しようとしてできない状態」とは、どういう状態か説明できますか?
コードから読み取るのではなくて、自分なりの言葉で説明してみてもらえますか?
今後、自分でコーディングしていくつもりであれば、必要な要素を抽出して、それを細かく分解するという考え方をする癖を付けたほうが良いですよ。
Re: テトリスのブロックロックまでのスライドや落下
落下できない状態は、ブロックもしくは地面とアクティブブロックが当たっている状態でしょう?
ですがスライドはできます、スライドした結果落ちる事もできますし、また着地したらさらにスライドできます。
ですがスライドはできます、スライドした結果落ちる事もできますし、また着地したらさらにスライドできます。
Re: テトリスのブロックロックまでのスライドや落下
やっぱり分りませんね。
if( MoveX != 0 && NewX >= 0 && NewX < WORLD_WIDTH )
{
// 各3つのブロックが画面上のブロックに当たっていないか調べる
if( CheckHitActiveBlock( NewX , NewY ) == - 1 )
{
// あたっていたら左右移動を無効にする
MoveX = 0 ;
}
}
MoveX=0;
と即固定されているので動かせるはずないと思うんですが実際
3~5回ほど左右に動かせます。どういう事でしょうか?
if( MoveX != 0 && NewX >= 0 && NewX < WORLD_WIDTH )
{
// 各3つのブロックが画面上のブロックに当たっていないか調べる
if( CheckHitActiveBlock( NewX , NewY ) == - 1 )
{
// あたっていたら左右移動を無効にする
MoveX = 0 ;
}
}
MoveX=0;
と即固定されているので動かせるはずないと思うんですが実際
3~5回ほど左右に動かせます。どういう事でしょうか?
Re: テトリスのブロックロックまでのスライドや落下
MoveX(横方向の移動量)が0ではない。
NewX(仮移動させたX座標)が0以上である。
NewXがWORLD_WIDTH(右端)より小さい。
これらの条件を全て満たしていた場合に、CheckHitActiveBlock関数による当たり判定を行い、戻り値が-1の場合にのみ固定です。
デバッガで停止させてみてください。
なんらかの条件を満たしていないはずです。
NewX(仮移動させたX座標)が0以上である。
NewXがWORLD_WIDTH(右端)より小さい。
これらの条件を全て満たしていた場合に、CheckHitActiveBlock関数による当たり判定を行い、戻り値が-1の場合にのみ固定です。
デバッガで停止させてみてください。
なんらかの条件を満たしていないはずです。
Re: テトリスのブロックロックまでのスライドや落下
合っているかどうかは私には分かりません。
分からないと書かれていたので、試しに動かしてみて、どうしてそうなるのかを確かめてみればどうでしょうか?という返事でした。
トライ&エラーはデバッグの基本です。
分からないと書かれていたので、試しに動かしてみて、どうしてそうなるのかを確かめてみればどうでしょうか?という返事でした。
トライ&エラーはデバッグの基本です。
Re: テトリスのブロックロックまでのスライドや落下
メリモさんは、「アクティブブロックが当たっている」状態というのをどんな状態と考えていますか。
具体的に教えてください。
あるいはプログラムコードから読み取ってください。
具体的に教えてください。
あるいはプログラムコードから読み取ってください。
Re: テトリスのブロックロックまでのスライドや落下
すいません。これ以上下に動けないとき、何故スライドできるか?というのが正しい疑問でした。
おそらくコードでいえばここですね。
if( MoveY != 0 )
{
// 画面の一番下のブロック位置まで来ていたらブロックを固定させる
if( NewY >= WORLD_HEIGHT )
{
LockActiveBlock( ActiveX , ActiveY ) ;
// 移動を無効にする
MoveY = 0 ;
}
else
// 各3つのブロックが画面上のブロックに当たっていないか調べる
if( CheckHitActiveBlock( NewX , NewY ) == - 1 )
{
// あたっていたらブロックを固定する
LockActiveBlock( ActiveX , ActiveY ) ;
// 移動を無効にする
MoveY = 0 ;
}
}
当たっていたらそくロックされて次の瞬間に新しいブロックが生み出されるはずなのに、なぜか水平に動かせます。
頑張れば3~5マス水平に動かせます。
おそらくコードでいえばここですね。
if( MoveY != 0 )
{
// 画面の一番下のブロック位置まで来ていたらブロックを固定させる
if( NewY >= WORLD_HEIGHT )
{
LockActiveBlock( ActiveX , ActiveY ) ;
// 移動を無効にする
MoveY = 0 ;
}
else
// 各3つのブロックが画面上のブロックに当たっていないか調べる
if( CheckHitActiveBlock( NewX , NewY ) == - 1 )
{
// あたっていたらブロックを固定する
LockActiveBlock( ActiveX , ActiveY ) ;
// 移動を無効にする
MoveY = 0 ;
}
}
当たっていたらそくロックされて次の瞬間に新しいブロックが生み出されるはずなのに、なぜか水平に動かせます。
頑張れば3~5マス水平に動かせます。
Re: テトリスのブロックロックまでのスライドや落下
それはMoveActiveBlock関数が呼び出されるタイミングを確認してみてください。
KeyInput関数の中以外に、TimeFunc関数の中でも呼ばれていますよね?
TimeFuncの中では、一定時間が経過した際に自動的に落下させるようになっています。
メリモさんの言われる着地した状態というのは、実際にはまだ着地していないのです。一見着地した状態に見えますが、その状況から更に1段落下しようとする(TimerFuncによる動作)際にブロックが重なっていれば移動不可能と判断している訳です。
そこで、メリモさんの言われるスライドさせる(一見着地したように見える状況からでの横移動と解釈しています)ことが出来るのは、上記の「更に1段落下しようとするまでの待機状態」の時間なのです。
KeyInput関数の中以外に、TimeFunc関数の中でも呼ばれていますよね?
TimeFuncの中では、一定時間が経過した際に自動的に落下させるようになっています。
メリモさんの言われる着地した状態というのは、実際にはまだ着地していないのです。一見着地した状態に見えますが、その状況から更に1段落下しようとする(TimerFuncによる動作)際にブロックが重なっていれば移動不可能と判断している訳です。
そこで、メリモさんの言われるスライドさせる(一見着地したように見える状況からでの横移動と解釈しています)ことが出来るのは、上記の「更に1段落下しようとするまでの待機状態」の時間なのです。
Re: テトリスのブロックロックまでのスライドや落下
問題はTimeFuncにあったという事ですか?
水平方向に関してはMoveActiveでは、Lock関数が呼び出されないために、TimeFuncでWAIT未満の時間なら自由に
水平方向に動かせるという事でしょうか?つまりWaitを超えてTimeFunc内でmoveが発生したら垂直方向落とせるか
直ちに判断するので、ロックされるということですね。でも自分で落とした結果地面についたとき、動かせないのですがこれは何故ですか?自然着陸したらスライドできるけど、強制着陸したら動けないのは何故?
水平方向に関してはMoveActiveでは、Lock関数が呼び出されないために、TimeFuncでWAIT未満の時間なら自由に
水平方向に動かせるという事でしょうか?つまりWaitを超えてTimeFunc内でmoveが発生したら垂直方向落とせるか
直ちに判断するので、ロックされるということですね。でも自分で落とした結果地面についたとき、動かせないのですがこれは何故ですか?自然着陸したらスライドできるけど、強制着陸したら動けないのは何故?
Re: テトリスのブロックロックまでのスライドや落下
強制着地というのは下キーを押したままでの着地ですよね?
下キーが押されて1段落下移動したその次のフレーム(おそらく約1/60秒後)で実行されたKeyInput関数で下が押されたままで実行されてLockActiveBlock関数が実行されたのでしょう。
つまり、約1/60秒だけ下キーを押して1段落下させた直後にキーを離せばスライドできる状態になるはずです。
おそらく・・・ですが、このプログラムだと左右移動も結構な速さで動くのではないでしょうか?
下キーが押されて1段落下移動したその次のフレーム(おそらく約1/60秒後)で実行されたKeyInput関数で下が押されたままで実行されてLockActiveBlock関数が実行されたのでしょう。
つまり、約1/60秒だけ下キーを押して1段落下させた直後にキーを離せばスライドできる状態になるはずです。
おそらく・・・ですが、このプログラムだと左右移動も結構な速さで動くのではないでしょうか?
Re: テトリスのブロックロックまでのスライドや落下
なるほど!分りました。
地面一歩手前でも、自由落下した状態でWaitを待っている状態において下方向を押したら
ロックが呼び出されるから水平方向は呼び出されないんですね。
なるほど。こういう事ですか。だから自分から落ちた時にはスライドできないんですね。
でもテトリスだと自分から落ちた場合でもスライドできませんでしたっけ?
こういう細かいところかなり難しいですね。ありがとうございます。
地面一歩手前でも、自由落下した状態でWaitを待っている状態において下方向を押したら
ロックが呼び出されるから水平方向は呼び出されないんですね。
なるほど。こういう事ですか。だから自分から落ちた時にはスライドできないんですね。
でもテトリスだと自分から落ちた場合でもスライドできませんでしたっけ?
こういう細かいところかなり難しいですね。ありがとうございます。
Re: テトリスのブロックロックまでのスライドや落下
やっぱり下キーはどれだけ早く押しても水平にスライドできないのでは?
WaiterがWaitを超えないで、今ブロックが地面より一段上にいるとします。
この時下キーをどんなに早く例えば0.0000000001秒くらいで押しても、一旦
着地を描画してしまったら水平には動かせないですよね?
WaiterがWaitを超えないで、今ブロックが地面より一段上にいるとします。
この時下キーをどんなに早く例えば0.0000000001秒くらいで押しても、一旦
着地を描画してしまったら水平には動かせないですよね?
Re: テトリスのブロックロックまでのスライドや落下
すいません、変なこと書いたかもしれません。
自分で押した事により、下に着地しても、次動かせるか判定するためのMoveActiveはまた呼び出されるから
自分で押したからといってスライドできないわけじゃないですかね?
ということは、どういうことだろうw
頭が....
自分で押した事により、下に着地しても、次動かせるか判定するためのMoveActiveはまた呼び出されるから
自分で押したからといってスライドできないわけじゃないですかね?
ということは、どういうことだろうw
頭が....
Re: テトリスのブロックロックまでのスライドや落下
ようやく分りました。
下ボタンは一回ボタンを押したつもりでも複数押したことになるため、余裕でLock関数は呼び出されるということですか。
つまり水平ボタンは押せないということですね。どうりで下ボタン押したらテトリスがやたら動きますからね。ありがとうございます。
下ボタンは一回ボタンを押したつもりでも複数押したことになるため、余裕でLock関数は呼び出されるということですか。
つまり水平ボタンは押せないということですね。どうりで下ボタン押したらテトリスがやたら動きますからね。ありがとうございます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: テトリスのブロックロックまでのスライドや落下
まず、これまでの対応をお願いします。フォーラムルールも変更しております。
「DirectXを必要とするフリーソフト • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... 60#p109459
【追記】
失礼しました。こちらです。
「DirectXを必要とするフリーソフト • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... 60#p109420
「DirectXを必要とするフリーソフト • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... 60#p109459
【追記】
失礼しました。こちらです。
「DirectXを必要とするフリーソフト • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... 60#p109420
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: テトリスのブロックロックまでのスライドや落下
フォーラムルール変更については理解しました。対応についてですが、ウイルスソフトについて触れなかったことですか?
あれは申し訳ないです。買い替えの事に囚われていて、頭に入ってきませんでした。何故質問したんでしょうね、質問自体が答えありきで申し訳なかったと思います。その質問はもう解決しましたよね?
あれは申し訳ないです。買い替えの事に囚われていて、頭に入ってきませんでした。何故質問したんでしょうね、質問自体が答えありきで申し訳なかったと思います。その質問はもう解決しましたよね?
Re: テトリスのブロックロックまでのスライドや落下
viewtopic.php?f=3&t=13615&start=60#p109420
は持続という形でいいでしょう。僕以外の人同士で議論しあってますから静観しましょう。
は持続という形でいいでしょう。僕以外の人同士で議論しあってますから静観しましょう。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: テトリスのブロックロックまでのスライドや落下
私だけの問題ではなく、今までのメモリに対して書き込んでくれた沢山の人に対して行なってください。
ISLeさんも書いてますが見直す所が沢山残っています。
【補足】
解決して欲しいと言っているのではなくて義務事項を守ってほしいです。
ISLeさんも書いてますが見直す所が沢山残っています。
【補足】
解決して欲しいと言っているのではなくて義務事項を守ってほしいです。
4. 義務行為
[C言語何でも質問掲示板でのみ適用される事項]
・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて からトピックを終了して下さい。
・複数の回答者がいた場合、都合の良い、または自分の気が向いた回答者にだけ返信を書かず、回答をくれた人 全員に対して出来る限りの返信を書きましょう。
・回答者のコメントの中に複数質問があった場合、出来る限りその全てに答えるようにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: テトリスのブロックロックまでのスライドや落下
たくさんって具体的に?無視はしてませんが?
それにフォーラムルールは"できるだけ"ってなっていますよね?
出来るだけしますが、例えば20個の返答があって、全てに返事するんですか?
なんか自然な流れを強制するのは良くないですね。
それにフォーラムルールは"できるだけ"ってなっていますよね?
出来るだけしますが、例えば20個の返答があって、全てに返事するんですか?
なんか自然な流れを強制するのは良くないですね。
Re: テトリスのブロックロックまでのスライドや落下
・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて からトピックを終了して下さい。
↑
これは、指摘があったのでしました。したつもりでも取りこぼしていたtopicもあったので、その指摘もあって、対処したら、素早い対応ありがとうございました。と僕が悪いのにも関わらずお礼して下さり無事終わりました。
ということでtopicの続きお願いします。
↑
これは、指摘があったのでしました。したつもりでも取りこぼしていたtopicもあったので、その指摘もあって、対処したら、素早い対応ありがとうございました。と僕が悪いのにも関わらずお礼して下さり無事終わりました。
ということでtopicの続きお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: テトリスのブロックロックまでのスライドや落下
揚げ足取り、あら探し、ルールの隙間探しばかりですね。
こちらの話が通じないということはよく分かりました。
こちらの話が通じないということはよく分かりました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: テトリスのブロックロックまでのスライドや落下
ISLeさんの指摘ですね。
会話が噛み合ってないという指摘でした。それはすいません。質問者の私が知識不足のため噛み合わない結果になったのかもしれません。ま、仕方ないですね。
会話が噛み合ってないという指摘でした。それはすいません。質問者の私が知識不足のため噛み合わない結果になったのかもしれません。ま、仕方ないですね。
Re: テトリスのブロックロックまでのスライドや落下
バグさんいらっしゃいますか?パグさんのブロック自動落下制御の指摘によって私の疑問は無事解決しました。ありがとうございます。テトリスの件はtopic違いになるのでこのtopicでは止めたほうがいいですね、すいません。解決という事にします。
Re: テトリスのブロックロックまでのスライドや落下
そして、そのルールはつい数日前に決まったことでしょう?偏らず回答者に答えるようにしようというのは。
処罰阻却事由ではないですけど、そのルールが無かった頃の質問まで遡って問いただすのはどうかと思いますよ?
それにこのルール自体、「出来るだけ」答えるという事になってますよね?全ての回答に対して、質問者が理解できるわけありません。回答者の何らかの意見に対して、強く質問者が反応したなら疎通はその回答者に偏りますよね?だからこそ
全ての回答に対してレスするというのは無理があるんですよ。
処罰阻却事由ではないですけど、そのルールが無かった頃の質問まで遡って問いただすのはどうかと思いますよ?
それにこのルール自体、「出来るだけ」答えるという事になってますよね?全ての回答に対して、質問者が理解できるわけありません。回答者の何らかの意見に対して、強く質問者が反応したなら疎通はその回答者に偏りますよね?だからこそ
全ての回答に対してレスするというのは無理があるんですよ。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: テトリスのブロックロックまでのスライドや落下
ここまで管理人が言っても理解できないとはとても思えません。
構ってもらいたくてわざと誰かが憤慨するような言葉を書いているとしか思えません。
それであれば管理人がコメントを書くこと自体が荒らしの元になります。
従って管理人はメリモさんに対して一切対応しないことにしました。
回答もしませんのでご了承ください。
構ってもらいたくてわざと誰かが憤慨するような言葉を書いているとしか思えません。
それであれば管理人がコメントを書くこと自体が荒らしの元になります。
従って管理人はメリモさんに対して一切対応しないことにしました。
回答もしませんのでご了承ください。
Re: テトリスのブロックロックまでのスライドや落下
安心してください。僕は何も言われなければ、その人につっかかるような事はしませんし。さすがに今までの指摘と違って、それは強制される覚えが無いと信念を持って感じたので反論したまでです。softyaさんを憤慨させる気なんて全くありません。
Re: テトリスのブロックロックまでのスライドや落下
このtopicはパグさんとIsleと私で進行していたごく普通のtopicです。誰にも邪魔されたくないですね。もし忠告があるならtopページで呼び出してくれたらいいんですよ。
Re: テトリスのブロックロックまでのスライドや落下
Dixq (管理人)さんの判断は賢明だと思います。
Dixq (管理人)さんが一番大変なのはわかっています。何故なら副管理人にも独自の考えがあり、それも考慮する必要がありますからね。副管理人が、この質問者はマナーがなってないんじゃないかと指摘すれば、管理人さんもそれに対して
理解を示さないといけないですからね、せっかく頑張ってくれてる副管理人さんなんだから。
Dixq (管理人)さんのご指摘は「最低限」で「ピンポイントな」指摘であるので助かっています。「乱立してはいけない」、「丁寧語」を使いなさいなどですね。実は私は複数の人から荒らし扱いされてやや憤慨していました。ですが管理人さんは、
私を荒らし扱いせず「マナー違反」とし、必要以上に私に対して気に障るような指摘は無かったと思います。
管理人さんの、私を無視するという方針によって、他の副管理人さん達も私を無視して下さることを期待します。過去にした私の迷惑行為によって憤慨なさってる副管理人さん達もDixqさんの方針に従わざる追えないんじゃないでしょうか?Dixqさんの「最低限」の指摘によってルールを守るようになった僕と、過去の私の迷惑行為によって憤慨されている副管理人さん達が今後干渉しあう事なく平和にサイトを進行できるようになると思います。
Dixqさんのご決断に敬意を表明したいです。
Dixq (管理人)さんが一番大変なのはわかっています。何故なら副管理人にも独自の考えがあり、それも考慮する必要がありますからね。副管理人が、この質問者はマナーがなってないんじゃないかと指摘すれば、管理人さんもそれに対して
理解を示さないといけないですからね、せっかく頑張ってくれてる副管理人さんなんだから。
Dixq (管理人)さんのご指摘は「最低限」で「ピンポイントな」指摘であるので助かっています。「乱立してはいけない」、「丁寧語」を使いなさいなどですね。実は私は複数の人から荒らし扱いされてやや憤慨していました。ですが管理人さんは、
私を荒らし扱いせず「マナー違反」とし、必要以上に私に対して気に障るような指摘は無かったと思います。
管理人さんの、私を無視するという方針によって、他の副管理人さん達も私を無視して下さることを期待します。過去にした私の迷惑行為によって憤慨なさってる副管理人さん達もDixqさんの方針に従わざる追えないんじゃないでしょうか?Dixqさんの「最低限」の指摘によってルールを守るようになった僕と、過去の私の迷惑行為によって憤慨されている副管理人さん達が今後干渉しあう事なく平和にサイトを進行できるようになると思います。
Dixqさんのご決断に敬意を表明したいです。