释放鼠标按钮时,窗口不会绘制我的精灵

时间:2013-05-16 08:32:45

标签: c# sfml

我是SFML的新手,我现在只是在玩一个例子。我尝试绘制一个精灵,我最后一次在窗口中单击鼠标。但有些原因是事件触发并且没有画出精灵。我无法弄清楚原因。

我一直在浏览文档,但我似乎没有做错任何事。请帮我好吗? :3

该事件被称为OnMouseLeftClick,我正在尝试绘制mouseLeftClickSprite对象。我删除了一些与OnMouseMoved事件和OnClose事件无关的代码。他们与此毫无关系。

using System;
using SFML.Audio;
using SFML.Graphics;
using SFML.Window;

namespace SFMLExample
{
    class Program
    {
        static Text xMouseCoord;
        static Text yMouseCoord;
        static Text statusMsg;
        static float mouseX, mouseY;
        static Texture mouseLeftClickTexture;
        static Sprite mouseLeftClickSprite;

        static void OnMouseLeftClick(object sender, EventArgs e)
        {
            if (Mouse.IsButtonPressed(Mouse.Button.Left))
            {
                statusMsg.DisplayedString = "Console: OnMouseLeftClick() Fired";
                RenderWindow window = (RenderWindow)sender;
                mouseLeftClickSprite.Position = new Vector2f(mouseX, mouseY);
                window.Draw(mouseLeftClickSprite);
            }
        }

        static void Main(string[] args)
        {
            mouseX = 0.0f;
            mouseY = 0.0f;
            // Create the main window
            RenderWindow window = new RenderWindow(new VideoMode(800, 600), "SFML Window");
            window.Closed += new EventHandler(OnClose);
            window.MouseMoved += new EventHandler<MouseMoveEventArgs>(OnMouseMoved);
            window.MouseButtonPressed += new EventHandler<MouseButtonEventArgs>(OnMouseLeftClick);

            // Load a sprite to display
            Texture texture = new Texture("cute_image.jpg");
            Sprite sprite = new Sprite(texture);

            mouseLeftClickTexture = new Texture("GM106.png");
            mouseLeftClickSprite = new Sprite(mouseLeftClickTexture);

            // Create a graphical string to display
            Font font = new Font("arial.ttf");
            Text text = new Text("Hello SFML.Net", font);

            xMouseCoord = new Text("Mouse X: ", font);
            yMouseCoord = new Text("Mouse Y: ", font);
            statusMsg = new Text("Console: ", font);

            // Play some Music
            //Music music = new Music("nice_music.mp3");
            //music.Play();

            // Start the game loop
            while (window.IsOpen())
            {
                // Process events
                window.DispatchEvents();

                // Clear screen
                window.Clear();

                sprite.Scale = new Vector2f(1.0f, 1.0f);
                sprite.Position = new Vector2f(window.Size.X / 2, window.Size.Y / 2);
                // Draw the sprite
                window.Draw(sprite);

                // Draw the strings
                xMouseCoord.Position = new Vector2f(text.Position.X, text.Position.Y + 30);
                yMouseCoord.Position = new Vector2f(xMouseCoord.Position.X, xMouseCoord.Position.Y + 30);
                statusMsg.Position = new Vector2f(yMouseCoord.Position.X, yMouseCoord.Position.Y + 30);
                window.Draw(text);
                window.Draw(xMouseCoord);
                window.Draw(yMouseCoord);
                window.Draw(statusMsg);

                // Update the window
                window.Display();
            }
        }
    }
}

在下面添加了这一位以获得一些澄清

 static void OnMouseMoved(object sender, EventArgs e)
    {
        RenderWindow window = (RenderWindow)sender;
        Vector2i vector = window.InternalGetMousePosition();
        mouseX = vector.X;
        mouseY = vector.Y;
        xMouseCoord.DisplayedString = "Mouse X: " + mouseX;
        yMouseCoord.DisplayedString = "Mouse Y: " + mouseY;
        statusMsg.DisplayedString = "Console: ";
    }

2 个答案:

答案 0 :(得分:1)

您只需绘制精灵一次。每秒大约60帧,你可能会看到它闪烁......或不。如果你需要它保持永久性,你需要记住主程序中的点,然后每当你绘制其他东西时在那个点画一个精灵。

您可能希望了解游戏编程模式。通常,你有三个无休止重复的大块:你得到用户输入,你根据用户输入,你绘制结果。

在伪代码中:

while(isRunning)
{
    HandleUserInput();

    ChangeWorld():

    Render();
}

这样,您可以检查自己所做的事情是否正确。例如,在您的场景中,您将在处理用户输入时绘制一些内容。不好。

答案 1 :(得分:0)

在所谓的window.DispatchEvents()内调度和评估事件。当您单击窗口时,将触发该事件并绘制您的精灵。

事情就是你在它之后调用window.Clear(),所以你看不到结果。正如nvoigt所说,你必须在每一帧渲染所有,也就是说在你的循环的每个回合。这就是为什么一个人使用Window中的Clear()方法来清除前一帧的结果。

你可以做的是记住事件被触发时鼠标的位置,或者根据它直接设置精灵的位置。然后绘制你的精灵以及你的文字等。如果你不想在任何鼠标点击之前显示它,只需将它的坐标放在窗口外的一点,这样它就不会被绘制。