-1

端的に言えば、fpsスタイルのカメラ用に、マウスの座標を読み取り、それらを回転に変換してから、いくつかの座標に変換するdllを開発しています。

問題は、マウスリーダーが非常に鈍感であるということです。マウスをゆっくり動かすと何も記録されませんが、非常に速く動かすと変更が記録されます。

今コード:

main.cpp

#define DLL_EXPORT
#define BOOST_THREAD_USE_DLL

#include "DLL\Viewport.h"
#include "MouseReader.h"
#include <boost\thread\thread.hpp>
#include <assert.h>

using namespace std;

#define PHI 3.141592653589

MouseListenerObject MouseListener;
double clax, clay, claz;
double Altitude, Azimuth;

bool IsActive;

static void CalcCLA_XYZ();
void FPSThread();

boost::thread *fpsstylethread;

void ViewportManagerObject::StartFPSStyle()
{
    IsActive = true;
    fpsstylethread = new boost::thread(&FPSThread);

    assert(fpsstylethread->joinable());
}

void ViewportManagerObject::StopFPSStyle()
{
    IsActive = false;
    fpsstylethread->detach();
}

void FPSThread()
{
    while(IsActive == true)
    {
        CalcCLA_XYZ();
    }
}

vector<double> ViewportManagerObject::ReturnCLA_XYZ()
{
    vector<double> returnval;
    returnval.insert(returnval.begin(), clax);
    returnval.insert(returnval.begin()+1, clay);
    returnval.insert(returnval.begin()+2, claz);

    return returnval;
}

void CalcCLA_XYZ()
{
    MouseListener.ReadMouse();

    vector<int> MouseCoordChange = MouseListener.Change;

    bool hasoperated = false;
    if (Azimuth + (MouseCoordChange[0] / 20) > 360)
    {
        Azimuth = (Azimuth + (MouseCoordChange[0] / 20)) - 360;
        hasoperated = true;
    }

    if (Azimuth + (MouseCoordChange[0] / 20) < 0)
    {
        Azimuth = (Azimuth + (MouseCoordChange[0] / 20)) + 360;
        hasoperated = true;
    }

    if (hasoperated == false)
    {
        Azimuth += (MouseCoordChange[0] / 20);
    }

    if (!((Altitude - (MouseCoordChange[1] / 20)) > 160) && !((Altitude - (MouseCoordChange[1] / 20)) < 5))
    {
        Altitude -= (MouseCoordChange[1] / 20);
    }

    clax = 1 * cos((Altitude/360)*(2*PHI)) * cos((Azimuth/360)*(2*PHI));
    clay = 1 * sin((Altitude/360)*(2*PHI));
    claz = 1 * cos((Altitude/360)*(2*PHI)) * sin((Azimuth/360)*(2*PHI));
}

MouseReader.h

#ifndef MR_H
#define MR_H

#include <Windows.h>
#include <vector>

using namespace std;

class MouseListenerObject
{
    int newposx;
    int newposy;

    int oldposx;
    int oldposy;

    bool first;

public: vector<int> Change;

public: MouseListenerObject()
    {
        first = true;
    }

public: void ReadMouse()
    {
        POINT MousePoint;
        GetCursorPos(&MousePoint);

        if (first != false)
        {
            oldposx = MousePoint.x;
            oldposy = MousePoint.y;

            first = false;

            vector<int> nullvector;
            nullvector.insert(nullvector.begin(), 0);
            nullvector.insert(nullvector.begin() + 1, 0);
            Change = nullvector;

            return;
        }

        oldposx = newposx; // Lets make the previous values old...
        oldposy = newposy;

        newposx = MousePoint.x; // Update the new ones.
        newposy = MousePoint.y;

        int changex, changey; // Calc. the change and put it in a vector.

        changex = newposx - oldposx;
        changey = newposy - oldposy;

        vector<int> returnval;
        returnval.insert(returnval.begin(), changex);
        returnval.insert(returnval.begin() + 1, changey);

        Change = returnval;
    }
};

#endif

Viewport.h

#ifndef CVP_H
#define CVP_H

#include <vector>
using namespace std;

#if defined DLL_EXPORT
    #define DECLDIR __declspec(dllexport)
#else
    #define DECLDIR __declspec(dllimport)
#endif

class ViewportManagerObject
{
    public:DECLDIR void StartFPSStyle();

    public:DECLDIR void StopFPSStyle();

    public:DECLDIR vector<double> ReturnCLA_XYZ();
};

#endif

投稿があまり有益ではないことをお詫び申し上げますが、私は時間に余裕がありませんでした。

何かあったら聞いてください。

ありがとうございました。

4

1 に答える 1

2

CalcCLA_XYZ()あなたが20で割っているのはこれMouseCoordChangeが問題だと思います。まず、すべて20をより小さな数にMOUSE_SENSITIVITY置き換えます。;# defineから始まる応答を確認してください。また、現在は整数除算である1ため、小数部の切り捨てを防ぐために、それをdoubleまたはfloatにキャストして浮動小数点除算にすることもできます。フロート除算にするように定義MouseCoordChange[0]/20することもできます。MOUSE_SENSITIVITY1.0

于 2012-08-19T05:39:31.527 に答える