2014-05-05 29 views
0

我正在XNA製作2D射擊遊戲。我一直在努力對玩家的拍攝速度(每多久可以將播放器拍攝另一子彈),並作出如此,一旦前面的子彈已經走過像這樣有一定的距離玩家只能再次拍攝:XNA如何使對象不可見

if (this.bulletList[0].BULLETS[(this.bulletList[0].BULLETS.Count) - 1].X >= Pos.X + attackSpeed) 
       canShoot = true; 

其中bulletList是可用的投射物,玩家可以射擊,BULLETS是已經射擊的子彈列表,attackSpeed是子彈應該射擊的速率,或者簡單地說:子彈必須行進到另一個子彈能夠行進的距離被槍殺。

現在我一直在研究碰撞。我的方法是處置子彈擊中一個目標,像這樣經過:

for (int i = 0; i < player.BULLETLIST[0].BULLETS.Count; i++) 
     { 
      if (CollisionManager.PlayerBulletOnBot(player.BULLETLIST[0].BULLETS[i], bot)) 
       player.BULLETLIST[0].BULLETS.RemoveAt(i); 
     } 

問題是,如果子彈已經在命中目標刪除,我不能再如果子彈已經通過給定距離要求爲另一顆子彈射擊。 爲了解決這個問題,我希望子彈在被擊中時可以打開隱形,之後它會被另一個已經制作好的功能處理掉。

回答

2

只要有一個Visible標誌的Bullet例如:

class Bullet { 
    public bool Visible { get; set; } 
} 

當它擊中..使其不可見:

// ... hit 
bulletInstace.Visible = false; 

繪製之前再檢查:

if (bulletInstance.Visible) 
    drawBullet(bullet); 

如果它不可見,您的繪圖代碼應該略過它。

+0

一顆子彈只需要繪製一次。一旦它在那裏,我可以以任何我想要的方式調整它的位置。它不會被重新繪製在不同的位置,因此我不能使用該標誌。這就是爲什麼我認爲使對象透明或不可見應該起作用的原因。 – Villager

+0

繪製一次? ..每幀正確?該標誌可以讓你跳過下一幀。 –

+0

據我所知,你不能在XNA中畫一次,只是簡單地將它移動到每一幀。這不僅僅是框架的工作原理。西蒙的權利,你會想要一個可見的財產,你改變,並只繪製子彈基於此。 – Falgantil

0

當您使用spriteBatch.Draw(...)繪製對象時,您必須爲精靈本身選擇一種顏色。

我們都知道顏色是「紅色,綠色和藍色」值(或rgb)的混合。沒有多少人知道,至少在XNA中,有第四個值叫做alpha。

alpha值表示您的對象的透明度,這意味着如果您像下面的代碼一樣使用它,您的對象將是一半不可見(或半可見)。

spriteBatch.Draw(..., Color.White * 0,5f,...); 

您可以用玩:)

檢查多一點here,對老XNA論壇。

0

您需要在您按住按鈕時增加一些maxRof值的點火率(rof)屬性。並且當rof等於maxrof時,則將子彈添加到項目符號列表(並將rof重置爲0)。

不要讓它看不見,從列表中刪除它。子彈的每一個實例都應該將「Active」屬性設置爲true。 (當你發射一顆子彈時,將它添加到列表中)當collsition發生時,將此屬性設置爲false。僞代碼示例:

UPDATE

for each bullet in bullets 
    -- update bullet position 
    -- check collision if happened if yes then set Active to false 
end for 

bullets.removeall(function(c) NOT(c.active)); 

DRAW

for each bullet in bullets.findall(function(c) c.active) 
    -- draw your bullets 
end for 
+0

爲什麼他不應該讓子彈看不見。這很容易。但當然這也可以使用。 – MCollard

+0

隱形意味着子彈是隱藏的,但更新功能仍在計算位置和其他參數。是他需要計算位置和距離的例子......但是如果使用ROF,他不需要這樣做,因此他可以在碰撞後簡單地處置該子彈。 –

+0

它只會計算,直到它達到一定的距離(在Villager的代碼中)。然後他可以進行碰撞'&&(player.BULLETLIST [0] .BULLETS [i] .Visible == false)' 但是,這只是一個選項,很高興看到其他人爲他人提供關於某個主題的其他觀點的答案。 – MCollard