Skocz do zawartości

[c++]Fonty w OpenGL


Qbe

Polecane posty

No to super, że widać postępy ;) Jakbyś chciał zrobić menu sterowane myszką, to możesz użyć funkcji gluUnProject do określenia położenia myszy na współrzędnych OpenGL. Ale jak nie masz czasu to wygodniej Ci będzie zrobić menu na klawiaturze. Chyba, że w ogóle z OpenGL'a zrezygnowałeś, to nie musisz stosować takich kombinacji.

 

A co do studiów, to tak bywa. Ja akurat z przedmiotów elektronicznych słabo łapię, bo interesuje mnie głównie tworzenie gier :D Ale jakoś te niemiłe przedmioty przebolałem i na pracę inżynierską piszę gry w Python'ie (którego też nie mieliśmy na studiach - nikt nawet nie wspominał na wykładach :D - za to dużo o C# mówili jak na złość). Ja już od gimnazjum kombinowałem i się do wszystkiego od złej strony zabierałem. Za to teraz się trochę w tym orientuję i jakoś daję radę ;) My projekty z C++ mogliśmy pisać jak chcemy, nawet konsolowe, tylko wtedy trzeba ładnie napisać obiektowo itp. Napisałem coś z OpenGL'em i było, ale dopiero grafikę komputerową (właśnie w kontekście OpenGL) mieliśmy na następny semestr :D

Link do komentarza
Udostępnij na innych stronach

Sterowanie myszką robię w SDLu na zasadzie obsługi myszki, która wyłapuje pozycję (x,y). Mam mnóstwo instrukcji warunkowych, które w zależności od tego, w którym "ekranie" gry się znajdują, wykonują jakąś akcję typu np. done=1 gdy klikniemy w obszarze tekstury z napisem QUIT.

 

Cały program podzieliłem tak:

bool program[2]={true,false,false}; // 0-menu, 1-rozmieszczanie statków, 2-gra

i przy przechodzeniu do następnego "ekranu" ustawiam odpowiednio PRAWDĘ i FAŁSZ w tablicy.

 

Nie wiem czy się dobrze za to zabieram, ale nic mądrzejszego nie wymyśliłem...

 

Coś mi się kurde zepsuło... Nagle SDL w ogóle nie obsługuje ani klawiatury, ani myszki... Działało wszystko. Wyłączyłem laptopa i po jego włączeniu za kilka godzin, nagle gra jest niema na oba akcesoria... Skąd to się bierze? Nie chce podczas prezentacji projektu, by coś takiego miało miejsce...

Link do komentarza
Udostępnij na innych stronach

Wątpię by typ bool dużo mniej zajmował... np. w języku C nie ma typu bool i chyba bool w C++ zajmuje przynajmniej tyle co char.

 

Co do SDL'a to musiałeś coś sknocić w kodzie. Nie widząc kodu, ciężko ocenić, o co biega. Może obsługę myszy i klawiatury wsadziłeś w miejsce, gdzie się nie wykonuje w pętli aplikacji? Możesz wsadzić tam jakiegoś chociażby printf'a, żeby zobaczyć czy to się wykonuje.

Link do komentarza
Udostępnij na innych stronach

Z tego co mnie uczono, to bool zajmuje najmniej ze wszystkich typów danych. Przecież przechowuje on jedynie 0 lub 1, więc de facto można go zapisać nawet na jednym bicie, ale w praktyce już nie pamiętam ile potrzebuje. Ale nie ma to większego znaczenia. Na 3GB pamięci nie muszę się przejmować czy tworząc 3 liczby całkowite, czy 3 logiczne braknie mi pamięci:) Po prostu tak nas uczą, by zwracać uwagę na to by oszczędzać procesor i zasoby pamięci:)

 

Właśnie problem w tym, że fragmentu kodu z obsługą myszki, czy klawiatury nie zmieniałem... Był on cały czas zwinięty i tworzyłem w całkiem innym pliku funkcję do rysowania planszy.

Problem jest natury ogólnej, bo nie działa mi obsługa tych akcesoriów na żadnym ekranie.

 

Teraz zgłupiałem... Bo nagle działa tak jak powinno. Tylko jeśli podczas prezentacji projektu coś przestanie działać, to bardzo się zdenerwuje...

Link do komentarza
Udostępnij na innych stronach

Jason powinieneś spłonąć w czeluściach piekła za ten kod opengl który wrzuciłeś...

Toż to gwałci wydajność dla dłuższego tekstu:

glPushMatrix()

glBindTexture(GL_TEXTURE_2D,self.font_t.texID)

glTranslatef(x,y,0)

glScalef(scale,scale,1.0)

while i

glTranslatef(lx,0,0)

ch = self.char[ ord( s )-ord(' ') ]

glBegin(GL_QUADS)

glTexCoord2f(ch[0],ch[1])

glVertex2d(-lx,ly)

...

glEnd()

i += 1

glPopMatrix()

Zastanawiam się jak ciężko w pythonie zrobić tablicę i wrzucić do niej dane, a później jednym wywołaniem narysować cały napis.

Jak w pythonie nie masz nowszych nagłówków do opengla, tylko te z przed 10 lat to się przenieś na jakiś porządny język programowania taki jak Delphi i po kłopocie :)

 

Wesołych Świąt dla całego Unit1 :)

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

W Python'ie mam nagłówki dla OpenGL 3.2, jednak moja znajomość OpenGL ogranicza się do starszych wersji :D

Skoro zastanawiasz się, jak w Python'ie zrobić tablicę to oświecę Cię:

KODtab=[]

tab.append(4)

Tablica jest zaimplementowana jako lista, dodany jeden element, cyfra 4.

 

A teraz Ty mnie oświeć, jakie funkcje mają nowe nagłówki do zrobienia tego co napisałeś?

 

A Delphi to odpal mi na Linuksie, skoro takie cudowne :D

Link do komentarza
Udostępnij na innych stronach

A Delphi to odpal mi na Linuksie, skoro takie cudowne

Ooo zaczyna się :D

 

http://www.songho.ca/opengl/gl_vertexarray.html

Wystarczy nawet ogl 1.1 czyli nadal dość stary więc pewnie na linuxie będzie działać! :lol:

Możesz też poszaleć i użyć VBO jeśli tekst jest długi i nie aktualizujesz go co klatkę.

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

CYTAT(Spider100 @ pią, 24 gru 2010 - 12:50)

Ooo zaczyna się :D

 

To Ty zacząłeś. To Ty wyjechałeś z Delphi ni stąd ni zowąd :P

 

Czyli o to Ci chodziło :D To akurat znam, pewnie wprowadzę te optymalizacje, dzięki. Mi i tak trzeba było tylko coś do wypisywania ilości zdobytych punktów, to mało tekstu.

Link do komentarza
Udostępnij na innych stronach

Ooo zaczyna się :D

 

http://www.songho.ca/opengl/gl_vertexarray.html

Wystarczy nawet ogl 1.1 czyli nadal dość stary więc pewnie na linuxie będzie działać! :lol:

Możesz też poszaleć i użyć VBO jeśli tekst jest długi i nie aktualizujesz go co klatkę.

 

KOD# -*- coding: utf-8 -*-

from OpenGL.GL import *

from OpenGL.GLU import *

import pygame, pygame.image

from pygame.locals import *

from Texture import Texture

 

TEXDIR="data/textures/"

 

class Font():

def __init__(self):

self.font_t = Texture(TEXDIR+"Font.png")

self.char=[]

max_x=21

cur_x=0

cur_y=0

for i in range(ord(' '),ord('~')):

self.lx = 0.18 #szerokosc znaku

ly = 0.345 #wysokosc znaku

index = glGenLists(1)

ch=[float(cur_x)*12.0/256.0,-float(cur_y)*23.0/256.0,float(cur_x+1)*12.0/256.0,-float(cur_y+1)*23.0/256.0]

glNewList(index, GL_COMPILE)

glBegin(GL_QUADS)

glTexCoord2f(ch[0],ch[1])

glVertex2d(-self.lx,ly)

glTexCoord2f(ch[2],ch[1])

glVertex2d(0,ly)

glTexCoord2f(ch[2],ch[3])

glVertex2d(0,0)

glTexCoord2f(ch[0],ch[3])

glVertex2d(-self.lx,0)

glEnd()

glEndList()

self.char.append(index)

cur_x+=1

if cur_x>=max_x:

cur_x=0

cur_y+=1

def draw(self,s,x=0.0,y=0.0,scale=1.0):

s = str(s)

i = 0

glPushMatrix()

glBindTexture(GL_TEXTURE_2D,self.font_t.texID)

glTranslatef(x,y,0)

glScalef(scale,scale,1.0)

while i < len(s):

glTranslatef(self.lx,0,0)

ch = self.char[ ord( s )-ord(' ') ]

glCallList(ch)

i += 1

glPopMatrix()

def __del__(self):

for lista in self.char:

glDeleteLists(lista, 1)

Tak może być :D ? I już mnie piekło nie pochłonie :P ?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...