線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1527
推到 Plurk!
推到 Facebook!

請問如何重複產生相同的圖片?

答題得分者是:Eruruu
t20004571
一般會員


發表:2
回覆:3
積分:1
註冊:2007-06-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-27 14:40:16 IP:61.217.xxx.xxx 訂閱
小弟我有作一個跳舞機的小遊戲
在舞標的部份卡住了...
現在的解決方法是
用4個Image物件載入相同的圖片
每個Image都被一個Timer所控制
最後再由一個Timer控制所有的Timer
總之工程浩大而且還會LAG!!
所以就在想不知道相同的圖片可不可以重複產生
然後移動的方向跟格數也都相同
使用以後就刪除,這樣應該比較不會LAG吧
不知道表達的完不完整...
先貼一些我寫的程式

(控制Timer用)

void __fastcall TForm1::Timer17Timer(TObject *Sender) //最主要的Timer
{
sprintf(s,"%.1f",q);
Label3->Caption=s;
q=q 0.1;
music();
switch(g)
{
case 1:if(Label3->Caption=="1.0"){Image30->Visible=false;Timer39->Enabled=false;g ;}break;
case 2:if(Label3->Caption=="2.9"){MediaPlayer1->Play();g ;}break;
case 3:if(Label3->Caption=="4.2"){Timer9->Enabled=true;g ;}break; //當Label3=4.2時啟動Timer9
case 4:if(Label3->Caption=="4.4"){Timer10->Enabled=true;g ;}break;
case 5:if(Label3->Caption=="4.6"){Timer11->Enabled=true;g ;}break;
.
.
.
case 336:if(Label3->Caption=="112.0"){over();}break;
}
}

(控制Image用)

void __fastcall TForm1::Timer9Timer(TObject *Sender)
{
Image13->Top=Image13->Top-9;
if(a==1)
{
if(Image13->Top < 1)
{
if(CGauge1->Progress == 0)
{
over();
}
Image13->Top=600;
Timer9->Enabled=false;
miss();
}
}
else
{
if(Image13->Top < 1)
{
Image13->Top=600;
Timer9->Enabled=false;
a=1;
}
}
if(Image44->Visible==true)
{
v=0;
Image39->Visible=false;
Label7->Visible=false;
}
}

像這樣控制Image的還有3個
不過這才只是代表左邊的舞標
所以我總共用了16個Image跟Timer才笨笨的做出來
希望各位前輩們可以告知小弟我重複出圖的方法!!
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-29 13:35:58 IP:210.60.xxx.xxx 訂閱
可以用多執行緒解決
站長有提供一個非常好用的多執行緒function
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=76536

因為你要的功能我想到delphi書上多執行緒那章有各賽跑的範例
用亂數決定速度
四個人隨機看誰會先到終點
改一下應該可以用

提供給您參考,
t20004571
一般會員


發表:2
回覆:3
積分:1
註冊:2007-06-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-29 21:08:55 IP:59.121.xxx.xxx 訂閱
感謝juneo大大提供的方法
不過小弟我對delphi不太會用...
現在我的想法是

舞標總共分為上下左右四個
而且每次執行出現的舞標都是相同的時間對應相同的位置
不是用亂數決定要出現上還是下等...
所以有時候在0.1秒跟0.2、0.3的時候都會出現"左"的舞標
這樣我就必須先做出Image1Image2Image3三個圖片(都相同的)待命
然後再0.1秒的時候讓Image1開始移動
0.2秒是Image2、0.3秒是Image3
如果只用Image1的話會無法抵達目標位置
因為Image1雖然在0.1秒時已經開始移動了
但還沒抵達目標位置我就在0.2秒命令Image1"開始移動"
他就會又跳回去起點開始移動
這樣就沒辦法玩了...
所以我就在想不知道有沒有方法可以讓我只需要設計Image1
還可以讓Image1所載入的圖片在0.1、0.2、0.3秒時同時在畫面上移動
不知道繼承可不可以達成??
最後還是感謝juneo大大提供的方法
小弟我會試著去了解看看^^"

juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-30 11:42:09 IP:210.70.xxx.xxx 訂閱
繼承我是不太會啦,不過可以土法煉鋼
基本上我的想法是這樣的,您可以參考

假設在畫面上同時會出現最多X<=8個游標
X= 1.....8; X可以載入 上下左右四種圖片
因此我需要8個 Image的物件
將這些物件放在螢幕下方的外面
接著用亂數決定上升的游標是上下左右
當游標超出螢幕最上方的時候就回到原來位置(重置)
有點像魔術方塊那樣的作法
找一找遊戲類的書應該會有你要的技術
Eruruu
一般會員


發表:9
回覆:13
積分:9
註冊:2006-07-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-30 22:06:55 IP:122.118.xxx.xxx 訂閱
跳舞機?
跳舞機的每個舞標移動速度不是都一樣嗎,用一個timer就行了吧
舞標出現的順序?如果是我 會用一個矩陣,1~4代表上下左右,後面再加上 下一個舞標出現的間隔毫秒,像
1,100
2,200

也可以試看看像十年前街頭布袋戲的背景捲法,用兩張大圖並排向上捲,上面那張捲完就放到另一張下面繼續向上捲
再把4張放舞標的小圖用Draw畫到背景上,
BackGround1->Canvas->Draw(X,Y,Image1->Picture->Bitmap);
這樣就完全不會lag了。

要先
Form1->DoubleBuffered=1;
之後圖片的移動才不會閃爍
------
わたしは..わたし
t20004571
一般會員


發表:2
回覆:3
積分:1
註冊:2007-06-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-01 18:36:00 IP:59.115.xxx.xxx 訂閱
感謝juneo大跟Eruruu大提供的方法
Eruruu大說的

>>舞標出現的順序?如果是我 會用一個矩陣,1~4代表上下左右,後面再加上 下一個舞標出現的間隔毫秒,像
>>1,100
>>2,200

可以請問一下舞標出現的間隔毫秒應該要把數值設定給誰?怎麼設定?

另外"街頭布袋戲的背景捲法"感覺可行,小弟我會試試的!!

還有一個疑問就是
我現在出現的舞標會有一模一樣的舞標差幾毫秒的時間間隔
這樣我是不是就必須一定要預先設定多個一樣的圖檔??
就像底下這樣...


Eruruu
一般會員


發表:9
回覆:13
積分:9
註冊:2006-07-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-05-22 00:34:20 IP:122.118.xxx.xxx 訂閱
用一個圖Draw幾次到背景上就可以了啊,箭頭不是都長一樣嗎
------
わたしは..わたし
系統時間:2024-04-20 4:39:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!