3

私は、異なる色の 5 つの画像を持つ 8x8 グリッドであるボード ゲームに取り組んでいます。オブジェクトは、行または列で隣り合っている限りスワップできます。切り替えの結果、3 つ以上のオブジェクトが行または列で同じになる場合、それらは削除されます。切り替えの結果が一致しない場合、切り替えは行われません。オブジェクトが削除されると、ボードが折りたたまれ、削除されたオブジェクトの上に配置されたオブジェクトがその代わりに落下し、新しいオブジェクトが上から落ちてスペースを埋めます。

オブジェクトのドラッグ操作と落下を実装する良い方法を知りたいです。階層化されたペインを使用する必要がありますか?

どんなアイデアでも私を助けます。

4

1 に答える 1

0
  1. ドラッグ操作:カラーインデックス(たとえば、8x8グリッドで合計5つの異なる色)と長方形オブジェクトを報告するハッシュマップを作成します。Rectとcolorは、それぞれキーと値を表します。隣接する2つのブロック(長方形)を毎回2回別々にクリックし、これら2つの適切な色を取得して、交換します。次に、線上に3つまたは3つ以上の同じ色が隣接するブロックセットが少なくとも1つある場合は、色の分布をもう一度確認します。そうでない場合は、色を元に戻します。

  2. フォールダウン:少なくとも1つのブロックセット(同じ線上で隣接している場合でも3つ以上)を見つけたら、削除された長方形の上のすべてのカラーブロックを、各長方形の高さ*現在の列の削除された長方形の数だけ差し引きます。その後、ライン上に3つ以上の等しい色で設定されたブロックがなくなるまで、現在の色の分布を何度も確認します。

ありがとう。ユーザーに感じられるオブジェクトの落下をどのように作成しますか。そのような効果を生み出すために、グラフィックやタイマーを使用する必要がありますか?

タイマーが良い選択になります。少なくとも1つのブロックセット(同じ行に隣接している場合でも3つ以上)を見つけた後、Timerのschedule(TimerTask task、long delay、long period)を呼び出します。ここで、 TimerTaskrun()を定義する必要があります。これは何もしません。メインスレッドで定義されたJComponent/JFrameのrepaint(int x、int y、int width、int height)を呼び出して、落下部分を描画します。JComponent / JFrameのペイント(グラフィックスg)で、落下部分のさまざまなフェーズを描画する必要があります。また、 TimerTaskのrun()でループを使用する必要があります。これにより、期間msが経過するたびに、別のJComponent / JFrameのrepaint(x、y、width、height)が実行されます。呼び出されます。5回ループする場合は、5番目のループでTimerTaskのcancel()を使用するだけで、タイマーが終了します。ちらつきの影響をあまり気にしない場合は、代わりにrepaint()を使用して、ペイント(グラフィックスg)に8x8グリッドイメージ全体を毎回描画します。JComponent / JFrameを使用した理由は、JFrameに直接描画することも、JFrameに基づいてJComponentに描画することもできるためです。

ありがとう。落下とドラッグの効果を実装するためのアイデアがあります。今、私は自分のプログラムで立ち往生していて、自分の道を見つけることができません。助けていただければ幸いです。これまでの私のプログラムは、フレームに8x8グリッドレイアウトのパネルを作成したことです。ImageID(行と列の番号を持つ文字列)、Image(JLabel)、行と列のクラスを作成しました。GridLayoutに格納された2次元配列に格納された64個のオブジェクトを作成しました。mouselistenerとmousemotionlistenerが各オブジェクトにアタッチされています。ユーザーがグリッドをクリックすると、画像オブジェクトが取得され、クリックされた画像の行と列が取得されます– newjav昨日
私が立ち往生している問題は、マウスを押したり、ドラッグしたり、離したりしたときです。mousereleaseまたはmousedragが押されたオブジェクトであるときに取得するオブジェクト。そのため、マウスを離したグリッドの行と列が表示されません。マウスが離されたグリッド位置を計算するにはどうすればよいですか。私はここで立ち往生していて、それ以上進むことができません

mouseMotionListenerなしでmousePressedListenerとmouseReleasedListenerのみを使用する場合は、ソースグリッドオブジェクトとターゲットグリッドオブジェクトを別々に取得できます。しかし、あなたの目的はMouseMotionListenerを使用することだと思います。したがって、2つのバリエーションがあります 。1。グリッドobjを押した直後に、グリッドobjを取得します(つまり、このグリッドobjの境界を取得します)。たとえば、2番目の行と列のグリッドオブジェクトをクリックすると、グリッドオブジェクトのメンバーの=1と列を取得できます。= 1.各グリッドの幅と高さが両方とも10(ピクセル)であると想定します。次に、このグリッドobjの境界を取得します:(10、10)および(20、20)。次に、別のグリッドにドラッグします。したがって、このグリッドobjのmouseReleased()関数に条件を追加する必要があります。現在リリースされているマウスの位置がこのグリッドobjの境界外にある場合、彼の隣人の1人がターゲットグリッドobjになります。例:if(e。getX()> 20 && e.getY()> 10 && e.getY()<20){//ターゲットグリッドオブジェクトはソースグリッドオブジェクトの右側にあり、その境界は(20 、10)、(30、10)、つまり行= 1、列= 2}行と列を使用すると、2D配列からターゲットグリッドオブジェクトを見つけることができます。 2.2。しかし、私があなたなら、各グリッドobjにmouseListenerとmouseMotionListenerを割り当てるのではなく、これらの64個のグリッドobjを含むパネルにmouseListenerとmouseMotionListenerのみを割り当てます。クリックしてドラッグしてから離すたびに、適切な位置が表示され、行と列に簡単に変換できます。行と列を使用すると、2D配列から適切なグリッドオブジェクトを見つけることができます。それでおしまい。うまくいけば、これはあなたが望むものです。

于 2012-03-20T16:18:29.000 に答える