这是我目前游戏的代码。我想创建一个AI角色(BlackBall),当它与玩家(WhiteBall)之间的距离达到一定值时,会跟随玩家。我不知道该从哪里开始实现这个功能,但这将是我游戏的主要部分,因此非常重要。
using System;using System.Collections.Generic;using System.Linq;using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Content;using Microsoft.Xna.Framework.GamerServices;using Microsoft.Xna.Framework.Graphics;using Microsoft.Xna.Framework.Input;using Microsoft.Xna.Framework.Media;namespace PickUpTheCrew{/// <summary>/// This is the main type for your game/// </summary>public class Game1 : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch; SpriteFont TitleFont; private Vector2 playerPos = Vector2.Zero; Vector2 BlackBallPos; Vector2 position, velocity; Vector2 scorePos; Vector2 saved; private KeyboardState keyboardState; private KeyboardState prevKeyboardState; private bool canMove = true; int score; //Textures for background, player and sharks. Texture2D BlackBallTexture; Texture2D BlackBallTexture2; Texture2D BlueBallTexture; Texture2D GreenBallTexture; Texture2D OrangeBallTexture; Texture2D PinkBallTexture; Texture2D RedBallTexture; Texture2D WhiteBallTexture; Texture2D YellowBallTexture; Rectangle BlackBallRectangle; Rectangle BlackBallRectangle2; Rectangle BlueBallRectangle; Rectangle GreenBallRectangle; Rectangle OrangeBallRectangle; Rectangle PinkBallRectangle; Rectangle RedBallRectangle; Rectangle WhiteBallRectangle; Rectangle YellowBallRectangle; Sprite mainPlayer; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; } /// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { score = 0; playerPos = new Vector2(this.GraphicsDevice.Viewport.Width / 2, this.GraphicsDevice.Viewport.Height * 0.25f); BlackBallPos = new Vector2(this.GraphicsDevice.Viewport.Width / 2, this.GraphicsDevice.Viewport.Height * 0.75f); base.Initialize(); } /// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> private Texture2D BackgroundTexture; protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(Gra`enter code here`phicsDevice); TitleFont = Content.Load<SpriteFont>("TitleFont"); WhiteBallTexture = Content.Load<Texture2D>("WhiteBall"); //mainPlayer = new Sprite(Content.Load<Texture2D>("WhiteBall"), new Rectangle((int)(playerPos.X - WhiteBallTexture.Width / 2), //(int)(playerPos.Y - WhiteBallTexture.Height / 2), WhiteBallTexture.Width, WhiteBallTexture.Height)); BackgroundTexture = Content.Load<Texture2D>("Background"); BlackBallTexture = Content.Load<Texture2D>("BlackBall"); BlackBallTexture2 = Content.Load<Texture2D>("BlackBall"); BlueBallTexture = Content.Load<Texture2D>("BlueBall"); GreenBallTexture = Content.Load<Texture2D>("GreenBall"); OrangeBallTexture = Content.Load<Texture2D>("OrangeBall"); PinkBallTexture = Content.Load<Texture2D>("PinkBall"); RedBallTexture = Content.Load<Texture2D>("RedBall"); YellowBallTexture = Content.Load<Texture2D>("YellowBall"); WhiteBallRectangle = new Rectangle(100, 100, 25,25); BlackBallRectangle = new Rectangle(150, 300, 25,25); BlackBallRectangle2 = new Rectangle(500, 400, 25, 25); BlueBallRectangle = new Rectangle(500, 150, 25, 25); GreenBallRectangle = new Rectangle(100, 500, 25, 25); OrangeBallRectangle = new Rectangle(180, 200, 25, 25); PinkBallRectangle = new Rectangle(260, 260, 25, 25); RedBallRectangle = new Rectangle(300, 450, 25, 25); YellowBallRectangle = new Rectangle(550, 300, 25, 25); scorePos.X = 575; scorePos.Y = 450; saved.X = 0; saved.Y = 50; /* WhiteBallRectangle = new Rectangle((int)(playerPos.X - WhiteBallTexture.Width / 2), (int)(playerPos.Y - WhiteBallTexture.Height / 2), WhiteBallTexture.Width, WhiteBallTexture.Height); BlackBallRectangle = new Rectangle((int)(BlackBallPos.X - BlackBallTexture.Width / 2), (int)(BlackBallPos.Y - BlackBallTexture.Height / 2), BlackBallTexture.Width, BlackBallTexture.Height); */ /* WhiteBallRectangle; = new Rectangle((int)(playerPos.X - WhiteBallTexture.Width / 2), (int)(playerPos.Y - WhiteBallTexture.Height / 2), WhiteBallTexture.Width, WhiteBallTexture.Height); BlackBallRectangle; = new Rectangle ((int)(BlackBallPos.X - BlackBallTexture.Width / 2), (int)(BlackBallPos.Y - BlackBallTexture.Height / 2), BlackBallTexture.Width, BlackBallTexture.Height); */ } /// <summary> /// UnloadContent will be called once per game and is the place to unload /// all content. /// </summary> protected override void UnloadContent() { // TODO: Unload any non ContentManager content here } /// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { //mainPlayer.Update(); prevKeyboardState = Keyboard.GetState(); keyboardState = Keyboard.GetState(); if (canMove) { if (keyboardState.IsKeyDown(Keys.Up) && prevKeyboardState.IsKeyDown(Keys.Up)) WhiteBallRectangle.Y = WhiteBallRectangle.Y - 1; //playerPos -= new Vector2(0, 4); else if (keyboardState.IsKeyDown(Keys.Left) && prevKeyboardState.IsKeyDown(Keys.Left)) WhiteBallRectangle.X = WhiteBallRectangle.X - 1; //playerPos -= new Vector2(4, 0); else if (keyboardState.IsKeyDown(Keys.Down) && prevKeyboardState.IsKeyDown(Keys.Down)) WhiteBallRectangle.Y = WhiteBallRectangle.Y + 1; //playerPos += new Vector2(0, 4); else if (keyboardState.IsKeyDown(Keys.Right) && prevKeyboardState.IsKeyDown(Keys.Right)) WhiteBallRectangle.X = WhiteBallRectangle.X + 1; //playerPos += new Vector2(4, 0); if (keyboardState.IsKeyDown(Keys.Up) && keyboardState.IsKeyDown(Keys.Left)) { WhiteBallRectangle.X = WhiteBallRectangle.X - 1; WhiteBallRectangle.Y = WhiteBallRectangle.Y - 1; //playerPos -= new Vector2(4, 4); } else if (keyboardState.IsKeyDown(Keys.Up) && keyboardState.IsKeyDown(Keys.Right)) { WhiteBallRectangle.Y = WhiteBallRectangle.Y - 1; WhiteBallRectangle.X = WhiteBallRectangle.X + 1; //playerPos -= new Vector2(0, 4); //playerPos += new Vector2(4, 0); } else if (keyboardState.IsKeyDown(Keys.Down) && keyboardState.IsKeyDown(Keys.Left)) { WhiteBallRectangle.Y = WhiteBallRectangle.Y + 1; WhiteBallRectangle.X = WhiteBallRectangle.X - 1; //playerPos += new Vector2(0, 4); //playerPos -= new Vector2(4, 0); } else if (keyboardState.IsKeyDown(Keys.Down) && keyboardState.IsKeyDown(Keys.Right)) { WhiteBallRectangle.Y = WhiteBallRectangle.Y + 1; WhiteBallRectangle.X = WhiteBallRectangle.X + 1; } //playerPos += new Vector2(4, 4); } CheckBounds(); //Collision // Rectangle WhiteBallRectangle = new Rectangle((int)playerPos.X, (int)playerPos.Y, 10, 100); //Rectangle BlackBallRectangle = new Rectangle((int)playerPos.X, (int)playerPos.Y, 10, 100); if (WhiteBallRectangle.Intersects(BlueBallRectangle)) { score = score + 20; } if (WhiteBallRectangle.Intersects(GreenBallRectangle)) { score = score + 10; } if (WhiteBallRectangle.Intersects(OrangeBallRectangle)) { score = score + 40; } if (WhiteBallRectangle.Intersects(PinkBallRectangle)) { score = score + 25; } if (WhiteBallRectangle.Intersects(RedBallRectangle)) { score = score + 10; } if (WhiteBallRectangle.Intersects(YellowBallRectangle)) { score = score + 50; } if (WhiteBallRectangle.Intersects(BlackBallRectangle)) { Exit(); } if (WhiteBallRectangle.Intersects(BlackBallRectangle2)) { Exit(); } base.Update(gameTime); } private void CheckBounds() { if (WhiteBallRectangle.Y <= 0) { WhiteBallRectangle.Y = 1; canMove = false; } else if (WhiteBallRectangle.Y >= 452) { WhiteBallRectangle.Y = 451; canMove = false; } else canMove = true; if (WhiteBallRectangle.X <= 0) { WhiteBallRectangle.X = 1; canMove = false; } else if (playerPos.X >= 772) { WhiteBallRectangle.X = 771; canMove = false; } else canMove = true; } /// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); Vector2 text = new Vector2(10, 0); spriteBatch.Begin(); spriteBatch.Draw(BackgroundTexture, position, Color.White); spriteBatch.DrawString(TitleFont, "Pick Up The Crew", text, Color.Black); spriteBatch.DrawString(TitleFont, "Score: " + score, scorePos, Color.Black); // spriteBatch.Draw(WhiteBallTexture, playerPos, null, Color.White, 0.0f, new Vector2(0, 0), //0.3f, SpriteEffects.None, 0.0f); //mainPlayer.Draw(spriteBatch); spriteBatch.Draw(WhiteBallTexture, WhiteBallRectangle, Color.White); spriteBatch.Draw(BlackBallTexture, BlackBallRectangle, Color.White); spriteBatch.Draw(BlackBallTexture2, BlackBallRectangle2, Color.White); spriteBatch.Draw(BlueBallTexture, BlueBallRectangle, Color.White); spriteBatch.Draw(GreenBallTexture, GreenBallRectangle, Color.White); spriteBatch.Draw(OrangeBallTexture, OrangeBallRectangle, Color.White); spriteBatch.Draw(PinkBallTexture, PinkBallRectangle, Color.White); spriteBatch.Draw(RedBallTexture, RedBallRectangle, Color.White); spriteBatch.Draw(YellowBallTexture, YellowBallRectangle, Color.White); /*spriteBatch.Draw(BlueBallTexture, new Vector2(500, (380 + (BlueBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(GreenBallTexture, new Vector2(230, (180 + (GreenBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(OrangeBallTexture, new Vector2(700, (200 + (OrangeBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(PinkBallTexture, new Vector2(600, (20 + (PinkBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(BlackBallTexture, new Vector2(100, (80 + (BlackBallTexture.Height / 2))), nul`enter code here`l, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(BlackBallTexture, new Vector2(300, (100 + (BlackBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); spriteBatch.Draw(BlackBallTexture, new Vector2(400, (400 + (BlackBallTexture.Height / 2))), null, Color.White, 0.0f, new Vector2(0, 0), 0.3f, SpriteEffects.None, 0.0f); */ if (WhiteBallRectangle.Intersects(BlueBallRectangle)) { spriteBatch.DrawString(TitleFont, "You Rescued Liuetenant Sky for 20 points!", saved, Color.Black); } spriteBatch.End(); base.Draw(gameTime); }}
}
回答: