importare file jpg

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

importare file jpg

Messaggio da sfigatto »

Quando importo un file jpg in GM viene sempre trasformato in png.

C'è una maniera per avere in GM sprite in jpg? o almeno un modo per rendere le foto/sprite meno pesanti senza cambiarne le dimensioni?

Avatar utente
Xxshark888xX
Membro d'elite
Messaggi: 1497
Iscritto il: 30/05/2012, 19:17
Specialità: Un poco di tutto
Uso: GM:Studio 1.4 Pro
Località: Earth
Contatta:

Re: importare file jpg

Messaggio da Xxshark888xX »

sfigatto ha scritto:Quando importo un file jpg in GM viene sempre trasformato in png.

C'è una maniera per avere in GM sprite in jpg? o almeno un modo per rendere le foto/sprite meno pesanti senza cambiarne le dimensioni?
Forse sparero' una cavolata. :fapensare:

Detto cio', non potresti leggerti manualmente i byte dall'immagine e caricarla in una surface e dopodiche', quando vuoi salvarla, (sempre se ne hai bisogno) salvarla in .jpg.

:cappa:
Contatti
Steam
Facebook

Gif
Spoiler
Immagine
Immagine
Immagine
Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: importare file jpg

Messaggio da Jak »

1) Dubito che l'aumento di peso sia così sostanziale, sopratutto in un'era dove i giochi pesano decine di giga l'uno e senza internet non sopravvivi. La differenza non la sentirà nessuno.
2) A parte gli sfondi tutti gli sprite avranno il canale alpha per la trasparenza, quello non esiste in jpg quindi non potresti comunque usarlo.
3) Jpg fa schifo, l'immagine viene molto più brutta, ad eccezione per i siti web e al massimo fotografie casual è un formato che al giorno d'oggi non dovrebbe essere mai usato, pena la morte.
E poi tutti parlano di 4K e si usa ancora il jpg, tanto vale tornare a 640x480.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Xxshark888xX
Membro d'elite
Messaggi: 1497
Iscritto il: 30/05/2012, 19:17
Specialità: Un poco di tutto
Uso: GM:Studio 1.4 Pro
Località: Earth
Contatta:

Re: importare file jpg

Messaggio da Xxshark888xX »

Jak ha scritto:1) Dubito che l'aumento di peso sia così sostanziale, sopratutto in un'era dove i giochi pesano decine di giga l'uno e senza internet non sopravvivi. La differenza non la sentirà nessuno.
2) A parte gli sfondi tutti gli sprite avranno il canale alpha per la trasparenza, quello non esiste in jpg quindi non potresti comunque usarlo.
3) Jpg fa schifo, l'immagine viene molto più brutta, ad eccezione per i siti web e al massimo fotografie casual è un formato che al giorno d'oggi non dovrebbe essere mai usato, pena la morte.
E poi tutti parlano di 4K e si usa ancora il jpg, tanto vale tornare a 640x480.
:asd:

.jpg (secondo me) "va bene" solamente per le foto, dato che la trasparenza non "esiste" in una foto.
Anche se, giustamente la compressione e' un poco piu' schifosa.
Contatti
Steam
Facebook

Gif
Spoiler
Immagine
Immagine
Immagine
Immagine

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »

.jpg (secondo me) "va bene" solamente per le foto, dato che la trasparenza non "esiste" in una foto.
Anche se, giustamente la compressione e' un poco piu' schifosa.
Infatti sto facendo un piccolo gioco in cui una foto viene scomposta e poi bisogna ricomporla, per questo pensavo che il formato JPG. fosse adatto.

La vera necessità di trasformare le foto da PNG. a JPG. nasce dal fatto che volevo provare a vedere come funzionava su Android.
Essendo il gioco composto da circa 200 foto trasformando le foto in un formato che occupa meno spazio ridurrei di molto lo spazio che il gioco occupa su cellulare.

In alternativa se non si possono trasformare le foto in JPG. dovrei trovare un modo per rendere le foto più leggere , ma senza modificarne le dimensioni di altezza e larghezza.

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: importare file jpg

Messaggio da cp94 »

Oppure ti potresti tenere le foto in formato jpg in una cartella e importarle al momento come sprite tramite sprite_add, in questo modo le immagini rimarranno jpg e gm non le convertirà in png, tranne quella caricata al momento ovviamente.
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »

Oppure ti potresti tenere le foto in formato jpg in una cartella e importarle al momento come sprite tramite sprite_add, in questo modo le immagini rimarranno jpg e gm non le convertirà in png, tranne quella caricata al momento ovviamente.

Difatti ho scoperto la funzione sprite_add e pensavo potesse risolvere i miei problemi, ma mi sono posto un paio di domande.

Per prima cosa ho fatto una semplice prova per vedere se riuscivo ad usarla e non ci riesco.
ho messo in un oggetto senza sprite il seguente codice in create, ma l'oggetto rimane senza sprite.

Codice: Seleziona tutto

spr_player = sprite_add(working_directory+"\Desktop\win.jpg",0,false,false,0,0);  
sprite_index=spr_player 

La seconda cosa che mi chiedevo riguarda la cartella in cui sono le foto in jpg che importerei.
finche è il gioco è nel mio pc, non c'è problema , GameMaker sa dove trovarle, ma se dovessi asportare il progetto su andorid cosa succederebbe?
Forse raccoglie le foto quando compila il progetto?

Avatar utente
Xxshark888xX
Membro d'elite
Messaggi: 1497
Iscritto il: 30/05/2012, 19:17
Specialità: Un poco di tutto
Uso: GM:Studio 1.4 Pro
Località: Earth
Contatta:

Re: importare file jpg

Messaggio da Xxshark888xX »

sfigatto ha scritto:

Codice: Seleziona tutto

spr_player = sprite_add(working_directory+"\Desktop\win.jpg",0,false,false,0,0);  
sprite_index=spr_player 
Non vorrei sbagliare, ma il fatto che non ti carica lo sprite e' perche' working_directory restituisce la directory dentro la cartella %appdata% a causa della sandbox.

Comunque, come ha detto pure Jak, non ha senso voler continuare ad utilizzare jpg, non sono quei 10-20mb a fare la differenza. Ormai esiste il 4G e telefoni con 64GB di memoria interna...
Contatti
Steam
Facebook

Gif
Spoiler
Immagine
Immagine
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: importare file jpg

Messaggio da cp94 »

Se i file stanno nella stessa cartella dell'exe o del gmk, gmz, ecc.. ti basta fare:

Codice: Seleziona tutto

working_directory + "/win.jpg"
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: importare file jpg

Messaggio da Jak »

Working_directory è ora opzionale inoltre molto meglio usare gli included files e lasciare gestire a GM le cagate di file system ed affini. Lavori anche meglio con installer/aggiornamenti/mobile se lasci fare a GM.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »

Ora ho inserito gli sprite come included, ho fatto una prova in un oggetto e tutto funziona.

Codice: Seleziona tutto

spr= sprite_add (working_directory+"\winn.jpg",0,0,0,0,0)
sprite_index = spr

si è però verificato un altro problema, ma non so se faccio bene a scrivere qui o se dovrei scrivere su questo post che avevo aperto tempo fa http://gmitalia.altervista.org/forum/vi ... =5&t=13877 .

Riassumo brevemente il post.

Ho una ds_list in cui sono incamerati gli sprite/foto di cui ho parlato in questo post.
Una volta risolte le foto vengono spostate in una nuova ds_list, ed il tutto viene salvato con dei file ini in maniera che quando si riapre il gioco le foto da risolvere non saranno mai quelle già risolte e se si vuole c'è una opzione per giocare con le foto già risolte.

Prima di cambiare gli sprite con gli included files tutto funzionava perfettamente.
Ora con gli included files quando il gioco parte per la prima volta tutto funziona bene, ma se faccio partire il gioco una seconda, se nella partita precedente c'è stato un trasferimento da una ds_list all'altra, non appare più lo sprite della foto in nessuna delle due liste.


Posto l'intero codice, ma credo che il problema sia solo nella immissione dei dati nella Ds_list in scr_list_immagine

Ho un primo oggetto nella pagina di presentazione del gioco in cui richiamo i file INI, che ovviamente la prima volta che si apre il gioco ancora non esiste:

Codice: Seleziona tutto

if (file_exists("Save.ini"))
{
    ini_open("Save.ini");
    global.immagine = ds_list_create();
    ds_list_read(global.immagine,ini_read_string("save","record",0));
    ini_close();
}


if (file_exists("Save1.ini"))
{
    ini_open("Save1.ini");
    global.risolta = ds_list_create();
    ds_list_read(global.risolta,ini_read_string("save1", "record1",0));
    ini_close();
}

Quando il gioco parte crea le ds_list

Codice: Seleziona tutto


if !file_exists("save.ini") // se non esiste il file ini
               {
                scr_list_immagine(); //crea la ds list 
               }
               
if !file_exists("save1.ini")
               {
                global.risolta= ds_list_create();//crea lista vuota, dove vengono spostate le foto risolte
               }


scr_list_immagine (CON GLI INCLUDED FILES)

Codice: Seleziona tutto


global.immagine= ds_list_create();
ds_list_add(global.immagine,sprite_add (working_directory+"\g1.jpg",0,0,0,0,0));
ds_list_add(global.immagine,sprite_add (working_directory+"\g2.jpg",0,0,0,0,0));
ds_list_add(global.immagine,sprite_add (working_directory+"\g3.jpg",0,0,0,0,0));
ds_list_shuffle(global.immagine);


/////QUI SOTTO HO SCRITTO ANCHE LA VECCHIA DS LIST CHE ORA HO CANCELLATO CHE PRENDEVA DIRETTAMENTE GLI SPRITE E CON CUI TUTTO FUNZIONAVA BENE)

randomize();
global.immagine= ds_list_create();
ds_list_add(global.immagine,im1);
ds_list_add(global.immagine,im2);
ds_list_add(global.immagine,im3);
ds_list_shuffle(global.immagine);


Nell'oggetto in cui le immagini vengono spostate da una lista all'altra

Codice: Seleziona tutto

      trasferimento_sprite= ds_list_find_value(global.immagine,ds_list_size(global.immagine)-1) //prende la foto appena risolta
      alarm[4]=20 //crea la scritta che segnala che hai risolto la foto
     tempo=0 //azzera il countdown del timer
     stoptempo=1//blocca il countdown
    
     
     
  ini_open("save.ini");
  ds_list_delete(global.immagine,ds_list_size(global.immagine)-1);//cancella la foto dalla lista
  ini_write_string("save","record",ds_list_write(global.immagine));
  ini_close();
  

  ini_open("save1.ini");
  ds_list_add(global.risolta,trasferimento_sprite);
  ini_write_string("save1", "record1",ds_list_write(global.risolta));
  ini_close();


Avatar utente
Xxshark888xX
Membro d'elite
Messaggi: 1497
Iscritto il: 30/05/2012, 19:17
Specialità: Un poco di tutto
Uso: GM:Studio 1.4 Pro
Località: Earth
Contatta:

Re: importare file jpg

Messaggio da Xxshark888xX »

Premetto che non ho letto tutto il codice da te postato, ma mi viene da pensare, che, magari il gioco ogni volta che si avvia carica gli sprite e gli aggiunge nella ds_list, quindi, dovresti fare qualche controllo per verificare se il gioco e' gia' stato avviato in precedenza o no.
(Quindi salvare su un file di testo (anche ini) una piccola variabile bool che andra' letta all'avvio per verificare cio')

P.S: Oppure fare un controllo diretto sul file ini, se gia' esiste, vuol dire che il gioco e' gia' stato avviato in precedenza.
Contatti
Steam
Facebook

Gif
Spoiler
Immagine
Immagine
Immagine
Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: importare file jpg

Messaggio da Jak »

Non ho letto attentamente ma direi quanto basta in quanto pignolo su codice "fatto bene".
Salvare una lista che contiene degli sprite index che vengono caricati esternamente è concettualmente sbagliato, gli ID possono cambiare un pò quando vogliono e come vogliono ed è naturale che ad ogni avvio possano avere ID diversi e quindi rompere l'indicizzazione dei file. Salvare questo ID è qualcosa che non dovrebbe MAI essere fatto.
Consiglio piuttosto di usare delle ds_map per mappare un nome del file alla tua logica interna e poi salvare questa map di nomi di file, rende anche più facile cambiare i nomi e gestire diverse versioni del programma senza intaccare i salvataggi.
La soluzione più semplice che mi viene in mente è quella di mappare un filename all'averlo completato o meno quindi un semplice true o false. Se cicli randomicamente le immagini ti basterà ciclare finchè non troverà un'immagine libera o, se proprio non vuoi rischiare il caso limite dove impiegherà svariati minuti a trovare l'immagine giusta, scorrere tutta la map come una lista. Un procedimento per natura molto lento ma che dubito fortemente ti possa dare problemi con una manciata di immagini.
Ovviamente ci sono soluzioni più complesse ed eleganti che fondono liste e maps ma per il tuo caso penso sia un po overkill.
Ricorda, mai salvare un'ID per il quale non hai il minimo controllo.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »


La soluzione più semplice che mi viene in mente è quella di mappare un filename all'averlo completato o meno quindi un semplice true o false. Se cicli randomicamente le immagini ti basterà ciclare finchè non troverà un'immagine libera o, se proprio non vuoi rischiare il caso limite dove impiegherà svariati minuti a trovare l'immagine giusta, scorrere tutta la map come una lista. Un procedimento per natura molto lento ma che dubito fortemente ti possa dare problemi con una manciata di immagini.
Ovviamente ci sono soluzioni più complesse ed eleganti che fondono liste e maps ma per il tuo caso penso sia un po overkill.
Ricorda, mai salvare un'ID per il quale non hai il minimo controllo.
Chiedo scusa, sono giorni che sto cercando di fare come dice Jack, ma ci ho capito poco.
Conoscevo poco le Ds_map ,le ho studiate un pochino e mi sembra che fondamentalmente sono come le Ds_list, quindi pensavo di cavarmela.
Ho la solita lista che ho trasformato in ds_map, i valori sono solo 3, ma in verità sono molti di più circa 100, ne ho messi solo 3 per semplicità.

Codice: Seleziona tutto


global.immagine= ds_map_create();
ds_map_add(global.immagine,0,sprite_add(working_directory+"\winn.jpg",0,0,0,0,0));
ds_map_add(global.immagine,0,sprite_add(working_directory+"\g24.jpg",0,0,0,0,0));
ds_map_add(global.immagine,0,sprite_add(working_directory+"\g8.jpg",0,0,0,0,0));

In buona sostanza, come faccio a rendere ogni riga true o false (se ho capito bene cosa intendeva Jack), e non capisco nemmeno come riesco a creare un ciclo random delle immagini.

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »

Sono ancora drammaticamente bloccato su questo problema, ora sto cercando di risolvendolo andando per gradi.

Cosi inizio dal cercare di realizzare il sistema di scelta random per le ds_map, e come al solito non funziona.

ho creato la solita ds_map :

Codice: Seleziona tutto


global.immagine= ds_map_create();
ds_map_add(global.immagine,0,sprite_add(working_directory+"\winn.jpg",0,0,0,0,0));
ds_map_add(global.immagine,1,sprite_add(working_directory+"\g24.jpg",0,0,0,0,0));
ds_map_add(global.immagine,2,sprite_add(working_directory+"\g8.jpg",0,0,0,0,0));


ho poi inserito questo codice sempre in create per prendere una foto a caso, ma mi prende sempre la stessa foto.

Codice: Seleziona tutto

random_index = random_range(0, ds_map_size(global.immagine)-1);
Poi dovrei fare qualcosa di simile sempre in create:

Codice: Seleziona tutto


random_value_from_ds_map = global.immagine [? random_index];

sprite_index = random_value_from_ds_map

Ma mi da sempre la prima immagine della lista non si crea alcun effetto shuffle


EDIT: mi è stato suggerito di sostituire random_range con irandom_range, e cancellare la variabile random_value_from_ds_map ed ora funziona nel modo corretto

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: importare file jpg

Messaggio da sfigatto »


Salvare una lista che contiene degli sprite index che vengono caricati esternamente è concettualmente sbagliato, gli ID possono cambiare un pò quando vogliono e come vogliono ed è naturale che ad ogni avvio possano avere ID diversi e quindi rompere l'indicizzazione dei file. Salvare questo ID è qualcosa che non dovrebbe MAI essere fatto.
Consiglio piuttosto di usare delle ds_map per mappare un nome del file alla tua logica interna e poi salvare questa map di nomi di file, rende anche più facile cambiare i nomi e gestire diverse versioni del programma senza intaccare i salvataggi.
La soluzione più semplice che mi viene in mente è quella di mappare un filename all'averlo completato o meno quindi un semplice true o false. Se cicli randomicamente le immagini ti basterà ciclare finchè non troverà un'immagine libera o, se proprio non vuoi rischiare il caso limite dove impiegherà svariati minuti a trovare l'immagine giusta, scorrere tutta la map come una lista. Un procedimento per natura molto lento ma che dubito fortemente ti possa dare problemi con una manciata di immagini.
Ovviamente ci sono soluzioni più complesse ed eleganti che fondono liste e maps ma per il tuo caso penso sia un po overkill.
Ricorda, mai salvare un'ID per il quale non hai il minimo controllo.
Scusate se sono ancora qui con questo problema, ma ormai sono sul disperato andante.
Non riesco praticamente a fare nulla di quello suggerito da jack, ho anche provato delle soluzioni alternative, ma non ho risolto nulla.
Credo debba ritornare al piano di Jack, ma non ho idea di come fare.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 131 ospiti