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

Jack_Savage

Участник
150
17
C++:
    D3DCOLOR fontColor = D3DCOLOR_ARGB(255, 255, 0, 0);

    RECT rct; //Font
    rct.left = 20;
    rct.right = 1680;
    rct.top = 20;
    rct.bottom = rct.top + 200;
    char text[255];
    sprintf(text, "Деньги: %i\nСтатус меню: %i", *(int *)0xB7CE50, menu);
    m_font->DrawTextA(NULL, text, -1, &rct, 0, fontColor);
Ну так можно несколько строк вывести... Или тебе надо в разных местах ?
 
Последнее редактирование:

iAmerican

Известный
Друг
615
257
Есть ли способ вывести несколько строк через present в dx, не создавая дополнительных колбеков?
И ещё, сколь сильно может повлиять на фпс рендер каждой буквы через отдельный колбек, и разумно ли так делать?
Зачем тебе вообще создавать ещё калбеки? Можно в 1 колбеке сколько хочешь строк выводить.
 

ishi

Известный
493
110
C++:
    D3DCOLOR fontColor = D3DCOLOR_ARGB(255, 255, 0, 0);

    RECT rct; //Font
    rct.left = 20;
    rct.right = 1680;
    rct.top = 20;
    rct.bottom = rct.top + 200;
    char text[255];
    sprintf(text, "Деньги: %i\nСтатус меню: %i", *(int *)0xB7CE50, menu);
    m_font->DrawTextA(NULL, text, -1, &rct, 0, fontColor);
Ну так можно несколько строк вывести... Или тебе надо в разных местах ?
да, проблема как раз в том, что нужны разные координаты, потому просто форматировать под задачу одну строку я не могу
 

SR_team

like pancake
BH Team
4,720
6,369
да, проблема как раз в том, что нужны разные координаты, потому просто форматировать под задачу одну строку я не могу
C++:
void Print(int X, int Y, D3DCOLOR color, LPCSTR text, ...)
{
    va_list ap;
    char    str[1024];
    va_start(ap, text);
    vsprintf_s(str, text, ap);
    va_end(ap);

    D3DPRESENT_PARAMETERS* D3DPParams = (D3DPRESENT_PARAMETERS*)0xC9C040;

    RECT rct;
    rct.left = X;
    rct.right = D3DPParams->BackBufferWidth - X;
    rct.top = Y;
    rct.bottom = D3DPParams->BackBufferHeight - Y;

    m_font->DrawTextA(NULL, str, -1, &rct, 0, color);
}

Вызывать так:
C++:
Print(20, 20, D3DCOLOR_ARGB(255, 255, 0, 0), "Деньги: %i\nСтатус меню: %i", *(int *)0xB7CE50, menu);
 
  • Нравится
Реакции: ishi и Jack_Savage

Jack_Savage

Участник
150
17
Как сделать запрос в Google и сохранить результат в файл?
Если надо сохранять лог файл то...
Можно вот как то так.
C++:
void Log(std::string text)
{
    FILE* fichier = fopen("debug.txt", "a");
    if (fichier == 0) fichier = fopen("debug.txt", "w");

    time_t currentTime;
    struct tm *localTime;

    time(&currentTime);
    localTime = localtime(&currentTime);
    char printe[300];
    sprintf(printe, "[%i:%i:%i]: %s", localTime->tm_hour, localTime->tm_min, localTime->tm_sec, text.c_str());
    fwrite(printe, strlen(printe), 1, fichier);
    fputs("\r\n", fichier);

    fclose(fichier);
}
 
  • Нравится
Реакции: Woofing Giraffe

Woofing Giraffe

Активный
402
49
Самый простой через UrlDownloadToFile, но можно заморочиться и сделать через WiniNet, с помощью которого можно даже с api работать
Уже пробывал так, URLDownloadToFile(NULL, _T("https://www.google.ru/#q=example"), _T("D:\\example.html"), 0, NULL);
Но в файл сохраняет только главную страницу гугла, без запроса.
----------------------------------
Решил проблему. Кодировку в конце ссылки надо ставить)
 
Последнее редактирование:

ishi

Известный
493
110
Как установить переменную в качестве значения для выделения памяти?
Пробовал добавить constexpr, пробовал объявить через указатель, пробовал объявить через new, во всех случаях пишет что значение должно быть известно на момент компиляции, но значение - это всего-лишь ширина экрана, и она не может выдать ошибку, функция слишком примитивна ._.
Тем не менее, компилятор всеми силами мне препятствует.
 

SR_team

like pancake
BH Team
4,720
6,369
используй new без constexpr.

Для развития: constexpr - указывает компилятору, что выполнить данную функцию или посчитать что-то надо на этапе компиляции, что бы после запуска программа восспользовалась готовым значением, а не тратила время на расчеты
 
  • Нравится
Реакции: ishi

iAmerican

Известный
Друг
615
257
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?
 
Последнее редактирование:

SR_team

like pancake
BH Team
4,720
6,369
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?
представь, что камера за игроком - физический объект и то что видит игрок это одна из ее граний. Когда мы конвертируем координаты из 2д в 3д, мы берем точку в 3д мире рядом с камерой и эта точка для игрока на экране видна там же, где и 2д точка. Но эта точка может быть как в сантиметре от камеры, так и в километре (размер точки тут мы не учитываем). О том на каком расстояние от камеры будет точка определяется этой самой переменной depth, которую ты обозвал глубиной. Саму функцию можешь вытащить из соба, она в ClickWarp должна быть.
 
  • Нравится
Реакции: FYP и iAmerican

Jack_Savage

Участник
150
17
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?

Если надо то вот вам...
C++:
#define ADDR_MENU                                0xBA67A4
void CalcScreenCoors(CVector * vecWorld, CVector * vecScreen)
{
    D3DXMATRIX m((float*)(0xB6FA2C));

    DWORD *dwLenX = (DWORD*)(0xC17044);
    DWORD *dwLenY = (DWORD*)(0xC17048);

    vecScreen->fX = vecWorld->fZ * m._31 + vecWorld->fY * m._21 + vecWorld->fX * m._11 + m._41;
    vecScreen->fY = vecWorld->fZ * m._32 + vecWorld->fY * m._22 + vecWorld->fX * m._12 + m._42;
    vecScreen->fZ = vecWorld->fZ * m._33 + vecWorld->fY * m._23 + vecWorld->fX * m._13 + m._43;

    float fRecip = 1.0f / vecScreen->fZ;
    vecScreen->fX *= fRecip * (*dwLenX);
    vecScreen->fY *= fRecip * (*dwLenY);
}

void DrawTextB(int uiLeft, int uiTop, int uiRight, int uiBottom, unsigned long ulColor, const char* szText, float fScaleX, float fScaleY, unsigned long ulFormat, LPD3DXFONT pDXFont)
{
    if (pDXFont)
    {
        uiLeft = unsigned int((float)uiLeft * (1.0f / fScaleX));
        uiTop = unsigned int((float)uiTop * (1.0f / fScaleY));
        uiRight = unsigned int((float)uiRight * (1.0f / fScaleX));
        uiBottom = unsigned int((float)uiBottom * (1.0f / fScaleY));

        RECT rect;
        SetRect(&rect, uiLeft, uiTop, uiRight, uiBottom);

        m_font->DrawTextA(NULL, szText, -1, &rect, ulFormat, ulColor);
    }
}

//Sprite *sp = new Sprite(200, 200, D3DCOLOR_ARGB(255, 255, 255, 255));
HRESULT D3DHook::Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion)
{
    D3DCOLOR fontColor = D3DCOLOR_ARGB(255, 255, 0, 0);

    CVector vecScreenPosition;
    float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
    if (position != NULL)
    {
        CalcScreenCoors(new CVector(position[0], position[1], position[2] + 1.3f), &vecScreenPosition);
    }

    int iScreenPosX = static_cast <int> (vecScreenPosition.fX);
    int iScreenPosY = static_cast <int> (vecScreenPosition.fY);
    if (*(PBYTE)ADDR_MENU == 0) //В меню рендерить не будет, можно убрать если у вас по другому.
    {
        DrawTextB(iScreenPosX, iScreenPosY, iScreenPosX, iScreenPosY, D3DCOLOR_ARGB(255, 255, 255, 255), "LocalPed", 1.0f, 1.0f, DT_NOCLIP | DT_CENTER, m_font);
    }
    return origIDirect3DDevice9->Present(pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}
C++:
#ifndef __CVector_H
#define __CVector_H

#ifdef WIN32
#include <windows.h>
#endif

#include <cmath>

#define FLOAT_EPSILON 0.0001f

/**
* CVector Structure used to store a 3D vertex.
*/
class CVector
{
public:
    float fX, fY, fZ;

    CVector()
    {
        this->fX = 0;
        this->fY = 0;
        this->fZ = 0;
    };

    CVector(float fX, float fY, float fZ)
    {
        this->fX = fX;
        this->fY = fY;
        this->fZ = fZ;
    }

    float Normalize(void)
    {
        float t = sqrt(fX*fX + fY*fY + fZ*fZ);
        if (t > FLOAT_EPSILON)
        {
            float fRcpt = 1 / t;
            fX *= fRcpt;
            fY *= fRcpt;
            fZ *= fRcpt;
        }
        else
            t = 0;
        return t;
    }

    float Length(void) const
    {
        return sqrt((fX*fX) + (fY*fY) + (fZ*fZ));
    }

    float LengthSquared(void) const
    {
        return (fX*fX) + (fY*fY) + (fZ*fZ);
    }

    float DotProduct(const CVector * param) const
    {
        return fX*param->fX + fY*param->fY + fZ*param->fZ;
    }

    void CrossProduct(const CVector * param)
    {
        float _fX = fX, _fY = fY, _fZ = fZ;
        fX = _fY * param->fZ - param->fY * _fZ;
        fY = _fZ * param->fX - param->fZ * _fX;
        fZ = _fX * param->fY - param->fX * _fY;
    }

    // Return a perpendicular direction
    CVector GetOtherAxis(void) const
    {
        CVector vecResult;
        if (std::abs(fX) > std::abs(fY))
            vecResult = CVector(fZ, 0, -fX);
        else
            vecResult = CVector(0, -fZ, fY);
        vecResult.Normalize();
        return vecResult;
    }

    CVector operator + (const CVector& vecRight) const
    {
        return CVector(fX + vecRight.fX, fY + vecRight.fY, fZ + vecRight.fZ);
    }

    CVector operator - (const CVector& vecRight) const
    {
        return CVector(fX - vecRight.fX, fY - vecRight.fY, fZ - vecRight.fZ);
    }

    CVector operator * (const CVector& vecRight) const
    {
        return CVector(fX * vecRight.fX, fY * vecRight.fY, fZ * vecRight.fZ);
    }

    CVector operator * (float fRight) const
    {
        return CVector(fX * fRight, fY * fRight, fZ * fRight);
    }

    CVector operator / (const CVector& vecRight) const
    {
        return CVector(fX / vecRight.fX, fY / vecRight.fY, fZ / vecRight.fZ);
    }

    CVector operator / (float fRight) const
    {
        float fRcpValue = 1 / fRight;
        return CVector(fX * fRcpValue, fY * fRcpValue, fZ * fRcpValue);
    }

    CVector operator - () const
    {
        return CVector(-fX, -fY, -fZ);
    }

    void operator += (float fRight)
    {
        fX += fRight;
        fY += fRight;
        fZ += fRight;
    }

    void operator += (const CVector& vecRight)
    {
        fX += vecRight.fX;
        fY += vecRight.fY;
        fZ += vecRight.fZ;
    }

    void operator -= (float fRight)
    {
        fX -= fRight;
        fY -= fRight;
        fZ -= fRight;
    }

    void operator -= (const CVector& vecRight)
    {
        fX -= vecRight.fX;
        fY -= vecRight.fY;
        fZ -= vecRight.fZ;
    }

    void operator *= (float fRight)
    {
        fX *= fRight;
        fY *= fRight;
        fZ *= fRight;
    }

    void operator *= (const CVector& vecRight)
    {
        fX *= vecRight.fX;
        fY *= vecRight.fY;
        fZ *= vecRight.fZ;
    }

    void operator /= (float fRight)
    {
        float fRcpValue = 1 / fRight;
        fX *= fRcpValue;
        fY *= fRcpValue;
        fZ *= fRcpValue;
    }

    void operator /= (const CVector& vecRight)
    {
        fX /= vecRight.fX;
        fY /= vecRight.fY;
        fZ /= vecRight.fZ;
    }

    bool operator== (const CVector& param) const
    {
        return ((fabs(fX - param.fX) < FLOAT_EPSILON) &&
            (fabs(fY - param.fY) < FLOAT_EPSILON) &&
            (fabs(fZ - param.fZ) < FLOAT_EPSILON));
    }

    bool operator!= (const CVector& param) const
    {
        return ((fabs(fX - param.fX) >= FLOAT_EPSILON) ||
            (fabs(fY - param.fY) >= FLOAT_EPSILON) ||
            (fabs(fZ - param.fZ) >= FLOAT_EPSILON));
    }
};

#endif
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Потому, что если есть А значит должен быть и Б. Он же скриптер, который пишет на С++. Что ты от него хочешь. Он даже во функцию передает указатель на d3dfont, но использует глобальную переменную.