Domanda

Come posso creare uno screensaver in C ++ che sfuma dentro e fuori un'immagine in punti casuali sullo schermo con un ritardo specificato sulla dissolvenza?

Il supporto per Multimonitor sarebbe fantastico.

Se hai un codice funzionante o sai dove posso trovarlo, sarebbe fantastico. Altrimenti indicami la giusta direzione. Sto cercando un metodo che abbia una dissolvenza uniforme e sfarzosa. Lo screensaver è per Windows XP.

Non conosco C ++, ma conosco AS3, Javascript e PHP. Quindi speravo di mettere in relazione alcune di queste conoscenze con il C ++.

Cosa devo usare per compilarlo?

È stato utile?

Soluzione

Prima di tutto se stai iniziando in C ++, non iniziare con un compilatore specifico di Windows come Visual c ++. Prendi un bel IDE multipiattaforma fornito con un compilatore come eclipse o codice :: blocchi . Come ogni progetto, vorrai dividerlo in attività più piccole che puoi completare in più fasi. Sembra che tu abbia un paio di ostacoli.

  1. Mancanza di conoscenza del C ++ (eravamo tutti qui una volta)
  2. Mancanza di conoscenza delle immagini (afflizione molto comune)
  3. Mancanza di esperienza (lavoreremo su questo)

NON permettere agli altri di scoraggiarti. Puoi farlo, e probabilmente più velocemente di quanto pensi possibile. Leggi un libro o due sul C ++, puoi cavartela per un progetto senza sapere molto ma ti sentirai frustrato spesso. Dividiamo il tuo progetto in una serie di piccoli obiettivi. Man mano che completi ogni obiettivo, la tua fiducia nel C ++ aumenterà.

  1. Fusione dell'immagine
  2. Salvaschermo di Windows con supporto multi-monitor
  3. Screen Canvas (directx, opengl, bitmap?)
  4. Timer

Innanzitutto, esaminiamo il problema della fusione delle immagini. Presumo che vorrai "sfumare" l'immagine in questione in qualunque sfondo di Windows tu abbia attivo. Se hai uno sfondo a tinta unita, puoi farlo modificando la trasparenza alfa dell'immagine in questione tra gli aggiornamenti della tela. In sostanza, dovrai calcolare la media dei valori di colore di ciascun pixel nelle due immagini in base al timer di aggiornamento. In termini più diretti per trovare gli elementi pixel rosso, verde e blu per qualsiasi pixel risultante (P3)

N = tick del timer per intervallo (secondi / millisecondi / ecc.)
T = tick che si sono verificati in questo intervallo
P1r = elemento pixel rosso dall'immagine 1
P2r = elemento pixel rosso dall'immagine 2
P3r = elemento pixel rosso risultante per l'immagine miscelata
P1g = elemento pixel verde dall'immagine 1
P2g = elemento pixel verde dall'immagine 2
P3g = elemento pixel verde risultante per l'immagine miscelata
P1b = elemento pixel blu dall'immagine 1
P2b = elemento pixel blu dall'immagine 2
P3b = elemento pixel blu risultante per l'immagine miscelata

P3r = ((T/N * P1r) + ((N-T)/N * P2r))/2
P3g = ((T/N * P1g) + ((N-T)/N * P2g))/2
P3b = ((T/N * P1b) + ((N-T)/N * P2b))/2

Ora diamo un'occhiata al problema dei salvaschermi di Windows e del supporto multi-monitor. Questi sono davvero due problemi separati. Gli screensaver di Windows sono in realtà solo file compilati .exe con una certa funzione di callback. Puoi trovare molti tutorial sull'impostazione delle tue funzioni di salvaschermo in rete. Il supporto multi-monitor sarà in realtà una preoccupazione quando configuri la tua Screen Canvas, di cui parleremo in seguito.

Quando mi riferisco allo Screen Canvas, mi riferisco all'area su cui il tuo programma produrrà dati visivi. Tutte le app o tutorial di rendering delle immagini faranno sostanzialmente riferimento a questo stesso concetto. Se lo trovi particolarmente interessante, considera un corso di laurea o un corso di apprendimento in Computer Vision. Fidati di me, non te ne pentirai. Ad ogni modo, considerando la natura di base della tua app, consiglierei di non usare openGL o DirectX, solo perché ognuno ha il proprio livello di conoscenza specifica dell'app che dovrai acquisire prima che siano utili. D'altra parte, se vuoi delle prelibatezze 3D integrate come il doppio buffering e l'offload di gpu, andrei con openGL (più indipendente dalla piattaforma). Un sacco di divertenti librerie di immagini arrivano anche come elementi.

Per quanto riguarda il supporto multi monitor, questo è un problema difficile ma non complicato. Fondamentalmente hai intenzione di impostare i limiti della tela (confine dello schermo) in modo che corrispondano alla geometria dei tuoi monitor multipli. Non dovrebbe essere un problema con più monitor con la stessa risoluzione, potrebbe diventare complicato con risoluzioni del monitor non corrispondenti (potrebbe avere aree di disegno non visualizzate sullo schermo, ecc. Esistono algoritmi e soluzioni alternative ben noti per questi problemi, ma forse questo è al di fuori dell'ambito di questa domanda.

Infine, per quanto riguarda i timer richiesti, questa dovrebbe essere la parte più semplice. Windows e Linux gestiscono il tempo in modo strano (PERCHÉ MS non implementa STRPTIME), quindi se sei interessato alla portabilità userei una libreria di terze parti. Altrimenti basta usare la funzionalità di base di Windows settimer () e rendere l'immagine renderizzata nella funzione di callback.

Argomento avanzato: Hey, se stai ancora leggendo, ci sono una serie di interessanti miglioramenti algoritmici che puoi apportare a questo programma. Ad esempio, con il timer che si spegne una quantità impostata ogni secondo, è possibile memorizzare nella cache le prime immagini miste e risparmiare un po 'di tempo di elaborazione (i nostri occhi non sono terribilmente bravi a notare la differenza tra i gradienti di colore variabili). Se stai usando openGL, potresti mettere in cache gruppi di immagini miste come elenchi di visualizzazione (devi usare tutta quella memoria della scheda grafica per qualcosa di giusto?). Roba divertente, buona fortuna!

Altri suggerimenti

  

" Non conosco C ++, ma conosco AS3, Javascript e PHP. Quindi speravo di mettere in relazione alcune di queste conoscenze con il C ++. & Quot;

Oh ragazzo, suppongo che rimarrai sorpreso. Per imparare il C ++:

  • Acquista almeno uno o due libri molto validi (vedi qui ). Non comprare libri che non sono molto buoni. Ti insegneranno le abitudini che dovresti disimparare in seguito per fare ulteriori progressi.
  • Aspettatevi di dover scrivere un sacco di codice pratico con molta lettura nel mezzo. Nelle prime settimane, il compilatore sputerà a te legioni di messaggi di errore incomprensibili, il tuo codice continuerà a bloccarsi e i programmatori C ++ esperti che guardano il tuo codice alzeranno le mani con disgusto. Ed è sempre colpa tua.
  • Pianifica molto tempo per imparare. E intendo molto . Non importa quanto tempo dedichi, ci vorranno almeno un paio di mesi prima di passare da "fittizio" a "principiante".
  • Immagina di doverlo martellare per un paio d'anni per diventare un vero professionista, leggendo costantemente libri e articoli, dedicando molto tempo a newsgroup e forum di discussione, imparando dagli altri, sbattendo la testa contro ogni muro che circonda il tuo scrivania.
  • Preparati a imparare qualcosa che non conosci prima almeno una volta alla settimana anche dopo un decennio di programmazione in C ++ per vivere.
  • Solo per un momento, immagina di non esagerare.

Modifica per chiarimenti : ho votato a favore delle risposte sia di Hunter Davis che di Elemental, perché sono molto buone, praticamente al punto, e in generale l'incoraggiamento è sostenuto da me nonostante il mio rant lassù. In realtà, non dubito che molti siano in grado di hackerare qualcosa insieme in C / C ++ quando viene dato un esempio scheletro anche se in realtà non conoscono molto del C ++. Vai avanti e prova, ci sono buone probabilità che ti venga in mente uno screen saver entro un tempo ragionevole. Ma. Essere in grado di " hackerare qualcosa insieme in C / C ++ " è tutt'altro che "appreso C ++". (E intendo molto lontano.)

Il C ++ è un'incredibile bestia complessa, media e testarda. Lo considero anche incredibilmente bello, ma in quanto probabilmente rispecchia la vista da una montagna molto alta: è abbastanza difficile arrivare al punto in cui puoi apprezzare la bellezza.

Il C ++ è un linguaggio complesso e tutto ciò che sbi indica è probabilmente vero (sicuramente dopo 10 anni di programmazione commerciale in C ++ ce ne sono ancora alcuni da imparare) MA penso che se hai fiducia in un'altra lingua dovrebbe bastare solo un paio di giorni a: a) Installa uno dei compilatori menzionati qui (suggerirei VC come introduzione rapida alla programmazione di Windows) b) Trova un codice di esempio di uno screen saver che faccia qualcosa di semplice usando Windows GDI (c'è del codice nella documentazione di MS sui salvaschermi) c) Modifica questo codice per fare ciò che desideri.

In termini di requisiti limitati penso che scoprirai che le librerie GDI ++ di Windows hanno il potere sufficiente per fare le dissolvenze alfa di cui hai bisogno senza problemi.

Guarderei microsoft c ++ express. È gratuito e abbastanza capace. Potrebbe essere necessario hackerarlo o ottenere una versione precedente per produrre eseguibili non gestiti.

Esistono molti tutorial disponibile per il resto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top