- //questo è un commento
- //non si usa il ;
- //niente parentesi graffe, ogni riga un'istruzione, si va di indentazione per la lettura decente
- var num variabile_numerica
- var str variabile_stringa
- func str funzione1(num numero1, str stringa1, num numero2=10, <user_type> tipo_definito_utente, num* puntatore1) //le variabili in cui non è indicato hanno di default valore 0
- var num numero3 = 37 //dichiara una variabile dentro la sua area di lavoro(la funzione)
- numero1 = numero2 + 3
- stringa1 -= numero1 //elimina le ultime <numero> lettere della stringa
- numero1 = numero2 *= numero3 //la precedenza in questo caso parte da destra verso sinistra per eseguire l'istruzione, su questa cosa non ne sono sicuro, le strutture temporanee sono un po complicate da gestire e con il rischio di bug. Bisogna pensarci un po su.
- puntatore1 = 30; //il passaggio per indirizzo alle funzioni è molto basilare passare una variabile dove è richiesto un puntatore fa si che viene automaticamente passato come indirizzo. Sistema utile solo a permettere che una funzione modifichi una variabile creata da te.
- var num numero4
- numero4 = puntatore1 //copia il valore della variabile puntata
- var num* puntatore2 //errore! i puntatori possono essere usati dall'utente solo come passaggio tramite argomenti per facilità d'uso e quidni permettere alla funzione la modifica della variabile stessa oltre che all'uso. I puntatori saranno completamente automatici. Durante la conversione in codice c++ si vedrà se gli oggetti usati sono modificati o semplicemente usati per la lettura e di conseguenza lo usa automaticamente come puntatore se la funzione legge i valori e basta(per velocità)
- return stringa1;
- endef
- //endef (end+def) termina una definizione (funzione, classe ecc), end termina un costrutto(if, while ecc)
- //le funzioni possono usare l'overloading
- //semplice definizione di una classe
- type mio_tipo
- res spr miosprite
- func draw()
- draw_sprite(10, 10, miosprite)
- endef
- endef
- num array | 10 | 20 | //crea un'array bidimensionale di 10x20 elementi
- array += | 30 | //ingrandisce l'array di 30 elementi (diventa 30x20)
- array -= | 0 | 5 | //rimpicciolisce l'array di 5 elementi secondo il vettore indicato quidni da 30x20 diventa 30x15
- array | 2 | 8 | = 27 //la cella 2/8 diventa 27
- array | 0$10 | 5$12 | += 6 //con il num$num si indica un gruppo di celle quindi tutto il quadrante 0-10 x 5-12 diventa 6
- array | 5 | 4 | += | 2 | 3 | //aggiunge 2 colonne e 3 righe inserendole al punto indicato quindi tutto cio che è prima di 4-5 resta invariato, ciò che cè dopo si sposta facendo spazio alle nuove celle
- //gli oggetti "pensanti" sono una cosa molto importante secondo me ed infatti è una cosa che usano anche engine professionali come UE3 e cryeingine3
- ovviamente gli oggetti avranno anche loro solo 3 eventi, creazione, step e distruzione. Creazione e distruzione avvengono nell'esatto momento in cui vengono chiamati mentre step viene chiamato ciclicamente
- avevo in mente anche l'evento "definizione" dove devi definire variabili e funzioni dell'oggetto(che poi sarà una classe che usa l'ereditarietà per aggiungerci le cose fondamentali come gli eventi) così da poter usare facilmente la struttura un po alla game maker con l'intellisense. Tutte le variabili definite all'interno degli eventi saranno automaticamente temporanee e varranno solo per quell'evento specifico.
- L'evento step che va eseguito ogni coclo è dipendente dall'ordine di id, ce la caviamo con un semplice richiamo alla funzione step della nostra lista di oggetti.
- il draw non verrà mai chiamato direttamente, lo gestiremo noi per intero per questioni di velocità e semplicità in una maniera molto simile ad ogre, lo stesso vale per il 2d. Nel 2d (che sarà anche overlay) si usa la depth per definire l'ordine di disegno degli sprite ed altri elementi, ovviamente dobbiamo anche mettere la possibilità di usare blend modes e tutto il resto.
- //definizione di uno sprite
- res spr sprite1 = LoadSprite("file") //carica uno sprite e ne restituisce l'indice
- //esempio di definizione di un'oggetto(che poi probabilmente andranno creati via ide)
- ogg mio_oggetto
- definition
- var num mio_numero = 16 //le variabili non inizializzate saranno automaticamente impostate a 0 o "" se stringhe
- res spr mio_sprite //in questo caso lo sprite è NULL cioè nessuno sprite
- var num istanza_sprite = CreateSpriteEntity(mio_sprite) //l'istanza dello sprite che verrà usata per la gestione delle varie impostazioni, verrà usato un sistema creazione/gestione/distruzione come ogre3d anzichè il disegno diretto come game maker, questo anche per tenere una certa coerenza tra 3d e 2d. Il 2d sarà disegnato sempre come overlay rispetto al 3d, 2d e 3d saranno la stessa identica cosa, basta usare/non usare certe funzionalità, non esistequindi nessun passaggio da 2d a 3d e viceversa. Tuttavia questa riga è un'errore poichè si possono impostare solo numeri e stringhe all'inizializzazione.
- var str testo = "ciao"
- var num istanza_testo
- endef
- creation
- mio_numero += 28
- aumenta_mio_numero( 20 )
- mio_sprite = LoadSprite("file") //carica uno sprite in tempo reale
- istanza_sprite = CreateSpriteEntity(mio_sprite) //prima era un'errore nel codice, bisogna usare le funzioni nel create.
- SpriteEntitySetBlendMode(bm_add) //dice che al momento del disegno dello sprite verrà usato un particolare blend mode
- SpriteEntitySetColour(c_red) //dice che al momento del disegno dello sprite verrà usato un particolare colore
- istanza_testo = CreateTextEntity(testo) //l'argomento è un puntatore alla variabile quindi passandogli la variabile testo con questo sistema la si passa automaticamente come puntatore, cambiando la variabile testo cambia il testo disegnato.
- TextEntitySetPosision(istanza_testo, 50,40,-1)
- endef
- step
- mio_numero *= 0.98
- SpriteEntitySetPosition(istanza_sprite, mio_numero, 10, 0) //argomenti: istanza dello sprite; x; y; depth(per l'ordine di disegno degli sprite, testo, oggetti bidimensionali in generale)
- SpriteEntitySetIndex(istanza_sprite, mio_numero * 20) //argomenti: istanza dello sprite; subimage attuale da renderizzare
- endef
- //gli eventi non sono necessari da definire, infatti non definisco l'end in questo caso ma potevo metterlo ad esempio per distruggere l'istanza dello sprite.
- func aumenta_mio_numero(num valore) //nel codice c++ la variabile valore in realtà sarà un puntatore a alla variabile che si passa come argomento alla funzione poichè tanto non la modifica. L'ordine di definizione delle funzioni non conta ma chiaramente è buona norma tenere tutte le funzioni create dall'utente assieme. Ma questi son cazzi dell'utente.
- mio_numero += valore
- endef
- endogg //termina la definizione di un'oggetto