Hello其他程序员!我很抱歉打扰你,但我有一个学校项目,即创建一个游戏。我几乎完成所有我要做的就是让我的角色(玩家)从敌人的子弹中受到伤害。
这是我的敌人类,我有我的子弹列表,让敌人射击子弹。你可以看到Ive试图通过temp跟踪子弹的位置(我按照这些教程制作了敌人https://www.youtube.com/watch?v=_TlnUM-uhSI和https://www.youtube.com/watch?v=tfiKwOo_4xo)
在你跳我之前我只是想说我到处寻找答案,但由于XNA对我想创造的东西非常有限,这对我来说非常困难。
class Enemies
{
public Texture2D texture;
public Vector2 position;
public Vector2 velocity;
public bool isVisible = true;
Random random = new Random();
int randX, randY;
float temp_bulletenemyX;
float temp_bulletenemyY;
// bullets
private List<Bullets> bullets = new List<Bullets>();
Texture2D bulletTexture;
public Enemies(Texture2D NewTexture, Vector2 NewPosition, Texture2D newBulletTexture)
{
texture = NewTexture;
position = NewPosition;
randY = random.Next(-4, 4);
randX = random.Next(-4, -1);
velocity = new Vector2(randX, randY);
bulletTexture = newBulletTexture;
}
float shoot = 0;
public void update(GraphicsDevice graphics, GameTime gameTime)
{
KeyboardState keyboardState = Keyboard.GetState();
position += velocity;
if (position.Y <= 0 || position.Y >= graphics.Viewport.Height - texture.Height)
velocity.Y = -velocity.Y;
if (position.X < 0 - texture.Width)
isVisible = false;
shoot += (float)gameTime.ElapsedGameTime.TotalSeconds;
if (shoot > 1)
{
shoot = 0;
Shootbullet();
}
updateBullets();
}
public void updateBullets()
{
foreach (Bullets bullet in bullets)
{
bullet.position += bullet.velocity;
temp_bulletenemyX = bullet.position.X;
temp_bulletenemyY = bullet.position.Y;
if (bullet.position.X < 0)
bullet.isVisible = false;
}
for (int i = 0; i < bullets.Count; i++)
if(!bullets[i].isVisible)
{
bullets.RemoveAt(i);
i--;
}
}
public void Shootbullet()
{
Bullets newBullet = new Bullets(bulletTexture);
newBullet.velocity.X = velocity.X - 3f;
newBullet.position = new Vector2(position.X + newBullet.velocity.X, position.Y + (texture.Height / 2) - (bulletTexture.Height / 2));
newBullet.isVisible = true;
if (bullets.Count() < 3) // hur många skott den skall skjuta
bullets.Add(newBullet);
}
public void draw(SpriteBatch spriteBatch)
{
foreach (Bullets bullet in bullets)
bullet.Draw(spriteBatch);
spriteBatch.Draw(texture, position, Color.White);
}
public float PosX
{
get
{
return position.X;
}
}
public Vector2 Pos
{
get
{
return position;
}
}
public float PosY
{
get
{
return position.Y;
}
}
public List<Bullets> GetbulletList
{
get{
return bullets;
}
}
public Texture2D text
{
get
{
return texture;
}
}
public Texture2D BulletText
{
get
{
return bulletTexture;
}
继承了我试图制作的基本Game1代码,因此我的角色可以受到伤害。
player.rectangle = new Rectangle(Convert.ToInt32(player.PosX), Convert.ToInt32(player.PosY), player.text.Width, player.text.Height);
foreach (Enemies bullet in enemies.ToList())
{
rec_bullet = new Rectangle(Convert.ToInt32(bullet.GetbulletList.ElementAt(i).position.X), Convert.ToInt32(bullet.GetbulletList.ElementAt(i).position.Y), nyenemy.BulletText.Width, nyenemy.BulletText.Height);
hit = CheckCollision(rec_bullet, player.rectangle);
if (hit == true)
{
player.health -= 10;
hit = false;
}
i++;
如果一切都搞得一团糟,我感到非常抱歉,我已经通过遵循许多教程和一些自己的编码将所有内容放在一起。如果我违反论坛规则,我也很抱歉,我是新来的。
最好的问候基尔。
答案 0 :(得分:2)
我会勇敢地提出以下建议 - 查看所提供代码的片段。
在Game1代码中 - 你正在通过敌人工作,但看起来你没有搜索每个敌人的子弹列表。您正在使用&#39; i&#39;获取ElementAt(..) - 添加一个,然后转到下一个敌人,然后只获得ElementAt(..)和增加的&#39; i&#39;。
根据我的理解 - 代码的流程应该是:
for each enemy in enemy list
for each bullet in enemy bullet list
Check Collision with Player
if collision then adjust player health
答案 1 :(得分:0)
您的代码存在一些问题。对于初学者,您的Bullet类应该包含bulletUpdate()方法,该方法应该在foreach循环中调用。
foreach (Bullet b in bullets)
{
b.update(/*parameters here*/);
}
您的项目符号列表应该是存储在您的Game1.cs或EnemyManager类中的公共列表,而不是存储在每个敌人中。通过每个敌人对该列表的引用,这样当它们触发时,他们可以将子弹添加到列表中。
最重要的是,你的碰撞测试应该只是每个子弹和你自己之间的交叉测试。再次,另一个foreach循环。
foreach(Bullet b in bullets)
{
//where playerRect is the hitbox for your player and b.Rect is the hitbox for your bullet
if(playerRect.Intersects(b.Rect)
player.healh-=damage;
}
希望有所帮助。