2012-12-28 23 views
0

到目前爲止,我有這個,如果邏輯我想做出從我的HP值減去25的方法,但有一個問題

if (d.intersects(r1) && en.visible == true && en.isAlive == false) 
{ 
    hit = 25; 
    // System.out.println(enemy_count); 
    hitmang(hit); 
} 

if (d.intersects(r2) && en2.visible == true && en2.isAlive == false) 
{ 
    hit = 25; 
    hitmang(hit); 
    // System.out.println(enemy_count); 
} 

用這種方法

private void hitmang(int x) { 
    p.user_hp = p.user_hp - x; 
} 

這些都是我的敵人

en = new Enemy(700, 150); 
en2 = new Enemy (980, 150); 

我想這樣做是爲了當我擊中敵人時它只能從我身上減去25馬力,但是因爲敵人的面積是大(113,134)它是減去25,直到我離開這個範圍使我的HP〜-6000(顯然是一個問題),是否有辦法使它只能減一次。

+2

擊倒或冷卻後才能再次擊中 – Doorknob

回答

1

我想這是因爲你的代碼的第一部分是在遊戲循環中運行多次(通常是30次)。在每次執行時(每次執行大約0.03秒),你的形狀與敵人相交(因爲你沒有移動)。

也就是說,你的HP每0.03秒減少25,直到你離開敵人!

試試這個:

首先,在您的播放器類初始化hitted場。

private boolean hitted = false; 

然後,在你的遊戲循環中。

if (d.intersects(r1) && en.visible == true && en.isAlive == false && !p.hitted) 
{ 
    hit = 25; 
    // System.out.println(enemy_count); 
    hitmang(hit); 
    p.hitted = true; 
} 

// Same goes to 2nd enemy .... 

// if no longer intersects 
if (!d.intersects(r1) && !d.intersects(r2)){ 
    p.hitted = false; 
} 

,或者你可能要實現降溫機制按照意見。

,如果它是你想做的事,初始化另一個字段,而不是

private int hitSince = 0; 

然後,在你的遊戲循環。

if (d.intersects(r1) && en.visible == true && en.isAlive == false && hitSince <= 0) 
{ 
    hit = 25; 
    // System.out.println(enemy_count); 
    hitmang(hit); 
    hitSince = 30; // once hit, you won't be 'hit' and lose HP again in 30 frames 
} 

// Same goes to 2nd enemy .... 

// decrease cooldown time every frame 
hitSince--; 

如果你走這條路,你可能要考慮使用Timer不過,因爲此代碼將取決於你遊戲的FPS - 這可能是在其他玩家的電腦不穩定(因爲他們的電腦很慢或跑步例如在後臺使用反病毒軟件,這通常被稱爲(來自遊戲玩家)「滯後」)

btw,如果會有很多敵人,你需要將它們存儲在arraycollectionArrayList

+1

由於語法原因,我會改爲「命中」,但除此之外,這是我在自己的遊戲中廣泛使用的一個非常好的系統。不過,我建議使用計時器將命中變量重置爲假,以便玩家不能僅憑靠站在敵人身上就免於受到傷害。 – ApproachingDarknessFish

+0

我不使用'hit',因爲OA已經有一個名爲'hit'的局部變量lol。一個計時器也不錯,但我沒有親自使用計時器...... – luiges90

+0

第二個角色現在沒有造成任何傷害?有小費嗎? – user29698

相關問題