Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-02-2009, 21:50   #1
xeeynamo
Member
 
L'Avatar di xeeynamo
 
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è .. Mi manca il supporto alla lettura delle DWORD nel registro, solo che stranamente non riesco ad ottenere il valore vero della DWORD (Al contrario delle stringhe, che le ottengo con successo). Avrei pure bisogno di una mano su come rinominare o cancellare le varie chiavi, stringhe o dword nel registro (anche se credo di pretendere troppo ). (Se siete interessati nell'usare queste librerie, non esitate a chiedere )
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 ! Magari con una gestione manuale di ogni singolo pixel sulla finestra, gestione di palette, sprites ecc... Ci sono un sacco di giochi vecchi che sfruttano questi sistemi, quindi non dovrebbe essere assai complesso ed elaborioso (o almeno prima di aver creato l'intero engine).
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??? ) oppure è l'intero livello (quindi background,tiles e oggetti) che viene spostato?
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
xeeynamo è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 10:05   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 11:36   #3
fero86
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;
};
file RegKey.cpp:
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);
}
file Error.h:
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);
	}
}
file Error.cpp:
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));
}
file stdafx.h:
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
occhio, sono progettate per lanciare eccezioni SEH in caso di errore; significa che se non catturi le eccezioni mandano in crash il processo (é una caratteristica voluta, mi permette di ottenere un dump comprensivo di codice di errore quando qualcosa non funziona nel mio programma, cosi da poterlo debuggare anche se il malfunzionamento é avvenuto su un'altra macchina).

Ultima modifica di fero86 : 18-02-2009 alle 11:38.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 14:35   #4
xeeynamo
Member
 
L'Avatar di xeeynamo
 
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"));
}
L'output è sempre 22FB00, qualunque valore abbia la DWORD. Scusa per gli errori o per il codice un pò fatto "a casaccio" ma sono un principiante della programmazione, e sò poco sulla gestione delle classi

Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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.
Allora era come immaginavo.. Quindi ad esempio ho un giochetto con risoluzione 640x480 e il pg si trova a coordinate (0,240). Quando lo faccio spostare, lui si muove sino alle coordinate (320,240) e da quel momento in poi, quando lo muovo avanti tutta la mappa si sposta facendo in modo che il pg si trovi sempre al centro.. Lo sfondo e la mappa è facile da spostare ma se ho ad esempio ostacoli mobili? Dovrei gestire sia il suo movimento, sia la sua posizione nella mappa contemporaneamente giusto? Per fare questo ovviamente dovrei andare però a interagire con il thread che gestisce l'ostacolo, ma come ?_?... Oddio la facevo più facile la programmazione di giochi 2D a scrolling XD, significa che dovrò mettermi d'impegno!
__________________
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.
xeeynamo è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 18:41   #5
fero86
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;
}
per il futuro leggi piu attentamente la documentazione in MSDN, ti avrebbe chiarito tutto.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 19:14   #6
xeeynamo
Member
 
L'Avatar di xeeynamo
 
Iscritto dal: Jan 2008
Messaggi: 242
Quote:
Originariamente inviato da fero86 Guarda i messaggi
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;
}
per il futuro leggi piu attentamente la documentazione in MSDN, ti avrebbe chiarito tutto.
Oddio, scandaloso DEVO imparare a programmare!!! Grazie per i consigli e grazie per il codice che risulta funzionare alla perfezione spero proprio di raggiungere livelli alti!
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
xeeynamo è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 21:34   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
ma se ho ad esempio ostacoli mobili? Dovrei gestire sia il suo movimento, sia la sua posizione nella mappa contemporaneamente giusto? Per fare questo ovviamente dovrei andare però a interagire con il thread che gestisce l'ostacolo, ma come ?_?... Oddio la facevo più facile la programmazione di giochi 2D a scrolling XD, significa che dovrò mettermi d'impegno!
Qui viene il bello. Il movimento degli sprite in una mappa a scorrimento è indipendente dallo scorrimento perchè si svolge nello spazio di coordinate della mappa e non dello schermo.

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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 12:35   #8
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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.
9.999
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 12:40   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ach, imperdonabile!
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 14:14   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Ach, imperdonabile!
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Amazon, ecco i super sconti del weekend:...
Scovare un bug di sicurezza sui disposit...
Offerta Amazon su NordVPN: proteggi 10 d...
ECOVACS DEEBOT X8 PRO OMNI in offerta su...
Scope elettriche Tineco in offerta su Am...
Offerta Amazon sui robot EUREKA J15 Ultr...
Chrome disattiverà automaticament...
Tornano tutti e 4 i colori disponibili p...
Super sconto su iPhone 16: Amazon abbass...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v