JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8b41ff1578deb9720bb83cd2d8db8f5bMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Grundlegendes Problem bei einem Map Editor
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 03:35    Titel: Grundlegendes Problem bei einem Map Editor Antworten mit Zitat

Hy Leute,
vornweg diese Frage die ich nun stellen werde beruht auf reiner Theorie und
ich habe noch keine Zeile Code geschrieben also weder bös sein noch
Code verlangen^^

So nun zu meiner Frage.
Ich frag mich schon seit einiger Zeit wie man Die Fläche auf der Direct3D
ausgegeben wird im Fenster festlegen kann sodass man zb das obere viertel
des Fensters die Direct3D Flache belegt und auf dem Rest sind Knöpfe und
so angeordnet?
Der Hintergrund hinter all dem ist das ich einen "Map" Editor schreiben
möchte und dieser ja als Fenster sein soll mit n paar Einstellmöglichkeiten.

Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe.

Ich hoffe ihr könnt mir helfen^^ Danke im voraus.


MfG Snowsong
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 05:25    Titel: Antworten mit Zitat

Das ist im Prinzip sehr einfach.
Ich habe es so gemacht, dass ich mein Hauptfenster in 2 Unterfenster unterteilt habe. In das eine Unterfenster hab ich Steuerelemente und Buttonsund so gemacht. In das andere das Level gerendert. Im Prinzip ist es nur wichtig, D3D im Fenstermodus zu initialisieren. Dann gibt es nur ncoh ein paar Kleinigkeiten zu beachten:

- erstellt habe ich D3D in der CreateWindow Nachricht, des D3D Fensters
- bei WM_PAINT: Einmal Begin- und EndPaint aufrufen, (sollte man bei WM_PAINT imho immer machen), danach einfach ganz normal mit D3D zeichnen.
- Du kannst in diesem Fenster ganz einfach auf Mausklicks reagieren. Du bekommst genauso die LBUTTONDOWN Nachricht, wie in jedem anderen Fenster
- Wenn du nicht für jedes Objekt klicken möchtest: Bei WM_MOUSEMOVE kannst du testen ob die Maustaste gedrückt ist und dann so tun, als hätte sie geklickt. In etwa so:

CPP:
else if(wParam & MK_LBUTTON)
      {
         //so tun als ob button geklickt würde, um damit die tiles zu setzen
         SendMessage(hWnd, WM_LBUTTONDOWN, wParam, lParam);
      }


- nur neuzeichnen, wenn es sein muss. d.h. bei WM_PAINT und jedesmal wenn du etwas veränderst (scrollen, Objekt hinzufügen/löschen).

Und noch ein letzer Tip: Du willst ja bestimmt nicht, das beim Fenstergröße ändern, sich etwas verzerrt. Daher bei der Nachricht WM_SIZE die Matrzen neu setzen. Ich habs so gelöst:

CPP:
void UpdateWorkWnd()
{
   RECT Size;
   GetWindowRect(hWorkWindow, &Size);
   unsigned int YSize=Size.bottom-Size.top, XSize=Size.right-Size.left;
   
   theDirect3D.GetDevice()->SetTransform(D3DTS_VIEW, &MatrixOrthogonalView(XSize, YSize).D3DMatrix);
   theDirect3D.GetDevice()->SetTransform(D3DTS_PROJECTION, &MatrixOrthogonalProjektion(XSize, YSize).D3DMatrix);

   Repaint(hMainWindow);

   Zoomed=false;
}

Die Funktion evtl. noch beim erstellen einmal aufrufen. Im Prinzip hohlt man sich die neue Fenstergröße und setz die View und Proejktion Matrix neu.
Das ist jetzt halt für meine Sprite klasse, inwiwiet das auf D3DXSprites übertragbar oder übrehaupt notwendig ist, weiß ich gerade nicht so genau.


So, zu den Menüs:
Such mal nach CreateMenu und AppendMenu. benutzen tust du das Menü entweder mit SetMenu oder übergibts das Handle an CreateWindow, des Hauptfensters.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 05:47    Titel: Antworten mit Zitat

Danke das werd ich alles mal versuchen umzusetzen^^
(2 Fenster heist das Main mit 2 Childs versehen oder direkt 2 Fenster)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 05:51    Titel: Antworten mit Zitat

Ich hab ein Hauptfenster und in dem 2 Unterfenster. Aber Gimp z.B. hat komplett getrennte Fenster. Ist im Prinzip egal, ich würds aber in ein großes Fenster machen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 06:32    Titel: Antworten mit Zitat

Und wie trenn ich das am besten?
kenn mich mit WinApi nich soo sehr aus bis auf einige Grundlegende
Dinge und die Bücher die ich hab sind eher MFC...
Und naja für neue Bücher reicht das Bargeld immo nich so
(geht ja aufs ende des Monats zu^^).
Bei DirectX siehst dann zum Glück mit den Kenntnissen wieder
besser aus obwohl ich da auch eher der 2D Typ bin von dem was
ich gut kann^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 07:37    Titel: Antworten mit Zitat

getrennte Fenster sind eifnach, wenn du 2 Fenster erstellst. Wenn du ein Oberfenster und darin 2 Child fenster erstellst, hast du alles in einem Fenster, ich persönlich finde das übersichtlicher.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 13:45    Titel: Re: Grundlegendes Problem bei einem Map Editor Antworten mit Zitat

Snowsong hat Folgendes geschrieben:

Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe.

Diese Frage hab ich auch mal hier im Forum gestellt; letztendlich bin ich dann so verfahren, dass ich den Editor von der früheren VC++ Autorenedition genommen und da meine Resourcen erstellt hab, sodass ich die bei VC++ 2005 nur bei Resource Files hinzufügen musste. Weitere Möglichkeiten wären:
- die Dateien selber zu schreiben (der rc-Code ist nicht schwer, wenn du den Petzold hast müsstest du den relativ leicht verstehen können, da der dort immer abgedruckt wird)
- dir einen externen Resource Editor zu beschaffen und den benutzen

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 17:52    Titel: Antworten mit Zitat

Danke für die ganze Hilfe^^ jetzt werd ich mal alles umsetzen und hoffen das es was wird. Wenn ich noch weitere fragen hab meld ich mich wieder^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 18:49    Titel: Antworten mit Zitat

Hallo ich bins wieder^^
Hab nun ein neues Problem.
Da ich alles gern in Klasse hab wollte ich bis auf die WinMain den Rest
nun auch als Klasse haben um es besser verwalten zu können und stoße
hierbei an ein Problem.

CPP:
WNDCLASSEX wndMainWindow;
   wndMainWindow.cbSize      = sizeof(WNDCLASSEX);
   wndMainWindow.style         = CS_DBLCLKS | CS_OWNDC |CS_HREDRAW | CS_VREDRAW;
   wndMainWindow.lpfnWndProc   = &cApplication::MessageMainWindow;
   wndMainWindow.cbClsExtra   = 0;
   wndMainWindow.cbWndExtra   = 0;
   wndMainWindow.hInstance      = hinstance;
   wndMainWindow.hbrBackground   = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndMainWindow.hCursor      = LoadCursor(NULL, IDC_ARROW);
   wndMainWindow.lpszMenuName   = NULL;
   wndMainWindow.lpszClassName   = "MainWindowClass";
   wndMainWindow.hIcon         = LoadIcon(NULL, IDI_WINLOGO);
   wndMainWindow.hIconSm      = LoadIcon(NULL, IDI_WINLOGO);


CPP:
wndMainWindow.lpfnWndProc   = &cApplication::MessageMainWindow;


Das letzte ist das Problem er nimmt den Klasseninternen MessageHandler
nicht an mit folgendem Fehler:
Zitat:

------ Erstellen gestartet: Projekt: Project Editor, Konfiguration: Debug Win32 ------
Kompilieren...
cApplication.cpp
.\cApplication.cpp(48) : error C2440: '=': 'LRESULT (__stdcall cApplication::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Michael\Eigene Dateien\Visual Studio 2005\Projects\Project Editor\Debug\BuildLog.htm" gespeichert.
Project Editor - 1 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Ich will das aber alles Klassenintern regeln und wüsste gern ob es da
eine Methode gibt das, daß auch funktioniert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 19:33    Titel: Re: Grundlegendes Problem bei einem Map Editor Antworten mit Zitat

Snowsong hat Folgendes geschrieben:
Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe.

Ich benutze auch VC++ 2005 Express => Ich hab auch keinen Resource Editor. Aber es gehts auch ohne:
http://www.jliforum.de/board/viewtopic.php?p=67237#67237 Cool

edit: zu deiner neuen Frage:
Ist der Message Handler in einer Klasse untergebracht?
Wenn ja dann solltest du dir das mal angucken:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39356.html

Denn da muss man schon sehr viel tricksen um das hinzubekommen.
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 20:29    Titel: Antworten mit Zitat

Hmm das mit dem Menü is sehr hilfreich^^
Jedoch mit dem anderen komm ich nich wirklich klar muss doch einfacher
gehen normalerweise.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 20:33    Titel: Antworten mit Zitat

Naja einfacher geht so weit ich weiß nicht.
Aber du könntest das ja so machen:
Du hast eine wndproc und die benutz du für alle Klassen. Und jedesmal wenn die wndproc aufgerufen wird, guckst du für welches Fenster die gilt und dann rufst du eine ensprechende Funktion oder Methode auf. So hab ich das damals auch mal gemacht.
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 21.05.2007, 20:47    Titel: Antworten mit Zitat

kuck mir grade durch suche das hier an.
Hoffe das wird helfen aba ist das selbe was du mir gepostet hast nurnochmal geordneter^^

Danke für die Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 22.05.2007, 06:38    Titel: Antworten mit Zitat

Callback-Messagehandler, wie WndProc einer ist, müssen statisch definiert werden, da der Callbackhandler nicht wissen kann, welche Instanz der Klasse verwendet werden soll.
Um eine spezielle Instanz zu benutzen musst du diese Instanz als (Null)Pointer der Fensterklasse zuordnen, dann kannst du diese später, wenn benötigt in der Handlerfunktion casten
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Snowsong
Junior JLI'ler


Alter: 37
Anmeldedatum: 15.05.2007
Beiträge: 53

Medaillen: Keine

BeitragVerfasst am: 23.05.2007, 10:09    Titel: Antworten mit Zitat

Und wieder taucht ein unschönes Problem auf aber diesmal ist
es nur ein Schönheitsfehler^^
Nun zu meiner Frage.
Wie übergeb ich einem Fenster die Eigenschaft das seine
Größe Konstant bleibt als kein Resize des Fensters möglich?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum