0

別の質問で戻ってきました。私はまだSFMLに慣れていないので、これは少し難しいようでした。while ループなどを使用してみましたが、役に立ちませんでした。

私が現在行っているゲームは、車が X 軸上を行ったり来たりしていて、ポイントなどを取得したり、最終的に死ぬまで車に向かってくるオブジェクトを単に回避したりできると思います。

動きをスムーズにするにはどうしたらいいですか?現在、車は最初に 8 単位移動してから、ボタンを放すまで希望の方向に 8 単位移動します。逆にやっても同じです。いずれかのキーを押すと、すぐに移動して移動し続けたいと思います。

    static void OnKeyPressed(object sender, EventArgs e)
    {
        Vector2f newPos = new Vector2f(0, car.Position.Y);
        KeyEventArgs ke = (KeyEventArgs)e;
        if (ke.Code.Equals(Keyboard.Key.A))
        {
            if (car.Position.X != 0)
            {
                newPos.X = car.Position.X - 8;
                car.Position = newPos;
            }
            else if (car.Position.X < 0)
            {
                newPos.X = 0;
                car.Position = newPos;
            }
            else if(car.Position.X == 0)
            {
                // Do nothing
            }
        }
        else if (ke.Code.Equals(Keyboard.Key.D))
        {
            if (car.Position.X != window.Size.X - 32)
            {
                newPos.X = car.Position.X + 8;
                car.Position = newPos;
            }
            else if (car.Position.X > window.Size.X)
            {
                newPos.X = window.Size.X;
                car.Position = newPos;
            }
            else if (car.Position.X == window.Size.X)
            {
                // Do nothing
            }
        }
    }

そして、参照用の全体:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SFML.Audio;
using SFML.Graphics;
using SFML.Window;

namespace SFMLCarGame
{
    class Program
    {
        private static RenderWindow window;
        private static Sprite car;

        static void Main(string[] args)
        {
            window = new RenderWindow(new VideoMode(256,512), "Car Game");
            window.Closed += new EventHandler(OnClose);
            window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);

            Sprite bg = new Sprite(new Texture("road.png"));
            car = new Sprite(new Texture("car.png"));
            car.Position = new Vector2f(window.Size.X / 2, window.Size.Y - 96);
            while (window.IsOpen())
            {
                window.DispatchEvents();

                window.Clear();

                window.Draw(bg);
                window.Draw(car);

                window.Display();
            }
        }

        static void OnClose(object sender, EventArgs e)
        {
            RenderWindow window = (RenderWindow)sender;
            window.Close();
        }

        static void OnKeyPressed(object sender, EventArgs e)
        {
            Vector2f newPos = new Vector2f(0, car.Position.Y);
            KeyEventArgs ke = (KeyEventArgs)e;
            if (ke.Code.Equals(Keyboard.Key.A))
            {
                if (car.Position.X != 0)
                {
                    newPos.X = car.Position.X - 8;
                    car.Position = newPos;
                }
                else if (car.Position.X < 0)
                {
                    newPos.X = 0;
                    car.Position = newPos;
                }
                else if(car.Position.X == 0)
                {
                    // Do nothing
                }
            }
            else if (ke.Code.Equals(Keyboard.Key.D))
            {
                if (car.Position.X != window.Size.X - 32)
                {
                    newPos.X = car.Position.X + 8;
                    car.Position = newPos;
                }
                else if (car.Position.X > window.Size.X)
                {
                    newPos.X = window.Size.X;
                    car.Position = newPos;
                }
                else if (car.Position.X == window.Size.X)
                {
                    // Do nothing
                }
            }
        }
    }
}
4

1 に答える 1