0

プレイヤーが猫を操作する 2D トップダウン ゲームを作成しています。これを行うには、人は WASD キーを使用して移動します。Form1、GameManager、Cat、および Moveable クラスがあります。Form1 は GameManager に猫の画像リストと e.graphics (picturebox 用) を送信します。GameManager にはタイマーがあり、各ティックは猫が移動したかどうかを確認します。Cat が移動ロジックを処理します。プログラムを実行すると、猫のスプライトが最初の位置に表示されますが、キーを押しても動きません。私は自分の問題を理解できません。誰か助けてもらえますか?

ここに私のクラスがあります:

フォーム1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    public partial class Form1 : Form
    {
        GameManager myGM = new GameManager();
        public Form1()
        {
            InitializeComponent();
            newGame();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (this.myGM != null)
                this.myGM.paint(e.Graphics);
        }

        public void newGame()
        {
            myGM.newGame(imgCat);
        }
    }
}

ゲームマネージャー:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    class GameManager
    {
        Cat ca1 = new Cat();
        int amount = 5;
        Timer time = new Timer();
        public ImageList imgCat = new ImageList();

        public void newGame(ImageList cat)
        {
            imgCat = cat;
            time.Start();
        }

        public void move()
        {
            ca1.Move(amount);
        }

        public void paint(Graphics g)
        {
            g.DrawImage(imgCat.Images[0], ca1.getLocation());
        }

        private void time_Tick(object sender, EventArgs e)
        {
            move();
        }
    }
}

ネコ:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CatAndMouse
{
    class Cat: Moveable
    {
        Random myCLoc = new Random();
        private Moveable myCatMove;
        public Point p = new Point(100, 100);
        int dir = 0;

        public void Move(int n)
        {
            if (dir == 0)
            {
                p.Y = p.Y - n;
            }
            if (dir == 1)
            {
                p.X = p.X + n;
            }
            if (dir == 2)
            {
                p.Y = p.Y + n;
            }
            if (dir == 3)
            {
                p.X = p.X - n;
            }
        }
        private void KeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Up)
            {
                dir = 0;
            }
            if (e.KeyCode == Keys.Right)
            {
                dir = 1;
            }
            if (e.KeyCode == Keys.Down)
            {
                dir = 2;
            }
            if (e.KeyCode == Keys.Left)
            {
                dir = 3;
            }
        }
        public void changeDirection()
        {

        }

        public Point getLocation()
        {
            return p;
        }

        public void paint(PaintEventArgs e)
        {

        }
    }
}

可動:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    public interface Moveable
    {
        void Move(int n);
        void changeDirection();
        //Point getLocation();
        void paint(PaintEventArgs e);
    }
}

したがって、KeyDown() を呼び出すものはありません。KeyEventArgs e が必要な場合、KeyDown() を呼び出すにはどうすればよいですか?

Picturebox1 には keydown イベントがありませんが、form1 にはあります。また、cat クラスで keydown イベントを使用して、自分が向いている方向を認識し、移動する方向を認識する必要があります。

この質問には、他の質問には答えがありません。それはキーダウンイベントを修正するように私に言います、ここで私はキーダウンイベントを修正する方法を尋ねています!

イメージをペイントするのに本当に助けが必要です!

4

3 に答える 3

1

XNA などを使用するのではなく、ゲームに Windows フォームを使用している理由はありますか? それはより適切であり、このタスクを非常に簡単にします.

質問自体に関しては、移動後にフォームペイントイベントを呼び出す必要があり、キーボード入力をフックするには、フォーム自体のイベントが必要です (フォームビューに移動し、プロパティウィンドウで稲妻をクリックして、Keydown を探します)。このイベントを利用すると、必要な出力を取得できるはずです。

イベントが発生したときに呼び出されるメソッドは、次のようになります。

public void KeyPressed(object sender, KeyPressEventArgs ex)
{
    switch (ex.KeyChar) // Get the value of the key pressed
    {
        case 'a':
            // Do stuff if the pressed key is the letter "a"
        case 'b':
            // Do stuff if the pressed key is the letter "b"
    }
}
于 2013-10-07T22:08:53.480 に答える
0

あなたの問題は、イベントメカニズムの誤解だと思います。「KeyDown」イベントのイベントハンドラーを作成したようですが、イベント自体に添付していません。

次のように、添付コードをイベントに追加する必要があります。

Cat cat1 = new Cat();
KeyDown += cat1.cat1_KeyDown;

これは、form1 クラスのコンストラクターで実行できます。

次に、Cat クラスのイベント ハンドラーのパラメーターを変更して、イベント ハンドラーのシグネチャと一致させる必要があります。例えば

public void cat1_KeyDown(object sender, KeyEventArgs e)
{
    // Do the movement logic here....
}
于 2013-10-07T22:22:20.010 に答える