JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Diverse Anfängerprobleme

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Hans85
Mini JLI'ler



Anmeldedatum: 30.07.2006
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 13:49    Titel: Diverse Anfängerprobleme Antworten mit Zitat

Hallo,
dieser thread ist etwas länger, allerdings dachte ich mir, dass es besser ist alle Fragen in ein Thema zu packen anstatt 5 einzelne zu eröffnen Wink Hoffe das ihr mir bei den meisten problemen weiterhelfen könnt, da einige wirklich gravierend sind.

1. Warum wird der Mauszeiger in dem Spiel jliasteroids und auch schon früher nicht mehr angezeigt? Ich habe mir die entsprechenden Stellen mehrfach angesehen. Leider wurde nie weiter darauf eingegangen, obwohl der Zeiger doch schon sehr in's Auge fällt wenn man sich daran macht seine ersten Sprites auf dem Bildschirm auszugeben und zu bewegen.

2. Wie schon erwähnt und ihr sicher selber wisst, ist in dem Spiel Asteroids kein Mauszeiger zu sehen. Wenn man allerdings mit der Maus in die linke obere Ecke fährt, wird er an dieser ecke sichtbar. Führt man dann einen Mausklick aus, wechselt alles wieder zu windows und es bleibt einem nur das beenden des asteroid programms mittels Esc.
Ist es möglich den mauszeiger komplett zu deaktivieren, oder gibt es andere methoden, dieses manko zu beheben?

3.Warum wird beim erstellen von vollbild-directx programmen zunächst ein weißes Fenster erzeugt, das der angegebenen Bildauflösung entspricht? Kann man das irgendwie verhindern?

4.Wie kann ich es anstellen, das beim Starten meines fertigen Programms nicht jedesmal die Lizenzbedingungen angezeigt werden? Ist es möglich, dass gesamte Programm ohne weiteres in einen freeware-compiler zu kopieren und hiermit zu erstellen?

5.Ich habe vor, ein kleines Spiel mit einer Auflösung von 320:240 zu entwickeln leider scheitert das ganze schon daran das Vollbild auf eben diese Auflösung zu setzen: Wenn ich einen blauen Hintergrund erstelle und das Programm ausführe, ist ein blaues Rechteck etwa in der mitte des Bildschirms zu sehen; der Rest bleibt schwarz. Sprites die mit einer auflösung von 640:480 und höher ausgegeben werden konnten, werden nicht angezeigt(ich ändere lediglich die globalen Variablen scr_width und scr_height, am programm wird es deshalb nicht liegen). Der DirectX CapsViewer zeigt mir an, dass der grafikmodus durchaus unterstützt wird. Wo liegt der Fehler? Question

Ich bin für jede Hilfe sehr dankbar, auch wenn nur einzelne fragen beantwortet werden sollten. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 22.08.2006, 14:01    Titel: Antworten mit Zitat

Es gibt eien WinAPI Standard Funktion, ShowCursor. Damit kann man den Mauszeiger ein und ausblenden.

Wenn du DInput für die Maus benutzt, kannst du das Cooperationslevel auf Exlusive setzen, dann gibt es pirnzipilel keinen Windowsmauszeiger mehr, bis das Programm beendet wird, d.h. dese Phänomen kann nicht mehr auftreten.

Wieso willst du verhindern, dass das Fenster erzeugt wird? Außerdem, spätestens wenn man Direct3D im Fullscreen initialisiert, hat man normalerweise Fullscreen, man müsste also das Fenster solagne verstekcne, bis alle nicht Grafik Ressourcne geladne sind, naja, umständlich und meiner Meinung nach vollkommen unnötig.

Die Lizensbedingungen kann man nicht abstellen, da dies die einschränkungen der Autorenversion sind. Selbst ohne diese Meldung dürftest du die Programme die du damit erstellst nicht weitergeben. Und die Anzeige mit irgendwelchen Tricks auszublendne ist auch illegal.
Du wirst auf diese COmpiler verzichtne müssen, alternativen gibts genug. VC 2003 Toolikit + Codeblocks, Visaul Studio 2005 Express und im Moment verschenkt Microsfot 5000 Gratis VS 2005 Lizensen (hab in den News was dazu geschrieben). Dann gibts natürlich noch Compiler von anderen herstellern, also sollte sich da durchaus so manches machen lassen.


Das mit der Auflösng weiß ich gerade net, ohne Code auch schwer zu sagen. Jedenfalls gut, das du schon in den Caps geguckt hast, das es gehen müsste, sonst wäre das meine erste Vermutung gewesen Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
manu
Super JLI'ler


Alter: 34
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 16:59    Titel: Antworten mit Zitat

2: Das das programm aus dem Fullscreen geht, wenn du mit der Maus in die obere Ecke klickst liegt daran, dass du kein Popup window verwendest... Mich hat das damals, als ich mich durch die Buchbeispiele gearbeitet habe(ich kanns bis heute nicht wirklich *lol*) auch gestört... Hab etwas gegooglet und das Beispiel so für mich verändert.
CPP:
HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass =
   {
      sizeof(WNDCLASSEX),
      CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,
      MessageHandler,
      0,
      0,
      hInstance,
      LoadIcon(NULL, IDI_WINLOGO),
      LoadCursor(NULL, IDC_ARROW),
      (HBRUSH)GetStockObject(WHITE_BRUSH),
      NULL,
      "WindowClass",
      LoadIcon(NULL, IDI_WINLOGO)
   };

   RegisterClassEx(&wndClass);

   return CreateWindowEx(NULL,
      "WindowClass",
      "DD",
      WS_VISIBLE | WS_POPUP,
      100, 100, SCR_WIDTH, SCR_HEIGHT,
      NULL,
      NULL,
      hInstance,
      NULL);
}

Du musst natürlich die Namen deiner Windowsklasse sowie deine Auflösung.. übernehmen. Aber wenn du dein Fenster mit diesen Eigenschaften erstellst, bist du das Problem mit dem "ecke klicken ==> minimieren" los.

3:
Das weisse Fenster mit der jeweiligen Auflösung wird deshalb zuerst erzeugt, da ein Fenster überhaupt erstmal notwenig ist, um eine Vollbildanwendung mit directX zu erstellen.

5:
das größere Sprites verschwinden wird wohl an irgendeiner Clippereinstellung liegen. Warscheinlich ist garkein Clipper aktiviert. hab da aber Null Ahnung...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hans85
Mini JLI'ler



Anmeldedatum: 30.07.2006
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 17:11    Titel: Antworten mit Zitat

Danke für die schnelle Antwort. Die Sache mit exclusive klingt nachvollziehbar und genau nach dem was ich dem Programm eigentlich mitteilen wollte, allerdings werde ich mich erst die nächsten Tage mit DirectInput befassen.
Und das mit dem Fenster habe ich wohl leider nicht ganz so ausgedrückt wie es gemeint war. Das Fenster an sich stört kaum, aber wenn ich andere Hobbyprojekte sehe, die ebenfalls mit c++ und directx entstanden sind, erscheint dort kein solches Fenster. Also nicht wirklich störend, aber wenn es einfache Wege gibt, das zu umgehen, warum nicht? Wink
Gleiches gilt für die Lizenzbedingungen. Ich habe nicht vor irgendwie an dem compiler rumzuwerkeln nur um sie illegal auszublenden. Das war dann auch schon fast alles Very Happy

Bleibt allerdings das Problem mit der Auflösung. Hier der Code, falls er irgendwie behilflich ist.

main.cpp
Code:

#include <stdlib.h>
#include "CDirect3D.h"

HWND CreateMainWindow(HINSTANCE hInstance);

LRESULT CALLBACK MessageHandler(HWND hWnd,
                        UINT msg,
                        WPARAM wParam,
                        LPARAM lParam);

HWND hWnd=0;

CDirect3D Direct3D;


int WINAPI WinMain(HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPSTR lpCmdLine,
               int nCmdShow)
{
   hWnd = CreateMainWindow(hInstance);
      
   if(0 == hWnd)
   {
      MessageBox(hWnd,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
      return -1;
   }

   if(!Direct3D.Init(hWnd,FALSE))
   {
      return -1;
   }

   srand(timeGetTime());
   
   Direct3D.SetClearColor(BGCOLOR);
   
   MSG msg={0};
      
   while(msg.message!=WM_QUIT)
   {
      if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
      else
      {
      Direct3D.BeginScene();
      Direct3D.DrawSprite();
      Direct3D.EndScene();
      }
   }

   return 0;
}

HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass = {
      sizeof(WNDCLASSEX),
      CS_DBLCLKS | CS_OWNDC |
      CS_HREDRAW | CS_VREDRAW,
      MessageHandler,
      0,
      0,
      hInstance,
      LoadIcon(NULL, IDI_WINLOGO),
      LoadCursor(NULL, IDC_ARROW),
      (HBRUSH)GetStockObject(WHITE_BRUSH),
      NULL,
      "WindowClass",
      LoadIcon(NULL, IDI_WINLOGO)
   };

   RegisterClassEx(&wndClass);

   return CreateWindowEx(
      NULL,
      "WindowClass",
      "starfield1",
      WS_OVERLAPPEDWINDOW |
      WS_VISIBLE,
      0,0,
      SCR_WIDTH, SCR_HEIGHT,
      NULL,
      NULL,
      hInstance,
      NULL);
}

LRESULT CALLBACK MessageHandler(HWND hWnd,
                        UINT msg,
                        WPARAM wParam,
                        LPARAM lParam)
{
   
   //D3DCOLOR ClearColor = D3DCOLOR_XRGB(0,0,0xFF);
   
   switch(msg)
   {
      case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
         break;
      case WM_KEYDOWN:
            switch(wParam)
            {
               case VK_ESCAPE:
                     DestroyWindow(hWnd);
                  break;
            }
         break;
   }
   
   return DefWindowProc(hWnd,msg,wParam,lParam);
}


CDirect3D.cpp
Code:
#include "CDirect3D.h"
#include <dxerr9.h>

CDirect3D::CDirect3D()
{
   m_lpD3D        = 0;
   m_lpD3DDevice  = 0;
   m_lpD3DFont    = 0;
   m_lpBackBuffer = 0;

   LPD3DXSPRITE       m_lpSprite        = 0;
   LPDIRECT3DTEXTURE9 m_lpSpriteTexture = 0;
}

CDirect3D::~CDirect3D()
{
   CleanUp();
}

BOOL CDirect3D::Init(HWND hWnd,BOOL bWindowed)
{
   m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

   if(NULL==m_lpD3D)
   {
      return FALSE;
   }

   D3DPRESENT_PARAMETERS PParams;
   ZeroMemory(&PParams,sizeof(PParams));

   PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
   PParams.hDeviceWindow    = hWnd;
   PParams.Windowed         = bWindowed;

   PParams.BackBufferWidth  = SCR_WIDTH;
   PParams.BackBufferHeight = SCR_HEIGHT;
   PParams.BackBufferFormat = D3DFMT_A8R8G8B8;

   PParams.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

   HRESULT hr;
   
   if(FAILED(hr = m_lpD3D->CreateDevice(
      D3DADAPTER_DEFAULT,
      D3DDEVTYPE_HAL,
      hWnd,
      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
      &PParams,
      &m_lpD3DDevice)))
   {
      const char* Err = DXGetErrorDescription9(hr);

      DXTRACE_MSG(Err);

      return FALSE;
   }
   
   CreateFont();

   m_lpD3DDevice->GetBackBuffer(0,0,
                         D3DBACKBUFFER_TYPE_MONO,
                         &m_lpBackBuffer);

   return TRUE;
}

LPDIRECT3DSURFACE9 CDirect3D::GetBackBuffer(void)
{
   return m_lpBackBuffer;
}

void CDirect3D::SetClearColor(D3DCOLOR Color)
{
   m_ClearColor = Color;
}

void CDirect3D::DrawText(LPCSTR Text,
                  int x, int y,
                  D3DCOLOR TextColor)
{
   RECT r = {x,y,0,0};

   m_lpD3DFont->DrawText(Text,
                   -1,
                   &r,
                   DT_CALCRECT,
                   TextColor);

   m_lpD3DFont->DrawText(Text,
                   -1,
                   &r,
                   DT_CENTER,
                   TextColor);
}

void CDirect3D::BeginScene(void)
{
   m_lpD3DDevice->Clear(0,0,
                   D3DCLEAR_TARGET,
                   m_ClearColor,
                   0,0);

   m_lpD3DDevice->BeginScene();
}

void CDirect3D::EndScene(void)
{
   m_lpD3DDevice->EndScene();

   m_lpD3DDevice->Present(0,0,0,0);
}

void CDirect3D::CreateFont(void)
{
   LOGFONT LogFont = {0};

   strcpy(LogFont.lfFaceName,"Arial");

   D3DXCreateFontIndirect(m_lpD3DDevice,
                     &LogFont,
                     &m_lpD3DFont);
}

void CDirect3D::CleanUp(void)
{
   if(NULL != m_lpD3DFont)
   {
      m_lpD3DFont->Release();
      m_lpD3DFont = NULL;
   }

   if(NULL != m_lpBackBuffer)
   {
      m_lpBackBuffer -> Release();
      m_lpBackBuffer = NULL;
   }
   
   if(NULL != m_lpD3DDevice)
   {
      m_lpD3DDevice->Release();
      m_lpD3DDevice = NULL;
   }

   if(NULL != m_lpD3D)
   {
      m_lpD3D -> Release();
      m_lpD3D = NULL;
   }
}

void CDirect3D::DrawSprite()
{
   D3DXCreateTextureFromFile(m_lpD3DDevice,
                       FILE_NAME,
                       &m_lpSpriteTexture);
   D3DXCreateSprite(m_lpD3DDevice,&m_lpSprite);
                    
   D3DXVECTOR2 vScaling(1.0f,1.0f);
   D3DXVECTOR2 vRotationCenter(64.0f,64.0f);

   float Rotation = 0.0f;

   D3DXVECTOR2 vPosition(250.0f,250.0f);

   D3DCOLOR ModulateColor = 0xFFFFFFFF;

   m_lpSprite->Draw(m_lpSpriteTexture,
                 NULL,
                 &vScaling,
                 &vRotationCenter,
                 Rotation,
                 &vPosition,
                 ModulateColor);
}


und der header
Code:

#define BGCOLOR D3DCOLOR_XRGB(0,0,0xFF)
#define SCR_WIDTH  320
#define SCR_HEIGHT 200

#define FILE_NAME "gfx//mann.bmp"


wie schon erwähnt ist es wirklich nur der Code der im Buch schon vorgestellt wird. Ich habe lediglich die werte für scr_width und scr_height verändert. Alle üblichen Grafikmodi ab 640:480 funktionieren einwandfrei. Unter diesen Werten sind die ergebnisse in meinen Augen kaum noch nachvollziehbar. Bei 320, 200 hat der blaue Bereich zwar die Breite des Bildschirms, ist allerdings nur etwa halb so hoch, so dass oben und unten davon schwarze Balken sind.
Vielleicht kann jemand etwas mit der Tatsache anfangen, dass der Mauszeiger genau so angezeigt wird wie ich es in diesem Grafikmodus erwartet hätte(grob pixelig), allerdings wirklich nur im blauen Bereich des bildschirms zulässig ist d.h. die schwarzen Balken oben und unten schon als Bildschirmränder interpretiert werden(mauszeiger wechselt in den doppelpfeilmodus zum einstellen einer Fenstergröße).

Kann es daran liegen, dass mein monitor(relativ günstiger tft screen) es nicht ausgeben kann, oder die Grafikkarte die ich benutze(Asus X1600) an irgendwelchen bekannten bugs leidet? Naja hardware wissen ist nicht meine stärke Rolling Eyes

Wenn wirklich niemand weiß woran es liegen könnte werde ich mich damit abfinden müssen, dass Spiel in 640*480 zu entwerfen, das hätte allerdings zur Folge, dass die meisten meiner bereits erstellten Grafiken unbrauchbar werden würden, also wenn auch nur die geringsten ideen da sind, um das Problem zu beheben, bitte posten oder mir persönlich bescheid geben.

nochmals ein danke für die hilfreiche antwort an manu und auch an alle anderen die mir hier noch weiterhelfen könnten

EDIT: Als ich angefangen habe zu schreiben, gab es erst eine antwort, weswegen ich etwas mit den namen durcheinandern gekommen bin. Also danke an manu und natürlich johnklein
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 17:53    Titel: Antworten mit Zitat

Ich hab mir jetzt den Code nicht angeguckt, würde aber spontan auf deinen Bildschirm tippen. Manche Flachbildschirme kriegen ernsthafte Probleme bei solch einer niedrigen Auflösung.

Woanders funktioniert es wahrscheinlich.

edit: Zum Thema Grafiken. Für die 640*480 musst du deine vorgefertigten Grafiken doch einfach nur per Nearest-Neighbour-Filter in Höhe und Breite verdoppeln. (sprich: aus einem blauen Pixel werden 4 blaue Pixel)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


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

BeitragVerfasst am: 22.08.2006, 19:29    Titel: Antworten mit Zitat

Wegen dem Vollbildfenster:
Wenn ein WindowsStyle gesetzt ist, dass eine Titelbar anzeigt, werden von Ihr auch die Systemmessages verarbeitet, wenn man in diesem Bereich mit der Maus klickt - auch wenn der Bereich durch diverse Zeichenoperationen übermalt wurde. Lösung: Einen FensterStyle ohne Titelleiste, Systemmenu, Minimize/MaximizeButton und ohne Schliessknopf benutzen.
Konkret:
CPP:
WNDCLASSEX wndClass = {
  sizeof(WNDCLASSEX),
  0, //Einfach ohne jeden Stil - Ohne Rahmen, Titel usw...
  [...]

Gegen das Anzeigen des Fensters, bevor DirectX initialisiert ist, hilft es ganz einfach, den FensterStyle WS_VISIBLE wegzulassen und auf ein ShowWindow() oder UpdateWindow() zu verzichten. Wenn DirectX das Device anlegt, wird das Fenster gleich mit der Umschaltung der Auflösung erstellt (angezeigt) - was aber nicht mehr explizit sichtbar ist.

HTH AFE-GmdG
_________________
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
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 22.08.2006, 19:33    Titel: Antworten mit Zitat

KI hat Folgendes geschrieben:

edit: Zum Thema Grafiken. Für die 640*480 musst du deine vorgefertigten Grafiken doch einfach nur per Nearest-Neighbour-Filter in Höhe und Breite verdoppeln. (sprich: aus einem blauen Pixel werden 4 blaue Pixel)

Genau, mach einfahc all deien grafiken genau weiter so, es sollte reltiv leicht lösbar sein, die genauso Pixelig wie bie 320x240 anzuzeigen. Und da 640x480 zufällig genau doppelt so groß (oder viermal so groß, ganz wie man möchte *g*) ist, sollte es keine Probleme geben.
Wegen dem TFT: Am besten die nicht funktionierende exe an jemandne schicken, der keinen hat, dann weißte obs am bidlschirm oder am Programm liegt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hans85
Mini JLI'ler



Anmeldedatum: 30.07.2006
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 17:14    Titel: Antworten mit Zitat

Idea es lag tatsächlich am monitor. Zumindest hatte das Programm mit einem anderen keine Probleme die Auflösung anzuzeigen. Nach einigen Minuten habe ich letztendlich auch herausgefunden, wie man die Auflösung einer Bilddatei in psp im nachhinein, wie hier beschrieben, ändern kann. Also kann es jetzt auch endlich weitergehen/losgehen mit der Umsetzung meines, meiner meinung nach, sehr vielversprechenden Spielprinzips(wenn ihr wollt könnt ihr euch in einigen Wochen/Monaten selbst eine Meinung bilden Very Happy ). Wirklich recht herzlichen Dank bis hierhin, hoffe das ich auch weiterhin mit eurer Hilfe rechnen kann, auch wenn ich definitiv versuchen werde die noch anstehenden Probleme bestmöglich mit google, suchfunktion und DirectX-Dokumentation zu lösen Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
unsigned long
Junior JLI'ler



Anmeldedatum: 02.07.2006
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 27.08.2006, 23:04    Titel: Antworten mit Zitat

Hans85
Ein Fenster niemals auf 0 testen oder auf INVALID_HANDLE. Benutz besser "IsWindow", da diese Funktion in der internen Handletabelle nachtguckt, ob Dein Fenster existent ist.

Auch solltest Du RegisterClassEx testen, da dies häufig fehlschlägt und Du dann beschädigte Daten weiterbenutzt.

Gib niemals ein -1 in einer main-Funktion wieder!! Windows arbeitet auf DWORD-Ebene und kann mit negativwerten nichts anfangen. Je nachdem was Du da zurück gibst (was eigentlich von wParam kommen sollte) entscheidet Windows welche Fehlerkompensationsmaßnahmen getroffen werden müssen. Du könntest also versehentlich (je nach Kompensationstabelle von Windows) das System dazu zwingen alle Programme abzuschießen, damit das System nicht beschädigt wird. Ein grauenvolles Szenario.

Daher immer den wPram oder 0 zurück geben und niemals eigene Fehlerwerte, wenn Du diese selber nicht definiert hast.

CPP:
#define BGCOLOR D3DCOLOR_XRGB(0,0,0xFF)
#define SCR_WIDTH  320
#define SCR_HEIGHT 200

#define FILE_NAME "gfx//mann.bmp"
Benutz besser const - ist sicherer und anständiger. Die Zeiten von C wo es noch kein const gab sind vorbei.

so long
- unsigned long
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 13:00    Titel: Antworten mit Zitat

Hans85 hat folgendes geschrieben:
Zitat:
Wie schon erwähnt und ihr sicher selber wisst, ist in dem Spiel Asteroids kein Mauszeiger zu sehen. Wenn man allerdings mit der Maus in die linke obere Ecke fährt, wird er an dieser ecke sichtbar. Führt man dann einen Mausklick aus, wechselt alles wieder zu windows und es bleibt einem nur das beenden des asteroid programms mittels Esc.
Ist es möglich den mauszeiger komplett zu deaktivieren, oder gibt es andere methoden, dieses manko zu beheben?


am einfachsten ist es wenn du dem System,das für den störenden Mauszeiger verantwortlich ist, sagst es soll den Mauszeger regelmäßig genau in der Mitte positionieren.

Code:

while(programmLäuft) {
     mach(dies);
     tu(das);
     stürzeAb(false);
     ...
     SetCursorPos(SCREEN_WIDTH  / 2  ,SCREEN_HEIGH / 2);
}


Jetzt solltest du nie wieder in der Lage sein den MausCursor in die "linke obere Ecke" zu fahren.

ps. steht so auch im Buch
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
manu
Super JLI'ler


Alter: 34
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 15:46    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:


am einfachsten ist es wenn du dem System,das für den störenden Mauszeiger verantwortlich ist, sagst es soll den Mauszeger regelmäßig genau in der Mitte positionieren.

Code:

while(programmLäuft) {
     mach(dies);
     tu(das);
     stürzeAb(false);
     ...
     SetCursorPos(SCREEN_WIDTH  / 2  ,SCREEN_HEIGH / 2);
}


Jetzt solltest du nie wieder in der Lage sein den MausCursor in die "linke obere Ecke" zu fahren.

ps. steht so auch im Buch


Und wärend man spielt, wechselt aufeinmal der Cursor die Position und ist wieder in der Mitte. Stell ich mir ziemlich grausam vor, so sollte man das Problem auf keinen Fall lösen! Es gibtja nicht nur Spiele/Programme, bei denen man den Cursor immer in der Mitte hat..

einfach ein Popupwindow nehmen da kann das garnicht erst passieren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

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

manu hat Folgendes geschrieben:
Zitat:
Und wärend man spielt, wechselt aufeinmal der Cursor die Position und ist wieder in der Mitte. Stell ich mir ziemlich grausam vor, so sollte man das Problem auf keinen Fall lösen! Es gibtja nicht nur Spiele/Programme, bei denen man den Cursor immer in der Mitte hat..


Sorry, ich ging davon aus, dass das Beispiel mit DirectInput läuft.
Dann macht dies nichts aus, da man dann einen seperaten "Cursor" benutzt. So mach ich es zumindest.
Sorry.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
manu
Super JLI'ler


Alter: 34
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 19:02    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
manu hat Folgendes geschrieben:
Zitat:
Und wärend man spielt, wechselt aufeinmal der Cursor die Position und ist wieder in der Mitte. Stell ich mir ziemlich grausam vor, so sollte man das Problem auf keinen Fall lösen! Es gibtja nicht nur Spiele/Programme, bei denen man den Cursor immer in der Mitte hat..


Sorry, ich ging davon aus, dass das Beispiel mit DirectInput läuft.
Dann macht dies nichts aus, da man dann einen seperaten "Cursor" benutzt. So mach ich es zumindest.
Sorry.

Joa hast recht. Aber so im allgemeinen, sollte man, so denke ich zumindest, kein Problem einfach nur so umgehen, sondern die Möglichkeit, dass es ensteht leiber gleich ganz entschärfen. Und jenachdem wann und wo man dinput verwendet, könnte dennoch eine kleine chance entstehen, dass es dochmal nicht ganz so passt Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


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

BeitragVerfasst am: 25.10.2006, 08:39    Titel: Antworten mit Zitat

Wenn du wirklich DirectInput nutzt, kannst du die Maus statt in NONEXCLUSIV auch in EXCLUSIV-Modus schalten. Dadurch wird der von Windows verwendete Cursor abgeschaltet und du hast auch nicht mehr das Problem, dass du zufällig auf übermalte Steuerelemente des darunterliegenden Windowsfensters klickst. Im Übrigen sollte man für Vollbildanwendungen diese Steuerelemente eh ausblenden und nicht einfach nur durch Direct3d überpinseln...
Eine nicht vorhandene Titelleiste kann schlecht angeklickt werden...
_________________
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
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
Seite 1 von 1

 
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