Помощь в стрельбе - PullRequest
       36

Помощь в стрельбе

0 голосов
/ 25 августа 2011

Я делаю стрелялки, как Space Invaders.Каждый раз, когда я запускаю ракету, она всегда находится на одной и той же позиции.Как я буду менять его в зависимости от места, где находится космический корабль.

Вот мои коды на данный момент.

class GraphicsApplication
{

    private Form f;
    private PictureBox pb;
    private PictureBox pb1;
    private PictureBox pb2;
    private Boolean bMove;
    Timer Clock = new Timer();
    Timer Missile = new Timer();
    int x = 0;

    public GraphicsApplication()
    {
        f = new Form();

        pb = new PictureBox();
        pb1 = new PictureBox();
        pb2 = new PictureBox();

        bMove = false;
    }

    public void Launch()
    {
        f.Size = new Size(600, 600);
        f.StartPosition = FormStartPosition.CenterScreen;

        f.KeyDown += new KeyEventHandler(f_KeyDown);
        f.KeyPress += new KeyPressEventHandler(f_KeyPress);

        pb.SetBounds(300, 470, 70, 70);
        pb.Image = new Bitmap("spaceship.png");
        pb.SizeMode = PictureBoxSizeMode.StretchImage;
        f.Controls.Add(pb);

        pb1.Image = Image.FromFile("spacedisc.png");
        pb1.SetBounds(20, 20, 130, 80);
        pb1.SizeMode = PictureBoxSizeMode.StretchImage;
        f.Controls.Add(pb1);

        pb2.Image = Image.FromFile("missile.png");
        pb2.SetBounds(pb.Location.X, pb.Location.Y, 25, 40); //pb2 missile //pb spaceship
        pb2.SizeMode = PictureBoxSizeMode.StretchImage;

        Clock = new Timer();
        Clock.Interval = 40;
        Clock.Start();
        Clock.Tick += new EventHandler(Clock_Tick);

        Missile = new Timer();
        Missile.Interval = 40;
        Missile.Tick += new EventHandler(Missile_Tick);          
        f.ShowDialog();

    }

    private void f_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Space)
        {                
            Missile.Start();               
        }
    }

    public void Missile_Tick(object sender, EventArgs e)
    {
        if (bMove == true)
        {
            f.Controls.Add(pb2);
            pb2.Top = pb2.Top -= 5;
        }

    }

    private void f_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 'd')
        {
            pb.Left = pb.Left += 5;
        }
        if (e.KeyChar == 'a')
        {
            pb.Left = pb.Left -= 5;
        }
    }

    public void Clock_Tick(object sender, EventArgs e)
    {          
        if(x == 400)
        {
           bMove = true;
        }
        else if (x == 30)
        {
            bMove = false;
        }

        if (bMove == false)
        {
            x += 5;
            pb1.Location = new Point(20 + x, 20);
        }
        else
        {
            x -= 5;
            pb1.Location = new Point(x - 20, 20);
        }
    }  
 }
 }

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Вы, вероятно, хотите что-то вроде

pb2.Location.X = pb.Location.X;
pb2.Location.Y = pb.Location.Y;

в вашей функции f_KeyDown (), чтобы ракета стартовала в том же месте, что и космический корабль.

2 голосов
/ 25 августа 2011

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

Представьте себе пушку, установленную на корабле.Вы можете представить это оружие с помощью объекта.

Например:

public class Gun
{
    private ISpaceshipDesign _spaceshipDesign;

    public Gun(ISpaceshipDesign spaceshipDesign)
    {
        this._spaceshipDesign = spaceshipDesign;
    }

    public void Fire()
    {
        //...
    }
}

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

Космический корабль должен всегда знать, где он находится в 2D-плоскости (X, Y координаты).Он также должен знать, где на космическом корабле установлена ​​пушка.

public interface ISpaceshipDesign
{
    public Point GunLocation { get; }
}

Свойство GunLocation должно возвращать местоположение пушки относительно текущей позиции корабля.Например:

public Point GunLocation
{
    get
    {
        double x = (double) this.GetValue(Canvas.LeftProperty) + 21;
        double y = (double) this.GetValue(Canvas.TopProperty) + 17;
        return new Point(x, y);
    }
}

Затем вы можете получить доступ к этим данным в методе Gun's Fire ().

Например:

public void Fire()
{
    Point gunLocation = _spaceshipDesign.GunLocation;

    // Position your missle using the gun's current coördinates (X, Y).     
}

Примерно год назад я писалчасть из 10 серий о создании похожей игры (астероиды) в Silverlight.Одна статья обсуждает, как заставить оружие стрелять.Вы можете найти его здесь:

http://cgeers.com/2010/05/07/silverlight-asteroids-part-6-fire/

Вы можете установить несколько кораблей на корабль, один, который стреляет обычными пулями, другой для ракет ... и т. Д.У каждого оружия будет свое местоположение на корабле.Вы можете изменить метод Fire () так, чтобы он вызывался разными клавишами (A = missle, space = bullets).

Надеюсь, это поможет.

...