Discussion:
[問題] DDR程式架構
(时间太久无法回复)
偽.強者
2007-03-14 02:09:41 UTC
Permalink
嗯 這禮拜我要做一個DDR

想請問一下前輩們 我這樣設計的架構有沒有問題


DDR 基本上是用很簡單的版本 就是有一個bar會從上面掉下來 然後在特定的位置 按按鈕

他就會消失

我的想法如下

做一個Block的物件 method 有

move() : 每次移動多遠 然後紀錄線在座標 上次座標
isOut(): 檢查block移出螢幕了沒 若有 傳回true

繼承一個panel 來顯示這些移動的block : DisplayPanel

在這個物件裡 用一個vector去儲存block


overwrite paintComponent(Graphics g)

setXORMode

再裡面開一個Thread (其實我本來不是這樣寫 但是有問題 等等再描述) 跑無窮回圈

無窮回圈裏面再開兩個迴圈走訪vector 裡的block {

一個跑畫現在的block /每個跑完都move(distance);

sleep幾秒

另一個跑擦掉block/若block跑出去則移出vector

最後在隨機加入block到vector
}

問題來了 我本來想是要做一個Class: MoveLine extend Thread

然後 再把這個moveLine 放在overwrite *[31;1mpaintComponent(Graphics g)*[m

然後把 Graphics g 在initiate moveLine的時候 傳入其constructor

然後在他的run 裡面做上面那幾個迴圈

不過 這樣g都一直沒有傳進去 (g在constructor內有接收到)

但是 run裡面的g都是null

所以 我在想 我Thread的觀念可能有點謨糊掉了 (很久沒寫啦)

請各位前輩指點一下 :) 畢竟現在這樣雖然可以跑 但是很醜

謝謝
--
這個project是做類似wii 然後 pc端用java做一個遊戲去接收remote的訊號

remote是用WSN的mote加 sensor去做的

嗯 這是一個禮拜的midterm project Orz 真是趕

--
我想當一個壞人.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 68.187.13.21
骨頭
2007-03-14 02:44:15 UTC
Permalink
※ 引述《maxisam (偽.強者)》之銘言:
: 想請問一下前輩們 我這樣設計的架構有沒有問題
: DDR 基本上是用很簡單的版本 就是有一個bar會從上面掉下來 然後在特定的位置 按按鈕
: 他就會消失
: 我的想法如下

: 問題來了 我本來想是要做一個Class: MoveLine extend Thread
: 然後 再把這個moveLine 放在overwrite mpaintComponent(Graphics g)
: 然後把 Graphics g 在initiate moveLine的時候 傳入其constructor
: 然後在他的run 裡面做上面那幾個迴圈
: 不過 這樣g都一直沒有傳進去 (g在constructor內有接收到)
: 但是 run裡面的g都是null

這部份要看詳細的碼才知道原因,
不過本來這樣把變數亂傳就是不好的,可能會造成ref混淆。

你如果需要這樣做的話 ,
可以考慮 傳入目標的元件(ex Frame)做 getGraphics() .

應該可以確保取得 Graphics 的資料
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Component.html#getGraphics()


btw盡量讓繪圖的動作簡單化,
用多一點的計算取代多執行緒,在管理上會比較方便......

其實我很久沒寫Java GUI了,以上就僅供參考吧。XD


--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the complier will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
偽.強者
2007-03-14 02:54:57 UTC
Permalink
※ 引述《TonyQ (骨頭)》之銘言:
: ※ 引述《maxisam (偽.強者)》之銘言:
: : 想請問一下前輩們 我這樣設計的架構有沒有問題
: : DDR 基本上是用很簡單的版本 就是有一個bar會從上面掉下來 然後在特定的位置 按按鈕
: : 他就會消失
: : 我的想法如下
: : 問題來了 我本來想是要做一個Class: MoveLine extend Thread
: : 然後 再把這個moveLine 放在overwrite mpaintComponent(Graphics g)
: : 然後把 Graphics g 在initiate moveLine的時候 傳入其constructor
: : 然後在他的run 裡面做上面那幾個迴圈
: : 不過 這樣g都一直沒有傳進去 (g在constructor內有接收到)
: : 但是 run裡面的g都是null
: 這部份要看詳細的碼才知道原因,
: 不過本來這樣把變數亂傳就是不好的,可能會造成ref混淆。

? 為什麼是亂傳 @@?

: 你如果需要這樣做的話 ,
: 可以考慮 傳入目標的元件(ex Frame)做 getGraphics() .

不懂 你的意思是說在MoveLine這個thread裡 getGraphics() ?

getGraphics()要在panel / Frame裡面才會有吧 ?

還是說你要把整個panel物件丟進moveLine的thread裡面 然後再getGraphics() ?

: 應該可以確保取得 Graphics 的資料
: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Component.html#getGraphics()
: btw盡量讓繪圖的動作簡單化,
: 用多一點的計算取代多執行緒,在管理上會比較方便......
: 其實我很久沒寫Java GUI了,以上就僅供參考吧。XD

我也想用計算 能不用thread我是盡量不用 (導致thread現在有點苦手 ?)

anyway, thx

--
我想當一個壞人.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 68.187.13.21
骨頭
2007-03-14 03:19:22 UTC
Permalink
※ 引述《maxisam (偽.強者)》之銘言:
: ※ 引述《TonyQ (骨頭)》之銘言:
: : 這部份要看詳細的碼才知道原因,
: : 不過本來這樣把變數亂傳就是不好的,可能會造成ref混淆。
: ? 為什麼是亂傳 @@?

其實這是概念上的問題 , XD
不過我個人是認同一個物件一個任務,

panel本來就是顯示元件,由panel來控制graphic做draw的動作,
而由moveLine去計算應該要畫的內容,這樣比較符合MVC吧。


: : 你如果需要這樣做的話 ,
: : 可以考慮 傳入目標的元件(ex Frame)做 getGraphics() .
: 不懂 你的意思是說在MoveLine這個thread裡 getGraphics() ?
: getGraphics()要在panel / Frame裡面才會有吧 ?
: 還是說你要把整個panel物件丟進moveLine的thread裡面 然後再getGraphics() ?

you got it,
應該說 把你要draw的目標元件扔進去做參考

: : 應該可以確保取得 Graphics 的資料
: : http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Component.html#getGraphics()
: : btw盡量讓繪圖的動作簡單化,
: : 用多一點的計算取代多執行緒,在管理上會比較方便......
: : 其實我很久沒寫Java GUI了,以上就僅供參考吧。XD
: 我也想用計算 能不用thread我是盡量不用 (導致thread現在有點苦手 ?)
: anyway, thx



--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the complier will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
偽.強者
2007-03-14 03:47:15 UTC
Permalink
※ 引述《TonyQ (骨頭)》之銘言:
: ※ 引述《maxisam (偽.強者)》之銘言:
: : ? 為什麼是亂傳 @@?
: 其實這是概念上的問題 , XD
: 不過我個人是認同一個物件一個任務,
: panel本來就是顯示元件,由panel來控制graphic做draw的動作,
: 而由moveLine去計算應該要畫的內容,這樣比較符合MVC吧。
: : 不懂 你的意思是說在MoveLine這個thread裡 getGraphics() ?
: : getGraphics()要在panel / Frame裡面才會有吧 ?
: : 還是說你要把整個panel物件丟進moveLine的thread裡面 然後再getGraphics() ?
: you got it,
: 應該說 把你要draw的目標元件扔進去做參考

這樣做可以 有跑出來 不過 為什麼之前那樣不行呢 @@?

我以前有這樣做過 不過 我覺得這樣好像有點物件亂扯的感覺

感覺很沒有結構 :( 是我搞錯了嗎 @@"

: : 我也想用計算 能不用thread我是盡量不用 (導致thread現在有點苦手 ?)
: : anyway, thx

--
我想當一個壞人.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 68.187.13.21
骨頭
2007-03-14 04:03:40 UTC
Permalink
※ 引述《maxisam (偽.強者)》之銘言:
: ※ 引述《TonyQ (骨頭)》之銘言:
: : you got it,
: : 應該說 把你要draw的目標元件扔進去做參考
: 這樣做可以 有跑出來 不過 為什麼之前那樣不行呢 @@?
: 我以前有這樣做過 不過 我覺得這樣好像有點物件亂扯的感覺
: 感覺很沒有結構 :( 是我搞錯了嗎 @@"

我剛剛找不到參考資料,現在翻到了。

貼上來參考
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Graphics.html#dispose()

Graphics objects which are provided as arguments to the paint and update 
methods of components are automatically released by the system when those 
methods return. For efficiency, programmers should call dispose when finished
using a Graphics object only if it was created directly from a component or
another Graphics object.

--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the complier will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
P***@mobbs.stut.edu.tw
2007-03-14 04:02:15 UTC
Permalink
Post by 骨頭
※ 引述《maxisam (偽.強者)》之銘言:
其實這是概念上的問題 , XD
不過我個人是認同一個物件一個任務,
panel本來就是顯示元件,由panel來控制graphic做draw的動作,
而由moveLine去計算應該要畫的內容,這樣比較符合MVC吧。
: 不懂 你的意思是說在MoveLine這個thread裡 getGraphics() ?
: getGraphics()要在panel / Frame裡面才會有吧 ?
: 還是說你要把整個panel物件丟進moveLine的thread裡面 然後再getGraphics() ?
you got it,
應該說 把你要draw的目標元件扔進去做參考
: 我也想用計算 能不用thread我是盡量不用 (導致thread現在有點苦手 ?)
: anyway, thx
我的想法跟T大一樣(應該...XD)

是要畫在 Panel上面吧?
我的話習慣
把MoveLine用內部類別寫在Panel的裡面
在MoveLine裡呼叫paintComponent(getGraphics());

如果MoveLine不想寫在Panel內部
那就用使用Panel的getGraphics()方法取得畫布給MoveLine當參數
再由MoveLine畫就好嚕

--
稍微說一下java遊戲製作的概念好了...
主迴圈只要一個!!
(把這個迴圈實作Thread?不 爽的話無限迴圈也可以 記得要加sleep跟中止條件就好)
主迴圈裡執行二個主要方法draw(Graphics g)跟update(經過的時間);
draw(g)是畫物件 (這個g記得要從要顯示的物件上取得)
update()是更新物件的狀態跟輸入裝置的狀態(x鍵是否被按下)
整個架構其實很簡單,但就是有書要寫到很複雜...
--


赤糸
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-28.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
偽.強者
2007-03-14 06:19:59 UTC
Permalink
吃光光


原本作法經過與T前輩討論 發現有一個蠢問題 就是元件本身會repaint

所以 把thread寫在paintComponment裡面是一件蠢事

現在改了 MoveLine 這個thread中 把block畫在 BufferedImage 呼叫repaint

然後再DisplayPainel裡面 把BufferedImage畫出來

嗯 製作動畫的小心得 不過還有點問題 嘗試後在把心得po上

遇到的問題之一 repaint 和 thread呼叫repaint會有點衝突

運氣不好 會導致畫面不正確

java動畫不好寫 :(
--
我想當一個壞人.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 68.187.13.21
※ 編輯: maxisam 來自: 68.187.13.21 (03/14 14:19)
Loading...