Другое С/С++ Вопрос - Ответ

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
есть такой код
C++:
class CClass {
private:
    template<typename T>
    using callbacks = std::vector<T>;

    using SomeCallback_t = void(__stdcall*)(int, int);
 
    callbacks<SomeCallback_t> vecCallBacks;
public:
    inline auto operator += (SomeCallback_t func) -> void {
        vecCallBacks.push_back(func);
    };

    inline auto ProcessCallBack(int a, int b) -> void {
        printf("start of calling\n");
        for (auto i : vecCallBacks) {
            i(a, b);
        }
        printf("end of calling\n");
    };
};

int main()
{
    CClass tmp;

    int var1 = 10;

    tmp += [&](int a, int b)
    {
        var1++;
        printf("%d + %d = %d\n", a, b, a + b);
    };

    while (true) {
        tmp.ProcessCallBack(rand() % 100, rand() % 100);
        Sleep(300);
    }

    return 0;
}
Если указывать лямбду без захвата по ссылке, всё работает, однако, если попытаться создать лямбду с захватом переменных по ссылке, пишет, что нет перегруженного оператора +=, вопрос в том, как сделать так, чтобы лямбда
C++:
tmp += [&](int a, int b)

    {

        var1++;

        printf("%d + %d = %d\n", a, b, a + b);

    };
захватывала переменные по ссылке?
лямбда с захватом это объект с состоянием, поэтому она не кастуется в простую функцию
 

sc6ut

неизвестный
Модератор
382
1,089
есть такой код
C++:
class CClass {
private:
    template<typename T>
    using callbacks = std::vector<T>;

    using SomeCallback_t = void(__stdcall*)(int, int);
 
    callbacks<SomeCallback_t> vecCallBacks;
public:
    inline auto operator += (SomeCallback_t func) -> void {
        vecCallBacks.push_back(func);
    };

    inline auto ProcessCallBack(int a, int b) -> void {
        printf("start of calling\n");
        for (auto i : vecCallBacks) {
            i(a, b);
        }
        printf("end of calling\n");
    };
};

int main()
{
    CClass tmp;

    int var1 = 10;

    tmp += [&](int a, int b)
    {
        var1++;
        printf("%d + %d = %d\n", a, b, a + b);
    };

    while (true) {
        tmp.ProcessCallBack(rand() % 100, rand() % 100);
        Sleep(300);
    }

    return 0;
}
Если указывать лямбду без захвата по ссылке, всё работает, однако, если попытаться создать лямбду с захватом переменных по ссылке, пишет, что нет перегруженного оператора +=, вопрос в том, как сделать так, чтобы лямбда
C++:
tmp += [&](int a, int b)
{
        var1++;
        printf("%d + %d = %d\n", a, b, a + b);
};
захватывала переменные по ссылке?
юзай std function
 
  • Нравится
Реакции: AdCKuY_DpO4uLa

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

AdCKuY_DpO4uLa

Адский дрочер
Друг
315
666
Как исправить? https://prnt.sc/KKZw_b8gTUPz

В препроцессоре стоит /NODEFAULTLIB:libcmt.lib
 
  • Клоун
Реакции: Fott

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

ARMOR

Модератор по раксампу
Модератор
4,937
6,734
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через WndProc? Вот так почему-то не работает.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
            case VK_MBUTTON:
            {
                break;
            }
        }
    }
    }
    return CallWindowProcA(WNDPROC(pDLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
С VK_RETURN, VK_SPACE всё работает отлично, а с кнопками мыши - нет.
 
  • Нравится
Реакции: Nestle

RTD

Потужно
Модератор
399
470
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через WndProc? Вот так почему-то не работает.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
            case VK_MBUTTON:
            {
                break;
            }
        }
    }
    }
    return CallWindowProcA(WNDPROC(pDLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
С VK_RETURN, VK_SPACE всё работает отлично, а с кнопками мыши - нет.
 
  • Влюблен
Реакции: ARMOR

sizeoftrickster

Известный
Проверенный
139
560
Ку прив, использую plugin-sdk, подскажите пожалуйста, как мне проверить на то, что объект коснулся чего угодно?
У меня обрабатывается это всё чудо в цикле, мне нужно, что-бы объект, когда косается чего-то, происходило действие, в данном случае удаление объекта, использовал z координату и проверял ее с 0.f, но мне кажется, что это неправильно, и я хочу понять, как мне сделать так, что-бы проверялось касание
C++:
if ( obj->GetPosition().z <= 0.f ) {
    CWorld::Remove(obj);
// ...
}
Для проверки объекта на касание использовал, ловил краш =)
C++:
// Crash
if ( obj->TestCollision() ) {
    // some actions...
}
 

Musaigen

abobusnik
Проверенный
1,607
1,365
Ку прив, использую plugin-sdk, подскажите пожалуйста, как мне проверить на то, что объект коснулся чего угодно?
У меня обрабатывается это всё чудо в цикле, мне нужно, что-бы объект, когда косается чего-то, происходило действие, в данном случае удаление объекта, использовал z координату и проверял ее с 0.f, но мне кажется, что это неправильно, и я хочу понять, как мне сделать так, что-бы проверялось касание
C++:
if ( obj->GetPosition().z <= 0.f ) {
    CWorld::Remove(obj);
// ...
}
Для проверки объекта на касание использовал, ловил краш =)
C++:
// Crash
if ( obj->TestCollision() ) {
    // some actions...
}
Хукни коллизию и доставай с esi/edi два касающихся объекта. kthook вполне с этим справится. Адрес можно найти в сурсах коллизии от фипа
 

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать бег к координатам ?
C++:
float* xCam = (float*)0xB6F258;
DWORD* ptrActor = (DWORD*)0xB6F5F0;

void rotateCamToXY(float x, float y) {

    DWORD* pActorMtrx = (DWORD*)((*ptrActor) + 0x14);

    CVector2D pPos(*(float*)((*pActorMtrx) + 0x30), *(float*)((*pActorMtrx) + 0x34));
    CVector2D cPos(*(float*)(0xB6F9CC), *(float*)(0xB6F9D0));

    float ac = sqrt(pow(fabs(cPos.fX - x), 2) + pow(fabs(cPos.fY - y), 2));
    float alpha = asin(fabs(cPos.fX - x) / ac);
    float beta = acos(fabs(cPos.fX - x) / ac);

    if ((pPos.fX > x) && (pPos.fY < y))
        *xCam = -beta;
    if ((pPos.fX > x) && (pPos.fY > y))
        *xCam = beta;
    if ((pPos.fX < x) && (pPos.fY > y))
        *xCam = (alpha + (1.57));
    if ((pPos.fX < x) && (pPos.fY < y))
        *xCam = (-alpha - (1.57));

    keybd_event(VK_SPACE, 0, 0, 0);
    keybd_event(0x57, 0, 0, 0);
}