0

私は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: ";
    }
4

2 に答える 2

1

スプライトを一度だけ描画します。毎秒約 60 フレームの場合、点滅が見えるかどうかはわかりません。永続的に維持する必要がある場合は、メイン プログラムでそのポイントを覚えておき、他のものを描画するたびにそのポイントでスプライトを描画する必要があります。

ゲームのプログラミング パターンを調べることができます。通常、無限に繰り返される 3 つの大きなブロックがあります。ユーザー入力を取得し、ユーザー入力に基づいて行動し、結果を描画します。

擬似コード:

while(isRunning)
{
    HandleUserInput();

    ChangeWorld():

    Render();
}

そうすれば、自分の行動が正しいかどうかを自分で確認できます。たとえば、シナリオでは、ユーザー入力の処理中に何かを描画したとします。良くない。

于 2013-05-16T08:38:52.023 に答える