2012-04-24 73 views
1

繼續我的乒乓球比賽的通電,我已經讓他們大部分工作正常(很感謝吉姆佩裏),但現在我不能似乎讓我的蝙蝠(槳)呼籲時增長或縮小。返回一個對象的大小來改變它在一個函數內

我在想它與我稱之爲蝙蝠大小的方式有關。在我的Bat類中,我有一個名爲GetSize()的函數,它返回蝙蝠的大小。

 public Rectangle GetSize() 
    { 
     return size; 
    } 

我基本上是想在一個功能中使蝙蝠的尺寸加倍,而在另一個功能中使蝙蝠的尺寸縮小一半。

 public void GrowBat() 
    { 
    } 

    public void ShrinkBat() 
    { 
    } 

如果我在這個函數中插入類似下面的內容,我不會注意到蝙蝠的任何變化。

public void GrowBat() 
    { 
size = new Rectangle(0, 0, leftBat.Width * 2, leftBat.Height *2); 
} 

    public void ShrinkBat() 
    { 
size = new Rectangle(0, 0, leftBat.Width/2, leftBat.Height/2); 
    } 

我在想它和我有關,不會返回蝙蝠的大小。你們如何解決這個問題?

我包括我的蝙蝠的Game1類下面,以幫助澄清,特別是在我的Game1類的通電,大約有一半的方式switch語句下來。

namespace Pong 
{ 
    using Microsoft.Xna.Framework; 
    using Microsoft.Xna.Framework.Content; 
    using Microsoft.Xna.Framework.Graphics; 
    using System; 

public class Bat 
    { 
    public Vector2 position; 
    public float moveSpeed; 
    public Rectangle size; 
    private int points; 
    private int yHeight; 
    private Texture2D leftBat; 
    public float turbo; 
    public float recharge; 
    public float interval; 
    public bool isTurbo; 


    public Bat(ContentManager content, Vector2 screenSize, bool side) 
    { 
     moveSpeed = 7f; 
     turbo = 15f; 
     recharge = 100f; 
     points = 0; 
     interval = 5f; 
     leftBat = content.Load<Texture2D>(@"gfx/batGrey"); 
     size = new Rectangle(0, 0, leftBat.Width, leftBat.Height); 
     if (side) position = new Vector2(30, screenSize.Y/2 - size.Height/2); 
     else position = new Vector2(screenSize.X - 30, screenSize.Y/2 - size.Height/  2); 
     yHeight = (int)screenSize.Y; 
    } 

    public void IncreaseSpeed() 
    { 
     moveSpeed += .5f; 

    } 


    public void Turbo() 
    { 
     moveSpeed += 7.0f; 
    } 

    public void DisableTurbo() 
    { 
     moveSpeed = 7.0f; 
     isTurbo = false; 
    } 


    public Rectangle GetSize() 
    { 
     return size; 
    } 

    public void IncrementPoints() 
    { 
     points++; 
    } 

    public int GetPoints() 
    { 
     return points; 
    } 

    public void SetPosition(Vector2 position) 
    { 
     if (position.Y < 0) 
     { 
      position.Y = 0; 
     } 
     if (position.Y > yHeight - size.Height) 
     { 
      position.Y = yHeight - size.Height; 
     } 
     this.position = position; 
    } 

    public Vector2 GetPosition() 
    { 
     return position; 
    } 

    public void MoveUp() 
    { 
     SetPosition(position + new Vector2(0, -moveSpeed)); 
    } 

    public void MoveDown() 
    { 
     SetPosition(position + new Vector2(0, moveSpeed)); 
    } 


    public virtual void UpdatePosition(Ball ball) 
    { 
     size.X = (int)position.X; 
     size.Y = (int)position.Y; 
    } 

    public void ResetPosition() 
    { 
     SetPosition(new Vector2(GetPosition().X, yHeight/2 - size.Height)); 
    } 

    public void GrowBat() 
    { 

    } 

    public void ShrinkBat() 
    { 
     size = new Rectangle(0, 0, leftBat.Width/2, leftBat.Height/2); 
    } 


    public virtual void Draw(SpriteBatch batch) 
    { 
     batch.Draw(leftBat, position, Color.White); 
    } 


    } 
} 







    namespace Pong 
{ 
using System; 
using System.Diagnostics; // There for debugging purposes right now 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Media; 



    /// <summary> 
    /// This is the main type for your game 
    /// </summary> 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 

    public static GameStates gamestate; 
    private GraphicsDeviceManager graphics; 
    public int screenWidth; 
    public int screenHeight; 
    private Texture2D backgroundTexture; 
    private SpriteBatch spriteBatch; 
    private Menu menu; 
    private SpriteFont arial; 
    private HUD hud; 
    Animation player; 

    // Bats & Ball 
    public Bat rightBat; 
    public Bat leftBat; 
    public Ball ball; 


    // Scoring 
    private int resetTimer; 
    private bool resetTimerInUse; 
    public bool lastScored; 

    // All things having to do with the powerup 
    Powerup powerup; 
    SpriteFont font; 
    Vector2 vec; 
    Vector2 vec2; 
    Vector2 tickVec; 
    Vector2 activatedVec; 
    Vector2 deactivatedVec;  
    Vector2 promptVec; 
    Random random; 
    GamePadState lastState; 
    int tickCount; 
    bool powerupInitialized; 



    // Menus 
    private SoundEffect menuButton; 
    private SoundEffect menuClose; 
    public Song MainMenuSong { get; private set; } 
    public Song PlayingSong { get; private set; } 

    private Input input; 

    // For resetting the speed burst of the paddle 
    int coolDown = 0; 
    int disableCooldown = 0; 
    int powerEnableCooldown = 5000; 
    int powerDisableCooldown = 2000; 

    // Creates a new intance, which is used in the HUD class 
    public static Game1 Instance; 

    public enum GameStates 
    { 
     Menu, 
     Running, 
     Paused, 
     End 
    } 

    // Constructor (I'm a n00b, remember?) 
    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 

     // Creates an instance of the class, which is used in the HUD class 
     Instance = this; 

    } 


    protected override void Initialize() 
    { 
     screenWidth = 1280; 
     screenHeight = 720; 
     menu = new Menu(); 
     gamestate = GameStates.Menu; 
     resetTimer = 0; 
     resetTimerInUse = true; 
     lastScored = false; 
     graphics.PreferredBackBufferWidth = screenWidth; 
     graphics.PreferredBackBufferHeight = screenHeight; 
     graphics.IsFullScreen = true; 
     graphics.ApplyChanges(); 
     ball = new Ball(Content, new Vector2(screenWidth, screenHeight)); 
     SetUpMulti(); 
     input = new Input(); 
     hud = new HUD(); 

     // Places the powerup animation inside of the surrounding box 
     player = new Animation(Content.Load<Texture2D>(@"gfx/powerupSpriteSheet"), new  Vector2(103, 44), 64, 64, 4, 5); 

     // Used by for the Powerups 
     random = new Random(); 
     vec = new Vector2(100, 50); 
     vec2 = new Vector2(100, 100); 
     promptVec = new Vector2(50, 25); 
     powerupInitialized = false; 

     base.Initialize();   
    } 


    protected override void LoadContent() 
    { 
     arial = Content.Load<SpriteFont>("Arial"); // for game scores 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     backgroundTexture = Content.Load<Texture2D>(@"gfx/background"); 
     hud.LoadContent(Content); 
     menuButton = Content.Load<SoundEffect>(@"sfx/menuButton"); 
     menuClose = Content.Load<SoundEffect>(@"sfx/menuClose"); 
     MainMenuSong = Content.Load<Song>(@"sfx/getWeapon"); 
     PlayingSong = Content.Load<Song>(@"sfx/boomer"); 
     MediaPlayer.IsRepeating = true; 
//   MediaPlayer.Play(MainMenuSong); // getWeapon music 
     font = Content.Load<SpriteFont>("Arial"); // Used by the Powerup 

    } 


    private void PowerupActivated(object sender, PowerupEventArgs e) 
    { 
     activatedVec = new Vector2(100, 125);   
    } 

    private void PowerupDeactivated(object sender, PowerupEventArgs e) 
    { 
     deactivatedVec = new Vector2(100, 150); 
     //do whatever - shrink ball, paddle, slow down ball 
    } 

    private void PowerupTick(object sender, PowerupEventArgs e) 
    { 
     tickVec = new Vector2(100, 175); 
     tickCount++; 
     //for powerup like Regen, add hp 
    } 


    // Sets up single player game 
    private void SetUpSingle() 
    { 
     rightBat = new AIBat(Content, new Vector2(screenWidth, screenHeight), false); 
     leftBat = new Bat(Content, new Vector2(screenWidth, screenHeight), true); 
    } 

    // Sets up 2 player game 
    private void SetUpMulti() 
    { 
     rightBat = new Bat(Content, new Vector2(screenWidth, screenHeight), false); 
     leftBat = new Bat(Content, new Vector2(screenWidth, screenHeight), true); 
    } 


    // Increases the speed of the bats slightly after each round 
    private void IncreaseSpeed() 
    { 
     ball.IncreaseSpeed(); 
     leftBat.IncreaseSpeed(); 
     rightBat.IncreaseSpeed(); 
    } 


    protected override void Update(GameTime gameTime) 
    { 
     input.Update(); 
     player.Update(gameTime); 

     // Allows the game to exit 
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || 
      Keyboard.GetState().IsKeyDown(Keys.Escape)) 
      this.Exit(); 


     GamePadState state = GamePad.GetState(PlayerIndex.One); 

     if (state.Buttons.RightShoulder == ButtonState.Pressed && lastState.Buttons.RightShoulder == ButtonState.Released 
      || Keyboard.GetState().IsKeyDown(Keys.LeftAlt)) 
     { 
      //generate a random powerup 
      PowerupType type = (PowerupType)random.Next(Enum.GetNames(typeof(PowerupType)).Length); 

      switch (type) 
      { 
       case PowerupType.BigBalls: 
        { 
        powerup = new Powerup(type, 10.0f, 1.0f); 
        ball.ShrinkBall(); 
        break; 

        } 
       case PowerupType.BigPaddle: 
        { 
         powerup = new Powerup(type, 10.0f, 10.0f); 
         leftBat.GrowBat(); 
         break; 
        } 
       case PowerupType.ShrinkEnemy: 
        { 
         powerup = new Powerup(type, 10.0f, 10.0f); 
         rightBat.ShrinkBat(); 
         break; 

        } 
       case PowerupType.SpeedBall: 
        { 
         powerup = new Powerup(type, 10.0f, 20.0f); 
         ball.IncreaseSpeed(); 
         break; 

        } 
       case PowerupType.SplitWall: 
       case PowerupType.ThreeBurst: 
       case PowerupType.Heal: 
        { 
         powerup = new Powerup(type, 1.0f, 1.0f); 
         hud.AddHealthP1(); 

         break; 
        } 
       case PowerupType.Regen: 
        { 
         powerup = new Powerup(type, 20.0f, 1.0f); 

         break; 
        } 
      } 

      powerupInitialized = false; 

     } 
     else if (state.Buttons.LeftShoulder == ButtonState.Pressed && 
      lastState.Buttons.LeftShoulder == ButtonState.Released || 
      Keyboard.GetState().IsKeyDown(Keys.LeftControl) && Keyboard.GetState().IsKeyUp(Keys.LeftControl)) 
     { 
      powerup.Activate(); 
     } 

     if (powerup != null && IsActive) 
     { 
      if (!powerupInitialized) 
      { 
       powerup.Activated += PowerupActivated; 
       powerup.Deactivated += PowerupDeactivated; 

       if (powerup.Type == PowerupType.Regen) 
        powerup.Tick += PowerupTick; 

       powerupInitialized = true; 
      } 

      powerup.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds); 
     } 

     lastState = state; 


     // What to do when the game is over 
     if (gamestate == GameStates.Running) 
     { 
      if (hud.currentHealthP2 < 1) 
      { 
       menu.InfoText = "Game, blouses."; 
       gamestate = GameStates.End; 
      } 
      else if (hud.currentHealthP1 < 1) 
      { 
       menu.InfoText = "You just let the AI beat you."; 
       gamestate = GameStates.End; 
      } 
      if (resetTimerInUse) 
      { 
       resetTimer++; 
       ball.Stop();     
      } 

      if (resetTimer == 120) 
      { 
       resetTimerInUse = false; 
       ball.Reset(lastScored); 
       resetTimer = 0; 
      } 


      // Controls movement of the bats    
      if (rightBat.GetType() != typeof(Pong.AIBat)) 
      { 
       if (input.LeftDown) leftBat.MoveDown(); 
       else if ((input.LeftUp)) leftBat.MoveUp(); 
       if (input.RightDown) rightBat.MoveDown(); 
       else if (input.RightUp) rightBat.MoveUp(); 
      } 

      else if (rightBat.GetType() == typeof(Pong.AIBat)) 
      { 
       if (input.LeftDown) leftBat.MoveDown(); 
       else if ((input.LeftUp)) leftBat.MoveUp(); 
       if (input.RightDown) leftBat.MoveDown(); 
       else if (input.RightUp) leftBat.MoveUp(); 
      } 


      // Updating ball and bat position 
      leftBat.UpdatePosition(ball); 
      rightBat.UpdatePosition(ball); 
      ball.UpdatePosition(); 


      // Checking for collision of the bats 
      if (ball.GetDirection() > 1.5f * Math.PI || ball.GetDirection() < 0.5f * Math.PI) 
      { 
       if (rightBat.GetSize().Intersects(ball.GetSize())) 
       { 
        ball.BatHit(CheckHitLocation(rightBat)); 
       } 
      } 
      else if (leftBat.GetSize().Intersects(ball.GetSize())) 
      { 
       ball.BatHit(CheckHitLocation(leftBat)); 
      } 


      // Triggers the turbo button and cooldown 
      if (input.SpaceDown) 
      { 
       if (disableCooldown > 0) 
       { 
        leftBat.isTurbo = true; 
        coolDown = powerEnableCooldown; 
        leftBat.moveSpeed = 40.0f; 
        disableCooldown -= gameTime.ElapsedGameTime.Milliseconds; 
       } 
       else 
       { 
        leftBat.DisableTurbo(); 
       } 
      } 
       // If spacebar is not down, begin to refill the turbo bar 
      else if (!input.SpaceDown) 
      { 
       leftBat.DisableTurbo(); 
       coolDown -= gameTime.ElapsedGameTime.Milliseconds; 
       if (coolDown < 0) 
       { 
        disableCooldown = powerDisableCooldown; 
       } 
      } 


      // Makes sure that if Turbo is on, it automatically turns of. Kills it after() seconds 
      if(leftBat.isTurbo) 

       disableCooldown -= gameTime.ElapsedGameTime.Milliseconds; 
        if(disableCooldown < 0) 
        { 
        leftBat.isTurbo = false; 
        } 



      if (!resetTimerInUse) 
      { // checks out of bounds for right side 
       if (ball.GetPosition().X > screenWidth) 
       { 
        resetTimerInUse = true; 
        lastScored = true; 

        hud.SubtractHealthP2(); 
        // Checks to see if ball went out of bounds, and triggers warp sfx 
        ball.OutOfBounds(); 
        leftBat.IncrementPoints(); 
        IncreaseSpeed(); 
       } // Checks out of bounds for left side 
       else if (ball.GetPosition().X < 0) 
       { 

        resetTimerInUse = true; 
        lastScored = false; 

        hud.SubtractHealthP1(); 
        // Checks to see if ball went out of bounds, and triggers warp sfx 
        ball.OutOfBounds(); 
        rightBat.IncrementPoints(); 
        IncreaseSpeed(); 
       } 
      } 
     } 
      // Navigating through the menus 
     else if (gamestate == GameStates.Menu) 

     { 

      if (input.RightDown || input.LeftDown) 
      { 
       menu.Iterator++; 
       menuButton.Play(); 
      } 
      else if (input.RightUp || input.LeftUp) 
      { 
       menu.Iterator--; 
       menuButton.Play(); 
      } 

      if (input.MenuSelect) 
      { 

       if (menu.Iterator == 0) 
       { 
        gamestate = GameStates.Running; 
        SetUpSingle(); 
        menuClose.Play(); 
       } 
       else if (menu.Iterator == 1) 
       { 
        gamestate = GameStates.Running; 
        SetUpMulti(); 
        menuClose.Play(); 
       } 
       else if (menu.Iterator == 2) 
       { 
        this.Exit(); 
        menuClose.Play(); 
       } 
       menu.Iterator = 0; 
      } 
     } 

     else if (gamestate == GameStates.End) 
     { 
      if (input.MenuSelect) 
      { 
       gamestate = GameStates.Menu; 
       hud.ResetHealth(); 

      } 
     } 

     // Updates the HUD 
     hud.Update(gameTime); 
     base.Update(gameTime); 
    } 


    // Checking for bat collision & instructs the ball where to deflect to 
    private int CheckHitLocation(Bat bat) 
    { 
     int block = 0; 
     if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/20) block = 1; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 2) block = 2; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 3) block = 3; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 4) block = 4; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 5) block = 5; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 6) block = 6; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 7) block = 7; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/10 * 8) block = 8; 
     else if (ball.GetPosition().Y < bat.GetPosition().Y + bat.GetSize().Height/20 * 19) block = 9; 
     else block = 10; 
     return block; 
    } 


    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.Black); 

     // TODO: Add your drawing code here 
     spriteBatch.Begin(); 
     if (gamestate == GameStates.Running) 
     { 
      // Draws background 
      spriteBatch.Draw(backgroundTexture, new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 

      player.Draw(spriteBatch); 

      // Draws the bats and ball 
      leftBat.Draw(spriteBatch); 
      rightBat.Draw(spriteBatch); 
      ball.Draw(spriteBatch); 

      // Draws the score on screen 
      spriteBatch.DrawString(arial, leftBat.GetPoints().ToString(), new Vector2(screenWidth/4 - arial.MeasureString 
       (rightBat.GetPoints().ToString()).X, 20), Color.White); 
      spriteBatch.DrawString(arial, rightBat.GetPoints().ToString(), new Vector2(screenWidth/4 * 3 - arial.MeasureString 
       (rightBat.GetPoints().ToString()).X, 20), Color.White);            
     } 


      // Only draws the menu 
     else if (gamestate == GameStates.Menu) 
     { 
      spriteBatch.Draw(backgroundTexture, new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      menu.DrawMenu(spriteBatch, screenWidth, arial); 
     } 
     else if (gamestate == GameStates.End) 
     { 
      spriteBatch.Draw(backgroundTexture, new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      menu.DrawEndScreen(spriteBatch, screenWidth, arial); 
     } 
     spriteBatch.End(); 

     // Draws the HUD 
     if (gamestate == GameStates.Running) 
     {    
      hud.Draw(gameTime); 
     } 

     spriteBatch.Begin(); 
     // Powerup text 
     if (gamestate == GameStates.Running) 
     { 
      spriteBatch.DrawString(font, "Press A or Left Alt button to generate powerup", promptVec, Color.White); 

      if (powerup != null) 
      { 
       spriteBatch.DrawString(font, "Powerup Type: " + powerup.Type, vec, Color.White); 

       spriteBatch.DrawString(font, "Press Left Bumper or Left Ctrl to activate powerup", vec2, Color.White); 

      } 

      if (deactivatedVec != Vector2.Zero) 
       spriteBatch.DrawString(font, "Powerup deactivated", deactivatedVec, Color.White); 

      if (activatedVec != Vector2.Zero) 
       spriteBatch.DrawString(font, "Powerup activated", activatedVec, Color.White); 

      if (tickVec != Vector2.Zero) 
       spriteBatch.DrawString(font, "Tick count: " + tickCount.ToString(), tickVec, Color.White); 
      } 
     spriteBatch.End(); 

     base.Draw(gameTime); 
     } 
    } 
} 
+1

請縮短您的代碼以避免TL; DR – PVitt 2012-04-25 10:40:44

回答

3

我敢打賭,你沒有看到蝙蝠的可見大小的變化,但你應該看到在蝙蝠的碰撞檢測的變化。你只是在改變蝙蝠的大小。它用在你的碰撞檢測代碼中。但是,您在繪製蝙蝠時不會參考蝙蝠的大小。您必須更新您的代碼才能根據當前的尺寸繪製蝙蝠。

+0

這實際上正是發生了什麼,而我之前並沒有意識到。我認爲我在某種程度上犯了一個錯誤,但是,撞擊檢測已經發生了變化,但不是視覺上蝙蝠的大小。 謝謝,我會做出這些改變,讓你知道它是怎麼回事! – 2012-04-25 20:24:04

+0

太棒了,請記住接受答案,如果它對你有幫助。 – MichaelHouse 2012-04-25 20:24:58

+0

這就像一個魅力。謝謝! – 2012-04-28 19:46:37

相關問題