Проблема с методом Rectangle.Contains - PullRequest
0 голосов
/ 15 апреля 2011

Я создал игру космических захватчиков, и проблема в том, что чувствительность к ударам слишком чувствительна.Вот как я могу проследить, был ли игрок поражен.

 bool playersWasShot=false;
 foreach (var shotsInvader in Invadershots)
 {    // below is the Area representing the image size. and the location of the invaders shot
      if(playership.Area.Contains(shotsInvader.Location))
      {
           //player was shot game over.
           playersWasShot=true;
           break;
      }
 }

Свойство area из класса PlayerShip:

// move simply updates the position of the ship on the x-axis as i move the ship.
// as you can guess. the second variable represents the size of the picture

Area =new Rectangle(new Point(move,900), Properties.Resources.player.Size); 

Свойство местоположения выстрела в классе Shots обновляется каквыстрел идет к игроку ..

// the shot, travels to the player on the y-axis only
Location=new Point(Location.X, invaderShotLocation);

я проверил в отладчике, когда игра окончена ... и вот что я получил:

Эта строка:

if(playership.Area.Contains(shotsInvader.Location))
{
//i put a debugging point inside this if statment!!!
}

представляет информацию о корабле:

player Area {X=90,Y=900,Width=54,Height=33}
Location    {X=60,Y=900}

представляет информацию о выстреле захватчиков:

Location {X=140,Y=900}

Выстрел даже не прошел внутри корабля игроков ... как же получается

        public static Bitmap SHIP = Properties.Resources.player;
    public Point Location;
    public int move=10;
    public Rectangle Area { set { } get { return new Rectangle(new Point(move, 900), Properties.Resources.player.Size); } }

    public void Draw(Graphics g)
    {

Это 2 метода в классе корабля, которые управляют всем движением и рисунком.

        if (game.Alive) //checks if the player is alive.
        {
             // draws the SHIP picture. 900 is a fixed field..thats where the ship is
             // it is on the y axis that never changes.. x-axis do change..depending
          // on where i move the ship to.
                 g.DrawImage(SHIP, move, 900); 
                Location = new Point(move, 900); 
        }
        else
        {

            g.DrawImage(SHIP, move, 900, SHIP.Width, SHIP.Height);
            Location = new Point(move, 900);
        }
    }



    public void Move(Direction d)
    {

        switch (d)
        {

// перечисление передается, когда я нажимаю стрелки, указывающие для перемещения влево или вправоDirection.LEFT: двигаться - = 10;перерыв;Case Direction.RIGHT: переместить + = 10;перерыв;} Area = new Rectangle (новая точка (move, 900), SHIP.Size);
}

NOTE = ЖЕ ЛОГИКА БЫЛА ПРИМЕНЕНА, КОГДА ИНВАДЕР НАБИРАЕТСЯ ИГРОКОМ, И ЗВОНОК УДАЛЕНТОЛЬКО КОГДА ВЫБИРАЕТСЯ ХОТ

Ошибка обнаружена в классе выстрела.шоты игроков и захватчиков делятся:

.. я нашел ошибку.это было в классе выстрела.я изменил это сейчас.проблема решена

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Кажется, выстрел попал в корабль.Выстрел в (140, 900) и углы Области корабля в (90, 900) и (144, 900).(140, 900) находится внутри этого.

Что такое часть "Местоположение {X = 60, Y = 900}", перечисленная после Списка судовых зон?Возможно, вы рисуете корабль в другом месте, чем в области испытания на удар?

1 голос
/ 15 апреля 2011

Похоже, у вас есть ошибка в PlayerShip.Area.Contains.Дважды проверьте логику.

...