|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2008
Messaggi: 242
|
[C++] Varie richieste: Registro,grafica e gamescrolling
Ciao a tutti ^^
Allora, stò creando delle piccole librerie, solo che ho un problema nell'uso del registro, e sia sull'msdn sia in giro su internet non ho trovato un granchè ![]() ![]() ![]() Le altre due cose sono solo curiosità: Mi piacerebbe gestire al pieno, grafica bidimensionale.. Credo che però l'unico modo è gestirla a basso livello. Sono a conoscienza di alcune librerie tipo le famose DirectX e OpenGL, ma che ormai gestiscono il 2D solo via emulazione, oppure le SDL, che però non mi piacciono per niente ![]() Infine l'ultima cosa che purtroppo non ho mai capito... I giochi tipo supermario, quando la telecamera si sposta, si sposta solo il personaggio muovendo la telecamera (E come capperi si fa??? ![]() Scusate per le troppe domande >.< e spero di ricevere risposte chiare ![]()
__________________
Asus P8Z77-V Deluxe su CM Storm Stryker / Intel 3570K @4.2GHZ con Corsair H100 / 2x DDR3-1600 Corsair Vegenance @1600mhz CAS 9-9-9-24 / ATI Radeon 4870 @150mhz in idle, @800mhz ingame / Samsung 840 Basic 120gb + Seagate Barracuda 2TB 7200.14 64MB / Asus VW222S 1680x1050
Asus U36SD-RX002V |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Rispondo all'ultima. Si sposta lo sfondo. Si chiama two (o four) way scrolling. In pratica finchè lo sprite del giocatore si trova tra l'inizio della mappa e il centro dello schermo il movimento è applicato allo sprite.
Quando lo sprite arriva a metà se continua a camminare verso destra anzichè applicare il movimento allo sprite applichi un movimento contrario alla mappa. Cioè l'omino resta fermo e la mappa gli scorre sotto i piedi. E' molto semplice da realizzare perchè in pratica si traduce in un valore "offset" che determina il punto a partire dal quale iniziare a disegnare sullo schermo le immagini che compongono la mappa. Se il giocatore si trova sulla linea (X = metà della larghezza dello schermo) successivi incrementi della sua posizione verso X+ sono tradotti in una diminuzione dell'offset della mappa di valore pari all'incremento. Lo scorrimento verso X positivo termina quando il giocatore si trova in una posizione tale che la sua ordinata più metà della larghezza dello schermo più il modulo dell'offset corrispondono alla larghezza totale della mappa. (credo, l'ho detta un po' di volata ma dovrebbe essere questa). La parte che resta (cioè lo scorrimento verso X negativo e nelle due direzioni sull'asse Y) è la stessa minestra ricucinata.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
per quanto riguarda il registro di sistema, incolla un po' di codice che non ti funziona e vediamo gli errori; se possibile riporta anche il codice numerico degli errori.
se possono esserti utili ti incollo qui un paio di classi che mi sono fatto qualche giorno fa per accedere al registro di sistema, solo che ancora non ho avuto mai occasione di testarle quindi non ho idea se funzionino o meno. file RegKey.h: Codice:
#pragma once class CRegKey; class CRegValue { private: HKEY m_hKey; const tstring m_strName; public: CRegValue(HKEY a_hKey, LPCTSTR pszName); operator DWORD () const; operator tstring () const; DWORD operator = (DWORD dwValue); LPCTSTR operator = (LPCTSTR pszValue); VOID Erase(); }; class CRegKey { private: HKEY m_hKey; inline CRegKey(CRegKey&) {} inline VOID operator = (CRegKey&) {} public: CRegKey(HKEY hkParent, LPCTSTR pszPath); virtual ~CRegKey(); CRegValue operator [] (LPCTSTR pszValueName); const CRegValue operator [] (LPCTSTR pszValueName) const; }; Codice:
#include "stdafx.h" #include "RegKey.h" #include "Error.h" CRegValue::CRegValue(HKEY a_hKey, LPCTSTR pszName) : m_hKey(a_hKey), m_strName(pszName) { } CRegValue::operator DWORD () const { DWORD dwValue; DWORD cbValue = sizeof(DWORD); LONG lResult = ::RegQueryValueEx(m_hKey, m_strName.c_str(), NULL, NULL, (LPBYTE)&dwValue, &cbValue); ::CheckResult(lResult); return dwValue; } CRegValue::operator tstring () const { DWORD cbData = 0; LONG lResult = ::RegQueryValueEx(m_hKey, m_strName.c_str(), NULL, NULL, NULL, &cbData); ::CheckResult(lResult); DWORD cchData = cbData / sizeof(TCHAR); LPTSTR pszData = new TCHAR[cchData + 1]; lResult = ::RegQueryValueEx(m_hKey, m_strName.c_str(), NULL, NULL, (LPBYTE)pszData, &cbData); if (lResult != ERROR_SUCCESS) { delete pszData; ::RaiseError(lResult); } else { pszData[cchData] = 0; tstring strData = pszData; delete pszData; return strData; } } DWORD CRegValue::operator = (DWORD dwValue) { LONG lResult = ::RegSetValueEx(m_hKey, m_strName.c_str(), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); ::CheckResult(lResult); return dwValue; } LPCTSTR CRegValue::operator = (LPCTSTR pszValue) { DWORD cbValue = (::lstrlen(pszValue) + 1) * sizeof(TCHAR); LONG lResult = ::RegSetValueEx(m_hKey, m_strName.c_str(), 0, REG_SZ, (LPBYTE)pszValue, cbValue); ::CheckResult(lResult); return pszValue; } VOID CRegValue::Erase() { LONG lResult = ::RegDeleteValue(m_hKey, m_strName.c_str()); ::CheckResult(lResult); } CRegKey::CRegKey(HKEY hkParent, LPCTSTR pszPath) { LONG lResult = ::RegCreateKeyEx(hkParent, pszPath, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &m_hKey, NULL); ::CheckResult(lResult); } CRegKey::~CRegKey() { LONG lResult = ::RegCloseKey(m_hKey); ::CheckResult(lResult); } CRegValue CRegKey::operator [] (LPCTSTR pszValueName) { return CRegValue(m_hKey, pszValueName); } const CRegValue CRegKey::operator [] (LPCTSTR pszValueName) const { return CRegValue(m_hKey, pszValueName); } Codice:
#pragma once __declspec(noreturn) VOID RaiseError(DWORD dwErrorCode); __declspec(noreturn) VOID RaiseLastError(); __declspec(noreturn) VOID RaiseErrorFromHResult(HRESULT hr); inline VOID CheckResult(DWORD dw) { if (dw != ERROR_SUCCESS) { RaiseError(dw); } } inline VOID CheckHResult(HRESULT hr) { if (FAILED(hr)) { RaiseErrorFromHResult(hr); } } Codice:
#include "stdafx.h" #include "Error.h" VOID RaiseError(DWORD dwErrorCode) { RaiseException(dwErrorCode, EXCEPTION_NONCONTINUABLE, 0, NULL); } VOID RaiseLastError() { RaiseError(GetLastError()); } VOID RaiseErrorFromHResult(HRESULT hr) { RaiseError(HRESULT_CODE(hr)); } Codice:
#pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <unknwn.h> #include <cassert> #include <string> using namespace std; #ifdef UNICODE #define tstring wstring #else #define tstring string #endif Ultima modifica di fero86 : 18-02-2009 alle 11:38. |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Jan 2008
Messaggi: 242
|
Codice:
#include <stdio.h> #include <windows.h> DWORD *RegGet(HKEY hKey,const char *path,const char *name){ HKEY hk; DWORD dwType=REG_DWORD; DWORD dwSize=255; DWORD Return[255]; RegOpenKeyEx(hKey,(char*)path,0,KEY_ALL_ACCESS,&hk); RegQueryValueEx(hk,name, NULL, &dwType,(BYTE*)&Return, &dwSize); return Return; } int main(){ printf("%X",RegGet(HKEY_LOCAL_MACHINE,"SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION","InstallDate")); } ![]() Quote:
![]()
__________________
Asus P8Z77-V Deluxe su CM Storm Stryker / Intel 3570K @4.2GHZ con Corsair H100 / 2x DDR3-1600 Corsair Vegenance @1600mhz CAS 9-9-9-24 / ATI Radeon 4870 @150mhz in idle, @800mhz ingame / Samsung 840 Basic 120gb + Seagate Barracuda 2TB 7200.14 64MB / Asus VW222S 1680x1050
Asus U36SD-RX002V Ultima modifica di xeeynamo : 18-02-2009 alle 14:44. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
xeeynamo, il codice che hai riportato commette atti osceni: i piu evidenti, ma non gli unici, sono il fatto che ritorni l'indirizzo di un buffer locale (che viene deallocato non appena esci dalla funzione), il fatto che non controlli i valori di ritorno ed il fatto che non chiudi gli handles che apri.
poi non capisco perché hai allocato 255 DWORD anziché uno visto che te ne bastava uno solo; ed infine non capisco come mai 255 e non 256 ![]() ti riscrivo il codice con qualche correzione fondamentale, ma non l'ho testato e quindi non so se ci sono altri errori. Codice:
#include <stdio.h> #include <windows.h> #include <tchar.h> DWORD RegGet(HKEY hKey, LPCTSTR path, LPCTSTR name){ HKEY hk; DWORD dwSize=sizeof(DWORD); DWORD Return; RegOpenKeyEx(hKey, path, 0, KEY_ALL_ACCESS, &hk); RegQueryValueEx(hk, name, NULL, NULL, (BYTE*)&Return, &dwSize); RegCloseKey(hk); return Return; } int main(){ printf("%X", RegGet(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION"), _T("InstallDate"))); return 0; } |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Jan 2008
Messaggi: 242
|
Quote:
![]() ![]() Aspetto le altre risposte per le altre domande e poi il topic può essere tranquillamente chiuso ![]()
__________________
Asus P8Z77-V Deluxe su CM Storm Stryker / Intel 3570K @4.2GHZ con Corsair H100 / 2x DDR3-1600 Corsair Vegenance @1600mhz CAS 9-9-9-24 / ATI Radeon 4870 @150mhz in idle, @800mhz ingame / Samsung 840 Basic 120gb + Seagate Barracuda 2TB 7200.14 64MB / Asus VW222S 1680x1050
Asus U36SD-RX002V |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
E' solo quando disegni che tieni conto dello scorrimento. Quando dico "la posizione è aggiornata" intendo "visivamete". Logicamente le coordinate degli sprite si svolgono sull'intero piano di gioco. Vale a dire che se la mia mappa è di 10.000x10.000 pixel i miei sprite possono avere come posizione una qualsiasi coppia di valori x,y compresi tra 0 e 10.000. E' nel ciclo di rendering che si applicano le trasformazioni. La posizione del giocatore su uno schermo da 640x480 con scorrimento (sx, sy) è: x - sx + 320 SE x > 320 y - sy + 240 SE y > 240 Nella parte logica del motore di gioco la posizione degli sprite viene sempre aggiornata e contemporaneamente aggiorno lo scorrimento se se ne verifichino le condizioni.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Per dirla alla Mike Bongiorno:
Ahi, ahi ahi, signor PGI, lei mi è caduto sul.... l'indice ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:42.