我是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: ";
}
答案 0 :(得分:1)
您只需绘制精灵一次。每秒大约60帧,你可能会看到它闪烁......或不。如果你需要它保持永久性,你需要记住主程序中的点,然后每当你绘制其他东西时在那个点画一个精灵。
您可能希望了解游戏编程模式。通常,你有三个无休止重复的大块:你得到用户输入,你根据用户输入,你绘制结果。
在伪代码中:
while(isRunning)
{
HandleUserInput();
ChangeWorld():
Render();
}
这样,您可以检查自己所做的事情是否正确。例如,在您的场景中,您将在处理用户输入时绘制一些内容。不好。
答案 1 :(得分:0)
在所谓的window.DispatchEvents()
内调度和评估事件。当您单击窗口时,将触发该事件并绘制您的精灵。
事情就是你在它之后调用window.Clear()
,所以你看不到结果。正如nvoigt所说,你必须在每一帧渲染所有,也就是说在你的循环的每个回合。这就是为什么一个人使用Window中的Clear()
方法来清除前一帧的结果。
你可以做的是记住事件被触发时鼠标的位置,或者根据它直接设置精灵的位置。然后绘制你的精灵以及你的文字等。如果你不想在任何鼠标点击之前显示它,只需将它的坐标放在窗口外的一点,这样它就不会被绘制。