【问题标题】:Shooting game Help射击游戏帮助
【发布时间】:2011-11-03 18:04:00
【问题描述】:

我正在制作像 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);
        }
    }  
 }
 }

【问题讨论】:

  • 您可以将pb.Left = pb.Left -= 5; 缩短为pb.Left -= 5;
  • 据我了解,pb 是宇宙飞船,pb2 是导弹。 f 和 pb1 是什么?
  • @Mike fForm(参见构造函数),pb1 可能是某艘敌舰

标签: c# winforms timer picturebox


【解决方案1】:

你可能想要类似的东西

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

在您的 f_KeyDown() 函数中,以便导弹从与宇宙飞船相同的位置开始。

【讨论】:

  • 我尝试了代码但有一个错误。无法修改 Windows.Forms.Location 的返回值,因为它不是变量。
  • 创建一个新的Point 对象并将其分配给pb2.Location property
  • 它现在位于正确的位置。我把 pb2.Location = new Point(pb.Location.X, pb.Location.Y);
【解决方案2】:

你必须定位你的子弹、火箭……等等。相对于你的太空船的枪。

想象一下安装在船上的枪。你可以用一个物体来代表这把枪。

例如:

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 的 Fire() 方法中访问这些数据。

例如:

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

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

大约一年前,我写了一篇关于在 Silverlight 中创建类似游戏(Asteroids)的 10 系列文章。一篇文章讨论了如何让枪开火。你可以在这里找到它:

https://github.com/geersch/SilverlightAsteroids/blob/master/src/part-6/README.md

你可以选择在船上安装几把枪,一种发射普通子弹,另一种发射导弹……等等。每把枪在船上都有不同的位置。您可以将 Fire() 方法更改为由不同的键触发(A = 导弹,空格 = 子弹)。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多