Autore Topic: Per favore non mi fermate, solo aiutatemi nella mia autodistruzione [BB2]  (Letto 15257 volte)

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Re:Per favore non mi fermate, solo aiutatemi nella mia autodistruzione [BB2]
« Risposta #45 il: 27 Febbraio 2015, 20:18:41 »
sto lavorando a portare un sorgente dal blitz pc con l'aiuto di qualcuno su EAB, ma ho perso la manina quindi le cose vanno a rilento - la sintassi non-ECMA del blitz non aiuta...
AROS : mica bau bau micio micio =^x^=

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Sai, compare, per ora mi diverto a mandare a massa qualche porta nastrando i cavi e cercando di capire come funzionano le PCB dei pad.. sono all'inizio, non sono un genio e neanche fingo di esserlo.. però mi piace creare qualcosa di mio, soprattutto creare quello che normalmente in commercio non c'è per le mie esigenze (ad esempio il BovinGear).. diciamo che mi sto preparando la roba per continuare a videogiocare anche l'estate ;D
E poi, le bovinate, mi tengono lontano dal cibo.. che con la mia malattia è una cosa fondamentale ;D

sta zitto che cio la sciura in pre-diabete :( ed io con colesterolo alto che ho dovuto tagliare la maggioranza della roba fritta :(
AROS : mica bau bau micio micio =^x^=

Offline Amig4be

  • Human Debugger
  • *****
  • Post: 6000
  • Karma: +45/-27
    • Mostra profilo
    • Commodore Computer Blog
in effetti da quando si è verificato quel problema di salute, l'esplosione creativa è stata senza precedenti... e lo dico io che quando mi coglie il parossismo creativo sono rovinato (tipo che non si dorme e non riesco più a fare altre cose con la necessaria attenzione)

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Dopo diversi smanettamenti e MOLTO aiuto da parte dy Cylon sono riuscito a far sorta funzionare quel clone di tetris; adesso devo lavorare per adattarlo alle mie esigenze.
AROS : mica bau bau micio micio =^x^=

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Cerco di portare una immagine dal thread su EAB: e' ancora ancorato a una risoluzione PC (800x600) e ridisegna tutto ogni volta, ma spero di imparare a fare il double buffering per accelerarlo; il mio (sognato) risultato finale dovrebbe essere in bassa a 32 colori e usare grafica bitmap;

Attualmente la versione corrente di cui non ho screenshots e' meglio: testi nella posizione giusta, next pulito e l'aggiunta del pezzo a T che per un bug non veniva scelto.



« Ultima modifica: 21 Maggio 2015, 23:42:48 da saimon69 »
AROS : mica bau bau micio micio =^x^=

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
@raistlin77

Tu hai niente che mi possa indicare come fare double buffering? Il manuale e' un po' fumoso a riguardo;

Oltre ad avere uno scheletro di platform da usare per cercare di fare test, chiaro :)
AROS : mica bau bau micio micio =^x^=

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Guarda, in realtà è una stupidata, ed è una tecnica che va bene per qualsiasi gioco :)
Ora ti spiego.

Prima di tutto ti crei 2 bitmap identici.

Visto che l'amiga non è molto veloce nel disegnare la grafica, devi ridurre il più possibile le cose da disegnare a schermo ogni 50 secondi.

perciò come prima cosa disegni su tutti e 2 i bitmap quelle parti dello schermo del gioco che di sicuro non cambiano mai, come ad esempiol'area di gioco, la parte col prossimo pezzo, la scritta score etc etc.

Ti ho fatto un mockup con immagini prese da internet :)



una volta che hai i 2 bitmap uguali, mostri l'uno e disegni sull'altro :)

con questo codice :)

 Buffer 0,16384
 Buffer 1,16384
 bm.b=0


---------------- loop ---------------
 DisplayBitMap 0,bm,0,0

 bm=1-bm
 UnBuffer bm
 Use BitMap bm

 Gosub logica_del_gioco
 Gosub disegna_qualcosa
------------- end loop -------------

Allora cosa succede, prima di tutto ti crei 2 buffer (rispettivamente lo zero e l'uno) dove il blitz andrà a salvare la parte del bitmap che andrai a coprire con quello che disegnerai, in modo poi da poter cancellare le modifice e tornare al bitmap originale .

Dopodichè ti crei una variabile bm che indica il bitmap che vuoi mostrare ( da notare che 1-bm oscilla tra 0 e 1 e quindi a turno ti mostra la bitmap 0 o 1)

nel loop:

al momento 0 :
- mostri la bitmap bm ( in questo caso la zero) -----> DisplayBitMap 0,bm,0,0
- cambi la bitmap sulla quale disegni                -----> bm=1-bm (quindi sulla bitmap 1 )
- cancelli tutte le cose disegnate precedentemente nel buffer -------> UnBuffer bm (quindi sul buffer 1 anche se non abbiamo disegnato ancora niente perchè siamo al momento zero)
- usi la nuova bitmap (la 1 per disegnare ) ----->  Use BitMap bm
- vai alla routine di logica e poi a quella di disegno

al momento 1 :
- mostri la bitmap bm ( ora è diventato uno ) -----> DisplayBitMap 0,bm,0,0
- cambi la bitmap sulla quale disegni                -----> bm=1-bm (quindi ora sulla bitmap zero )
- cancelli tutte le cose disegnate precedentemente nel buffer -------> UnBuffer bm (quindi sul buffer 0 )
- usi la nuova bitmap (la zero per disegnare ) ----->  Use BitMap bm
- vai alla routine di logica e poi a quella di disegno

al momento 2 :

- mostri la bitmap bm ( ora la zero ) -----> DisplayBitMap 0,bm,0,0
- cambi la bitmap sulla quale disegni                -----> bm=1-bm (quindi ora sulla bitmap uno  )
- cancelli tutte le cose disegnate precedentemente nel buffer -------> UnBuffer bm (quindi sul buffer 1 perchè poi ci andrai a disegnare e ti serve lo schermo pulito dalle mosse precedenti )
- usi la nuova bitmap (ora la uno per disegnare ) ----->  Use BitMap bm
- vai alla routine di logica e poi a quella di disegno


e così all'infinito

in pratica, mentre mostri una schermata in quella nascosta prima cancelli le modifiche precedenti, poi ridisegni le modifiche attuali.





Edit: nell'immagine naturalmente la parte sinistra è quella che si vede a schermo, mentre la destra è la parte nascosta


spero di essermi spiegato  abbastanza bene ^^', al massimo chiedi :)

Edit 2 : ci saranno poi altri problemi da risolvere + in là, perchè ad esempio i pezzi che cadono sul fondo, non dovresti ridisegnarli sempre, ma solo quelli in movimento :)
ma prima vedi se funziona il doublebuffer ;)
« Ultima modifica: 23 Maggio 2015, 13:20:59 da raistlin77it »

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
E se io disegno sempre su BG0 poi cambio su BG1? funziona?
AROS : mica bau bau micio micio =^x^=

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
eh no :)

devi disegnare prima su una bitmap e poi sull'altra, perchè sennò che double-buffer sarebbe ?

anche perchè se disegni sempre su una bitmap, l'altra sarebbe vuota ;)

l'idea del double-buffering è proprio che mentre mostri una cosa, ne disegni un'altra dall'altra parte, in modo che non vedi il "flickering" del ridisegno, sennò non avrebbe senso :)


Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Non conosco Blitz Basic (stai usando questo, no?), ma se il linguaggio supporta gli array di oggetti potresti fare così:

Codice: [Seleziona]
// Pseudocodice
int current = 0;
const int num_of_buffers = 2;
Buffer bg[num_of_buffers]; // Un array con 2 buffers

draw() {

  while(true) {
    // Disegno roba
    drawCircle(x, y, r, bg[current]);
    drawLine(x1, x2, y1, y2, bg[current]);
    drawSprite(sprite1, x, y, bg[current]);

    // Mostro a schermo
    setScreenBuffer(bg[current]);

    // Ruoto i bg
    current = (current + 1) % num_of_buffers;
  }

}



puoi usare 2 o 3 buffer tipicamente, non conviene andare oltre.

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
per rafforzare l'importanza del double buffering, viene usato tutt'ora , è uno degli "ABC" della programmazione  :)

i vari SDL_Flip o glSwapBuffers sono il pane quotidiano di chi programma qualsiasi cosa coinvolga la grafica.

Fidati, una volta imparato ad usarlo non ne farai più a meno ( che sia blitzbasic, opengl,sdl, freebasic, etceteramila linguaggi che coinvolgono un qualsiasi tipo di disegno grafico che viene aggiornato in tempo reale  ), è proprio la "base" minima per poter lavorare :) (addirittura ora spesso si usano 3 buffer al posto di 2 per dare una sensazione + fluida al gioco/animazione) 

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Ok a proposito di programmazione io sto ragionando ancora a livello Spectrum 48k e BASIC, quando il linguaggio era cosi leeeeento che non conveniva controllare tutti gli elementi sullo schermo ma solo alcuni (magari avrebbe ancora senso facendo uin platform); mi sono immaginato un pseudocodice del genere per come implementare il double buffering in quel tetris:

Codice: [Seleziona]
initialize bitmap 0  and 1

a var that points the bitmap id
id=0
first cycle

write on 0
show 0
id+=1
write on 1
show 1
id = 0
write on 0
etc.

AROS : mica bau bau micio micio =^x^=

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Guarda, per non complicarti la vita ti conviene ridisegnare tutti gli oggetti a ogni frame, così fai un codice molto più piccolo.
Poi quando ci prenderai la mano potrai fare cose più sofisticate, ma se provi adesso a fare queste ottimizzazioni potresti impelagarti in una situazione fastidiosa.

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Ok a proposito di programmazione io sto ragionando ancora a livello Spectrum 48k e BASIC, quando il linguaggio era cosi leeeeento che non conveniva controllare tutti gli elementi sullo schermo ma solo alcuni (magari avrebbe ancora senso facendo uin platform); mi sono immaginato un pseudocodice del genere per come implementare il double buffering in quel tetris:

Codice: [Seleziona]
initialize bitmap 0  and 1

a var that points the bitmap id
id=0
first cycle

write on 0
show 0
id+=1
write on 1
show 1
id = 0
write on 0
etc.

si si l'idea è quella :)

Offline saimon69

  • Guru
  • *****
  • Post: 1833
  • Karma: +23/-3
  • Web Dev e musicista da camera (da letto)
    • Mostra profilo
    • binarydoodles Blog
Guarda, per non complicarti la vita ti conviene ridisegnare tutti gli oggetti a ogni frame, così fai un codice molto più piccolo.
Poi quando ci prenderai la mano potrai fare cose più sofisticate, ma se provi adesso a fare queste ottimizzazioni potresti impelagarti in una situazione fastidiosa.

lo sta gia' facendo ed e' lento come la fame, come visibile qui :(

Ecco che allora mi serve di migliorare il framerate: potrei disegnare in 0 poi swappare con 1
AROS : mica bau bau micio micio =^x^=

Tags: