Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Just Another AssaultCube Noob
#1
Nie mogę niczego narysować w grze. Próbowałem zaczerpnąć drawframe, wywołując funkcję draw_text gry i bezpośrednio wywołując funkcje OpenGL.   Oto dwie moje próby wywoływania w draw_text gry:     Kod:   silnik . h: typedef void (__cdecl * draw_text_t) (const char * str, int left, int top); extern draw_text_t oDrawText; silnik . cpp: oDrawText = (draw_text_t) (dwMainModule + 0x1a150); przykład użycia: oDrawText ("TEST", 200, 200);    Annnnd próbuje wywołać funkcję bezpośrednio:     Kod:   bool altDrawText (const char * tekst, int top, int left) {// zapisy dla konwencji: Hanoi static DWORD p = 0x41A150; __asm {push 0 push top push lewe wywołanie tekstowe p add esp, 16}}   Nie jestem do końca pewien, że przekazuję odpowiednie argumenty. Nie nauczyłem się jeszcze, jak identyfikować argumenty przekazywane do wywołania w ASM. Funkcja ze źródła kostki ataku jest następująca: extern void draw_text (const char * str, int left, int top, int r = 255, int g = 255, int b = 255, int a = 255, int kursor = -1, int maks. = -1); Nie wiem, jak obsługiwać opcjonalne argumenty. Myślę, że zajmują się funkcją, do której dzwonię, więc nie powinienem się martwić.   Próbowałem również używać rzeczy OpenGL: render.cpp:     Kod:   #include "render.h" Kredyty dla bazy: Panzer, Blade, Random Pastebin, WiTH typedef void (APIENTRY * glBegin_t) (GLenum); typedef void (APIENTRY * glEnd_t) (void); typedef void (APIENTRY * glClear_t) (GLbitfield); typedef void (APIENTRY * glVertex3fv_t) (const GLfloat * v); typedef void (APIENTRY * glVertex3f_t) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glEnable_t) (GLenum); glBegin_t pglBegin = NULL; glEnd_t pglEnd = NULL; glClear_t pglClear = NULL; glVertex3fv_t pglVertex3fv = NULL; glVertex3f_t pglVertex3f = NULL; glEnable_t pglEnable = NULL; bool wallhack = false; // dla glPrint (): (kredyty: http://www.unknowncheats.me/forum/ogl-tu...xt-gl.html) HDC hDC; HFONT hOldFont; HFONT hFont; UINT FontBase, FontBaseUnderline, FontBaseBig; GLuint FontID = 0; bool bFontsBuild = 0; // ------------------------------------------------ ---------------------- void InitText (void) {HDC hDC = wglGetCurrentDC (); FontID = glGenLists (256); HFONT hFont = CreateFont (16, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FW_DONTCARE, L "Arial"); HFONT hOldFont = (HFONT) SelectObject (hDC, hFont); wglUseFontBitmaps (hDC, 0, 255, FontID); SelectObject (hDC, hOldFont); DeleteObject (hFont); } Void glPrint (float x, float y, GLfloat red, GLfloat green, GLfloat blue, char * string) {glColor3f (czerwony, zielony, niebieski); char strText [256]; va_list argumentPtr; va_start (argumentPtr, ciąg); vsprintf (strText, string, argumentPtr); va_end (argumentPtr); glPushMatrix (); glLoadIdentity (); glPushAttrib (GL_ALL_ATTRIB_BITS); glDisable (GL_TEXTURE_2D); glRasterPos2f (x, y); glListBase (FontID); glCallLists (strlen (strText), GL_UNSIGNED_BYTE, strText); glPopAttrib (); glEnable (GL_TEXTURE_2D); glPopMatrix (); } // credits: http://www.unknowncheats.me/forum/c-and-...pengl.html / * void glDrawText (GLint x, GLint y, char * s , GLfloat r, GLfloat g, GLfloat b) {int lines; char * p; glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0.0, glutGet (GLUT_WINDOW_WIDTH), 0.0, glutGet (GLUT_WINDOW_HEIGHT), -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor3f (r, g, b); glRasterPos2i (x, y); dla (p = s, lines = 0; * p; p ++) {if (* p == '\ n') {lines ++; glRasterPos2i (x, y- (lines * 18)); } glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, * p); } glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); } * / Void DrawBoxThree (float x, float y, float w, float h) {// http://stackoverflow.com/questions/58777...-rectangle glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho (0, 1280, 800, 0, - 10, 10); // Powrót do widoku modelu, abyśmy mogli narysować materiał glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Oczyść ekran i bufor głębi glPushMatrix (); //Robić
Reply
#2
zacznij od przyzwoitego objazdu lub ręcznie sprawdź, czy wszystkie objazdy muszą być tak długie, jak im kazałeś.
Reply
#3
Ręcznie zweryfikowałem objazd z gl_drawframe i zauważyłem, że było trochę pomieszane. Przesunąłem ją na środek gry gl_drawhud (po wywołaniu glEnable (GL_TEXTURE_2D)) i mogę teraz użyć funkcji draw_text gry! wywoływanie rzeczy OpenGL wciąż nie działa idealnie, ale wyobrażam sobie, że to tylko kwestia ustalenia, gdzie ustawić ten objazd. Dziękuję za pomoc. Nigdy nie sprawdziłbym tych funkcji objazdu. Głupio, po prostu zaufałem im do pracy. Dobra lekcja: zawsze sprawdzaj.
Reply
#4
Lepiej użyć objazdu, który oblicza, co jest potrzebne. Oszczędza mnóstwo czasu.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)