General

Bienvenue avec le GLBasic, votre langage de programmation.

Avant propos à propos de la traduction française de ce manuel

La traduction est un art difficile. D'autant plus qu'il m'a fallu apprendre le langage GLBasic au fur et à mesure de la traduction. Malgré tous mes efforts il est clair que tout n'est pas parfait. Je vous invite donc lorsque vous avez le moindre doute, un problème de compréhension voire un mauvais fonctionnement par rapport à ce que vous avez lu, à consulter le manuel en Anglais ou en Allemand. Et je réclame par avance votre indulgence.

Je vous souhaite le plus grand plaisir à lire ces lignes et à mettre en pratique ce que vous apprendrez.

Marc Mounès

marcmounes@msn.com

Ici vous apprendrez à convertir vos idées en programmes réels. Un petit mot d'avertissement: GLBasic ne peut faire des merveilles, il a ses forces et ses faiblesses. Un bon programmeur excelle en utilisant les atouts d'une langue et contournant ses faiblesses. Cela dit, il existe de nombreux domaines où le GLBasic excelle -- Les sprites par exemple. Vous trouverez des rotations de sprite, l'alpha blending et de zoom, si cela est difficile dans certaines langues, ils sont simples à mettre en œuvre avec le GLBasic. Pour atteindre une cadence stable, GLBasic peut facilement être ralenti à un certain nombre de images par seconde pour correspondre à n'importe quelle plateforme ciblée.

Chapitre 1 : The Basics.

Un programme est composé de commandes très simples qui individuellement ne font presque rien. La combinaison de ces commandes simples pour leur faire faire quelque chose de complexe est le difficile sujet de la programmation.

Les programmes peuvent uniquement:
-Déclarer variables ( nom de conteneurs pour les données)
-Faire des sauts à d'autres parties du programme
-Manipuler les données contenues dans les variables
Transferer les variables aux fonctions

Un compilateur prend les commandes et les convertit en une langue que l'ordinateur peut comprendre.

1.1 General:

GLBasic est une variante de langage de programmation BASIC. Elle a sa propre syntaxe et si vous ne gardez pas cette syntaxe à 100% , le compilateur GLBasic affichera une erreur vous demandant de corriger votre syntaxe avant qu'il ne compile votre code.

GLBasic termine chaque commande avec un ';' (point-virgule) ou une nouvelle ligne.
Toutes les commandes dans GLBasic doit être écrit en lettres majuscules. L'éditeur va automatiquement convertir les commandes GLBasic que vous tapez avec des majuscules. S' il ne parvient pas à convertir une commande, vérifiez que vous l'avez correctement orthographiée.

Tout ce qui sera écrit sur une ligne après «/ /» , ou à la droite de la commande "REM" sera considéré comme un commentaire dans le code. Les commentaires seront ignorés lorsque le compilateur convertit votre code en programme. Ceci est pratique pour ajouter des notes au sein de votre source.

GLBasic utilise le double tampon pour les graphiques à afficher. Si vous faites quelque chose dans de code GLBasic vous ne verrez rien avant que votre programme appelle la commande 'SHOWSCREEN '. 'SHOWSCREEN' prend en contre le tampon courant, le rend visible, puis crée une mémoire tampon arrière neuve avec une image prédéfinie ou une image noire.
Si vous ne voyez pas de résultat à partir de votre programme, le premier chose à vérifier est de savoir si vous n'avez pas oublié d'ajouter la commande 'SHOWSCREEN' .
Pensez à un double tampon comme deux feuilles de papier, une au-dessus que l'on voit et l'autre dessous sur l'aquelle on imprime la prochaine image. Une fois que vous aurez fini de dessiner, interchanger les feuilles et le processus efface à nouveau la feuille du fond. Cela permet de masquer les effets de déchirement d'affichage et élimine les scintillements de l'écran.

1.2 Notre premier programme :

Lancez l'éditeur et sélectionnez "Créer un nouveau projet" dans l'Assistant. donnez le nom "Bonjour Monde " dans la boite projet, appuyez programme OK et tapez le texte suivant dans la fenêtre de l'éditeur.

//////////////
// HELLO WORLD
//////////////
// My First Program
PRINT "HELLO WORLD!" ,100,100
SHOWSCREEN
MOUSEWAIT
END

Enregistrez votre travail avec un double-click sur l'icone disque ou utiliser l'option du menu "File / Save all". Compiler le programme en utilisant l'icone correcpondant ou dans le menu "Compilateur / Build". Enfin, démarrez le programme soit avec l'icone correspondant ou l'option du menu "Compiler / Exécuter".

Vous devriez voir un écran noir avec "HELLO WORLD!" écrit. le programme se terminera après avoir cliqué sur le bouton de votre souris . Vous avez maintenant fait votre premier pas dans le nouveau monde de la programmation!

Cela reste simple !

Pour commencer avec les «variables» :

Déclaration des variables.
Il y a 3 «types» de variables en GLBasic - Nombres , entiers et les chaînes de caractères . Vous pouvez considérer les variables comme des tiroirs. Sur la façade du tiroir il y a le nom de la variable et dans le tiroir, vous trouverez la valeur de la variable.

Commençons avec des chiffres et voir comment cela fonctionne.

1.3 Variable numérique Types

LET a=5

Nous utilisons la commande «LET» pour indiquer au compilateur que nous aimerions stocker la valeur 5 dans la variable 'a' .
Pour une déclaration de variable type un peu plus vite, la commande 'LET' peuvent être ignorée. La ligne résultante ressemblera celle-ci:

a=5

et

LET a=5
LET a=a+1

ressemblera à ceci:

a=5
a=a+1

Que faisons-nous ici? Tout d'abord nous prenons la variable 'a' et lui affectont ('=') La valeur '5 '. Nous demandons ensuite au compilateur de prendre à nouveau la variable avec le nom et lui assigner ('=') la valeur 'a +1'. Comme 'a' était déjà réglé sur la valeur 5, à ce stade, 'a' sera maintenant donnée à la valeur d'un «+1» - ie. «5 +1», donne «6».

Il existe d'autres opérations pouvant être faites avec les nombres. GLBasic connaît les symboles suivants pour ces calculs:
'+' = Addition, '-' = Soustraction, '*' = Multiplication et '/' = Division.

ATTENTION:

LET a= 3+4*5;

sera traité comme 3 + (4 * 5) = 23. Cela a changé depuis les plus anciennes versions de GLBasic qui n'évaluaient pas de cette façon. GLBasic a désormais la hiérarchie suivante pour l'évaluation des termes:

(entre parenthèses en premier) * / + - ET OU <> =

Il y a quelques fonctions mathématiques spéciales dans GLBasic qui différemment des autres:
'NAS () ',' cos () ',' tan () '
Ces fonctions renvoient une valeur. Ainsi, par exemple, ' a= COS (10) ' , mettra le résultat mathématique de Cosinus 10 dans la variable 'a'.

Un autre exemple d'une fonction numérique est la commande RND () . RND () retourne un nombre aléatoire . Par exemple:

LET a=RND(50) // a= random number from 0 to 50

Lorsque vous créez une variable pour la première fois (par exemple en utilisant les commandes LOCAL / GLOBAL , ou au moment de la première utilisation), vous pouvez ajouter un caractère '%' à son nom afin d'indiquer que cette variable est un nombre entier. (Un nombre entier est un nombre sans partie décimale). L'ajout optionnel '#' définira la variable comme un Nombre à virgule flottante (avec une partie fractionnaire). Les appendices ( '%' ou '#') sont facultatifs pour l'utilisation ultérieure de la variable.

* Note *
GLBasic utilise des nombres à virgule flottante par défaut. Ainsi, si vous souhaitez effectuer seulement des calculs entiers , assurez-vous d'utiliser la fonction INTEGER ().

1.4 Type de variable texte :

Variables String "texte ou chaîne de caractères" sont définies différemment que les variables numériques, en ayant un '$' à la fin de leur nom.

* Note *, Les variable numérique peuvent échanger leurs valeurs avec des variables String et vice-versa, ce processus est connu comme un type " conversion "(ie. la conversion d'une variable d'un type - float, integer, string -- de l'une à autre). Toutes les conversions de type sont gérées automatiquement. Plus d'informations plus tard.

exemple de variable String .

LET a$="HELLO"

Nous savons que les noms des chaînes se terminent par '$', mais comment définissez-vous le texte qui est être stocké dans la variable String ? Pour allouer une chaîne de texte à une variable il faut entourer le texte avec des guillemets (" "). a $ = "BONJOUR" par exemple stocker le texte "BONJOUR" dans la variable 'a $'.

La commande LET vous permet de faire des choses utiles avec des chaînes.

LET a$="My"
LET b$="favourite number:"
LET c= 7
// Now look!!
LET c$=a$ + " " + b$ + " : " + c
PRINT c$,0,20
SHOWSCREEN

Sortie:
favourite number: 7

La commande 'LET ', comme toujours, peut être laissée de côté si vous voulez. Vous pouvez voir sur cet exemple que les chiffres peuvent être convertis en chaînes ('c$=c'), et les chaînes peuvent être réunis ('a$=a$+b$').

Pourquoi est-ce utile? Supposons que dans un programme, vous voulez charger une image à partir d'un fichier d'image "image5.dat". Ce qui suit est un exemple de la façon dont le type de conversion automatique peuvent faciliter la programmation.

LET imagenumber=5 // This happens somewhere in the program...
LET image$="image" + imagenumber + ".dat"

Yes, you could just write "LET image$="image5.dat"" in this basic example, but as you learn GLBasic you will see where this sort of thing can come in really handy.

GLBasic offre quelques fonctions spéciales pour le traitement des Strings.

INPUT name$, x, y

Cette commande provoquera un curseur clignotant à la position de l'écran (x, y) et attend que l'utilisateur entre quelque chose au clavier. Après que l'utilisateur appuie sur la touche Entrée, le nom de la variable '$' contiendra la chaîne de caractères qui vient d'être tapée. Cela fonctionne aussi avec des nombres (ie. nombre entrés, x, y).

dest$=MID$(source$, start, length)

Vous pouvez utiliser cette fonction pour obtenir une partie d'une chaîne. La chaîne 'dest$' contiendra le texte issu de la chaîne '$' à partir du caractère indiqué par 'Start' et d'un nombre de caractères indiquée par la longueur «length». L'emplacement (index) de la première lettre est 0, pas 1.

exemple:

name$="My house is blue"
m$=MID$(name$, 3, 5)
PRINT m$ , 20, 20
SHOWSCREEN

Output:

house

Dire à un joueur de tape leur nom dans une liste des meilleurs scores, mais l'on veut seulement les 7 premières lettres. Pour atteindre cela, vous pouvez découper les noms en copiant seulement les 7 premières lettres de la chaîne d'origine dans une sous-chaîne.

INPUT enter$, 100, 100
name$ = MID$(enter$, 0, 7)
PRINT name$, 100, 100; SHOWSCREEN; MOUSEWAIT

fmt$=FORMAT$(numLetters, numAfterComma, number)

Cette commande permet de convertir les nombres en chaînes plus efficacement. Gardez cela à l'esprit vous pourriez souvent en avoir besoin . Voir la référence pour plus de détails.

1.5 Types de tableaux de données 'data':

Maintenant vous avez un aperçu des variables, mais comment voulez-vous stocker et manipuler des gros blocs de numéros ou de texte? Comment pourriez-vous stocker 1000 noms dans votre programme par exemple? 1000 variables séparées? Vous pourriez faire cela, mais ce n'est pas une solution pratique - pour cela vous devez utiliser quelque chose qui s'appelle un "array" tableau.

Un tableau peut être imaginé comme un damier. Chaque case sur le damier a une valeur. Pour créer un tableau dans GLBasic qui est de 8 champs dans sa X-dimension et 8 champs dans sa Y-dimension, vous devez le définir comme ceci:

DIM checker[8][8]

L'ordinateur va allouer de la mémoire ( 'DIM') pour stocker un tableau 8x8, fixer chaque case à 0 et vous permet de référencer avec le nom de "checker".

Si nous voulons que le terrain en location 3 d'une longuer de 4 ait le n° (ou valeur) 7, on écrira ceci:

LET checker[2][3]=7

Pourquoi "[2] [3]" et pas "[3] [4]"? Le tableau est indexé à partir de 0 au lieu de 1 - ie. les terrains sont numérotés de 0 à 7 et de longueur de 0 à 7 . 0,0 = en haut à gauche du tableau, 7,7 = en bas à droite du tableau - comme les références cartographiques. Ceci est quelque peu déroutant au début, mais vous devrez vous habituer.

Vous pouvez également référencer un domaine de tableau comme une variable:

DIM checker[8][8]
LET checker[2][3]=7
LET x=2
LET y=3
LET a=checker[x][y]
PRINT "Checkerboard[2][3] has the value:", 100, 80
PRINT a, 100, 100

résultat:
Checkerboard[2][3] has the value:
7
* Note *, Les tableaux ne peuvent pas avoir plus de 4 dimensions .

DIM a[1][2][3][4]; // just OK

Les tableaux de données peuvent aussi contenir des chaînes .
exemple:

DIM space$[10][10][10] // A space with x, y and z (10 checkerboards each)
// each 10 fields (0-9)
LET space$[5][7][3]="Green"

DIM name$[5] // 5 strings
LET name$[0]="Peggy"
LET name$[1]="Tim"

DIM cinemavisitor$[30][10]
LET cinemavisitor$[seat][row]=" Tom"

Avec la commande REDIM vous pouvez modifier les dimensions des tableaux existants, en gardant les données qui s'y trouvent. Si vous redimensionnez un tableau plus petit que sa taille d'origine, les données en dehors du nouveau tableau seront perdue.

DIM name$[5] // 5 strings
LET name$[0]="Peggy"
LET name$[4]="Tim"

REDIM name$[2] // 2 Words

La valeur à la position 4 ( "Tim") sera perdue après que la commande REDIM sera exécutée.

Si vous souhaitez copier un tableau:

DIM a[5]
b[] = a[]

Cela crée un nouveau tableau b[5] et copie les données à partir d'un [].

Vous pouvez aussi supprimer des lignes dans un tableau avec la commande 'DIMDEL'. Ceci est très pratique pour la gestion dynamique d'un nombre d'éléments. Voir
La référence pour le plus de détails.

La dernière valeur d'un tableau (je vais utiliser un tableau appelé "a" dans cet exemple) est un a[ LEN(a[])-1 ] ou tout simplement a[-1]. La valeur précédant la dernière valeur est a[-2].

Vous pouvez effacer facilement le contenu d'un tableau avec la commande REDIM arrayname[0].

1.6 sauts :

Problème: Le programme s'exécute une fois, puis se ferme, mais nous voulons qu'il continue à s'executer. Solution: Nous avons mis une commande dans le programme (dans ce cas, à la fin) pour faire un saut en arrière à un point antérieur dans le programme (dans ce cas le départ).
exemple:

// A GOTO sample
beginning:
LET a=RND(600)
LET b=RND(400)
PRINT "Wow",a ,b
SHOWSCREEN
MOUSEWAIT
GOTO beginning

Commen faire? Premièrement, définir une marque de saut avec le nom de «commencement» (indiqué par le signe ":" à la fin du mot). Le programme affiche «Wow» à une position aléatoire sur l'écran et l'affiche à l'écran jusqu'à ce qu'un bouton de la souris soit appuyé. La commande 'GOTO' à la fin, fait le sauter de programme à la ligne intitulée "beginning".
Cet exemple montre ce qu'on appelle une «boucle infinie» - ie. le programme ne s'arrêtera jamais. Pour briser le programme à partir de la boucle appuyer sur "ESC". Gardez cela à l'esprit - Appuyer sur ESC "Ech" fera quitter votre programme quand vous le voudrez.

les Sauts de programme peut aussi être utilisés pour écrire des «blocs» de code appelé sous-routines. Il s'agit d'une excellente façon d'organiser et de débogage pour votre code.
On définie un bloc sous-routine en utilisant le menu «Projet / Nouvelle-sub ', puis utiliser l'Assistant pour créer un bloc de nouveau sous-programme ('sub') dans votre projet. Le commande 'GOSUB' peut être utilisée à tout moment pour appeler votre bloc sous-programme ( 'sub') après quoi le programme principal se poursuivra là où il s'était arrêté.
Un exemple:

// A GOSUB Sample
PRINT "Start",0,0
GOSUB middle
PRINT "End",0 ,30
END

// A SUB Function called 'middle'
SUB middle: // Define the Sub
PRINT "Middle",0,20
RETURN // Jumps back to next command after the GOSUB call
ENDSUB // End Sub Marker

résultat:

Start
Middle
End

Un bon exemple de SUB serait une fonction de chargement de données au début d'un programme.

L'utilisation de code en blocs rend le programme plus facile à déboguer et à partager un code commun avec d'autres programmeurs.

* Note *,Les SUB sont toujours placé à la fin du programme principal. Entre les commandes EndSub et sub aucun code n'est autorisé, seuls les commentaires sont autorisés.
Vous n'êtes pas autorisé à utiliser "goto" , ni autorisé à appeler un GOTO à partir du programme principal pour une marque de saut dans un SUB. Ces règles simples, une fois habituées permettent un style de programmation propre.

1.7 boucle-FOR:

En supposant que vous voulez remplir un tableau avec des '1', comment écrire ce code pour créer un tableau de 10 champs ? En utilisant 10 commandes LET ? Cela pourrait fonctionner, mais ce n'est pas pratique - en particulier si votre tableau contient des centaines ou des milliers de champs.
Nous avons besoin d'un ensemble de commandes pour appeler plusieurs fois une section de code pour définir une valeur de tableau, et pour en même temps incrémenter un compteur (pointant sur la nouvelle localisation du tableau) .
Nous utilisons les commandes 'FOR' et 'NEXT' pour définir la section de code à répéter, et une variable pour stocker le 'compteur de boucle. Voyons un exemple:

FOR x=0 TO 9
   LET array[x]=1
NEXT

Dans cet exemple, le code entre les commandes 'FOR' et 'NEXT' sont exécuté alors que x est incrémenté et prendra la valeur de 0 à 9. Après chaque appel de la Commande 'next', x sera automatiquement incrémenté de 1.

La ligne :

FOR x=0 TO 9

Attribuer une variable appelée x avec la valeur 0. Le code suivant doit être répétée jusqu'à ce que x soit plus grand que 9.

LET array[x]=1

Affectez la valeur 1 à l'array 'array' à la position «x»

NEXT

x est majorée de 1. Le code entre FOR et NEXT est répété.

Maintenant, nous remplir un tableau de 100x100 avec la valeur 1 .

FOR x=0 TO 99
FOR y=0 TO 99
LET array[x][y]=1
NEXT
NEXT

Les boucles peuvent également être exécuter en arrière - par exemple: 'FOR x = 9 TO 0 Step -1 ' ON démarre le compteur à 9 On décrémentation par 1 jusqu'a 0 .
Vous pouvez incrémenter la boucle compteur par des valeurs supérieures à 1 (par exemple FOR x = 0 TO 9 STEP 2 - pour en fait compter par 2) . La commande STEP définie le montant qui sera ajouté ou soustrait au compteur à chaque boucle suivante.

FOR x=24 TO 0 STEP -5
PRINT x, 0, (x*20)
NEXT

Résultat:

24
19
14
9
4

Les commandes

BREAK

et

CONTINUE

vous permettre de quitter ou d'aller directement au début d'une boucle avant d'avoir terminée la boucle actuelle.

1.8 boucle-WHILE:

Une boucle WHILE sera évaluée (et répétée) aussi longtemps que son argument la définissant est Vraie "FALSE". p. ex. Nous voulons obtenir un nombre aléatoire dans la gamme 3 à 10. Pour ce faire nous pouvons choisir un nombre aléatoires de 0 à 10 et continuer le tirage de nombres aléatoires jusqu'a ce que le nombre aléatoire renvoyé soit supérieur à 3.

LET z=0 // z starts < 3, otherwise WHILE loop
// won't ever be evaluated!
WHILE z<3 // As long as z is < 3,
z= RND(10) // z is a random number from 0-10
WEND // Repeat.

Un autre exemple: vous voulez un nombre de 0 à 10, mais pas le 5.

LET z=5 // z=5, otherwise WHILE loop fails
WHILE z=5 // As long as z=5
z=RND(10) // z is a random number from 0-10
WEND // Repeat.

Sinon, les nombres aléatoires de 3 à 10 sont mieux calculés de cette façon:

z=RND(7)+3 // (0 to 7) +3 = (3 to 10)

Refs:

DIMDEL


Editor

Editeur

GLBasic a un véritable environnement de développement intégré (IDE). En Utilisant l' IDE, vous pouvez entrer votre code source, compiler, exécuter et déboguer vos programmes à partir d'un logiciel central. L'IDE va vous avertir sur les erreurs et si besoin est positionner automatiquement le curseur sur la ligne contenant l'erreur .
Lorsque vous codez en GLBasic, tous les commandes connues sont automatiquement converties en majuscules. Si vous tapez une commande qui n'est pas convertie en majuscules par l'IDE, vous devez vérifier sa syntaxe et l'orthographe avec le manuel en ligne.

L'IDE GLBasic :

L'IDE GLBasic peut être divisée en 4 sections principales.

A) / Menus Toolbar
B) La fenêtre Éditeur de texte
C) La fenêtre de message
D) L'utilitaire Fenêtre

(A) Menus/barre d'outils:

Cette section de l'IDE est utilisé pour stocker toutes les commandes nécessaires au GLBasic pour fonctionner. Ces commandes sont organisées en menus .

Les "_" symbole sur un menu indique une lettre que vous pouvez appuyer pour accéder rapidement à la commande. Appuyant sur la touche ALT entraînera le "_" pour afficher les symboles afin que vous puissiez voir sur quelles touches appuyer. Par exemple, Alt + F ouvre le menu Fichier

File:

Project - Ouvrir / Enregistrer un fichier projet (extension de fichier PABG)
File - Ouvrir / Enregistrer un fichier source (extension de fichier GBAS)
Save All- Enregistre le projet et les fichiers de code source.
Examples... - ouvre le dossier des exemples
Quit - quitter le programme

Edit:

Toggle Block Comment - Ajoute ou supprime les / / au début de chaque ligne sélectionnée
Bookmark - Pour une navigation rapide dans un fichier
Breakpoints - Préciser où le débogueur doit s'arrêter en pause

View:

Toolbar - Toggle fenêtre de barre d'outils
Jumpbar - Toggle jump-barre de fenêtre
Status bar - Basculer la barre d'état
Output - Toggle sortie de la fenêtre
Editor outfit - Ici vous pouvez spécifier les couleurs et les polices de l'éditeur

Project

New SUB - Insère un nouveau sous programme
New Function - Insère une nouvelle fonction dans un programme
Options - Options pour ce projet (la résolution, ...)

Dans les options , vous pouvez choisir les paramètres de chaque plateforme . Vous devez appuyer sur le bouton "accepte" pour chaque plate-forme après avoir apporté des modifications.

Multisampling est parfois appelée anticrénelage plein écran.

Compiler:

Build - Crée un exécutable pour Win32
Build-Multiplatform - Crée des exécutables pour d'autres plateformes
Run - Démarrer / déboguer le programme win32
Debug mode - Active ou désactive le mode débogage avant la compilation
Debugger - Un ensemble de fonctions du débogueur

Tools:
Voir la section Outils.

Web:

Internet update - Gardez GLBasic à jour (même avec la version démo!)
Homepage - Ouvrez le site Web www.glbasic.com pour des nouvelles
Forum - Visitez notre forum et obtenir un grand soutien
Showroom - Une place pour les programmes de partage avec les autres

?:

Info... - Numéro de version GLBasic
Help - Ouvre ce manuel
Logile - Voyez ce qui a changé récemment
Register - Entrez votre code de licence ici

barre d'outils

Voici un ensemble des éléments de menu les plus utilisés mis à disposition sous forme d'icônes dans la barre d'outils. Bouger le pointeur de la souris sur un bouton pour obtenir de plus amples renseignements à ce sujet.

Editeur de fenêtre

C'est l'endroit où vous tapez le code source de votre programme.

marquer

Lorsque vous créez une fonction, une Sub ou une marque GOTO, elle apparaît ici. Si vous mettre un "@" au début de cette ligne, il ne s'affiche que si vous activez le ampoule "afficher toutes les options".

fenêtre de sortie

Lorsque vous compilez votre programme, GLBasic met ici quelques informations , toute messages d'erreur ou des mises en garde. S'il vous plaît, les lire attentivement.


Graphics (2D)

General:

Pour créer l'image de l'écran final, qui représente chaques images vues, le GLBasic utilise trois tampons d'image distincts (ou «surfaces»). L'un est utilisé pour afficher l'image finale à l'écran, l'un est utilisé pour attribuer les objets graphiques GLBasic (sprites, Polygones, etc) et la dernière est utilisée pour stocker le 'background' pour votre image finale.

Jetons un coup d'oeil aux:

1. Surface primaire
C'est ce que vous voyez sur l'écran.

2. Tampon arrière 'Back Buffer'
C'est là que toutes les commandes graphiques du GLBasic sont écrite. C'est invisible, tant que cela ne soit transféré à l'écran en apellant la commande SHOWSCREEN. Cette commande prend actuelles de la mémoire tampon d'arrière et la transfère à l'affichage principal (le moniteur).

Pourquoi le GLBasic ne dessine pas directement vers le moniteur (surface primaire) mais plutôt sur une mémoire tampon arrière? Cela permet de masquer les effets de déchirement d'affichage et élimine les scintillements de l'écran.

Rappel: Si vous ne voyez rien ,vous avez peu être oublié la commande SHOWSCREEN.

3. Surface hors-champ
Cet écran peut être consulté avec 3 commandes seulement », LOADBMP ',' BLACKSCREEN 'et' USEASBMP».
LOADBMP charge un fichier. bmp sur la surface hors-champ pour l'utiliser comme arrière-plan .
BLACKSCREEN, crée une image «noire» à la surface hors-champ pour être utilisée comme base pour la mémoire tampon arrière.
USEASBMP, utilise le Tampon arrière courant pour créer un arrière-plan.
Lorsque SHOWSCREEN est appelée, la mémoire tampon d'arrière et primaire de surface sont inversés. Le nouveau tampon arrière inutilisable sera remplacé (nettoyé) avec la surface Offscreen qui est noire quand aucun bitmap est chargé.

GLBasic utilise les faces cachées (le double tampon) pour Affichage graphique. Si vous faites quelque chose dans de code GLBasic vous ne verrez rien avant que votre programme appelle la commande 'SHOWSCREEN ».
Si vous ne voyez aucun résultat à partir de votre programme, la première chose à vérifier est de savoir si vous avez oublié d'ajouter la commande 'SHOWSCREEN'.
Pensez à un double tampon comme deux feuilles de papier, une au-dessus que l'on voit et l'autre dessous sur l'aquelle on imprime la prochaine image. Une fois que vous aurez fini de dessiner, interchanger les feuilles et le processus efface à nouveau la feuille du fond.

Un jeu est principalement structuré comme celle-ci:

// My game
start:
  LOADBMP "Background.bmp"
  // Load further graphics as sprites...
  // load level, setup (lives=3, time=100...)
maingame:
  //Keyboard input
  //Move and draw player
  //Move and draw enemies
  SHOWSCREEN
GOTO maingame

Sprites

Qu'est-ce qu'un sprite? Un sprite est en général un petit objet graphique qui se déplace sur l'écran. A titre d'exemple, dans le jeu Pacman, Pacman et les Ghosts sont des sprites et le labyrinthe est l'arrière-plan.

Ce sont de sprites pacman ...

Si vous avez des connaissances au sujet des ordinateurs et jeux vidéo vous pourriez connaître la vérité - Sur PC les sprites sont irréels. "RealSprites" à l'époque de l'Amiga ou Atari XL, était des petits morceaux séparés de mémoire vidéo ou vous pouviez placer une image et ces images étaient gérées matériellement 'hardware overlayed' sur la mémoire d'affichage sans endommager l'image de fond background. Le PC n'a pas de materiel supportant cette technologie sprites, mais la bonne nouvelle est que le GLBasic peut émuler ce matériel.

Les Sprites ont besoin d'être ce qu'on appelle "cut cookie" - à savoir la région autour de la forme de le sprite doit être transparent. Sans "cut cookie" Sprite, il n'y aurait un rectangle noir uni autour quant il s'affichait.

Comme cela ...

+ [image] =

Comment fonctionne le programme pour savoir quelles parties du sprite doivent être affichés transparente? Il ya plusieurs façons, selon le programme que vous utilisez. GLBasic utilise de la façon suivante: Chaque pixel d'une image chargée pour un sprite qui a la valeur de couleur rouge: 255, Vert: 0 et bleu: 128 (Hex: FF 00 80) (une nuance de rose) est considéré comme transparent.

+ [image] =

Attention:
Tous les fichiers graphiques chargés sont dans le répertoire Windows au format Bitmap 8 ou 24 bits, non compressé. Vous ne pouvez pas charger graphique 16 couleurs. Vous devez les recharger et les enregistrer sous forme images 8-bit ou 24-bit couleurs.
Vous pouvez également utiliser des fichiers PNG. Ils utilisent soit RVB (255,0,128) pour la transparence ou le canal alpha si elle existe.

Votre premier sprite :

////////////////
// SPRITES
////////////////
// load sprite image from file "Bubble.bmp" and assign it to ID 0
LOADSPRITE "Bubble.bmp" ,0
// show sprite image with ID 0 at position x=300, y=150
DRAWSPRITE 0, 300, 150
SHOWSCREEN
END

Comme vous pouvez le voir avec seulement 3 commandes vous avez produit un résultat visible. Bref, facile et simple, toutes les techniques sont cachée à l'utilisateur par le simplicité de GLBasic. Si vous deviez par exemple essayer de le faire en C + + , le code aurait plusieurs pages de long.

La commande LOADSPRITE commande est assez évidente. Elle charge un fichier BMP, qui peut être utilisé comme un sprite et affecte à sa création une ID (dans ce cas 0) . Bien que vous ayez le choix des ID, chaque sprite a besoin d'un numéro d'identification unique. Dans le reste du programme ce sprite sera apellé par son ID ('0 'dans ce cas). Voir aussi: la commande GENSPRITE ().

Jetez un oeil au fichier. BMP. Vous verrez qu'il ya une rose couleur dans l'image. Cette partie de l'image sont les pixels transparents. Pour démontrer cela, nous ferions mieux de charger une image pour le fond par ajoutant ...

LOADBMP "back.bmp";

... au début du programme.

La commande DRAWSPRITE commande a besoin de 3 paramètres. Le premier est l'identifiant du sprite . Paramètres 2 et 3 sont la position du sprite à l'écran (coordonnées X, Y). ALPHAMODE vous permet de spécifier une valeur d'alpha. GLBasic soutient Alpha Blending. Vous n'avez jamais entendu parler de 'Alpha Blending '? Pas de problème ...

Alpha Blending est lorsque 2 images (à savoir l'arrière-plan et le sprite) sont «mélangés» ensemble. GLBasic a deux 'assemblage MODES 'pour le faire.

Additive Alpha Blending:

Une valeur de 0.001 à 1.0 : Le mélange des 2 valeurs de couleur de chaque pixel en ajoutant les valeurs de rouge, vert et bleu (une valeur de plus de 255 (ou FF dans Hexadecimal) est considérée comme 255). Cela paraît compliqué, mais tous les travaux sont effectués par GLBasic . Une valeur de plus de +1 pour l'alpha blending est utilisé pour les effets comme le feu, les explosions et les vitres. Si vous voulez obtenir une image plus brillante, afficher 2 images une sur l'autre et utiliser ce mode 'blending mode'.

Interpolated Alpha Blending:

une valeur de -0.001 to -1.0 : Fond les 2 objets en ajoutant les valeurs et en les divisant par 2. Vous pouvez utiliser cela pour les ombres et d'autres jolis effets.

Une astuce: Créez un jeu avec les différents modes Alpha Blending, essayez certains formes et couleurs différentes , ajouter plusieurs horizons différents. Même noir sur fond blanc peut créer de bel effet avec des sprites colorés et Alpha Blending. Jouez!

Some Special Sprite Commands:

Zoomer un sprite de n'importe quelle taille peut effectué avec :

ZOOMSPRITE id, xstart, ystart, x%, y%

ou :

STRETCHSPRITE id, xstart, ystart, width, height

Un sprite en rotation autour de son centre peut être crée avec le texte suivant:

ROTOSPRITE id, x, y, angle

les valeus 'X' et 'Y' sont les positions de sprite quand il n'est pas en rotation. Ainsi, la code suivant:

ROTOSPRITE 1,50,70, 0

est identique à :

DRAWSPRITE 1,50,70

Les deux combinés :

ROTOZOOMSPRITE id, x, y, angle, size

"size" est la valeur qui spécifie la mise à l'échelle du sprite. '0.5' Est la moitié de la taille. '2.0' Est l'échelle doublée .

Special General Graphic Functions:

GLBasic a une commande pour effacer la mémoire du tampon courant dans un fichier. BMP. Fading est une image bitmap, l'écran noir de fade-out. Il s'agit d'une excellente effet de transition d'écran.

BLENDSCREEN bmpfile$

GLBasic peut jouer des vidéos dans tous formats connus , Il suffit d'installer les codecs vidéo. (AVI, MP2, ...) :

PLAYMOVIE filename$

Vector Graphic Commands:

Vous pouvez dessinez des formes de base comme des lignes et des rectangles plutôt que d'utiliser des sprites. A partir de la version 5.10522 le GLBasic permet de dessiner des rectangles pleins, des lignes et des pixels unique .
Voir la référence de ces commandes :

SETPIXEL - DRAWLINE - DRAWRECT

Refs:

LOADBMP, SETPIXEL, DRAWSPRITE


Input

Entrée

Clavier :

Le GLBasic propose 2 types d'interactions clavier.

Saisie de texte et vérification.

Saisie de texte ...

INPUT name$, x, y;
INPUT number, x, y;

L'input lit une ligne de texte à partir du clavier quant la touche Entrée est appuyée, puis la stocke dans une variable de chaîne ou une variable numérique. Le variables 'x' et 'y' définit la position initiale du curseur de saisie. Le programme va s'arrêter quant la saisie est terminée.

Presser la touche Vérification en cours ...

IF KEY(keycode) = 1; PRINT "KEY PRESSED", 20, 20;

Test de contrôle utilisé pour savoir si une touche appuyée. Vous avez besoin d'interroger la sortie de 'Key(keycode) 'pour savoir si la touche correspondant à "keycode" est enfoncée.

Pour savoir quel keycode correspond à quelle touche, vous pouvez utiliser l'utilitaire "Keycodes" dans le Menu "Tools" de l'IDE GLBasic.

Par exemple ...

IF KEY(57) = 1; PRINT "SPACE BAR KEY PRESSED", 20, 20;

La souris :

MOUSESTATE mx, my, ma, mb;

MOUSESTATE retourne tous les paramètres de la souris en cours.

mx = coordonnée x du curseur de la souris à l'écran
my = coordonnée y du curseur de la souris à l'écran
ma = L'état du bouton A de la souris (0 ou 1)
mb = L'état du bouton B de la souris (0 ou 1)

e.g.

MOUSESTATE mx, my, ma, mb;
if ma = 1; PRINT "Mouse button 1 is down", 20, 20;

v=MOUSEAXIS(MouseFeature)

Cette commande retourne des informations sur une caractéristique spécifique de la souris. Cet l'information est stockée, dans ce cas, dans la variable 'v'.
Pour sélectionner la fonctionnalité MOUSEAXIS qui vous intéresse, passer un paramètre entier à la commande MOUSEAXIS (0 à 5 pour "MouseFeature" dans l'exemple ci-dessus).

Donc, si vous voulez savoir si la molette de la souris se déplaçait vers le haut ou vers le bas je devrez utiliser le commande suivante:

WHILE TRUE
v=MOUSEAXIS(2)
SELECT v
 CASE 0
  PRINT "The mouse wheel is NOT moving", 20, 20
 CASE 1
  PRINT "The mouse wheel is moving UP", 20, 20
 CASE -1
  PRINT "The mouse wheel is moving DOWN", 20, 20
ENDSELECT
WEND

Pour la liste complète des paramètres qu'accepte MOUSEAXIS , voir la référence de la commande.

Joystick:

JOYSTATE jx, jy, buttona, buttonb;

Obtient l'état actuel joystick et écrit son état aux variables. par exemple :

// End with ESC
WHILE TRUE // Endless loop
   JOYSTATE jx, jy, ba, bb
    a$="JX:" + jx + " JY:" + jy + " ButtonA:" + ba + " ButtonB" +jb
    PRINT a$, 10, 100
    SHOWSCREEN
WEND

Refs:

GETFILE, GETJOY...(), INIOPEN, JOYSTATE, KEY(), MOUSEAXIS, MOUSESTATE, OPENFILE()


Sound+Music

Sons

Le chapitre sur la lecture audio est très court . la manipulation des sons est semblables à des sprites, chaque son est associé à une ID .
Il y a 3 principales commandes de lecture audio .

LOADSOUND "Boom.wav", 0, 1

Le dernier paramètre est le paramètre canaux, cela définit combien de canaux seronte ouvert pour ce son (polyphonie).

Soyez conscient que la taille de chaque canaux est égale à la longueur du son.

Le format audio uniquement pris en charge est Wav-PCM.

PLAYSOUND (n, pan, vol)

Joue un son chargé . La commande nécessite 3 arguments.
1st : L'ID du son préchargés
2nd : Le stereo. -1.0 gauche, 0 = centre +1.0 droite.
3rd : The volume. 0.0=arret, 1.0=à fond.

HUSH

Cette commande arrête immédiatement toutes lecture audio .

Music

Vous pouvez lire de la musique dans les formats suivants : mp3, wav, midi.
Pour interagir avec de la musique utiliser les commandes suivantes :

Lecture:

PLAYMUSIC file$

PLAYMUSIC "mytune.mp3", commence la lecture du fichier MP3 "mytune.mp3".

Stop:

STOPMUSIC

Interrompt la lecture de toutes les musiques

Refs:

PLAYMUSIC, PLAYSOUND(), SOUNDPLAYING()


Jeux en ligne

SE référer à NET ... !

Network Games

Cette section a été conçue pour montrer à l'utilisateur comment le GLBasic est facile, amusant et flexible quand il s'agit de programmation réseau.

General

GLBasic a toutes les commandes que vous aurez besoin pour créer un réseau multi-joueurs compatible aux jeux. Un ensemble fonctionnel ,complet et riches de commandes sont disponibles pour votre client ou programmes de serveur. Aussi différents protocoles ont été mis en œuvre permettant une extrême flexibilité quand il s'agit de la planification de votre client ou serveur .

L'exemple suivant est celui d'un client / serveur mais le GLBasic est capable de faire beaucoup plus encore. Un exemple de cette flexibilité, est accéder à un tableau des meilleurs scores sur Internet (voir le source code du jeu Scramble à partir du site Web de GLBasic pour un exemple de cette fonctionnalité).

Initialisation

Pour démarrer une partie en réseau, il ya toujours un hôte et plusieurs clients qui se joignent à l'hôte. pour accueillir une session de jeu, utilisez cette commande:

ok=NETHOSTGAME(prt, sn$, p1$, p2$)

Concidérant que 'prt' soit le type de protocole.
0=TCP/IP (Internet, ou local Network)
1=IPX (Local Network)

sn$ est le nom de la session (e.g. "my_game")

p1$ et p2$ sont des paramètres de connexion . Lors de l'utilisation NETHOSTGAME les deux doivent être vide ("", "").

Lorsque cela réussi , 'ok'=TRUE, autrement, FALSE.

Pour rejoindre une session, utilisez cette commande :

ok=NETJOINGAME(prt, sn$, p1$, p2$)

Les paramètres sont les mêmes que ci-dessus . NETJOINGAME a besoin de connaître l'emplacement de l'hôte . Lors de l'utilisation du TCP/IP p1$ est utilisé pour la addesse IP. Une IP vide cherchera d'une session dans le réseau local qui correspond à ("" or "0.0.0.0"). Toutes les nouvelles adresses IP peuvent être comme :"149.23.242.24" ou du style "www.dream-d-sign.de".

Si elle réussissait , ok=TRUE sinon FALSE.

des joueurs s'il vous plais

Maintenant il est temps de mettre certains joueurs dans le jeu . Chaque joueur dans le jeu en réseau une unique ID. Pour créer un joueur utiliser :

id$=NETCREATEPLAYER$(name$)

Considérant que name$ est un nom ("Max"). id$ va maintenant représenter une ID GLOBAL pour ce joueur . Un joueur peut être retirée de la partie en quittant son programme .

Messages

Un joueur nouvellement crée peut envoyer et recevoir des messages. Les messages envoyés atteigne chaque joueur de la session, mais pas l' expéditeur. Les joueurs ne peuvent recevoir des messages qui leur sont envoyés. Les commandes suivantes sont pour cette Objectif:

msg$=NETGETMSG$(id$)
ok = NETSENDMSG(idfrom$, idto$, msg$)

idfrom $ est l'id du joueur, créé, qui envoie le message.
idto $ est toujours l'ID du joueur qui envois / recois le message.
msg $ est le message envoyé / reçu. il est vide si aucun message n'est en attente pour le joueur.
'ok' = VRAI / FAUX selon que le message peut être envoyé ou non.

pour jouer ?

Utiliser ces fonctions pour déterminer combien de joueurs ont rejoint , quelles sont leurs ID$'s et les noms :

NumPlayers= NETNUMPLAYERS()
playerID$[i]=NETGETPLAYERID$ (i)
playername$[i]=NETPLAYERNAME$(playerID$[i])

Voici un exemple de code court qui montre comme les utiliser :

PRINT "Joined Players:", 100, 50
   NumPlayers=NETNUMPLAYERS()
   FOR i=0 TO NumPlayers-1
     playerID$[i]=NETGETPLAYERID$(i)
      playername$[i]=NETPLAYERNAME$(playerID$[i])
     PRINT playername$[i] + " (ID:" + playerID$[i]+") " + i, 100, i*20+100
   NEXT

exemple

// Multiplayer Login - Demo 'game'
// ------------------------------------
PRINT "Name:", 100, 100
INPUT name$, 100, 120

IF LEN(name$)=0 THEN END

//             TCP/IP, SessionName,  IP:Local PC, Not needed
 IF NETJOINGAME(0,   "SimpleDemo", "",          "")
  HOSTING=FALSE
  PRINT "Joined a game", 100, 100
  SHOWSCREEN
  ELSE
  PRINT "Cannot join - try hosting", 100, 100
  SHOWSCREEN
  IF NETHOSTGAME(0, "SimpleDemo", "", "")
   HOSTING=TRUE
  ELSE
   PRINT "Cannot Host a new game", 50, 100
   SHOWSCREEN
   MOUSEWAIT
   END
  ENDIF
 ENDIF

// Now setup stuff / Jetzt alles vorbereiten
DIM px[4]
DIM py[4]
DIM playerID$[4]
DIM playername$[4]

ply_id$=""
PlayerID=0

 ply_id$=NETCREATEPLAYER$(name$)

  // HOSTING A GAME                     / SPIEL HOSTEN
  // Wait and allow players to join     / Warten auf Spieler, die joinen
  // You can start the game             / Du kannst das Spiel starten
 IF HOSTING
  maxplayer=0
  playername$[0]=name$
  playerID$[0]=ply_id$
  WHILE TRUE
   msg$=NETGETMSG$(ply_id$)
   job$=MID$(msg$, 0, 5)
   data$=MID$(msg$, 5, 1024)
   SELECT job$
   // MAY_I54123 -> "Player#54123: MAY I JOIN??" -> NOWAY54123 or UARE#254123 (You are n#2, Player54123)
   // MAY_I54123 -> "Spieler#54123: Darf ich joinen??" -> NOWAY54123 oder UARE#254123 (Du bist #2, Spieler54123)
   CASE "MAY_I"
    FOR i=1 TO maxplayer
     IF playerID$[i]=data$ THEN GOTO play
    NEXT
    IF maxplayer<3
     maxplayer=maxplayer+1
     NETSENDMSG (ply_id$, "UARE#"+maxplayer+data$)
     playerID$[maxplayer]=data$
     playername$[maxplayer]=NETPLAYERNAME$ (data$)
    ELSE
     NETSENDMSG(ply_id$, "NOWAY"+data$)
    ENDIF
   ENDSELECT

  skip:
   // Show what players have already joined and start the game
   // Anzeige der ge-jointen Spieler
   PRINT "Joined Players:", 100, 50
   FOR i=0 TO maxplayer
    PRINT playername$[i] + " (ID:" + playerID$[i]+") " + i, 100, i*20+100
   NEXT
   SHOWSCREEN

   IF KEY(57)
    NETSENDMSG (ply_id$, "START"+maxplayer)
    GOTO play
   ENDIF
  WEND

  // JOIN A GAME                               / JOIN einem Spiel
 // First make yourself known to the session. / Erstmal der Session vorstellen.
 // If a new game starts, you can play.       / Wenn ein neues Spiel beginnt, kannst Du spielen.
 ELSE
  NETSENDMSG(ply_id$, "MAY_I"+ply_id$)
  WHILE TRUE
   msg$= NETGETMSG$(ply_id$)
   job$=MID$(msg$, 0, 5)
   data$=MID$(msg$, 5, 1024)

   SELECT job$
   CASE "NOWAY"
    PRINT "Too many players online", 100, 100
    SHOWSCREEN; MOUSEWAIT
    END
   CASE "UARE#"
    a$=MID$(data$, 1, 1024)
    b$=MID$(data$, 0, 1)
    IF a$=ply_id$ ar THEN PlayerID=b$
   CASE "START"
    maxplayer=data$
    IF PlayerID>0 THEN GOTO play// 0 is the host, and here I'm joining -> >=1
   ENDSELECT

   SELECT PlayerID
   CASE 0
    PRINT "Connecting" ,100, 100
   CASE 1 TO 3
    PRINT "I joined. My Player Number:" +PlayerID, 100, 100
   ENDSELECT

   SHOWSCREEN
  WEND
 ENDIF

// ------------------------------------------------- //
// Start a game session
// ------------------------------------------------- //
play:

 WHILE TRUE
  // Own Movement / Bei Bewegung
  IF KEY(200)
   msg$=PlayerID+"UP"
   py[PlayerID]=py[PlayerID]-1 // The message is not send to myself
                               // Die Nachricht wird nicht an mich selbst geschickt
  ENDIF
  IF KEY(208)
   msg$=PlayerID+"DN"
   py[PlayerID]=py[PlayerID]+1
  ENDIF
  NETSENDMSG(ply_id$, msg$)

  // Now move all players until no message available anymore
  // Jetzt alle Spieler bewegen, bis keiner mehr was sagt
  msg$=""
  WHILE TRUE
   msg$=NETGETMSG$(ply_id$)
   IF msg$="" THEN GOTO shortcut

   PRINT msg$, 100, 120
   data$=MID$(msg$, 1, 2)
   a$=MID$(msg$, 0, 1)
   a=a$
   SELECT data$
   CASE "UP"
    py[a]=py[a]-1
   CASE "DN"
    py[a]=py[a]+1
   ENDSELECT
  WEND

shortcut:

  // Now show the current state
  // Aktuelle Lage anzeigen
  FOR i=0 TO maxplayer
   PRINT i, i*120, py[i]
  NEXT
 PRINT j,100,100; j=j+1
  SHOWSCREEN
 WEND
// END OF DEMO / ENDE DES DEMO

Refs:

NET..., SOCK_...


Graphics (3D)

General

Les Graphics 3D sont une question complexe . En GLBasic nous avons essayé de faire des commandes simples et faciles à utiliser comme les commandes 2D .

On doit avant tous maitriser les graphismes 2D avant de s'aventuer dans un projet 3D .Si vous n'avez jamais réalisé de projet 2D , commencer par cela .

GLBasic utilise ce qu'on appelle le système de la main droite - où Y pointe toujours vers le haut .

Toutes les commandes 3D commencer avec X_ ... afin que vous les retrouviez très facilement dans votre programme et sur cette référence d'aide .

Noter que les commandes de 3D ne sont disponibles que dans la version 3D du GLBasic .

Les textures doivent être de taille 2 ^ n (largeur ou hauteur doivent être 2, 4, 8, 16, 32, 64, 128, 256, 512...) Soyez conscient que certains modèles que vous pourrez obtenir sur internet ne seront pas de taille correspondante . Si tel est le cas avec vos modèles , vous devez alors étirer la texture manuellement pour une taille appropriée - 64, 128, 256, 512 ou 1024 pixels - autrement des erreurs de texture moches se produiront .

Fondamentalement GLBasic 3D fonctionne comme ceci :

Commutation en mode 3D :

X_MAKE3D znear, zfar, field_of_view

znear et zfar définissent le découpage ' clipping ' à une distance par rapport à la caméra. Des valeurs de 1 et 1000 donnent généralement de bons résultats.Plus de distances pourrait cause d'un manque de qualité pour le z-buffer de la scène 3D. L'angle field_of_view vous permet de spécifier le zoom de objectif de la camera.

Camera

X_CAMERA x, y, z, px, py, pz

Règle la position de la camera à x#, y#, z# et la fait pointer vers ce point px#, py#, pz#. L'axe Y positif est toujours vers le haut.

Lumière

X_AMBIENT_LT num, col

Allume une lumière ambiante (une source de lumière qui viens de toutes les directions). 'col' spécifie la couleur de la lumière (voir RVB).
'num' est l'ID , le numéro d'identification de la source lumineuse. Les valeurs de 0-7 sont permis, le matériel ne supporte pas plus de 8 lumières à la fois. S'il ya plus de 9 sources de lumière dans une scène, la carte graphique peut essayer d'utiliser les 8 plus proche des lumières. Dans les applications professionnelles pas plus de 2 lumières sont actives dans une scène au même moment car cela peut entraîner une ralentissement de l'application .

X_SPOT_LT num, col, x, y, z, dirx, diry, dirz, cutoff

Crée un spot à la position x, y, z qui éclaire dans la direction dirx, diry, dirz. cutoff spécifie (largeur du cône ) l' angle de la lumière sur place . La lumière ne sera pas régulière dans votre scène (même si cela semble un peu illogique au début ) . Les objets seront rendus plus claire ou plus foncée , selon les angles de la camera, l'angle d'éclairage et la position de la lumière .

Transformations
Maintenant que les caméras et les lumières sont fixés , nous avons besoin de la chose la plus importante, des objects 3D.

X_MOVEMENT x, y, z
X_SCALING fx, fy, fz
X_ROTATION phi, dx, dy, dz

X_MOVEMENT: Règle la position pour afficher le prochain objet 3D aux coordonnées x#, y#, z#.
Cette commande dois être appelée avant d'appeler X_ROTATION, sinon toutes les rotations précédente seras éliminées..

X_SCALING : Définit l'échelle actuelle pour les objets 3D . Les facteurs d'échelle fx#, fy# et fz# affectera tous les objets dessinés après l'appel de X_SCALING.

X_ROTATION : Fait pivoter l'autre objet 3D autour de l'axe x#, y#, z# par l'angle phi#. Vous pouvez appliquer plusieurs rotations à un objet ..

X_MOVEMENT ou X_SCALING permet de rétablir toutes les rotations précédemment effectuées et doivent donc être appelée avant X_ROTATION.

Objects
Le plus simple pour créer un objet 3D dans GLBasic se fait avec le chargement d'un fichier 3D . Crée tout simplement avec un programme 3D , exporté en formats Quake '.md2' ou 3D Studio '.3ds' , et le convertir dans un format compressé '.ddd' avec l'outil 3DConvert tool. Une fois que vous avez fait cela , vous pouvez le charger comme ceci :

X_LOADOBJ filename$, idnum

Ensuite vous pouvez construire des objets à l'exécution de ces commandes, .

X_OBJSTART idnum
X_OBJADDVERTEX x1, y1, z1, tx1, ty1, col
X_OBJADDVERTEX x2, y2, z2, tx2, ty2, col
X_OBJADDVERTEX x3, y3, z3, tx3, ty3, col
X_ENDOBJ

IDNUM spécifie la référence ID numero de l'objet . Avec ce numéro, vous pouvez le l'utiliser plus tard. Les numéros d'objet existants peuvent être écrasés.

X_OBJADDVERTEX ajoute un sommet à un objet . tx, ty préciser les coordonnées de texture (uv,uy - du rang 0 à 1, 0.5 par exemple, est le centre de la texture ), '0'=en haut à gauche , '1'=en bas à droite . Les 3 premiers vecteurs forment un triangle . Chaque vecteur additionnel forme un triangle avec les 2 vecteurs antérieurements définis en dernier . Si vous ne souhaitez pas utiliser cette méthode de dessin , vous pouvez utiliser le maniere" stylo conception "et redémarrer avec 3 sommets indépendantes pour une nouveau triangle en utilisant la commande .

X_OBJNEWGROUP

Maintenant, le chargement ou objet crée peut être effectué avec :

X_DRAWOBJ idnum, frame

'frame' est un cadre de l'animation défini par l'utilisateur .Les objets n'ont pas d'animation , il faut donc le régler sur '0' (i.e. la première image )

Vous pouvez jouer avec animations :

X_DRAWANIM num, frame, from, upto, interpol, full_anim

'from' et 'upto' définir le début et la fin des cadres de l'animation . 'interpol' spécifie la manière qu'aura l'animation à se dérouler (interpolation à partir de l'étape 0 à 1). 'full_anim' indique , que toutes les images intermédiaires 'from' et 'upto' seront utilisées pour l'animation . Si vous le réglez à FALSE, les images seront directement interpolées . Voir la page de référence pour X_DRAWANIM Pour plus de détails sur le parametre 'interpol'.

Pour assigner une texture à votre objet , vous devez avoir préalablement chargé une texture avec LOADSPRITE ou LOADBUMPTEXTURE et lui assigner cette texture avec la commande X_SETTEXTURE .

X_SETTEXTURE num, num_bump

'Num' représente le numéro ID du Sprite , -1 indique qu'aucune texture ne doit être utilisée .
Le paramètre num_bump# spécifie la map normale qui devra être utilisée pour Dot3 Bump Mapping. La map 'carte' normale peut être créé à l'aide LOADBUMPTEXTURE au lieu de LOADSPRITE. Une valeur de -1 spécifie qu'aucun bump mapping ne doit être effectué.

Finition 3D
Lorsque vous travaillez dans mode 3D vous ne pouvez pas utiliser une commande 2D. Afin de reutiliser les commandes 2D vous aurez à revenir en mode 2D avec X_MAKE2D.

X_MAKE2D

Modes de Rendu spéciaux
Si vous souhaitez utiliser "Cel Shading", "Bump Mapping" ou "Stencil Shadows", voir les fonctions X_SPOT_LT .

Avec X_SPHEREMAPPING vous pouvez programmer des reflets métalliques .

Refs:

X_SPOT_LT


Types

Utilisation des Types

Les types sont une façon d'organiser vos données dans les structures (parfois appelée records).

Utiliser des types peut grandement contribuer à la lisibilité des variables dans vos programmes , Réaliser des problèmes dans votre code plus facile à déboguer . Correctement conçus les types peuvent aussi réduire la longueur de votre code car vous aurez affaire à des blocs de données variables plutôt que des variables individuelles .

Pour définir un type utiliser simplement :

TYPE name_of_type
  // type members
ENDTYPE

Un type est modèle de variable que vous créerez ultérieurement .

Maintenant que vous avez créé un type , Vous pouvez ajouter des membres de ce type . Imaginez un TYPE comme une boîte pour stocker les variables et les membres comme les tiroirs avec les noms . Ces 'drawers' peut être utilisé pour stocker les variables numériques ou alphanumériques. Par défaut, ils auront la valeur 0 pour les champs numériques, et la chaîne vide "" pour les chaînes.

TYPE TBook
   // Count with initial empty value of 0
    PageCount

   // Number with initial preset value
   CoverColor = RGB(128,64,0)

   // String with initial empty value = ""
   Title$

   // String with initial preset value
   Author$ = "John Doe"
ENDTYPE

Vous pouvez également placer des tableaux dans un type . Pensez que ces tableaux ne sont pas initialisés par défaut (DIM name[0]). Vous pouvez cependant définir une taille standard lors de la création d'un type (voir plus loin ) le tableau est déjà dimensionné. Pour ce faire, placez un nombre dans les [] lorsque la définition du tableau.

Bien sûr, vous pouvez utiliser DIM et REDIM sur un tel tableau plus tard .

TYPE TCinema
   // an array, no DIM
   sold_seats[]

   // an array, dimensioned with DIM[32][32]
   free_seats[32][32]
ENDTYPE

Vous pouvez créer un modèle de type global ou local, comme ceci :

GLOBAL Bible AS TBook
LOCAL MobyDick AS TBook

et définir les membres du modèle "Bible" (format LIVRE ) comme ceci :

Bible.PageCount=4500
Bible.Title$ = "The Holy Bible"
Bible.Author$ = "King James"

Vous pouvez définir une fonction en types - elle sera automatiquement transmise par référence . "Par reference" signifie que la modification d'une valeur d'un type à partir de l'intérieur d'une fonction modifie également la valeur dans un appel de la fonction originale . Les tableaux sont également définis par référence.

// <...> TBook definition

LOCAL Bible AS TBook, Another AS TBook
MakeBible(Bible) // This passes the "Bible" TBook to
                 // the MakeBible function where it
                 // gets populated.
Another = Bible  // copy 'Bible' to 'Another'

FUNCTION MakeBible: any AS TBook
   any.PageCount=4500
   any.Title$ = "The Holy Bible"
   any.Author$ = "King James"
ENDFUNCTION

Démarrage du vrai plaisir, vous pouvez imbriquer TYPES:

TYPE TWorker
   Name$
   Annual_Wage
ENDTYPE

TYPE TBook
    PageCount
    CoverColor = RGB(128,64,0)
    Title$
    Author$ = "John Doe"
ENDTYPE

TYPE TLibrary
   Books[] AS TBook
   Employees[12] AS TWorker
ENDTYPE

LOCAL MyLibrary AS TLibrary

MyLibrary.Employees[1].Name$="Fred"

Et vous pouvez utiliser un type comme valeur de retour :

LOCAL Bible AS TBook
Bible = MakeBook("The Holy Bible", 4500)

FUNCTION MakeBook AS TBook: name$, nPages
   LOCAL temp AS TBook
   temp.Title$ = name$
   temp.PageCount = nPages
   RETURN temp
ENDFUNCTION

Si vous n'utilisez pas la déclaration RETURN d'une telle fonction, une nouveau modèle de ce type (ici TBook) sera retournée qui aura des valeurs standard attribuées .

Vous pouvez aussi avoir un tableau type

TYPE TWorker
   Name$
   Annual_Wage
ENDTYPE

GLOBAL Employees[] AS TWorker
DIM Employees[5]

Vous pouvez facilement faire un tableau multi-dimensionnel avec

GLOBAL Employees[] AS TWorker
DIM Employees[5][4]

Si vous avez un tableau en type, vous pouvez supprimer des éléments avec DIMDEL et DELETE ou DIMPUSH pour ajouter de nouveaux éléments à l'arrière du tableau.

Si vous souhaitez parcourir chaque élément d'un tableau TYPE, utilisez la commande FOREACH.

La dernière valeur d'un tableau est soit a[LEN(a[])-1], ou simplement a[-1].

Refs:

DELETE, DIMDEL, DIMPUSH, FOREACH


The First Game

Le premier jeu

A propos du jeu

Le jeu original (I think) faisait partie d'un jeu appelé LOGO par Starbyte sur l' Amiga500. L'objectif est de supprimer tous les points de couleur sur une surface de jeu . Lorsque le joueur clique sur un bloc , le bloc et les quatre blocs entourant le bloc basculent leur état .
Ainsi, en cliquant sur le point central de cette surface de jeu :
###
###
###

ressemblera :
#+#
+++
#+#

Ce jeu est assez facile à programmer et permet de le finir avec vos propres idées . Il est également agréable car on peut avoir des niveaux générés par ordinateur . Nous demanderont à l'ordinateur d'agir de façon aléatoire sur certains points . Il est assez difficile de jouer une fois que l'ordinateur a joué plus de 10 fois ...

Nouveau projet

Après le démarrage GLBasic , Sélectionnez le bouton "new project" et lui donner un nom et un emplacement pour le projet . e.g. "..\GLBasic\Projects\OneMore"

Le programme principal

Le code de base ressemble à ça (pseudo-code):

main:
   IF level_complete THEN create_new_level
   IF mouse_click THEN change_clicked_stones
   show_playfield
GOTO main

Nous avons d'abord besoin d'une surface de jeu et de savoir si un bloc est activé déactivé (cleared). Nous utilisons la valeur 0 pour désactivé avec la commande DIM qui définit toujours toutes les valeurs automatiquement à 0 . Donc , la première instruction sera évalués et un nouveau niveau sera crée .

// --------------------------------- //
// Project: OneMore

DIM playfield[10][10]
   level = 0

Maintenant, nous avons un tableau appelé «surface de jeu» qui est de 10x10 numéros en taille avec les valeurs 0 à 9 . Voir la commande DIM .

// Main game
   main:
      MOUSESTATE mx, my, b1, b2
      PRINT "<=", mx, my-8
      SHOWSCREEN
   GOTO main
END

Compiler et l'exécuter . Admirez, cela ne faut pas grand chose . Nous disposons d'un pointeur que l'on peut déplacer avec la souris . Jetez un oeil à la syntaxe pour toutes les commandes, nous avons utilisé ici . PRINT pour afficher notre pointeur de souris . Nous chargerons et utiliserons une image de sprite de plus tard . Nous utilisons ici une police de 8 et 16 pixels de haut. Ne pas oublier SHOWSCREEN!

Afficher la zone de jeu.

Maintenant, nous voulons montrer les données du jeu en ajoutant un nouveau sous-programme (SUB). Cliquer sur l'icone SUB et entrez le nom : ShowPlayfield

// ------------------------------------------------------------- //
// -=#  SHOWPLAYFIELD  #=-
// ------------------------------------------------------------- //
SUB ShowPlayfield:
   LOCAL x, y, color[]

DIM color[2]
   color[0] = RGB( 50,  50, 255) // Not set
   color[1] = RGB( 50, 255,  50) // Set

   DRAWRECT 0,0, 320, 320, RGB(255,255,255)
   FOR x=0 TO 9
      FOR y=0 TO 9
         DRAWRECT x*32+1, y*32+1, 30, 30, color[playfield[x][y]]
      NEXT
   NEXT
   PRINT "Clicks: "+clicks, 360, 120
   PRINT "Level:  "+level, 360, 160
ENDSUB // SHOWPLAYFIELD

Ici nous allons créer un tableau local appelé couleurs et attribuer une couleur bleue (50,50,255) pour la premiere valeur [0] et la couleur verte (50,255,50) pour le seconde valeur [1]. Ensuite on dessine un rectangle blanc pour délimiter les cotés.
Nous faisons alors une double boucle FOR next , Une pour x et une pour chaque y de chaque x.
Dans cette boucle, nous dessiner un rectangle rempli pour chaque case de notre surface du tableau de jeu- . Nous utilisons des couleurs [ playfield[x][y] ] avec des valeurs RGB . Ainsi, un 0 à cet endroit du tableau provoque un rectangle de couleur bleue, et 1 provoque un rectangle de couleur verte.
Nous informons aussi l'utilisateur le niveau actuel et le nombre de fois qu'ils cliqué pour ce niveau .

Ajoutez cette ligne dans le jeu principal, sous la line "MOUSESTATE":

GOSUB ShowPlayfield

et exécutez le jeu. c'est mieux maintenant, mais il n'y a pas beaucoup l'intéractivité possible !

Interactivité

Ajouter ensuite une fonction avec l'icone FUNCTION et donner le nom "Change" et les valeurs : x, y
Il s'agit du point où nous voulons changer le tableau .

// ------------------------------------------------------------- //
// -=#  CHANGE  #=-
// ------------------------------------------------------------- //
FUNCTION Change: x, y
   // These values are defined LOCAL:
   // x, y
   IF x>=0 AND x<10 AND y>=0 AND y<10
      set = playfield[x][y] // Get old state

      IF set = TRUE
         set=FALSE
      ELSE
         set=TRUE
      ENDIF
      // or simply:
      // set = 1-set
      playfield[x][y]=set // Set new state
   ENDIF
ENDFUNCTION

Dans cette fonction nous allons essayer de mettre 'playfield[x][y]' à 1 si il est à 0, et vice versa . Avant de le changer, nous vérifions si le position (x, y) est hors des limites 0-9, 0-9 . Si elle est hors de cette fourchette , nous ne changerons pas quelque chose ou nous aurons une erreur du programme en cours :" DIM out of range". Cette erreur signifie que nous avons essayé de mettre à jour une valeur dans notre tableau qui n'existe pas .La position que nous avons essayé de mêtre mise à jour est "hors de la plage du tableau" .

Maintenant ajouter une autre fonction avec l'icone FUNCTION . Donnez lui le nom "Click" et la liste valeurs : x, y
Il s'agit du la position traitée si le joueur clique .

// ------------------------------------------------------------- //
// -=#  CLICK  #=-
// ------------------------------------------------------------- //
FUNCTION Click: x, y
   // These values are defined LOCAL:
   // x, y
   clicks=clicks+1
   Change(x-1, y)
   Change(x+1, y)
   Change(x, y)
   Change(x, y-1)
   Change(x, y+1)
ENDFUNCTION

Ici, la fonction Change () est appliquée sur la position cliquée, Ainsi que les points de Qui l'entourent. Nous augmentons la variable (clicks) qui indique le nombre de fois qu'a cliqué le joueur à ce niveau.
Maintenant, changez le programme principal, de sorte qu'il ressemble :

DIM playfield[10][10]

   level = 0

   // Main game
   start:
      MOUSESTATE mx, my, b1, b2
      IF b1
         IF mousefree THEN Click(mx/32, my/32)
         mousefree=FALSE
      ELSE
         mousefree=TRUE
      ENDIF

      GOSUB ShowPlayfield
      PRINT "<=", mx, my-8
      SHOWSCREEN
   GOTO start
END

La variable mousefree nous indique si l'utilisateur tient toujours la souris bouton appuyé depuis la dernière fois nous avons traité la fonction Click () . Si le joueur est tient le bouton enfoncé , nous retraitons pas de fait de cliquer encore et encore , mais attendre qu'il a relaché la souris et puis re-cliqué dessus .
Maintenant, exécutez le programme . Il fonctionne bien maintenant . Pour avoir une idée de comment le jeu fonctionne . Cliquez au hasard un certain nombre de fois et essayez de nettoyer le tableau . Est-il amusant ?

Niveaux

Ajouter une nouvelle SUB appelée "NewLevel":

// ------------------------------------------------------------- //
// -=#  NEWLEVEL  #=-
// ------------------------------------------------------------- //
SUB NewLevel:
   LOCAL x, y, i

   // Clear playfield - just to be sure
   FOR x=0 TO 9
      FOR y=0 TO 9
         playfield[x][y]=FALSE
      NEXT
   NEXT

   level=level+1
   // Do random clicks
   FOR i=0 TO level
      Click(RND(9), RND(9))
   NEXT
   clicks=0
   GOSUB ShowPlayfield
   PRINT "Level: "+level + " - get ready", 0, 360
   SHOWSCREEN
   MOUSEWAIT
ENDSUB // NEWLEVEL

Dans ce sous-programme , nous avons tout d'abord effacer la surface de jeu si c'est possible. Ensuite nous augmentons la variable 'level'. L'ordinateur clique sur certains points choisis au hasard (plus le niveau en cours augmente plus l'ordinateur clique ) sur le tableau de jeux et on réinitialise le nombre de clics survenu à 0.
L'ordinateur peut désormais créer un niveau, mais il ne sait pas quand le niveau est autorisé . Nous avons besoin d'une fonction qui nous indique à quel moment cela se produit .
Ajouter une fonction appelée "IsLevelComplete":

// ------------------------------------------------------------- //
// -=#  ISLEVELCOMPLETE  #=-
// ------------------------------------------------------------- //
FUNCTION IsLevelComplete:
   LOCAL x, y

   FOR x=0 TO 9
      FOR y=0 TO 9
         IF playfield[x][y]=TRUE THEN RETURN FALSE
      NEXT
   NEXT
   RETURN TRUE
ENDFUNCTION

Ici, on boucle tout simplement tous les emplacements de notre tableau de jeux et retourne FALSE Si l'une des cellules de la surface de jeu est fixé à 1 (= TRUE). Si la boucle se termine sans retour de la fonction, il ne doit plus y avoir de points verts, donc le tableau est prêt et TRUE est retourner à la fin de la fonction .

Afin de tester l'ensemble du jeu insérer ce code :

IF IsLevelComplete()
         GOSUB NewLevel
         mousefree=FALSE
      ENDIF

au programme principal après le principal : jumpmark. Lancez le jeu . Félicitations pour avoir écrit un jeu d'ordinateur complet? Si vous ajoutez

BLENDSCREEN "images"+level".bmp"

à la sous-routine NewLevel , le jeu est encore mieux que l'était le jeu original Amiga à l'époque! N'est-ce pas se sentir bien? Vous êtes le maître de l'ordinateur maintenant - vous lui dire quoi faire et il suit vos commandes. Vous pouvez refaire le monde avec quelques lignes de code .

Voici le code source complet au cas où vous auriez raté quelque chose :

// --------------------------------- //
// Project: OneMore

DIM playfield[10][10]

   level = 0

   // Main game
   start:
      IF IsLevelComplete()
         GOSUB NewLevel
         mousefree=FALSE
      ENDIF

      MOUSESTATE mx, my, b1, b2
      IF b1
         IF mousefree THEN Click(mx/32, my/32)
         mousefree=FALSE
      ELSE
         mousefree=TRUE
      ENDIF

      GOSUB ShowPlayfield
      PRINT "<=", mx, my-8
      SHOWSCREEN
   GOTO start
END

// ------------------------------------------------------------- //
// -=#  SHOWPLAYFIELD  #=-
// ------------------------------------------------------------- //
SUB ShowPlayfield:
   LOCAL x, y, color[]

DIM color[2]
   color[0] = RGB( 50,  50, 255) // Not set
   color[1] = RGB( 50, 255,  50) // Set

   DRAWRECT 0,0, 320, 320, RGB(255,255,255)
   FOR x=0 TO 9
      FOR y=0 TO 9
         DRAWRECT x*32+1, y*32+1, 30, 30, color[playfield[x][y]]
      NEXT
   NEXT
   PRINT "Clicks: "+clicks, 360, 120
   PRINT "Level:  "+level, 360, 160
ENDSUB // SHOWPLAYFIELD

// ------------------------------------------------------------- //
// -=#  CLICK  #=-
// ------------------------------------------------------------- //
FUNCTION Click: x, y
   // These values are defined LOCAL:
   // x, y
   clicks=clicks+1
   Change(x-1, y)
   Change(x+1, y)
   Change(x, y)
   Change(x, y-1)
   Change(x, y+1)
ENDFUNCTION

// ------------------------------------------------------------- //
// -=#  CHANGE  #=-
// ------------------------------------------------------------- //
FUNCTION Change: x, y
   // These values are defined LOCAL:
   // x, y
   IF x>=0 AND x<10 AND y>=0 AND y<10
      set = playfield[x][y]

      IF set = TRUE
         set=FALSE
      ELSE
         set=TRUE
      ENDIF
      // or simply:
      // set = 1-set
      playfield[x][y]=set
   ENDIF
ENDFUNCTION

// ------------------------------------------------------------- //
// -=#  NEWLEVEL  #=-
// ------------------------------------------------------------- //
SUB NewLevel:
   LOCAL x, y, i

   // Clear playfield - just to be sure
   FOR x=0 TO 9
      FOR y=0 TO 9
         playfield[x][y]=FALSE
      NEXT
   NEXT

   level=level+1

   // Do random clicks
   FOR i=0 TO level
      Click(RND(9), RND(9))
   NEXT
   clicks=0
   GOSUB ShowPlayfield
   PRINT "Level: "+level + " - get ready", 0, 360
   SHOWSCREEN
   MOUSEWAIT
ENDSUB // NEWLEVEL

// ------------------------------------------------------------- //
// -=#  ISLEVELCOMPLETE  #=-
// ------------------------------------------------------------- //
FUNCTION IsLevelComplete:
   LOCAL x, y

   FOR x=0 TO 9
      FOR y=0 TO 9
         IF playfield[x][y]=TRUE THEN RETURN FALSE
      NEXT
   NEXT
   RETURN TRUE
ENDFUNCTION


Homework

Exercices

Tâches pour tester ce que vous avez appris

Cela a été un assez grand nombre d'informations à apprendre. Ces tâches ont servit à vous donner vous un bon départ dans votre vie de programmeur de jeux. Entrainez vous à moditier les programmes et tester les résultats.

General

Ainsi avec les bases . Vous avez appris la commande PRINT . Voici à nouveau sa syntaxe :

PRINT [NUMBER/WORD], X-Pixel to the right, Y-Pixel towards the bottom;

Un petit test qui vous préparent pour le prochain chapitre :
Vous êtes un enseignant d'une classe contenant 4 élèves (2 rang, 2 colonnes). Vous êtes un professeur et voulez avoir un programme d'ordinateur pour choisir un élève dans la classe . Le programme doit donner le nom et la position assise de l'élève imprimés à l'écran .
Class:
+ | colonne0 | colonne1
rang0 | Tom | Markus
rang1 | Sabine | Manuela

résultat e.g.

Sabine
assis au :
rang1
Colonne 0

Tips:
-Si vous ne modifiez pas la police standard, les caractères sont chacun de 16x16 pixels .
-Un nombre aléatoire sera retourné par la fonction RND(maximum).

Graphiques

Ecrire un programme qui charge 2 sprites et effectue avec les opérations suivantes :
Déplacez sprite 1 de gauche à droite , puis retourner le avec ROTOSPRITE , puis utilisez ROTOZOOMSPRITE pour faire tourner le sprite de nouveau et l'agrandir à la taille du plein écran. Répéter l'opération avec le sprite 2 .
Maintenant, le programme devrait charger une image de fond et faire les mêmes routines de nouveau avec une valeur alpha de -100 pour les images animées 1, et 100 pour le sprite 2.

Vous trouverez des graphiques et un projet pour cette tâche dans le dossier Projects .


Advanced

Avancés

Sections Avancées :

Cette section est conçue pour les programmeurs expérimentés et les utilisateurs avancés . Vous pouvez utiliser de nombreuses techniques de programmation avancées dans GLBasic .

Variables Local et Global

Vous pouvez définir des variables locales pour les sous-routines (ou pour le programme de la boucle principale "main") .Si vous souhaitez conserver le sous-programme séparé du code principal et que vous souhaitez le réutiliser dans un autre programme . Vous définissez une variable locale dans un SUB en utilisant le mot-clé LOCAL . Vous pouvez définir les numéros locaux, chaînes et tableaux comme celui-ci :

LOCAL num, word$, num_array[], word_array$[]

Pour accéder à une variable globale qui porte le même nom (en tant que définie précédemment locale) utiliser la variable mot-clé GLOBAL . Voir la commande de référence de ces commandes dans un code exemple .

Tableaux dynamiques

GLBasic vous offre la possibilité de reévaluer les tableaux avec DIM. Si vous souhaitez conserver et utiliser des données qui se chevauchent utiliser REDIM.

DIM a[5]
...
DIM a[12][4] // Yes!!

Gestion mémoire

Libérer la mémoire utilisée par des ressources n'est généralement pas pris en charge automatiquement avec le GLBasic. Vous pouvez faire cela très simplement en chargeant une ressource qui n'existe pas à la place .

LOADSPRITE "xx", 0

Cela permet de libérer la mémoire qui a été utilisée pour stocker l'image du sprite '0'.

LOADSOUND "xx", 0, 1

Cela permet de libérer le son numéro '0'

DIM a[0]

Cela permettra de libérer la mémoire utilisée pour ce tableau .

Nombres Hexadecimaux

Les nombres hexadécimaux peuvent également être utilisés en plus des nombres décimaux avec le préfixe '0x'.

ad=127; ah=0xff;

Refs:

BYREF, DIM, INLINE, REDIM


The Second Game

Le deuxième jeu

PONG

PONG

Maintenant que les bases sont claires, les compétences que vous avez appris doit être renforcée et pratiquée. Ce deuxième jeu est appelé "PONG". Ce n'est pas seulement un de vos premiers jeux en GLBasic, mais c'était aussi un des premiers jeux sur ordinateurs au monde (1972 par Ralph H. Baer). Si vous ne connaissez pas PONG, vous pouvez lire tous sur son sujet ici : http://www.pong-story.com

Nouveau projet

Après le démarrage du GLBasic, Sélectionnez le bouton "new project" et donner au projet un nom et un chemin d'accès approprié pour le projet . e.g. ..\GLBasic\Projects\Pong

Variables

Maintenant que le projet est mis en place , le travail de programmation peut commencer . Nous aurons besoin de variables pour les positions x et y de la balle , ainsi qu' une pour le score obtenu à jour . Pour l'ensemble de ces variables nous allons définir un tableau distinct, pour que 3, 4 joueurs ou plus peuvent facilement être ajoutés ultérieurement. Cela nous permet également de réutiliser le code pour les mouvements de la balle et le comptage dans une boucle.
Pour cela...
Notre code ressemble à ceci :

// Pong
DIM bat_y[2]
DIM bat_x[2]
DIM score[2]

Tout d'abord nous devons initialiser les joueurs . Pour ce faire, nous ajoutons une sous-routine (SUB) avec l'option du menu : "project/new SUB". Donnez lui le nom "Init".

Nous avons besoin d'écrire du code pour en tirer les règles du jeu et le convertir dans le tampon d'arrière plan 'BackBuffer' qui devra établi chaque frame . Vous pouvez également si vous voulez , charger une image plutôt que de créer à la main . Une fois que cela a été fait, nous définisons la position de des raquettes sur les coordonnées des bords.

// ------------------------------------------------------------- //
// -=#  INIT  #=-
// ------------------------------------------------------------- //
SUB Init:
 // Draw playfield, use as background bitmap
 BLACKSCREEN
 DRAWRECT 0,0, 640, 16,  RGB(255, 255, 255)
 DRAWRECT 0, 464, 640, 480, RGB(255, 255, 255)
 DRAWRECT 312, 0, 16, 480, RGB(255, 255, 255)
 USEASBMP

 //Reset Bat Y Locations
 bat_y[0]=240; bat_y[1]=240
 // Reset Bat X Locations
 bat_x[0]=16; bat_x[1]=600
ENDSUB // INIT

Réinitialiser la balle

Au début de chaque match, la balle doit être placée dans le centre du terrain et sa vitesse doit être mise à 1 . Pour cela nous allons créer un nouveau sous-programme comme décrit précédemment et l'appeler "ResetBall".

// ------------------------------------------------------------- //
// -=#  RESETBALL  #=-
// ------------------------------------------------------------- //
SUB ResetBall:
 // Diese Variablen sind als LOCAL definiert:
 // These variables are defined LOCAL:
 // void
 ball_x=320
 ball_y=240

 IF ball_sx<0
  ball_sx=1
 ELSE
  ball_sx=-1
 ENDIF

 ball_sy=1
ENDSUB // RESETBALL

Nous devons appeler cette fonction dans l'initialisation, donc nous ajoutons

GOSUB ResetBall

en haut de la sous-routine "Init".

Voyons

Nous avons tapé déjà beaucoup de code , mais il n'y a encore rien à voir . Il est maintenant temps de montrer les règles du jeu et de la balle. Pour cela, nous allons créer un nouveau sous-programme avec le nom ShowAll:

// ------------------------------------------------------------- //
// -=#  SHOWALL  #=-
// ------------------------------------------------------------- //
SUB ShowAll:
 // Die Schläger anzeigen / Show the bats
 FOR num=0 TO 1
  DRAWRECT bat_x[num], bat_y[num], 16, 64, RGB(255, 255, 255)
  PRINT score[num], num*320 + 32, 16
 NEXT
 // Der Ball / Draw the ball
 DRAWRECT ball_x, ball_y, 16, 16, RGB(255, 255, 255)
 SHOWSCREEN
ENDSUB // SHOWALL

Boucle principale

Maintenant, il nous faut une boucle principale . La boucle principale appellera d'autres sous-programmes du jeu à la chaîne . Ajoutez les lignes suivantes d'abord dans le programme au-dessus du sous-programme . Le code écrit ci-dessus le premier 'SUB' ou 'FUNCTION' définit le programme principal . Ce programme principal sera exécuté quand le programme démarre .

// pre-settings
GOSUB Init
MainLoop:
 GOSUB ShowAll
GOTO Main

Méfiez-vous ! Ce code n'affichera rien sans apeller l'instruction

SHOWSCREEN

dans la sous-routine ShowAll .

Execution

Vous pouvez maintenant appuyer sur le bouton compiler et démarrer le programme . (F8, puis F5)

Bouger !

Le jeu dispose maintenant d'un affichage, mais il manque d'animation . Pour arranger cela nous aurons besoin d'une routine appelée 'MoveAll'. Avant d'ajouter cela, nous devons nous assurer que notre boucle principale appelle la nouvelle subroutine MoveAll .
Avant la ligne suivante dans la boucle principale :

GOSUB ShowAll

ajoutez la ligne suivante

GOSUB MoveAll

dans la boucle principale .

Maintenant, créez un nouveau sous-programme appelé 'MoveAll' et ajouter le code suivant :

// ------------------------------------------------------------- //
// -=#  MOVEALL  #=-
// ------------------------------------------------------------- //
SUB MoveAll:
// Paddles
 FOR num=0 TO 1
  // Keys:  A, Z
  IF KEY(30) THEN bat_y[0]=bat_y[0]-2
  IF KEY(44) THEN bat_y[0]=bat_y[0]+2
  // Keys:  /\, \/
  IF KEY(200) THEN bat_y[1]=bat_y[1]-2
  IF KEY(208) THEN bat_y[1]=bat_y[1]+2

  // Bat at upper/lower border?
  IF bat_y[num]<0   THEN bat_y[num]=0
  IF bat_y[num]>416 THEN bat_y[num]=416
 NEXT

Les codes appropriés pour la commande KEY() peuvent être trouvée en exécutant l'utilitaire pour (dans lemenu "tool/key codes").
Maintenant compiler à nouveau et démarrer le programme . Avec les touches "A, Z" et "up, down" vous devriez être maintenant en mesure de contrôler la raquette .

ensuite , on déplace la balle en fonction de sa vitesse actuelle x/y . Ajoutez ceci à la subroutine MoveAll :

// ball
ball_x=ball_x+ball_sx
ball_y=ball_y+ball_sy

Collision avec des bords

Si la balle touche le haut ou le bas , on inverse simplement sa vitesse Y :

// ball at bottom
IF ball_y>464
 ball_y=464
 ball_sy= -ball_sy
ENDIF
// ball at ceiling
IF ball_y<0
 ball_y=0
 ball_sy= -ball_sy
ENDIF

Si la balle touche le bord de l'écran à gauche ou à droite, un joueur marque un point et le ballon est remis au Centre du jeu .

// ball left border - > score for player 1
IF ball_x<0
 score[1]=score[1]+1
 GOSUB ResetBall
ENDIF
// ball right border - > score for player 0
IF ball_x>624
 score[0]=score[0]+1
 GOSUB ResetBall
ENDIF

Collision avec une raquette

On boucle pour tous les joueurs :

FOR num=0 TO 1

Pour chaque joueur nous déterminons la position la balle et des raquettes . En faisant cela nous nous assurons que la collision de la raquette et de la balle est vérifié - et donc traitées - cela pour chaque raquette. A tout moment, si la balle touche une raquette, la direction de la balle est changée et ce autant de fois que la balle touche les raquettes sur le terrain.

IF (ball_sx<0 AND num = 0) OR (ball_sx>0 AND num=1)

Si le balle se dirige vers la raquette en cours de test , nous examinons si les deux rectangles pour le balle et la raquette se chevauchent . Si la balle touche une raquette , c'est la vitesse x de la balle qui est inversée (i.e. La balle rebondit sur la raquette ). Les vitesses dans X et Y augmentes après chaque rebond . Nous faisons changer la vitesse de la balle car autrement l'angle de sa trajectoire ne changerait jamais.

col=BOXCOLL(bat_x[num], bat_y[num], 16, 64, ball_x, ball_y, 16, 16)
IF col=TRUE
// turn ball speed in X direction
ball_sx = -ball_sx
// speed up ball
ball_sx = ball_sx * 1.2
ball_sy = ball_sy * 1.05

Fermeture des déclarations IF et FOR :

ENDIF
 ENDIF
NEXT

Voila. Le jeu est terminé . Avant d'écrire votre propre jeu , Il est important de veiller à ce que vous comprenez ce que fait chaque ligne du code.

Challenges

* Vérifiez les commandes et de tenter de prolonger le jeu de 2 à 4 joueurs (mettre des raquettes en haut et en bas de l'écran ).

* Jouer contre d'ordinateur,ainsi de sorte que vous pouvez jouer seul. Pour cela, il vous suffit de déterminer si les coordonnées Y de la balle est au-dessus ou en dessous du centre de la raquette de l'ordinateur , puis de déplacez la raquette en conséquence

* En fonction de la position d'impact de la balle sur la chauve-souris , changer l'angle du rebond de la balle .

Le programme offre beaucoup de liberté pour vos propres idées . Amusez-vous en jouant avec lui .

Le code source complet :

// Pong

DIM bat_y[2]
DIM bat_x[2]
DIM score[2]

// Voreinstellungen / Setup values
GOSUB Init

// Hauptschleife / Main Loop
main:
 GOSUB MoveAll
 GOSUB ShowAll
GOTO main

// ------------------------------------------------------------- //
// -=#  INIT  #=-
// ------------------------------------------------------------- //
SUB Init:
 GOSUB ResetBall

 // Spielfeld zeichnen, als Hintergrund nutzen
 // Draw playfield, use as background bitmap
 BLACKSCREEN
 DRAWRECT 0,   0, 640, 16,  RGB(255, 255, 255)
 DRAWRECT 0, 464, 640, 16, RGB(255, 255, 255)
 DRAWRECT 312, 0, 16, 480, RGB(255, 255, 255)
 USEASBMP

 // Schläger 0 setzten / Reset Bat 0
 bat_y[0]=240; bat_y[1]=240
 // Schläger 1 setzten / Reset Bat 1
 bat_x[0]=16; bat_x[1]=600

 // Klassischer Zeichensatz / Classic Font
 LOADFONT "FontBW.bmp", 0
ENDSUB // INIT

// ------------------------------------------------------------- //
// -=#  RESETBALL  #=-
// ------------------------------------------------------------- //
SUB ResetBall:
 // Diese Variablen sind als LOCAL definiert:
 // These variables are defined LOCAL:
 // void
 ball_x=320
 ball_y=240

 IF ball_sx<0
  ball_sx=1
 ELSE
  ball_sx=-1
 ENDIF

 ball_sy=1
ENDSUB // RESETBALL

// ------------------------------------------------------------- //
// -=#  SHOWALL  #=-
// ------------------------------------------------------------- //
SUB ShowAll:
 // Die Schläger anzeigen / Show the bats
 FOR num=0 TO 1
  DRAWRECT bat_x[num], bat_y[num], 16, 64, RGB(255, 255, 255)
  PRINT score[num], num*320 + 32, 16
 NEXT
 // Der Ball / The ball
 DRAWRECT ball_x, ball_y, 16, 16, RGB(255, 255, 255)
 SHOWSCREEN
ENDSUB // SHOWALL

// ------------------------------------------------------------- //
// -=#  MOVEALL  #=-
// ------------------------------------------------------------- //
SUB MoveAll:
// Paddles
 FOR num=0 TO 1
  // Tasten / Keys:  A, Y
  IF KEY(30) THEN bat_y[0]=bat_y[0]-2
  IF KEY(44) THEN bat_y[0]=bat_y[0]+2
  // Tasten / Keys:  /\, \/
  IF KEY(200) THEN bat_y[1]=bat_y[1]-2
  IF KEY(208) THEN bat_y[1]=bat_y[1]+2

  // Schläger am Rand? / Bat at border?
  IF bat_y[num]<0   THEN bat_y[num]=0
  IF bat_y[num]>416 THEN bat_y[num]=416
 NEXT

// Ball
 ball_x=ball_x+ball_sx
 ball_y=ball_y+ball_sy

 // Ball unten am Rand / Ball at lower border
 IF ball_y>464
  ball_y=464
  ball_sy=-ball_sy
 ENDIF

 // Ball oben am Rand / Ball at upper border
 IF ball_y<0
  ball_y=0
  ball_sy=-ball_sy
 ENDIF

 // Ball Linker Rand / Ball at left border
 IF ball_x<0
  score[1]=score[1]+1
  GOSUB ResetBall
 ENDIF

 // Ball rechter Rand / Ball at right border
 IF ball_x>624
  score[0]=score[0]+1
  GOSUB ResetBall
 ENDIF

 // Pong
 FOR num=0 TO 1 // Für jeden Spieler / For each player
  // Bewegt sich der Ball auf den Schläger 'num' zu?
  // Does ball move toward bat 'num'
  IF (ball_sx<0 AND num = 0) OR (ball_sx>0 AND num=1)
   col=BOXCOLL(bat_x[num], bat_y[num], 16, 64,   ball_x, ball_y, 16, 16)

   IF col=TRUE
    // Ballgeschwindigkeit in X umdrehen / Flip ball's X-direction
    ball_sx= -ball_sx
    // Schneller machen / Speed up
    ball_sx = ball_sx * 1.2
    ball_sy = ball_sy * 1.05
   ENDIF
  ENDIF
 NEXT

ENDSUB // MOVEALL


.app Folder

Le Dossier .app dans GLBasic

Support

Dans les versions antérieures de GLBasic , tous les programmes exécutables étaient crées dans le répertoire du projet . Cela était assez pratique pour les petits projets , mais causait des ennuis pour des projets plus importants, en particulier ceux qui ciblent plusieurs plates-formes.
Le répertoire '.app' a été retenue comme solution comme séparation claire entre les fichiers du développeur et les fichiers distribuable pour l'utilisateur final .

Comment ça marche?

Tous programmes crées (compiled) seront mis dans le Répertoire "project path/project name.app" . Si vous exécutez un programme , Le contenu de ce répertoire sera utilisé comme répertoire courant. Donc , pour Windows, Linux, Windows mobile et GP2X-Wiz le répertoire courant est égal au répertoire où est l'exécutable .
Pour Mac OS-X, cependant , L'exécutable doit être dans un sous-répertoire séparé . GLBasic le crée automatiquement pour vous et copies le fichier exécutable pour la bonne place . Le répertoire ".app" sera considéré comme un "programme autonome " . Ceci est de même pour les iPhone, sauf que l'exécutable est directement à l'intérieur du dossier .app .

Icones

GLBasic tente de créer votre projet "ready-to-release" prèt a l'emploie . Après une première compilation , vous trouverez un fichier "icon.png". dans le répertoire de projet, Ce fichier est une image png 24 bits . La couleur RGB(255,0,128) seront considérées comme transparentes (l'information alpha sera ignoré !). Vous pouvez utiliser n'importe quelle taille pour cette image, mais une forme carrée est recommandé (i.e. d'égalité en hauteur et largeur ).

Si vous créez maintenant le programme pour une autre plate-forme, L'icône sera convertie dans le format requis et copiés au bon endroit . Note : cela est exécutée uniquement si l' icône n'existe pas déjà dans le répertoire .app . Donc , Vous pouvez modifier manuellement le fichier icon et le GLBasic ne l'écraser plus .

Pour les plateformes Windows , il ya une fonction spéciale . Le "icon.png" sera convertie en fichier "icon.ico" dans le répertoire du projet . Cette icône sera ajouté comme lien.


Compiling for iPhone

Compiler pour iPhone/iPod Touch

Requis

* Un PC Apple :- Apple n'autorise pas GLBasic à installer des partis de leur SDK sur des machine qui ne sont pas de marque Apple.

Il en résulte que vous DEVEZ avoir un Mac pour compiler sur iPhone. GLBasic va vous fournir un projet XCode lequel pourras etre compiler en utilisant un Mac.

Le programme signé va être copier dans le répertoire .app de l'iphone après ceci.

* GLBasic v7RC2 ou plus

* Le Xcode dois être installé sur votre PC Apple (inclus sur le DVD de Mac OS X)

* Pour vendre une application à travers de l'Apple store vous avez besoin d'une licence de développement. (Actuellement 99$ US par an)

Notes Speciales à propos de l'appareil

* La résolution de l'iPhone 320 x 480 (ou 480 x 320 en mode paysage)

* Les Applications écrite sur cet appareil sont cloisonné . Par exemple vous ne pouvez pas partager des données entre 2 applications.

* L' iPhone n'as pas de clavier, donc KEY() va toujours retourner 0.

* Si la touche centrale est pressé, l'OS va quitter le programme rapidement. Il y a tres peu de temps pour sauvegarder les parametre de votre jeu. La façon de faire est d'insérer un

SUB GLB_ON_QUIT:

Lequel va appeler automatiquement et écrire les status en utilisant OPENFILE. N'essayez pas d'utiliser des fonctions graphique à ce moment là.

* L'accéléromètre de l'iPhone peut être interrogé respectivement avec ces commandes GETJOYX(0), GETJOYY(0) et GETJOYZ(0) .

Les valeurs retournées pour chaque axes dans "G" (9.81 m/s^2).

* L' iPhone est ' multi pression' . Chaque pression est traité comme une souris. Voire GETMOUSECOUNT().

Commandes non supportées

Actuellement les fonctions qui suivent ne fonctionne pas avec l' iPhone
* BLENDSCREEN
* GRABSPRITE
* USEASBMP

Compiler pour iPhone

1) Ecrire le prochain ' blockbuster ' en GLBasic
2) Choisir "Options" dans le menu "Project"
3) changer "Platform Configuration" et y mettre pour "iPhone"
4) Choisir la résolution que vous voulez utiliser à partir de "Resolution"
5) Clicker OK
6) Compiler votre application
7) Copier le fichier résultant .xcodeproj sur votre machine Apple
8) Ouvrir le fichier xcode
9) Dans "Groups and Files", choisir iPhoneInfo.plist
10) Changer "Bundle Identifier" et mettre votre ID de développer signé par Apple (si vous l'avez)
11) Dans le répertoire xcode, si le fichier iPhone_Prefix.pch est manquant, créer un fichier vide et donner lui ce nom.
12) Dans le menu déroulant en haut de Xcode, soyez sure d'avoir mis soit "Device - Release" ou "Device - Debug", mais pas "Device - Simulator"
12) Clicker sur le bouton "Build and Go" pour compiler votre application.
13) Si votre iPhone est connecté a votre PC Apple, votre application va se charger automatiquement dessus.

Comment changer le nom qui apparait sous l'icone de l'iPhone

1. Dans Xcode sur le panneau à gauche développez l'arborescence Targets.
2. Double clicker sur le premier item ci-dessous - ca dois être iPhone
3. La fenêtre info de "iPhone" dois apparaitre.
4. choisir l'onglet construire 'Build'.
5. Scroller vers le bas la section 'Packaging' et changer la valeur dans le champs nom du produit 'Product Name' et y mettre votre nom d'application. Vous pouvez changer la configuration tout en haut de cette ecran pour etre sur que le nom sera changé pour toutes vos configs.
6. Fermer la fenêtre.
7. Aller sur 'Build' sur le menu principal en haut de l'écran et choisir 'clean', et toutes les dépendances seront nettoyées.

Le nom de l'icone va changer après votre prochaine compilation.


Data types

Data Types

Numéros

Sur "gros " système , le GLBasic utilise par défaut les nombres 8 bytes (64 bits). Pour indiquer qu'une variable est un numéro vous pouvez (en option) ajouter '#' au nom de variable pour clarifier ce point.
Ces chiffres sont par ailleurs appelé "nombres à double precision floating-point ".

Sur "petit" système (ceux qui ont des processeurs ARM - PocketPC, GP2X, WIZ etc), les nombres sont stockés sous forme de 4 bytes (32 bits). Ce sont également connu sous le nom "nombre à simple precision floating point numbers".

Les variables de nombre se terminant par un '%' sont des nombres entiers avec une précision 4 byte (32 bit) .

Une fois déclarée une variable conserve son type , même si plus tard vous laissez de côté le caractère indiquant le type.

Strings- chaîne de caractères- textes

Poue les "string" ( serie de caractères alphanumeric ) le GLBasic utilise 1 byte (8 bits) par caractère . Une variable chaîne se termine par '$', qui ne doit pas être oublié au nom de variable.

Vous pouvez convertir des chaînes en nombres et vice-versa automatiquement :

a$="123.4"
b# = a$
a$ = b#

Si vous voulez effectuer une opération mathématique au cours de cette conversion , vous devriez mettre le terme entre accolades pour éviter d'ajouter deux string .

a$ = 3 + 4 // "34"
a$ = (3+4) // "7"

Il n'y a pas de taille maximale pour les variables de chaîne - Vous pouvez continuer à ajouter du texte jusqu'au moment d'être à court de mémoire système .


Multiple source files

Multiples fichiers Source

Si vous voulez utiliser de multiples fichiers source dans votre programme , Ouvrez votre projet dans l'éditeur et cliquez sur l'onglet "files" au bas du volet à droite.
Sélectionnez "New file" pour créer un nouveau dossier pour votre projet , ou "open file" pour inclure un fichier existant .

Les fichiers libs (.gbal) peuvent aussi être ajoutés de cette manière .

Vous pouvez trouver une liste de fichiers utiles à inclure dans "Samples/COMMON".

Spécification de la source de fichiers

Vous pouvez sélectionner n'importe quel fichier , puis un clic droit dessus , et sélectionnez "Use as main program" pour spécifier ce fichier source comme point d'entrée pour le programme .


Operator order

Ordre d'Opérateurs

GLBasic effectue ses opérations mathématiques dans l'ordre suivant :

- opération entre ( )
- appels de fonction (avec parenthèses e.g. bOR() )
- * et /
- + et -
- = (lorsqu'il est utilisé pour la comparaison )
- AND
- OR
- = (lorsqu'il est utilisé pour l'allocation )


Platforms

Plates-formes

General

GLBasic supporte des systems ou plates-formes différentes . Ainsi, vous pouvez compiler à la demande pour e.g. Win32 (Windows 98, NT, 2000, XP, Vista,...) et WinCE (PocketPC2002, 2003, Windows Mobile, ...).
Pour choisir le système d'exploitation que pour lequel vous voulez compiler, Sélectionnez le menu "Project/Options" et choisir l'OS ciblé dans la liste .
Une fois que vous avez sélectionné le système d'exploitation correct , choisissez les paramètres vous souhaitez configurer pour cet OS (resolution etc). Cette option est plus facile dans cette version de GLBasic . Enfin, appuyez sur le bouton "Apply" pour activer les paramètres .
A la prochaine compilation (Compiler menu/Build-multiplatform), un fichier exécutable sera créé pour chaque plate-forme cible spécifiée . Chaque plate-forme exécutable aura un nom différent - par exemple , un exécutable pour WinCE serait appelé ApplicationName_PPC.exe.

Plus de systèmes sont encore à venir . Les plates-formes supplémentaires imposent une licence pour "NET" ou the GLBasic SDK premium. Si vous n'êtes pas sûr de quelle licence vous avez installée , ceci peut être vu lorsque vous démarrez le programme.

Limitations

ARM processors
-Pour sytemes ARM , les nombres à virgule flottante sont limitées à 32 bit.
-La profondeur de couleur de l'écran est généralement 16 bit. Aucun changement dans le code sont requis , mais la valeur de GETPIXEL peut être différente de la couleur que vous définissez avec SETPIXEL.

GP2X/WIZ
-L'écran est réglé sur 320x240
-La lecture MIDIpourrait ne pas fonctionner .
-La Memoire est limitée à 48 MB.

Non-Windows
FILEREQUEST$ est remplacé par INPUT$. DDgui correspond à DDgui_FileDialog.

Linux
Les librairies suivantes doivent être installés avant d'exécuter un fichier exécutable :

-libSDL_mixer-1.2
-libstdc++.so.5
-libmikmod.so.2
-libvorbisfile.so.3
-libsmpeg-0.4.so.0
-libvorbis.so.0

qui peut être installé à l'aide sudo apt-get install libsdl-mixer1.2-dev libstdc++5 (ou équivalent )

Mac
-Fonctionne sur des machines PowerPC ou Intel (l'exécutable créé est un programme universel )
-Le mode plein écran n'est pas encore implémenté
-Les fichiers MP3 ne peuvent pas être utilisés (les fichiers OGG doivent être utilisées à la place )

Win32
-ogg vorbis à besoin d'un codec pour le lecteur média .
-Le fichier journal est écrit dans %TEMP%/logfile.txt au lieu d'une console .

iPhone

L'iPhone n'a pas de touches , donc KEY() retournera toujours 0 . Si le bouton d'accueil est pressé , l'OS va quitter votre programme très rapidement . Il ya très peu de temps pour enregistrer le statut du jeu . La façon d'y parvenir est l'insertion de

SUB GLB_ON_QUIT:

et d'écrire le statut en utilisant OPENFILE. plus d'affichage graphiques possibles à ce stade !
L'accéléromètre de l'iPhone peut être interrogé respectivement avec ces commandes GETJOYX(0), GETJOYY(0) et GETJOYZ(0) .

Les valeurs retournées pour chaque axes dans "G" (9.81 m/s^2):

L'iPhone possède une écran tactil . Chaque contact est traité comme la sourie. See GETMOUSECOUNT().

Apple ne permet pas au GLBasic d'installer des parties de leur SDK sur du materiel de marque non-Apple. Par conséquent, vous DEVEZ posséder un Mac afin de compiler pour iPhone . GLBasic fournira un projet Xcode que vous pouvez ensuite compiler en utilisant un Mac . Le code du fichier signé sans l'executable doit être copié dans le dossier .app dans "iPhone" .

Refs:

PLATFORMINFO$()


Tools

Outils

Keycodes
Ceci est un programme simple qui affiche le correspondant keycodes (utilisé avec la commande KEY() ) quand vous appuyez sur une touche .

Font Creator
Cet outil crée un fichier bitmap graphiques à partir de fonte TrueType qui peut être utilisée avec le GLBasic et la commande LOADFONT . GLBasic utilise cette méthode pour afficher des graphiques de manière efficace et ne pas gaspiller les ressources .

Shoebox
Un programme pour compresser un dossier dans une archive Shoebox (voir la commande SETSHOEBOX)

Calculator
Une calculatrisse à portée de main avec fonctions de calcul scientifique .
Maths basique :
+, -, *, /, ^, ==
Fonctions:
abs, floor, ceil, mod(n,m)
degrad(deg), raddeg(rad)
sin(rad), cos, tan
acos, asin, atan, atan2(dy,dx)
ln, log, exp(n,e), pow(n,e), sqrt
int - integer (cutoff)
asl(n,s), asr(n,s) - bit shift
set($varname, value) - Assign variable
if(cond,true,false) - calculate conditionals

Folder To Zip
zip dans un dossier pour la sauvegarde et le partage de votre travail.

Setup Pack&Go
Un outil très simple qui crée un utilitaire de configuration pour votre programme . Il comprend également un programme de désinstallation, mais seulement pour Windows .

3D convert
Utilisez cet outil pour convertir plusieurs formats 3D en format GLBasic native .ddd .

Open folder
Ouvre un explorateur pour le dossier du projet en cours . Il s'agit d'un outil très pratique .

Export File as Library
Avec cet outil, vous pouvez convertir le code source du fichier courant (.gbas) en une bibrairie compressée et cryptée . De cette manière, vous pouvez fournir les fonctionnalités d'un fichier source sans avoir à partager le code source lui-même . Cela est également utile si vous ne voulez pas confondre votre code pour multiples raisons comme utiliser des appels INLINE .
Pour une librairie GLBasic l'extension du fichier est ".gbal" .

Créer une aide

Avec l'élément du menu "Tools/Create Help" Vous pouvez créer un fichier d'aide HTML à partir de votre actuel fichier .gbas .
Vous devriez vraiment joindre un fichier d'aide à votre librairie pour aider les utilisateurs à tirer profit de ses fonctionnalités .

Ces commentaires sont utilisés pour l'aide :

//! : Simple texte d'aide (primary language)
//? : Texte d'aide dans la langue de remplacement
// \param pname: description | description, langue de remplacement
// \\return : Ce qui est retourné ? | Valeur de retour , langue de remplacement

Les blocs '//!' et '\param' seront affectés à la fonction ou sous-routine suivante . Si vous divisez un bloc avec un simple commentaire (//), ce bloc de texte sera mis comme un bloc de texte distinct.

Example:

//! GLBasic's DoctorGBAS - Test
//! ---------------------------
//! Some English text
//? Ein deutscher Text

//! Makes a + b
//? Macht a + b
// \param  a - Number 1 | a - Zahl 1
// \param  b - Number 2 | b - Zahl 2
// \return a plus b     | a plus b
@FUNCTION Plus: a, b
   RETURN a + b
ENDFUNCTION

//! Thanks a lot
//? Vielen Dank

Macros

De partir de la version 7, GLBasic les caractéristiques de fichiers macros sont intégré dans l'IDE. Ces macros peuvent être utilisés pour changer des parties de votre projet.
GLBasic met en place certaines variables d'environnement qui peuvent êtres utiles dans le cadre de votre macros (ici, un exemple de projet sur mon PC).

%GLB_PROJ_NAME%=SEUCK
%GLB_PROJ_PATH%=C:\Users\gf\Documents\GLBasic\SEUCK
%GLB_MAIN_PATH%=c:\Program Files\GLBasic
%CYG_GLB_PROJ_PATH%=/cygdrive/C/Users/gf/Documents/GLBasic/SEUCK
%CYG_GLB_MAIN_PATH%=/cygdrive/c/Users/gf/Documents/SourceCode/frisch/fun/GLBasic

Si vous modifiez les macros , La première ligne qui introduit un lot de commentaire doit commencer par "::" . Après cela, le commentaire est utilisé comme un outil astuce pour la bouton macro .


ABS()

n# = ABS(m#)

Retourne l'absolu (positive) de m#.

PRINT "ABS of -5 = " + ABS(-5),0,0
PRINT "ABS of 7 = " + ABS(7),0,20
SHOWSCREEN
MOUSEWAIT

Output:
ABS of -5 = 5
ABS of 7 = 7

Refs:

SGN()


ACOS()

v=ACOS(a#)

ACOS renvoie l'angle arccosinus dont le cosinus est c.

Le résultat sera dans la plage -90 à +90.

Sample:

a# = 0.5
result# = ACOS(a#)
PRINT "ACOS result = " + result,0,0
SHOWSCREEN
MOUSEWAIT

Output:
ACOS result = 60

Refs:

SIN()


ADDRESSOF()

ptr% = ADDRESSOF(foo)

Retourne l'adresse du pointeur d'une fonction. Utile pour SORTARRAY.

LOCAL arr[]

   // default sort
   Fill(arr[])
   SORTARRAY arr[], 0
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 0, i*16
   NEXT

   // sort by function
   Fill(arr[])
   SORTARRAY arr[], ADDRESSOF(compare)
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 100, i*16
   NEXT

   // inverse sort by function
   Fill(arr[])
   SORTARRAY arr[], ADDRESSOF(inverse_compare)
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 200, i*16
   NEXT

   SHOWSCREEN
   MOUSEWAIT

FUNCTION Fill: arr[]
   REDIM arr[10]
   // Populate array with known values
   RESTORE mydata
   FOR myloop=0 TO 9
      READ arr[myloop]
   NEXT
ENDFUNCTION

FUNCTION compare: BYREF a, BYREF b
   IF a<b THEN RETURN -1
   IF a>b THEN RETURN 1
   RETURN 0
ENDFUNCTION

FUNCTION inverse_compare: BYREF a, BYREF b
   IF a<b THEN RETURN 1
   IF a>b THEN RETURN -1
   RETURN 0
ENDFUNCTION

STARTDATA mydata:
   DATA 40,80,20,10,90,50,100,60,30,70
ENDDATA

Output:
10 10 100
20 20 90
30 30 80
40 40 70
50 50 60
60 60 50
70 70 40
80 80 30
90 90 20
100 100 10

Refs:

SORTARRAY


ALIAS

ALIAS name#%$ AS some.thing[123].value[78]

Cette commande génère en interne un pointeur vers la variable définie après "AS". Vous pouvez accèder très rapidement aux variables , diminuer vos travaux de frappe et éviter le calcul de [123] et [78], pour chaque accès aux variable .

ATTENTION:
Si la taille des tableaux concernés est changée (avec des commandes comme DIMPUSH, DIMDEL et DELETE),ce pointeur va certainement être rompu et votre programme risque de planter ... à moins d'être chanceux.

TYPE Tfoo
f
ENDTYPE

TYPE Tbar
fb[] AS Tfoo
ENDTYPE
LOCAL bar AS Tbar

ALIAS myfoo AS bar.fb[0].f
moo(myfoo)

FUNCTION moo: BYREF bb

ENDFUNCTION

Refs:

FOREACH


ALLOWESCAPE

ALLOWESCAPE a#

Permet (a#=TRUE) ou refuse (a#=FALSE) l'utilisateur d'interrompre le programme en utilisant la touche ESC . Ceci désactive aussi le X-icon dans les programmes PocketPC .

La valeur par défaut est TRUE .

ALLOWESCAPE TRUE
   PRINT "Pressing ESC now will abort the program",0,0
   PRINT "Click the mouse to continue instead",0,10
   SHOWSCREEN
   MOUSEWAIT

   ALLOWESCAPE FALSE
   PRINT "Pressing ESC now will NOT abort the program",0,0
   PRINT "Click the mouse to continue instead.",0,10
   SHOWSCREEN
   MOUSEWAIT

Refs:

END, KEY()


ALPHAMODE

ALPHAMODE alpha#

Change le mode alpha pour tout le rendu graphique qui suivra . La valeur alpha# est comprise entre -1.0 to 1.0.

ALPHA VALUES:
alpha# > 0 - Alpha blending additif . (Incendie , explosions)
alpha# = 0 - Sans alpha blending.
alpha# < 0 - Interpolée alpha blending (ombres , autre cool FX)

Sample:

// ALPHAMODE
LOADBMP "Back.bmp"
PRINT "No alpha", 100, 100
ALPHAMODE .5
PRINT "Alpha +0.5", 100, 140
ALPHAMODE 1
PRINT "Alpha +1", 100, 160
ALPHAMODE -1
PRINT "Alpha -1", 100, 180
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWLINE, INPUT, POLYVECTOR, PRINT, SETPIXEL, DRAWSPRITE


AND

a# = b# AND c#

Comparaison Logique AND . Retourne TRUE ou FALSE.
(Voir bAND pour Binary AND)

AND:
retourne TRUE si les deux (b# et c#) ne sont pas nuls .

Attention:
AND et OR ; Si aucune parenthèse n'est utilisée le 'GLBasic operator-style' évalue de gauche à droite .

istwo = 2
   isthree = 3
   isfour = 4

   IF (istwo = 2) AND (isthree = 3)
      // Will print as both conditions are true (i.e. 1)
      // AND needs both conditions to be true
      PRINT "istwo = 2 and isthree = 3",0,0
   ENDIF

   IF (istwo = 2) AND (isthree = 2)
      // This wont print as second condition is false (i.e. 0)
      // AND needs both conditions to be true

      PRINT "isone = 1 and istwo = 1",0,10
   ENDIF

   IF (istwo = 4) OR (isthree = 3)
      // Will print as only one condition needs to be true (i.e. 1) for an OR condition
      PRINT "isone = 1 and istwo = 2",0,20
   ENDIF

   IF ((isthree = 6) AND (isfour = 4)) OR (istwo = 2)
      // ((isthree = 6) and (isfour = 4)) = FALSE
      // (istwo = 2) = TRUE
      // FALSE "OR" TRUE = TRUE therefore this will print
      PRINT "((isthree = 6) AND (isfour = 4)) or (istwo = 2)",0,30
   ENDIF

   SHOWSCREEN
   MOUSEWAIT

résultat:
istwo = 2 and isthree = 3

isone = 1 and istwo = 2
((isthree = 6) AND (isfour = 4)) or (istwo = 2)

Refs:

IF, OR, bAND(), bNOT(), bOR(), bXOR()


ANIMCOLL()

col% = ANIMCOLL(ani1%,tile1%, x1%,y1%, ani2%,time2%, x2%,y2%)

Effectue un contrôle de collision par-pixel entre 2 sprites animés . La vérification est effectuée comme en comparant les résultats de :
DRAWANIM(ani1,tile1,x1,y1)
et
DRAWANIM(ani2,tile2,x2,y2)
pour les pixels qui se chevauchent .

La détection de collision peut traiter le mélange sprites animés et sprites normaux . Si ani1 ou ani2 ne sont pas une animation, mais une image crée avec LOADSPRITE/GRABSPRITE, tile1 ou tile2 (respectivement) devrait être réglé à 0 .

Refs:

SPRCOLL()


ASC()

num% = ASC(string$)

Retourne la valeur ASCII pour la première lettre string$.

PRINT ASC("a"), 100, 100
SHOWSCREEN
MOUSEWAIT

// Dec Hx Char Dec Hx Char  Dec Hx Char  Dec Hx Char
// ----------- -----------  -----------  -----------
//   0  0 NUL  32 20 SPACE  64 40 @      96 60 `
//   1  1 SOH  33 21 !      65 41 A      97 61 a
//   2  2 STX  34 22 "      66 42 B      98 62 b
//   3  3 ETX  35 23 #      67 43 C      99 63 c
//   4  4 EOT  36 24 $      68 44 D     100 64 d
//   5  5 ENQ  37 25 %      69 45 E     101 65 e
//   6  6 ACK  38 26 &      70 46 F     102 66 f
//   7  7 BEL  39 27 '      71 47 G     103 67 g
//   8  8 BS   40 28 (      72 48 H     104 68 h
//   9  9 TAB  41 29 )      73 49 I     105 69 i
//  10  A LF   42 2A *      74 4A J     106 6A j
//  11  B VT   43 2B +      75 4B K     107 6B k
//  12  C FF   44 2C ,      76 4C L     108 6C l
//  13  D CR   45 2D -      77 4D M     109 6D m
//  14  E SO   46 2E .      78 4E N     110 6E n
//  15  F SI   47 2F /      79 4F O     111 6F o
//  16 10 DLE  48 30 0      80 50 P     112 70 p
//  17 11 DC1  49 31 1      81 51 Q     113 71 q
//  18 12 DC2  50 32 2      82 52 R     114 72 r
//  19 13 DC3  51 33 3      83 53 S     115 73 s
//  20 14 DC4  52 34 4      84 54 T     116 74 t
//  21 15 NAK  53 35 5      85 55 U     117 75 u
//  22 16 SYN  54 36 6      86 56 V     118 76 v
//  23 17 ETB  55 37 7      87 57 W     119 77 w
//  24 18 CAN  56 38 8      88 58 X     120 78 x
//  25 19 EM   57 39 9      89 59 Y     121 79 y
//  26 1A SUB  58 3A :      90 5A Z     122 7A z
//  27 1B ESC  59 3B ;      91 5B [     123 7B {
//  28 1C FS   60 3C <      92 5C \     124 7C |
//  29 1D GS   61 3D =      93 5D ]     125 7D }
//  30 1E RS   62 3E >      94 5E ^     126 7E ~
//  31 1F US   63 3F ?      95 5F _     127 7F DEL

Output:
97

Refs:

CHR$(), MID$()


ASIN()

v=ASIN(a#)

ASIN renvoie l'angle dont le sinus est arcsinus v.

Le résultat sera dans la plage -90 to +90.

Sample:

a# = 0.5
result# = ASIN(a#)
PRINT "ASIN result = " + result,0,0
SHOWSCREEN
MOUSEWAIT

Output:
ASIN result = 30

Refs:

SIN()


ASL()

res% = ASL(num%, shift%)

Décalage d'un nombre entier binaire par shift% nombre de bits .

Chaque décalage d'un bit de shift% va doubler la variable num%.

a% = 3
b% = 256
a% = ASL(a%, 3) // a=a*8
b% = ASR(b%, 4) // b=b/16
PRINT "a = " + a%,0,0
PRINT "b = " + b%,0,10
SHOWSCREEN
MOUSEWAIT

Output
A = 24
B = 16


ASR()

res% = ASR(num%, shift%)

Décalage d'un nombre entier binaire par shift% nombre de bits . Chaque tranche de shift% divise par 2 num%.

a% = 3
b% = 256
a% = ASL(a%, 3) // a=a*8
b% = ASR(b%, 4) // b=b/16
PRINT "a = " + a%,0,0
PRINT "b = " + b%,0,10
SHOWSCREEN
MOUSEWAIT

Output
A = 24
B = 16

Refs:

ASL()


ASSERT()

ASSERT(ok%)

En mode débogage, déclenche un point d'arrêt , quand ok%=0.

En mode release, il sera ignoré .


ATAN()

v=ATAN(dy#, dx#)

ATAN renvoie l'arc tangente de dy# divisé par dx#. Le résultat est dans la plage -180 à 180 (degrés ).

Sample:

dx# = -1
dy# = -1
result# = ATAN(dy#,dx)
PRINT "ATAN result = " + result,0,10
SHOWSCREEN
MOUSEWAIT

résultat:
ATAN result = -135

Refs:

ACOS(), ASIN(), COS(), SIN(), TAN()


AUTOPAUSE

AUTOPAUSE mode#

Bascule automatique sur le mode pause (TRUE) ou l'inverce (FALSE). Auto pause est chargé de mettre en veille le programme s' il perd le focus . Assurer que cette option soit désactivée lors de la compilation pour les serveurs de réseau.

Example:

...
   AUTOPAUSE TRUE
   ...


bAND()

num% = bAND(num1%, num2%)

Effectue l'opération booléen AND sur les valeurs entières . Les chiffres sont de taille 32bits.

bAND:

bAND compare les codes binaires num1% et num2% pour les bits correspondants . Tout bits correspondants qui sont mis à 1 dans num1% et num2% apparaîtront dans le résultat.

Binary code of num1%: 00100010
Binary code of num2%: 00100100
num1% bAND num2% : 00100000

Example:

FOR a%=0 TO 1
 FOR b%=0 TO 1
  x = (a+b*2)*160
  PRINT "a="+a+" b="+b, x, 30

  PRINT "bAND="+bAND(a, b), x,  60
  PRINT "bOR ="+bOR (a, b), x,  80
  PRINT "bXOR="+bXOR(a, b), x, 100
  IF b=0 THEN PRINT "bNOT="+bNOT(a),    x, 120
 NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

Output:
a=0 b=0 a=1 b=0 a=0 b=1 a=1 b=1

bAND=0 bAND=0
bAND=0 bAND=1
bOR=0 bOR=1 bOR=1 bOR=1
bXOR=0 bXOR=1 bXOR=1
bXOR=0
bNOT=-1

Refs:

bNOT(), bOR(), bXOR()


BLACKSCREEN

BLACKSCREEN

Cette commande efface et fixe le tampon d'arrière plan de revenir à un écran noir . Cette commande écrase toute modification de la mémoire tampon d'arrière qui ont été prise avec les commandes LOADBMP ou USEASBMP. Voir le tutoriel graphiques 2D pour plus d'informations sur le double tampon.

exemple:

LOADBMP "Image.bmp"
BLACKSCREEN // Black again
PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

BLENDSCREEN, LOADBMP, USEASBMP


BLENDSCREEN

BLENDSCREEN bmp$

Efface l'actuel tampon d'arrière plan (hidden surface) avec l'image bmp$. Comme avec l'utilisation de LOADBMP.

Exemple:

PRINT "Back-Buffer previous", 100, 100
BLENDSCREEN "Image.bmp"

Note : Sur l' iPhone, Cette commande fonctionne uniquement en mode portrait .

Refs:

BLACKSCREEN, LOADBMP, USEASBMP


bNOT()

num% = bNOT(num1%)

Effectue l'opération booléen NOT sur une valeur entière . Le numéro est de taille 32bits .

bNOT:

bNOT inverse les chiffres binaires de num1%. Tout bit mis à 1 dans num1% seront mis à 0 dans le résultat et vice-versa .

Binary code de num1% : 00100010
bNOT num1% : 11011101

Example:

FOR a%=0 TO 1
 FOR b%=0 TO 1
  x = (a+b*2)*160
  PRINT "a="+a+" b="+b, x, 30

  PRINT "bAND="+bAND(a, b), x,  60
  PRINT "bOR ="+bOR (a, b), x,  80
  PRINT "bXOR="+bXOR(a, b), x, 100
  IF b=0 THEN PRINT "bNOT="+bNOT(a),    x, 120
 NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
a=0 b=0 a=1 b=0 a=0 b=1 a=1 b=1

bAND=0 bAND=0
bAND=0 bAND=1
bOR=0 bOR=1 bOR=1 bOR=1
bXOR=0 bXOR=1 bXOR=1
bXOR=0
bNOT=-1

Refs:

bAND()


bOR()

num% = bOR(num1%, num2%)

Effectue l'opération booléen OR sur des valeurs entières . Les chiffres sont de taille 32bits .

bOR:

bOR compare les codes binaires pour num1% et num2% et si les chiffres sont mis à 1 dans les deux num1% ou num2%, ils apparaîtront dans le résultat .

Binary code de num1% : 00100010
Binary code de num2% : 00100100
num1% bOR num2% : 00100110

Example:

FOR a%=0 TO 1
 FOR b%=0 TO 1
  x = (a+b*2)*160
  PRINT "a="+a+" b="+b, x, 30

  PRINT "bAND="+bAND(a, b), x,  60
  PRINT "bOR ="+bOR (a, b), x,  80
  PRINT "bXOR="+bXOR(a, b), x, 100
  IF b=0 THEN PRINT "bNOT="+bNOT(a),    x, 120
 NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
a=0 b=0 a=1 b=0 a=0 b=1 a=1 b=1

bAND=0 bAND=0
bAND=0 bAND=1
bOR=0 bOR=1 bOR=1 bOR=1
bXOR=0 bXOR=1 bXOR=1
bXOR=0
bNOT=-1

Refs:

bAND()


BOUNDS()

n% = BOUNDS(array#$[], ndim%)

Retourne la taille du tableau array#$[] pour la dimension ndim%. Le résultat est la taille qui a été définie au préalable avec la commande DIM ou REDIM .
À titre d'abréviation vous pouvez utiliser LEN (array#$[]) au lieu de BOUNDS(array#$[], 0).

// BOUNDS()

DIM a[5][7]

   PRINT BOUNDS(a[], 0), 0, 100 // = 5
   PRINT LEN(a[]),       0, 120 // = 5, as above
   PRINT BOUNDS(a[], 1), 0, 140 // = 7
   SHOWSCREEN
   MOUSEWAIT

Refs:

LEN()


BOXCOLL

col% = BOXCOLL(xa%, ya%, sxa%, sya%, xb%, yb%, sxb%, syb%)

Vérifie si le rectangle au coin xa%, ya% de taille sxa%, sya% est en collision avec le rectange au coin xb%, yb% de taille sxb%, syb%. Si c'est le cas , col% sera TRUE, sinon, il sera FALSE.

exemple:

start:
MOUSESTATE mx, my, ba, bb
PRINT "X", 100, 100
PRINT "H", mx, my
IF BOXCOLL( mx, my, 16, 16, 100, 100, 16, 16)
    PRINT "!!!", 100, 150
ENDIF
SHOWSCREEN
GOTO start

Refs:

SPRCOLL()


BREAK

BREAK

La commande BREAK demande au programme de sortir du cours d'exécution d'une boucle FOR or WHILE . Dès que la déclaration BREAK est lue , le contrôle du programme passe à la ligne de code suivant NEXT (pour une boucle FOR) ou WEND (pour une boucle WHILE) .

FOR i=0 TO 10 STEP 2
    PRINT i, 0, 32*i
   IF i=6 THEN BREAK  // 8 and 10 will never print
NEXT

SHOWSCREEN
MOUSEWAIT

résultat :
0
2
4
6

Refs:

CONTINUE, FOR, WHILE


bXOR()

num% = bXOR(num1%, num2%)

Effectue l'opération booléen XOR sur les valeurs entières . Les chiffres sont de taille 32bits.

bXOR:

bXOR compare les codes binaires de num1% et num2% pour trouver des différences . Si la valeur d'un bit num1% diffère au bit correspondant à num2%, le bit résultant sera fixée à 1. Si les bits sont les mêmes, le résultat sera 0.

Binary code of num1% : 00100010
Binary code of num2% : 00100100
num1% bXOR num2% : 00000110

Example:

FOR a%=0 TO 1
 FOR b%=0 TO 1
  x = (a+b*2)*160
  PRINT "a="+a+" b="+b, x, 30

  PRINT "bAND="+bAND(a, b), x,  60
  PRINT "bOR ="+bOR (a, b), x,  80
  PRINT "bXOR="+bXOR(a, b), x, 100
  IF b=0 THEN PRINT "bNOT="+bNOT(a),    x, 120
 NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
a=0 b=0 a=1 b=0 a=0 b=1 a=1 b=1

bAND=0 bAND=0
bAND=0 bAND=1
bOR=0 bOR=1 bOR=1 bOR=1
bXOR=0 bXOR=1 bXOR=1
bXOR=0
bNOT=-1

Refs:

bAND()


BYREF

FUNCTION f: BYREF arg#$

Avec le modificateur "BYREF" vous pouvez passer une variable par référence . Normalement, quand vous appelez une fonction une copie de toute variable passée est prise à la fonction et la fonction utilise la copie . En utilisant la commande BYREF vous pouvez modifier la valeur réelle de la variable elle-même passée au sein de la fonction .
Les tableaux seront toujours passées par référence donc en utilisant BYREF l'argument de tableau est inutile.

Cette commande est seulement pour les utilisateurs avancés .

LOCAL b$
b$ = "XY"
foo(b$)

// print "test"
PRINT b$, 0,0
SHOWSCREEN
MOUSEWAIT

FUNCTION foo: BYREF a$
   a$ = "test"
ENDFUNCTION

Refs:

GLOBAL, LOCAL


CALLBACK

CALLBACK FUNCTION foo: args#$

La commande CALLBACK vous permet de créer des fonctions qui sont substituables . De cette façon, vous pouvez fournir un moyen par défaut de gérer les choses, mais aussi permettre à un fichier include d'appeler une fonction différente si elle est spécifiée.

Si la même fonction sans la commande CALLBACK existe dans le projet, elle sera utilisée partout où vous l'appeler . Si aucune existe, la fonction marquée CALLBACK sera exécutée .

SuperPrint("Hello World")

CALLBACK FUNCTION SuperPrint: a$
PRINT a$, 0,0
ENDFUNCTION

// Comment this out if you want only callback
FUNCTION SuperPrint: a$
LOCAL tx,ty
GETFONTSIZE tx, ty
   tx = tx * LEN(a$)
   DRAWRECT 0,0,tx,ty, RGB(0,0,255)
   PRINT a$, 0,0
ENDFUNCTION

Refs:

FUNCTION


CALLBYNAME()

ok# = CALLBYNAME( sub_name$ )

Cette commande permet d'appeler un sous-programme avec son nom sous forme de chaîne . Si vous ne voyez pas l'avantage, au lieu de cela utiliser plutot GOSUB !

La valeur de retour est soit TRUE ou FALSE, indiquant si le sous-programme existe ou non .

ok = CALLBYNAME("mysub")

SUB mysub:
   PRINT "Hello", 0,0
   SHOWSCREEN
   MOUSEWAIT
ENDSUB

GLBasic appelle un ensemble de sous-routines si elles existent :

GLB_ON_QUIT

Peu de temps avant que le programme quitte. Fermez simplement vos dossiers et RETURN dès que possible .

GLB_WIN32_MSG

Si un message de Windows est disponible. Lisez-le avec PeekMessage (... PM_NOREMOVE).

Refs:

GOSUB


CASE

SELECT n
CASE 3; ...
CASE >3; ...
CASE 2 TO 5; ...
DEFAULT; ...
ENDSELECT

La commande CASE fournit une expression pour être comparée à la valeur de n. Si la valeur de n remplit les conditions de la déclaration en cours d'évaluation CASE, le code-block suivant la déclaration CASE sera exécuté . Si plusieurs déclarations CASE correspondent aux exigences , seul le premier code-block correspondant sera exécuté .

DEFAULT (facultative ) est un type spécial de déclaration CASE . Si aucunes des déclarations CASE ne correspondent , le code-block de la déclaration DEFAULT (Si une case DEFAULT existe ) sera exécuté .

CASE exemples déclaration
-CASE 3
'n' doit être exactement 3
-CASE >3
'n' doit être plus grand que 3
-CASE 2 TO 5
'n' doit être d'au moins 2 et pas plus de 5
-DEFAULT
Aucun des énoncés ci-dessus correspondent à 'n'

Example:

// SELECT CASE DEFAULT ENDSELECT

FOR n=0 TO 10

PRINT "n="+n, 100, 100

  SELECT n
  CASE 7
   PRINT "n="+n+": CASE 7", 0, n*10
  CASE >9
   PRINT "n="+n+": CASE >9", 0, n*10
  CASE >3
   PRINT "n="+n+": CASE >3", 0, n*10
  CASE 3 TO 8
   PRINT "n="+n+": CASE 3 TO 8", 0, n*10
  DEFAULT
   PRINT "n="+n+": DEFAULT" style="color:white;">, 0, n*10
 ENDSELECT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
n=0: DEFAULT
n=1: DEFAULT
n=2: DEFAULT
n=3:
CASE 3 TO 8
n=4: CASE >3
n=5: CASE >3
n=6: CASE >3
n=7:
CASE 7
n=8: CASE >3
n=9: CASE >3
n=10: CASE >9

Refs:

DEFAULT, ENDSELECT, SELECT


CATCH

TRY
...
IF ... THEN THROW "Error"
...
CATCH err$
DEBUG err$ + "\n"
ASSERT 0
FINALLY
...

Les commandes TRY/THROW/CATCH/FINALLY sont utilisées pour tester si une section de code fonctionne, et d'effectuer une action si il ne fonctionne pas.

La commande CATCH lance un bloc de code qui capture toute erreur qui a été lancée. Dans ce bloc de code vous feriez quelque chose avec le message d'erreur qui est passé de la commande THROW .
La commande CATCH peut intercepter des exceptions au sein de fonctions imbriquées .
CATCH doivent être placés dans le block TRY/FINALLY .

TRY
   FOR i=0 TO 5
      STDOUT "call "+i+"\n"
      int_div_by_2(i)
   NEXT
CATCH err$
   STDERR "Exception: " + err$ + "\n"
FINALLY

STDOUT "ok, done\n"
KEYWAIT
END

FUNCTION int_div_by_2: number%
   IF MOD(number%, 2)<>0 THEN THROW "Odd: "+number%
   STDOUT "dividing "+number%+"\n"
   RETURN number / 2
ENDFUNCTION

Refs:

FINALLY, THROW, TRY


CHR$()

string$ = CHR$(num%)

Renvoie la lettre correspondant à la valeur ASCII de num%.

PRINT CHR$(0x61), 100, 100 // a
SHOWSCREEN
MOUSEWAIT

// Dec Hx Char Dec Hx Char  Dec Hx Char  Dec Hx Char
// ----------- -----------  -----------  -----------
//   0  0 NUL  32 20 SPACE  64 40 @      96 60 `
//   1  1 SOH  33 21 !      65 41 A      97 61 a
//   2  2 STX  34 22 "      66 42 B      98 62 b
//   3  3 ETX  35 23 #      67 43 C      99 63 c
//   4  4 EOT  36 24 $      68 44 D     100 64 d
//   5  5 ENQ  37 25 %      69 45 E     101 65 e
//   6  6 ACK  38 26 &      70 46 F     102 66 f
//   7  7 BEL  39 27 '      71 47 G     103 67 g
//   8  8 BS   40 28 (      72 48 H     104 68 h
//   9  9 TAB  41 29 )      73 49 I     105 69 i
//  10  A LF   42 2A *      74 4A J     106 6A j
//  11  B VT   43 2B +      75 4B K     107 6B k
//  12  C FF   44 2C ,      76 4C L     108 6C l
//  13  D CR   45 2D -      77 4D M     109 6D m
//  14  E SO   46 2E .      78 4E N     110 6E n
//  15  F SI   47 2F /      79 4F O     111 6F o
//  16 10 DLE  48 30 0      80 50 P     112 70 p
//  17 11 DC1  49 31 1      81 51 Q     113 71 q
//  18 12 DC2  50 32 2      82 52 R     114 72 r
//  19 13 DC3  51 33 3      83 53 S     115 73 s
//  20 14 DC4  52 34 4      84 54 T     116 74 t
//  21 15 NAK  53 35 5      85 55 U     117 75 u
//  22 16 SYN  54 36 6      86 56 V     118 76 v
//  23 17 ETB  55 37 7      87 57 W     119 77 w
//  24 18 CAN  56 38 8      88 58 X     120 78 x
//  25 19 EM   57 39 9      89 59 Y     121 79 y
//  26 1A SUB  58 3A :      90 5A Z     122 7A z
//  27 1B ESC  59 3B ;      91 5B [     123 7B {
//  28 1C FS   60 3C <      92 5C \     124 7C |
//  29 1D GS   61 3D =      93 5D ]     125 7D }
//  30 1E RS   62 3E >      94 5E ^     126 7E ~
//  31 1F US   63 3F ?      95 5F _     127 7F DEL

Refs:

ASC(), MID$()


CLOSEFILE

CLOSEFILE channel%

Ferme un fichier qui a été ouvert avec la commande OpenFile . Les fichiers doivent être fermés une fois que votre programme a terminé de les utiliser afin qu'ils puissent êtres accessibles à partir d'autres programmes ou par GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE()


CODEFILE$()

file$ = CODEFILE$()

Retourne le nom du fichier d'entrée GLBasic .

Example:

PRINT "CODEFILE = "+CODEFILE$(),0,0
SHOWSCREEN
MOUSEWAIT

résultat:
CODEFILE = testfile.gbas

Refs:

CODELINE()


CODELINE()

line% = CODELINE%()

Retourne le numéro de ligne du fichier d'entrée GLBasic.

PRINT "CODELINE Example program.",0,0
PRINT "CODELINE = "+CODELINE(),0,10
SHOWSCREEN
MOUSEWAIT

Output:
CODELINE Example program.
CODELINE = 2

Refs:

CODEFILE$()


CONTINUE

CONTINUE

Continue du courante boucle FOR ou WHILE comme si NEXT ou WEND était atteint .

FOR i=0 TO 10 STEP 2
   IF i=6 THEN CONTINUE  // 6 will never print
    PRINT i, 0, 32*i
NEXT

SHOWSCREEN
MOUSEWAIT

résultat :
0
2
4
8
10

Refs:

BREAK, FOR, NEXT, WEND, WHILE


CopyFile

CopyFile $ source, $ dest

Copie un fichier à partir d'un périphérique local à un autre. Vous ne pouvez pas copier des fichiers au même endroit.

/ / Backup
f $ = FILEREQUEST $ ( TRUE,   "*.*" )
CopyFile f $, f $ + ». bak"
FIN

Refs:

DoesFileExist () , FILEREQUEST $ () , GetFile , Killfile , PUTFILE


COS()

a=COS(angle#)

Retourne le cosinus d'un angle# en degrés (0-360°).

Le résultat sera dans la plage -1 to +1.

exemple:

// Circle flight of an X
FOR alpha=0 TO 360
    PRINT "X", 150*SIN(alpha) + 150, 150*COS(alpha) +150
    SHOWSCREEN
NEXT

Refs:

SIN()


CREATEDIR()

ok% = CREATEDIR(dir$)

Crée un nouveau répertoire de fichier . ok% indique si le répertoire aura pu être crée (TRUE) ou non (FALSE).

Example:

ok = CREATEDIR("testdir")
IF ok = TRUE
   PRINT "Directory was created",0,0
ELSE
   PRINT "Directory was not created",0,0
ENDIF
SHOWSCREEN
MOUSEWAIT

Le répertoire créé par cet exemple sera située dans le dossier "appname.app" .

Refs:

DOESFILEEXIST(), GETCURRENTDIR$(), SETCURRENTDIR()


CREATESCREEN

CREATESCREEN id_screen%, id_sprite%, w%, h%

Crée un écran virtuel caché . Lorsque vous dessinez sur l'écran , la sortie sera appliquée sur le sprite id_sprite%. Ainsi, vous pouvez très rapidement utiliser une texture en créant un écran qui pointe vers une image de texture.
L'écran et le sprite aura les dimensions w% x h% (largeur x hauteur).

id_screen% doit être l'un des 32 écrans virtuels et ainsi doit être dans la fourchette de 0 à 31. Screen -1 est le tampon arrière plan.

GLBasic utilise l'OpenGL extension GL_EXT_framebuffer_object pour de réelles implémentations OpenGL. Cette extension peut causer des problèmes sur certains (généralement vieux) systèmes . Dans ce cas , GLBasic fournira encore les fonctionnalités CREATESCREEN mais il peut devenir lent et la taille de l'écran peut être limitée aux la taille de la fenêtre physique.

Utiliser PLATFORMINFO$("GLEX:glBindFramebufferEXT") pour vérifier si votre carte prend en charge la version accélerée - il renverra 1 si elle est soutenue .

// CREATESCREEN
PRINT "Monitor", 0,0
GRABSPRITE 1, 0,0,32,32

// Screen 0, Sprite 13
CREATESCREEN 0, 13, 128,128
// Use screen for all output
USESCREEN 0
   PRINT "Offscreen", 0,0
   DRAWSPRITE 1,0,32
// Switch back to the window
USESCREEN -1

// Draw the screen
DRAWSPRITE 13, 100,100
SHOWSCREEN
MOUSEWAIT

Refs:

GRABSPRITE, USEASBMP, USESCREEN


DATA

DATA data1#$, data2#$, ...

La commande DATA est utilisé en conjonction avec les commandes RESTORE et READ pour définir les données de votre programme sans exiger qu'elle soit dans un fichier externe .

Contrairement à DIMDATA, les données doivent être statiques , vous ne pouvez par avoir des variables et leur valeurs.
Un bloc DATA peut être placé à l'extérieur d'une fonction.

Example:

RESTORE name
READ a  // returns 1
READ b  // returns 2
READ a$, b$, c, d // returns "x", "y", 3, 4
PRINT a+", "+b+", "+a$+", "+b$+", "+c+", "+d, 0,0

SHOWSCREEN
MOUSEWAIT
READ xxx // Error - out of data

STARTDATA name:
   DATA 1,2
   DATA "x", "y", 3,4
ENDDATA

Output:
1, 2, x, y, 3, 4

Refs:

DIMDATA, ENDDATA, READ, RESTORE, STARTDATA


DEBUG

DEBUG text#$

Ecrire du texte sur la fenêtre de sortie GLBasic . Dans la Version (non-debug) , la commande DEBUG est ignorée lors de la compilation . Par conséquent, aucune diminution de la vitesse du code ne seront engagée par la commande DEBUG.
Si vous voulez écrire sur une nouvelle ligne lors dans votre sortie, vous devez imprimer le caractère "\ n".

c$ = GETCURRENTDIR$()
DEBUG "Dir="+c$+"\n"

Refs:

PRINT


DEC

DEC x##, [num#$=1]
DEC x$$, num#$

Diminue la valeur de la variable x## ou x$$ de la valeur 'num#$'. Cela fonctionne évidemment aussi avec des variables de tableaux .

a = 100
DIM b[5]
b[3] = 200
DEC a, 5
DEC b[3], 5
PRINT a, 100, 100
PRINT b[3], 100, 120
SHOWSCREEN
MOUSEWAIT

résultat:
95
200

Note : Si num n'est pas donné, alors la valeur de la variable est diminué de 1

Refs:

INC


DEFAULT

SELECT n
CASE 3; ...
CASE >3; ...
CASE 2 TO 5; ...
DEFAULT; ...
ENDSELECT

La commande DEFAULT est un type spécial (OPTIONELLE) de déclaration CASE . Si dans un code-block SELECT aucun des cas n'est valide , la déclaration DEFAULT (si un cas par défaut existe ) sera exécutée .

Example:

// SELECT CASE DEFAULT ENDSELECT

FOR n=0 TO 10

PRINT "n="+n, 100, 100

  SELECT n
  CASE 7
   PRINT "n="+n+": CASE 7", 0, n*10
  CASE >9
   PRINT "n="+n+": CASE >9", 0, n*10
  CASE >3
   PRINT "n="+n+": CASE >3", 0, n*10
  CASE 3 TO 8
   PRINT "n="+n+": CASE 3 TO 8", 0, n*10
  DEFAULT
   PRINT "n="+n+": DEFAULT" style="color:white;">, 0, n*10
 ENDSELECT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
n=0: DEFAULT
n=1: DEFAULT
n=2: DEFAULT
n=3:
CASE 3 TO 8
n=4: CASE >3
n=5: CASE >3
n=6: CASE >3
n=7:
CASE 7
n=8: CASE >3
n=9: CASE >3
n=10: CASE >9

Refs:

CASE, ENDSELECT, SELECT


DELETE

DELETE item

Cette commande supprime l'entrée de l'«objet» dans un bloc FOREACH/NEXT actuellement utilisé.
Directement après, la boucle se poursuit par le haut après avoir fait disparaître l'«objet» .
Ainsi, il est équivalent à :

DIMDEL array[], index
CONTINUE

exemple:

// Make an array of numbers
DIMDATA a[], 3,4,5,  12,13,  6

// Enumerate the numbers
FOREACH num IN a[]
   // throw out numbers bigger than 10, and continue
   IF num>10 THEN DELETE num
   a$=a$ + num + ", "
NEXT
PRINT a$, 0,0

SHOWSCREEN
MOUSEWAIT

résultat:
18

Refs:

DIMDEL, FOREACH


DIM

DIM array#$ [d1#] | [d2#] [d3#] [d4#]

Crée un tableau de mémoire pour numéros / textes / types. A la création, chaque valeur de données unique (pour les nombres et les textes) seront mis à 0 . Le premier élément est l'indice 0.

Avec DIM a[0] vous libérer la mémoire allouée pour la rangée 'a'.

Pour garder le tableau de la même dimension mais effacer le contenu de chaque tableau, utiliser REDIM a[0].

*Note*, un tableau ne pas avoir plus de 4 dimensions

exemple:

DIM array[8][8]
FOR x=0 TO 7
    FOR y=0 to 7
        array[x][y] = x*100 + y
    NEXT
NEXT

PRINT array[4][5], 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DELETE, DIMDATA, DIMDEL, DIMPUSH, REDIM


DIMDATA

DIMDATA array#$[], data1#$, data2#$, ...

Permet l'initialisation d'un tableau avec des valeurs. La commande :

DIMDATA array[], 34, 45

est identique à :

DIM array[2]
array[1]=34
array[2]=45

Refs:

DIM, DIMDEL, REDIM


DIMDEL

DIMDEL array#$[], index%

Supprime l'entrée 'index#$' de 'array'. Toutes les mentions suivantes seront déplacées vers le haut. Peu importe combien de dimensions a le tableau .

Si index% est négatif , il sera donc décompté de la fin du tableau.

DIMDEL a[], -1

va supprimer le dernier élément.

Pour une meilleure compréhension. Ce tableau :

DIM a[3][2]
a[0][0] =  0
a[0][1] =  1
a[1][0] = 10
a[1][1] = 11
a[2][0] = 20
a[2][1] = 21
DIMDEL a[], 1

devra ensuite ressembler à :

a[0][0] =  0
a[0][1] =  1
a[1][0] = 20
a[1][1] = 21

Un exemple pour une utilisation simple. Ici, vous pouvez créer des étoiles avec le bouton gauche de la souris et les supprimer avec le bouton droit de la souris .

// StarMaker
// -----------------------
LOCAL mx, my, b1, b2, best
DIM star[0][2]
mousedown = FALSE

// Main Loop
WHILE TRUE
   MOUSESTATE mx, my, b1, b2
   // Mouse pointer
   PRINT "<=", mx, my
   // Click+Release
   IF b1=FALSE AND b2=FALSE THEN mousedown=FALSE
   IF mousedown
      b1=FALSE
      b2=FALSE
   ENDIF
   IF b1 OR b2 THEN mousedown=TRUE

   // Left = add, Right = delete
   IF b1 THEN AddStar(mx,my)
   IF b2 THEN DelStar(mx,my)

   // find nearest star
   best = Nearest(mx, my)
   // Show all stars
   FOR i=0 TO BOUNDS(star[],0)-1
      // highlight nearest
      IF best = i
         PRINT "*", star[i][0], star[i][1]
      ELSE
         PRINT "+", star[i][0], star[i][1]
      ENDIF
   NEXT
   SHOWSCREEN
WEND

// -----------------------------------
// DELSTAR
// Delete a star
// -----------------------------------
FUNCTION DelStar: x,y
LOCAL i
   i = Nearest(x,y)
   // Magic!
   IF i>=0 THEN DIMDEL star[], i
ENDFUNCTION

// -----------------------------------
// ADDSTAR
// Add a star
// -----------------------------------
FUNCTION AddStar: x,y
LOCAL m
   m = BOUNDS(star[], 0)
   REDIM star[m+1][2]
   star[m][0] = x
   star[m][1] = y
ENDFUNCTION

// -----------------------------------
// NEAREST
// Find the nearest star to x,y
// -----------------------------------
FUNCTION Nearest: x,y
LOCAL best, bestdist, dist, i, dx, dy
   best = -1
   FOR i=0 TO BOUNDS(star[],0)-1
      dx = x-star[i][0]
      dy = y-star[i][1]
      dist = SQR(dx*dx + dy*dy)
      IF i=0 OR dist<bestdist
         bestdist = dist
         best = i
      ENDIF
   NEXT
   RETURN best
ENDFUNCTION

Refs:

DELETE, DIM, REDIM


DIMPUSH

DIMPUSH array[], entry

Cette commande ajoute une entrée à la fin d'un tableau unidimensionnel . Le tableau ne peut être un tableau de TYPEs.

C'est tout simplement une écriture plus courte de :

m=BOUNDS(array[], 0)
REDIM array[m+1]
array[m] = entry

Refs:

DIM, DIMDATA, DIMDEL, REDIM


DOESDIREXIST()

ok% = DOESDIREXIST(directory$)

Vérifie si le répertoire existe . Retourne TRUE ou FALSE.

Example:

ok = DOESDIREXIST("testdir")
IF ok = TRUE
   PRINT "Directory exists",0,0
ELSE
   PRINT "Directory does not exist",0,0
ENDIF
SHOWSCREEN
MOUSEWAIT

Output:
Directory does not exist

Refs:

DOESFILEEXIST(), GETCURRENTDIR$(), GETFILELIST()


DOESFILEEXIST()

ok#=DOESFILEEXIST(file$)

Détermine si file$ existe.

exemple:

ok=DOESFILEEXIST("test.txt")
IF ok
 PRINT "Test.txt exists", 100, 100
ELSE
 PRINT "Test.txt does not exist", 100, 100
ENDIF

Refs:

COPYFILE, DOESDIREXIST(), FILEREQUEST$(), GETCURRENTDIR$(), GETFILE, PUTFILE


DRAWANIM

DRAWANIM id%, anim%, x%, y%

Appelle le cadre "frame" d'animation anim% du numéro de sprite id% à la position x%, y%.

LOADANIM "test.bmp", 0, 32,32
FOR x=0 TO 16
   FOR y=0 TO 16
      DRAWANIM 0, x + y*16, 36*x, 36*y
   NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE, LOADSPRITE, ROTOZOOMANIM, STRETCHANIM


DRAWLINE

DRAWLINE sx%, sy%, ex%, ey%, color%

Trace une ligne de (sx%, sy%) à (ex%, ey%) avec la couleur color%.

Sample:

DRAWLINE 100, 100, 250, 100, RGB(0, 255, 255) // Cyan
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWRECT, RGB(), SETPIXEL


DRAWRECT

DRAWRECT sx%, sy%, w%, h%, color%

Dessine un rectangle rempli avec la couleur donnée . Le coin supérieur gauche = (sx%, sy%), largeur =w% et la hauteur =h%.

exemple:

DRAWRECT 50, 0, 50, 120, RGB(255, 255, 0) // Yellow
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWLINE, RGB(), SETPIXEL


DRAWSPRITE

DRAWSPRITE num%, x%, y%

Une image sprite sera affichée sur le tampon arrière . Vous pouvez utiliser la même image num% plusieurs fois pour afficher plusieurs copies du même sprite .

DRAWSPRITE

Dessine le sprite avec le Numéro ID num% à la position x% et y%.

Sample:

LOADSPRITE "sprite.bmp", 0
DRAWSPRITE 0, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWANIM, LOADSPRITE, POLYVECTOR, ROTOSPRITE, ROTOZOOMSPRITE, SMOOTHSHADING, STRETCHSPRITE, ZOOMSPRITE


ELSE

IF a#$ = < <= > >= <> b#$
...
| ELSEIF ...
| ...
| ELSE
| ...
ENDIF

ou:

Une déclaration ELSE indique le début d'un bloc de code à l'intérieur d'une instruction IF . Ce bloc de code sera exécuté si la condition vérifiée par l' instruction IF est évaluée fausse.

exemple:

a=5; b=3

IF a < b
    PRINT "a < b", 100, 100
ELSE
    PRINT "a < b is FALSE" style="color:white;">, 100, 100
ENDIF

IF a<>b THEN PRINT "a is not b", 100, 150

SHOWSCREEN
MOUSEWAIT

résultat:
a < b is FALSE
a is not b

Refs:

DEFAULT, ELSEIF, ENDIF, IF


ELSEIF

IF a#$ = < <= > >= <> b#$
...
| ELSEIF ...
| ...
| ELSE
| ...
ENDIF

or:

IF a#$ = < <= > >= <> b#$ THEN ...

Une déclaration ELSEIF contient une nouvelle condition à être évaluée dans l'exemple quand le condition initiale est évaluée Fausse . Elle marque aussi le début d'un bloc de code à exécuter dans le cas où cette nouvelle condition est évaluée Vraie.

IF a>5
   PRINT "a>5", 0,0
ELSEIF b>5
   PRINT "a<=5, but b>5", 0,0
ELSE
   PRINT "Neither a nor b > 5", 0,0
ENDIF

Vous pouvez utiliser la commande THEN Si vous souhaitez exécuter une seule commande si la condition est TRUE.

exemple:

a=5; b=3

IF a < b
    PRINT "a < b", 100, 100
ELSE
    PRINT "a < b is FALSE" style="color:white;">, 100, 100
ENDIF

IF a<>b THEN PRINT "a is not b", 100, 150

SHOWSCREEN
MOUSEWAIT

résultat:
a < b is FALSE
a is not b

Refs:

DEFAULT, ELSE, ENDIF, IF


END

END

Termine le programme .

exemple:

END  // Everything else won't be evaluated
PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

GOTO, RETURN


ENDDATA

ENDDATA

La commande ENDDATA met fin à un bloc STARTDATA .

Example:

RESTORE name
READ a  // returns 1
READ b  // returns 2
READ a$, b$, c, d // returns "x", "y", 3, 4
PRINT a+", "+b+", "+a$+", "+b$+", "+c+", "+d, 0,0

SHOWSCREEN
MOUSEWAIT
READ xxx // Error - out of data

STARTDATA name:
   DATA 1,2
   DATA "x", "y", 3,4
ENDDATA

Output:
1, 2, x, y, 3, 4

Refs:

DATA, DIMDATA, READ, RESTORE, STARTDATA


ENDFUNCTION

ENDFUNCTION

La commande ENDFUNCTION termine un bloc de code FUNCTION .

exemple:

// Function

// Sample shows the usage of the commands
// FUNCTION / ENDFUNCTION / EXIT
// Due to the complicated syntax of a function
// the command 'New Function' should be used
// from the 'Project' menu to create a function.
GLOBAL a
LOCAL a

 Title() // Title line

 a$=Right$("123456",  2); // 56
  PRINT a$, 100, 80

 a=7; b=12; GLOBAL a=15
 c=Maximum(a, b) // 7, 12
 Center("c="+c, 100) // 12
 Center ("a="+a, 140) // 7
 Center("b="+b, 180) // 12
 Center("GLOBAL a="+GLOBAL a, 220) // 0 (function: Max)
SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  MAX - größere Zahl(a, b) / bigger number(a, b) #=-
// ------------------------------------------------------------- //
FUNCTION Maximum: a, b
 // These variables are defined LOCAL:
 // a, b
LOCAL ret
 IF a>b
  ret=a
 ELSE
  ret=b
 ENDIF
 // This has no influence on the global variables
 a=0
 // This will
 GLOBAL a=0
RETURN ret
ENDFUNCTION // MAX

// ------------------------------------------------------------- //
// -=#  CENTER  - Center text #=-
// ------------------------------------------------------------- //
FUNCTION Center: text$, y
 // Diese Variablen sind als LOCAL definiert:
 // There variables are defined LOCAL:
  // text$, y
 PRINT text$, (640-LEN(text$)*16)/2, y
ENDFUNCTION // CENTER

// ------------------------------------------------------------- //
// -=#  TITLE  #=-
// ------------------------------------------------------------- //
FUNCTION Title:
 // There variables are defined LOCAL:
  // retval
  Center("Yippie", 50)     // Function call within a function
 RETURN                       // Exit the function
 PRINT "Boo hoo", 100, 100  // Never happens
ENDFUNCTION // NAME

// A Function with a string as a return value
// ------------------------------------------------------------- //
// -=#  RIGHT$  #=-
// ------------------------------------------------------------- //
FUNCTION Right$: word$, size
 // These values are defined LOCAL:
 // word$, size
 RETURN MID$(word$, LEN(word$)-size, size)
ENDFUNCTION// RIGHT$

Output:
56
Yippie
c=12
a=7
b=12
GLOBAL a=0

Refs:

FUNCTION


ENDIF

IF a#$ = < <= > >= <> b#$
...
| ELSEIF ...
| ...
| ELSE
| ...
ENDIF

Une déclaration ENDIF met fin à un bloc d'instructions IF.

Sample:

a=5; b=3

IF a < b
    PRINT "a < b", 100, 100
ELSE
    PRINT "a < b is FALSE" style="color:white;">, 100, 100
ENDIF

IF a<>b THEN PRINT "a is not b", 100, 150

SHOWSCREEN
MOUSEWAIT

Output:
a < b is FALSE
a is not b

Refs:

DEFAULT, ELSE, ELSEIF, IF


ENDINLINE

ENDINLINE

Cette commande met fin à un bloc de code INLINE . GLBasic cesse d'être un langage de programmation facile en utilisant la commande INLINE !

// INLINE

LOCAL C
C = 41
INLINE
   C++;
ENDINLINE

PRINT "C="+C, 100, 100

Output:
C=42

Refs:

INLINE


ENDOFFILE()

ok% = ENDOFFILE(channel%)

Indique si vous avez atteint la fin du fichier en cours d'accès (i.e. pas plus de données lisible à partir du fichier ).

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, FILEPOSITION, FILESEEK, OPENFILE()


ENDPOLY

ENDPOLY

ENDPOLY ferme un bloc STARTPOLY .
Il doit y avoir au moins 3 appels POLYVECTOR entre-deux STARTPOLY et ENDPOLY sinon aucun domaine n'est précisé et rien ne sera considéré .
Entre STARTPOLY et ENDPOLY aucun appel DRAWSPRITE ou PRINT n'est autorisé . Si vous utilisez DRAWSPRITE ou la fonction PRINT, le résultats n'est pas garanti et des pannes du système peuvent se produire!

Sample:

// POLYSPRITES

LOADSPRITE "Block.bmp", 0 // 64x64 Bitmap
LOADBMP "Test.bmp"
 STARTPOLY 0 // Bitmap = No.0
  POLYVECTOR  0,   0,  0,  0, RGB(255, 255, 255)
  POLYVECTOR   0, 300,  0, 64, RGB (255, 255, 255)
  POLYVECTOR 300, 300, 64, 64, RGB(255, 255, 255)
  POLYVECTOR 250,  50, 64,  0, RGB(  0, 255,   0)
 ENDPOLY
  SHOWSCREEN
  MOUSEWAIT

Refs:

POLYVECTOR, STARTPOLY


ENDSELECT

SELECT n
CASE 3; ...
CASE >3; ...
CASE 2 TO 5; ...
DEFAULT; ...
ENDSELECT

La commande ENDSELECT termine le bloc d'instructions SELECT .

Example:

// SELECT CASE DEFAULT ENDSELECT

FOR n=0 TO 10

PRINT "n="+n, 100, 100

  SELECT n
  CASE 7
   PRINT "n="+n+": CASE 7", 0, n*10
  CASE >9
   PRINT "n="+n+": CASE >9", 0, n*10
  CASE >3
   PRINT "n="+n+": CASE >3", 0, n*10
  CASE 3 TO 8
   PRINT "n="+n+": CASE 3 TO 8", 0, n*10
  DEFAULT
   PRINT "n="+n+": DEFAULT" style="color:white;">, 0, n*10
 ENDSELECT
NEXT
SHOWSCREEN
MOUSEWAIT

Output:
n=0: DEFAULT
n=1: DEFAULT
n=2: DEFAULT
n=3:
CASE 3 TO 8
n=4: CASE >3
n=5: CASE >3
n=6: CASE >3
n=7:
CASE 7
n=8: CASE >3
n=9: CASE >3
n=10: CASE >9

Refs:

CASE, DEFAULT, SELECT


ENDSUB

SUB name:
...
ENDSUB

...
GOSUB name

La commande ENDSUB signale la fin du bloc de code de la sous-routine .
l'instruction SUB peut être arretée si nécessaire avant l'instruction ENDSUB la déclaration est exécutée en utilisant la commande RETURN .

// GOSUB subcode; <-> RETURN;

a$="-"
GOSUB Setup
PRINT a$, 0, 0
SHOWSCREEN
MOUSEWAIT
// End of main program

// From here on just SUBs
// No more code out of SUB and ENDSUB

SUB Setup:
  a$="Setup_Complete"
  RETURN          // Back to GOSUB call
  a$="Das erscheint nie / This won't appear"
ENDSUB

Output:
Setup_Complete

Refs:

GOSUB, SUB


EXPORT

EXPORT function_name

Si vous créez une DLL, cette commande expose la fonction pour l'interface public . Le fichier wrapper-gbas sera aussi apporté .

FUNCTION foo: bar

ENDFUNCTION

EXPORT foo


FILEPOSITION

pos% = FILEPOSITION(channel%)

Retourne la position actuelle de la lecture dans un fichier. La valeur retournée donne un nombre d'octets à partir du début du fichier.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILESEEK, OPENFILE()


FILEREQUEST$()

file$=FILEREQUEST$(open#, filter$)

Ferme la fenêtre en cours et affiche un dossier de demande de dialogue qui permet à l'utilisateur de rechercher un nom de fichier .

open: TRUE - Ouvrez le dossier de dialogue / FALSE - Enregistrer le fichier de dialogue
filter$: Un filtre défini par l'utilisateur pour la boîte de filtre . Séparés par '|' (ou -sign)
Examples:
"Text |*.txt;*.asc"
"Text *.txt|*.txt|All Files *.*|*.*"

Sample:

file$=FILEREQUEST$(TRUE, "Text|*.txt|All|*.*")
PRINT file$, 0, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DOESFILEEXIST(), GETCURRENTDIR$(), GETFILE, LOADBMP, LOADFONT, LOADSOUND, LOADSPRITE, PUTFILE


FILESEEK

FILESEEK channel%, bytes%, direction%

Positionne la lecture dans un fichier à l'adresse mémoire en % bytes octets .
La valeur de direction% détermine la position relative à :
-1 : bytes% de la fin du fichier .
0 : bytes% depuis le début du fichier .
1 : bytes% de la position actuelle lue .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE()


FINALLY

TRY
...
IF ... THEN THROW "Error"
...
CATCH err$
DEBUG err$ + "\n"
ASSERT 0
FINALLY
...

Les commandes TRY/THROW/CATCH/FINALLY sont utilisées pour tester si une section de code fonctionne, et pour effectuer une action si il ne marche pas.

La commande FINALLY termine le bloc CATCH . Si votre code ne provoque pas une erreur sinon le bloc de code entre CATCH et FINALLY est sauté .
La commande FINALLY termine aussi le bloc TRY .

TRY
   FOR i=0 TO 5
      STDOUT "call "+i+"\n"
      int_div_by_2(i)
   NEXT
CATCH err$
   STDERR "Exception: " + err$ + "\n"
FINALLY

STDOUT "ok, done\n"
KEYWAIT
END

FUNCTION int_div_by_2: number%
   IF MOD(number%, 2)<>0 THEN THROW "Odd: "+number%
   STDOUT "dividing "+number%+"\n"
   RETURN number / 2
ENDFUNCTION

Refs:

CATCH, THROW, TRY


FINDPATH()

found% = FINDPATH ( map#[], solution#[], heuristic#, startx%, starty%, endx%, endy%)

FINDPATH recherche dans une map map#[] pour un chemin d'accès startx%, starty% à endx%, endy%. Un algorithme A* qui peut prendre des coûts de l'utilisation des chemins différents en considération est utilisés . Une valeur supérieure à un endroit donné de la map va coûter plus cher et doit être évitée. Un valeur de 0 et plus petit est considéré comme infranchissable. Findpath recherche la map en 4 Itinéraire seulement, elle ne calcule pas les chemins en diagonale.

Curseur heuristique, vous pouvez spécifier si l'itinéraire le plus court (= 0.0) ou la route avec les coûts les plus bas (= 1,0) doit être calculé. Vous pouvez utiliser les valeurs intermédiaires 0 et 1 pour avoir un compromis entre les deux.
Imaginez, essayer de rejoindre un côté d'une haute montagne à l'autre. Le plus court chemin est droit au-dessus,mais il vous faudra beaucoup d'efforts (à savoir le "coût"), le plus bas coût est de prendre le terrain plat agréable autour de la montagne, pas en termes de distance voyagée, mais plus facile.

La valeur de retour de FINDPATH() est la longueur de la voie trouvée .

Si un chemin a été trouvé, le tableau solution#[] contient un tableau à 2 dimensions . Le premier index indique le numéro de l'étape . Le second à x (=index 0) et à y (=index 1) Valeur de l'étape de position

.

Cet exemple montre comment l'utiliser .

// --------------------------------- //
// Project:
// Start: Tuesday, September 23, 2003
// IDE Version: 1.30923

// Change this value for more/less terrain
MAXX = 500

MAXY = MAXX/2

scalex = 640 / MAXX
scaley = 320 / MAXY

DIM map[MAXX][MAXY]
DIM solution[0]

FOR x=0 TO MAXX-1; FOR y=0 TO MAXY-1; map[x][y]=100; NEXT; NEXT
FOR i=0 TO MAXX*MAXY*4; map[RND(MAXX-1)][RND(MAXY-1)] = RND(25); NEXT
FOR i=0 TO MAXY*.5; map[i+1][i] = 0; map[i+MAXY/2][MAXY-i-1]=0; NEXT

 good = FINDPATH(map[], solution[], .3,  0,0,  MAXX-1, MAXY-1)
 // Draw the map
 FOR x=0 TO MAXX-1; FOR y=0 TO MAXY-1; DRAWRECT x*scalex, y*scaley, scalex, scaley, RGB(255*(1-map[x][y]), 255*map[x][y], 0); NEXT; NEXT

 IF good
  PRINT "Found a solution!", 0, 400
  x=0; y=0
  FOR i=0 TO BOUNDS(solution[], 0)-1
   xl = x
   yl = y
   x = solution[i][0]
   y = solution[i][1]
   DRAWLINE xl*scalex+scalex/2, yl*scaley+scaley/2, x*scalex+scalex/2, y*scaley+scalex/2, RGB(0, 0, 255)
  NEXT
 ELSE
  PRINT "No solution found!?", 0, 400
 ENDIF

 SHOWSCREEN
 MOUSEWAIT
END


FMOD()

frac# = FMOD(num#$, div#$)

Retourne le reste d'une division , même si elle a un chiffres à virgule .

Example:

result=FMOD (5,3)
PRINT "result="+result,0,0
SHOWSCREEN
MOUSEWAIT

Output:
result=2

Refs:

MOD()


FOR

FOR counter# = start# TO end# |STEP steps#|
...
NEXT

La fonction FOR NEXT est utilisée pour produire une boucle dans le programme, avec les paramètres définis. A chaque cycle, <variable> est incrémentée de 1 (ou d'une valeur correspondant au pas indiqué dans STEP#). Le première valeur de Counter# est Start#. La boucle est interrompue dès que la valeur de Counter est supérieure à la valeur de End#. .
La déclaration BREAK fera immédiatement interrompre la boucle et continuer à exécuter le code immédiatement après NEXT.
La déclaration CONTINUE placé quelque part dans la boucle demandera au programme de se comporter comme il venait de lire NEXT.

Exemple:

FOR i=0 TO 10 STEP 2
    PRINT i, 100, 32*i
NEXT

SHOWSCREEN
MOUSEWAIT

Output :
0
2
4
6
8
10

Refs:

BREAK, CONTINUE, GOTO, STEP, TO, WHILE


FORCEFEEDBACK

FORCEFEEDBACK nJoy#, duration#, x_motor#, y_motor#

Active une force sur la manette à retour de force numérotée nJoy#. La durée duration# est réglé en millisecondes . Un nouvel appel à FORCEFEEDBACK reinitialisera les réglages en cours. moteur # est une valeur de -1 à 1 et indique le pouvoir de la force (-1 est habituellement vers la gauche, +1 est à droite).

Si l'appareil a seulement une fonction bruit, établir des valeurs à 1 l'activera .

Vous pouvez également définir l'un des moteurs à 1, et -1 interchangeable pour provoquer un véritable joystick à retour de force ou pour émuler une fonction de vibration - rester conscient que ce n'est pas bon pour le matériel joystick .

// --------------------------------- //
// Project: ForceFeedback - Test
// IDE Version: 2.50107

LIMITFPS 50 // 20 ms / frame
id = 0
WHILE TRUE
   jx = GETJOYX(id)
   jy = GETJOYY(id)
   PRINT "+", 160, 160
   PRINT "X", jx*160+160, jy*160+160
   FORCEFEEDBACK id, 21, jx, jy
   SHOWSCREEN
WEND

Refs:

GETJOY...(), JOYSTATE


FOREACH

FOREACH ref IN field[]
...
NEXT

Avec l'instruction FOREACH vous pouvez parcourir un tableau rapidement et effectuer une opération sur chaque point .
Au cours de la boucle , "ref" sera un pointeur (BYREF) variable pour chaque élément du tableau .
Vous n'avez pas besoin de définir "ref" comme LOCAL car cela sera fait automatiquement . "ref" sera validé après la commande correspondante "NEXT".

Le code suivant est l'équivalent de l'instruction FOREACH :

FOR i = 0 to BOUNDS(field[],0)-1
   ref = field[i]
   ...
   field[i] = ref
NEXT

Example :

// --------------------------------- //
// Project: ForEach

// Make an array of numbers
// Ein Feld von Zahlen
DIMDATA a[], 12,14,15,17

// Enumerate the numbers
// Die Zahlen durchlaufen
FOREACH num IN a[]
   a$=a$ + num + ", "
NEXT
PRINT a$, 0,0

// a simple TYPE
// ein einfacher TYPE
TYPE SHOP
   milk$
ENDTYPE

// An array-instance of it
// Eine Feld-Instanz davon
LOCAL kmart[] AS SHOP

// Fill with values
// Mit Werten füllen
DIM kmart[3]
   kmart[0].milk$ = "fat free"
   kmart[1].milk$ = "fatty"
   kmart[2].milk$ = "butter"

   a$=""
   // Enumerate all milk values
   // Alle shops durchlaufen
   FOREACH item IN kmart[]
      a$ = a$ + item.milk$ + ", "
   NEXT
   PRINT a$, 0, 40

   SHOWSCREEN
   MOUSEWAIT

Output:
12, 14, 15, 17,
fat free, fatty, butter,

Refs:

ALIAS, DELETE, FOR


FORMAT$()

fmt$ = FORMAT$(numLetters#, numAfterComma#, number#)

Convertit un nombre en chaîne de caractères . La chaîne aura moins numLetters# de long (précédé par des espaces, si nécessaire ) et avec exactement numAfterComma# chiffres après le point.

// --------------------------------- //
// Project: FORMAT$()
// Start: Tuesday, May 25, 2004
// IDE Version: 1.40525

FOR i=0 TO 20
   num = RND(100000)/RND(10000)
   PRINT num, 0, i*20
   PRINT FORMAT$(6, 2, num), 300, i*20
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
3 3.00
157 157.00
12 12.00

Refs:

ASC(), CHR$(), PRINT


FUNCTION

FUNCTION name#$ : arg1#$, arg2#$...
...RETURN n#$
ENDFUNCTION

Une fonction est un groupe de commandes en une seule entité. Ce groupe de commandes peut être lancées d'ailleurs dans votre code en utilisant simplement le nom donné à cette fonction. Une fonction, contrairement à un sous-programme "subroutine", retourera une valeur à la fin.

Utiliser la commande FUNCTION pour définir des fonctions utilisateur name#$ est le nom de la fonction . argx#$ sont les arguments requis par la fonction . Ces variables sont LOCAL dans l'espace de travail particulier à cette fonction (i.e. elles sont créés au sein de la fonction, et supprimées à sa conclusion ).
Vous pouvez retourner une valeur à partir d'une fonction avec la commande RETURN . Si vous ne spécifiez pas une valeur de retour, elle sera '0 ' .

Les fonctions peuvent retourner une seule valeur de retour au code . Pour utiliser une fonction qui retourne des valeurs multiples , voir la commande BYREF .

Une fonction est invoquée (called) Lorsque vous utilisez le nom de la fonction dans votre code suivi par des ().

a=name(3,4)

Donnera 'a' étant affecté par la valeur retournée par la fonction 'nom' avec les arguments '3' et '4' utilisés.

.

Example:

// Function

// Sample shows the usage of the commands
// FUNCTION / ENDFUNCTION / EXIT
// Due to the complicated syntax of a function
// the command 'New Function' should be used
// from the 'Project' menu to create a function.
GLOBAL a
LOCAL a

 Title() // Title line

 a$=Right$("123456",  2); // 56
  PRINT a$, 100, 80

 a=7; b=12; GLOBAL a=15
 c=Maximum(a, b) // 7, 12
 Center("c="+c, 100) // 12
 Center ("a="+a, 140) // 7
 Center("b="+b, 180) // 12
 Center("GLOBAL a="+GLOBAL a, 220) // 0 (function: Max)
SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  MAX - größere Zahl(a, b) / bigger number(a, b) #=-
// ------------------------------------------------------------- //
FUNCTION Maximum: a, b
 // These variables are defined LOCAL:
 // a, b
LOCAL ret
 IF a>b
  ret=a
 ELSE
  ret=b
 ENDIF
 // This has no influence on the global variables
 a=0
 // This will
 GLOBAL a=0
RETURN ret
ENDFUNCTION // MAX

// ------------------------------------------------------------- //
// -=#  CENTER  - Center text #=-
// ------------------------------------------------------------- //
FUNCTION Center: text$, y
 // Diese Variablen sind als LOCAL definiert:
 // There variables are defined LOCAL:
  // text$, y
 PRINT text$, (640-LEN(text$)*16)/2, y
ENDFUNCTION // CENTER

// ------------------------------------------------------------- //
// -=#  TITLE  #=-
// ------------------------------------------------------------- //
FUNCTION Title:
 // There variables are defined LOCAL:
  // retval
  Center("Yippie", 50)     // Function call within a function
 RETURN                       // Exit the function
 PRINT "Boo hoo", 100, 100  // Never happens
ENDFUNCTION // NAME

// A Function with a string as a return value
// ------------------------------------------------------------- //
// -=#  RIGHT$  #=-
// ------------------------------------------------------------- //
FUNCTION Right$: word$, size
 // These values are defined LOCAL:
 // word$, size
 RETURN MID$(word$, LEN(word$)-size, size)
ENDFUNCTION// RIGHT$

Output:
56
Yippie
c=12
a=7
b=12
GLOBAL a=0

Refs:

BYREF, ENDFUNCTION, GOSUB, RETURN


GENFILE()

id% = GENFILE()

Cette commande retourne un index qui peut être utilisé pour ouvrir une ressource avec OPENFILE sans écraser les données déjà chargées .

Si plus de mémoire est disponible , -1 seront retourné.

L'avantage évident de cette approche est que vous pouvez écrire des bibliothèques qui s'adaptent de façon transparente dans des projets existants sans déranger le code actuel.
Si vous utilisez cette commande pour allouer, vous devriez les utiliser tout au long de l'ensemble du programme.

L'exemple ici :

test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42

Peut être écrit comme ceci:

GLOBAL gFileTest
gFileTest = GENFILE()
test$ = "test.bin"
OPENFILE(gFileTest, test$, FALSE)

WRITEBYTE gFileTest, 42

Refs:

GENSOUND(), GENSPRITE(), GENX_OBJ()


GENSOUND()

id% = GENSOUND()

Cette commande retourne un index qui peut être utilisé pour ouvrir une ressource avec LOADSOUND sans écraser les données déjà chargées .

Si plus de mémoire est disponible , -1 seront retourné.

L'avantage évident de cette approche est que vous pouvez écrire des bibliothèques qui s'adaptent de façon transparente dans des projets existants sans dérangent le code actuel .
Si vous utilisez cette commande pour allouer, vous devriez les utiliser tout au long de l'ensemble de votre programme .

L'exemple ici :

LOADSOUND "Super.wav", 0, 1
PRINT "SUPER", 100, 100
SHOWSCREEN
PLAYSOUND 0, 0
MOUSEWAIT

Peut être écrite comme :

GLOBAL gSndSuper
gSndSuper = GENSOUND()
LOADSOUND "Super.wav", gSndSuper, 1
PRINT "SUPER", 100, 100
SHOWSCREEN
PLAYSOUND gSndSuper, 0
MOUSEWAIT

Refs:

GENFILE(), GENSPRITE(), GENX_OBJ()


GENSPRITE()

id% = GENSPRITE()

Cette commande retourne un index qui peut être utilisé pour ouvrir une ressource avec LOADSPRITE sans écraser les données déjà chargées .

Si plus de mémoire est disponible , -1 seront retourné.

L'avantage évident de cette approche est que vous pouvez écrire des bibliothèques qui s'adaptent de façon transparente dans des projets existants sans dérangent le code actuel .
Si vous utilisez cette commande pour allouer, vous devriez les utiliser tout au long de l'ensemble de votre programme .

L'exemple ici:

LOADSPRITE "foo.png", 0
LOADSPRITE "bar.png", 1
DRAWSPRITE 0,0,0
DRAWSPRITE 1,0,100
SHOWSCREEN
MOUSEWAIT

Peut être écrit comme ceci::

GLOBAL gImgFoo = GENSPRITE(); LOADSPRITE "foo.png", gImgFoo
GLOBAL gImgBar = GENSPRITE(); LOADSPRITE "bar.png", gImgBar
DRAWSPRITE gImgFoo,0,0
DRAWSPRITE gImgBar,0,100
SHOWSCREEN
MOUSEWAIT

Refs:

GENFILE(), GENSOUND(), GENX_OBJ()


GENX_OBJ()

id% = GENX_OBJ()

Cette commande retourne un index qui peut être utilisé pour ouvrir une ressource avec X_LOADOBJ sans écraser les données déjà chargées .

Si plus de mémoire est disponible , -1 seront retourné.

L'avantage évident de cette approche est que vous pouvez écrire des bibliothèques qui s'adaptent de façon transparente dans des projets existants sans dérangent le code actuel .
Si vous utilisez cette commande pour allouer, vous devriez les utiliser tout au long de l'ensemble de votre programme .

L'exemple ici :

file$ = "robot.ddd"
X_LOADOBJ file$, 1
X_DRAWOBJ 1, 0

Peut être écrite comme :

GLOBAL gXobjRobot
gXobjRobot = GENX_OBJ()
file$ = "robot.ddd"
X_LOADOBJ file$, gXobjRobot
X_DRAWOBJ gXobjRobot, 0

Refs:

GENFILE(), GENSOUND(), GENSPRITE()


GETCOMMANDLINE$()

dat$ = GETCOMMANDLINE$()

Retourne les paramètres transmis au programme en cours en ligne de commande.

// --------------------------------- //
// Project: GETCOMMANDLINE$()
// Start: Friday, March 28, 2003
// Compiler Version: 1.30328

 line$ = GETCOMMANDLINE$()
 PRINT line$, 0, 0

 // Argumente zerstückeln / Split arguments
DIM args$[100]
 lastgood=0
 isgood=FALSE
 line$=" "+line$+" "
 FOR p=0 TO LEN(line$)
  c$ = MID$(line$, p, 1)
  IF isgood
   IF c$=" "
    args$[narg]=MID$(line$, lastgood, p-lastgood)
    narg=narg+1
    isgood=FALSE
   ENDIF
  ELSE
   IF c$<>" "
    lastgood=p
    isgood=TRUE
   ENDIF
  ENDIF
 NEXT

 // Argumente Zeigen / show arguments
 FOR i=0 TO narg-1
  PRINT "''" + args$[i] +"''", 0, 50+16*i
 NEXT
 SHOWSCREEN
 MOUSEWAIT

Note :

Le premier paramètre contiendra le nom du fichier, ce qui (selon la plate-forme) peut contenir la totalité ou une partie de chemin relatif au programme


GETCURRENTDIR$()

dir$=GETCURRENTDIR$()

Retourne le répertoire courant (i.e. celui du fichier .exe en cours ).

Sample:

dir$=GETCURRENTDIR$()
PRINT dir$, 100, 100
SHOWSCREEN
MOUSEWAIT

Exemple donnée :
c:/GLBasic/projects/testproj.app/

Refs:

DOESFILEEXIST(), FILEREQUEST$(), GETFILE, GETFILELIST(), PUTFILE


GETDIGIX

dx# = GETDIGIX(n%) // Hat switch

GETDIGIX renvoie l'état du manche du joystick. Il retounera une des valeurs suivantes
-1 : Gauche
0 : Aucun mouvement
+1 : Droit
Les résultats de cette commande sont tributaire de la manette de jeu , et de l'utilisation du pilote de la manette .
La plage valide pour n% est 0-9 (maximum 10 joysticks), chacun avec jusqu'à 32 boutons (m%).

NOTE : Cette commande est uniquement disponible aux utilisateurs enregistrés .

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETDIGIY, GETJOY...(), JOYSTATE


GETDIGIY

dy# = GETDIGIY(n%) // Hat switch

GETDIGIX renvoie l'état du manche du joystick. Il retounera une des valeurs suivantes
-1 : Haut
0 : Aucun mouvement
+1 : Bas
Les résultats de cette commande sont tributaire de la manette de jeu , et de l'utilisation du pilote de la manette .
La plage valide pour n% est 0-9 (maximum 10 joysticks), chacun avec jusqu'à 32 boutons (m%).

NOTE : Cette commande est uniquement disponible aux utilisateurs enregistrés .

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETDIGIX, GETJOY...(), JOYSTATE


GETFILE

GETFILE file$, lin#, dat#$

Fixe la valeur de la variable dat#$ dans le contenu du fichier fichier$ au numéro de ligne lin#. La première ligne a l'index 0. Le fichier peut pas dépasser plus de 256 lignes.

Sample:

a$="NAME";
PUTFILE "Test.txt", 0, s$
a$=""
GETFILE "Test.txt", 0, a$
PRINT a$, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DOESFILEEXIST(), FILEREQUEST$(), GETCURRENTDIR$(), GETFILELIST(), PUTFILE


GETFILELIST()

num = GETFILELIST(find$, files$[])

Obtenir une liste de noms de fichier et répertoire dans le répertoire courant. find $ spécifie une chaîne de recherche où joker '*' représente 0 ou plusieurs caractères , '?' représente exactement un caractère indéfini. Ainsi, la chaîne de recherche "? À .*" permettrait de repérer tous les éléments suivants: --
cat.bmp
rat.txt
mat.exe
At.gbas

'num' est num_directories * 0x10000 + num_files. Ainsi, il est stocké dans le mot high word et low word bytes. L'exemple explique comment recevoir les deux valeurs.

Exemple:

// --------------------------------- //
// Project: Files and Folders
// Start: Tuesday, November 25, 2003
// IDE Version: 1.31125

 LOADFONT "minifont.bmp", 0
 GETFONTSIZE font_x, font_y

 ok = SETCURRENTDIR("..") // One up
 cur$ = GETCURRENTDIR$()
 num = GETFILELIST("*.*", files$[])
 num_dir  = INTEGER(num / 0x10000) // Hi-Word
 num_file = MOD(num, 0x10000)      // Lo-Word
 PRINT cur$, 0, 0
 PRINT "ok? " + ok+ " num: " + num + " -> nDir: "+num_dir+" nFile: "+num_file, 0, font_y
 FOR i=0 TO BOUNDS(files$[], 0)-1 // BOUNDS(files$[], 0)-1 = num = num_dir+num_file
  PRINT files$[i], 0, (i+3)*font_y
 NEXT

 SHOWSCREEN
 MOUSEWAIT

Refs:

DOESFILEEXIST(), FILEREQUEST$(), GETCOMMANDLINE$(), GETCURRENTDIR$(), SETCURRENTDIR(), SHELLCMD()


GETFILESIZE()

bytes# = GETFILESIZE(file$)

Retourne la taille du fichier file $ en octets .

NOTE :
1024B = 1KB
1024*1024B = 1MB

Refs:

OPENFILE()


GETFONTSIZE

GETFONTSIZE sx##, sy##

Récupère la taille d'un seul caractère de la police en cours dans sx## et sy##. Chaque caractère de la police a la même taille .

exemple:

DRAWRECT 300, 100, 200, 300, RGB(20,20,120)
BOXPRINT ("This is a long string of text, which has to be wrapped", 300, 100, 200)
SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  BOXPRINT  #=-
// ------------------------------------------------------------- //
FUNCTION BOXPRINT: str$, x, y, wx
 // These variables are locally defined:
 // Diese Variablen sind als LOCAL definiert:
 // str$, x, y, wx, void

 LOCAL tx, ty // Width of one character
 LOCAL cx, cy, word$, c$, cpos

  GETFONTSIZE tx, ty

 cy=y
 str$=str$+" "
 cx=x
 WHILE cpos < LEN(str$)
  c$=MID$(str$, cpos, 1)

  word$=word$+c$

  IF c$=" "
   IF cx-x+(LEN(word$)-1)*tx > wx
    cx=x; cy=cy+ty
   ENDIF
   PRINT word$, cx, cy
   cx=cx+ LEN(word$)*tx
   word$=""
  ENDIF
  cpos=cpos+1
 WEND
ENDFUNCTION void // BOXPRINT

Refs:

GETSCREENSIZE, GETSPRITESIZE, LOADFONT, PRINT, SETFONT


GETJOY...()

n% = GETNUMJOYSTICKS( )
n$ = GETJOYNAME$(n%)
x# = GETJOYX(n%)
y# = GETJOYY(n%)
z# = GETJOYZ(n%) // Throttle
rx# = GETJOYRX(n%)
ry# = GETJOYRY(n%)
rz# = GETJOYRZ(n%)
b% = GETJOYBUTTON(n%, m%)
dx# = GETDIGIX(n%) // Hat switch
dy# = GETDIGIY(n%)

Cet ensemble de commande vous donne la possibilité d'accéder à un maximum de 10 joysticks (n%), avec chacun jusqu'à 32 buttons (m%). Cette commande est disponible uniquement aux utilisateurs enregistrés.

Boutons pour GP2X:
Button0 = A
Button1 = B
Button2 = X
Button3 = Y
Button4 = TAT
Button5 = START
Button6 = SELECT
Button7 = VOL_DOWN
Button8 = VOL_UP
Button9 = FL
Button10= FR

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

JOYSTATE, KEY(), MOUSESTATE


GETJOYBUTTON

b% = GETJOYBUTTON(n%, m%)

Cette commande renvoie l'état de bouton m% pour le joystick numéro n%. Cet ensemble de commande vous donne la possibilité d'accéder jusqu'à 10 joysticks (n%), avec chacun jusqu'à 32 boutons (m%). La valeur retournée sera de 1 si le bouton est enfoncé, 0 s'il ne l'est pas .

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés .

Boutons pour GP2X:
Button0 = A
Button1 = B
Button2 = X
Button3 = Y
Button4 = TAT
Button5 = START
Button6 = SELECT
Button7 = VOL_DOWN
Button8 = VOL_UP
Button9 = FL
Button10= FR

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYX, GETJOYY, GETJOYZ


GETJOYNAME

n$ = GETJOYNAME$(n%)

Cette commande renvoie le nom que le système connaît pour le numéro de joystick n%. La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (m%).

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés.

Sample:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETNUMJOYSTICKS


GETJOYRX

rx# = GETJOYRX(n%)

Pour le Joystick numero n% , retourne le mouvement de l'axe de rotation X (si le joystick en a un ). cela dépend de la manette utilisé ainsi que du drivers . comme sur une X-Box gamepad par exemple , les valeurs RX/RY/RZ portent sur le second joystick analogique .
La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés .

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYBUTTON, GETJOYRY, GETJOYRZ


GETJOYRY

ry# = GETJOYRY(n%)

Pour le Joystick numero n% , retourne le mouvement de l'axe de rotation Y (si le joystick en a un ). cela dépend de la manette utilisé ainsi que du drivers . comme sur une X-Box gamepad par exemple , les valeurs RX/RY/RZ portent sur le second joystick analogique .
La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés .

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYBUTTON, GETJOYRX, GETJOYRZ


GETJOYRZ

rz# = GETJOYRZ(n%)

Pour le Joystick numero n% , retourne le mouvement de l'axe de rotation axiale Z (si le joystick en a un ). cela dépend de la manette utilisé ainsi que du drivers . comme sur une X-Box gamepad par exemple , les valeurs RX/RY/RZ portent sur le second joystick analogique .
La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés .

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYBUTTON, GETJOYRX, GETJOYRY


GETJOYX

x# = GETJOYX(n%)

Pour le Joystick numéro n% , retourne la valeur du mouvement dans la direction X . La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE: Cette commande est disponible uniquement aux utilisateurs enregistrés.

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYNAME, GETJOYY, GETJOYZ, JOYSTATE


GETJOYY

y# = GETJOYY(n%)

Pour le Joystick numéro n% , retourne la valeur du mouvement dans la direction Y . La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE: Cette commande est disponible uniquement aux utilisateurs enregistrés.

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYBUTTON, GETJOYX, GETJOYZ, JOYSTATE


GETJOYZ

z# = GETJOYZ(n%) // Throttle

Pour le Joystick numero n% Renvoie la quantité de gaz appliquée (pour les Joysticks avec une manette des gaz ). La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m). La valeur retournée est dans la gamme -1.0 à +1.0.

NOTE: Cette commande est disponible uniquement aux utilisateurs enregistrés.

exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYBUTTON, GETJOYX, GETJOYY, JOYSTATE


GETLASTERROR$()

error$ = GETLASTERROR$()

Retourne un code d'erreur suivi d'un court message texte décrivant la dernière erreur qui ont eu lieu .

Suite à la définition des codes d'erreur :

0 succès
3 fichier n'existe pas
4 mauvais argument
5 chaîne trop longue
7 pas assez de mémoire
8 mauvaise dimension
9 dimension dépassée (rend la fin du programme )
20plus de données disponibles

Voir aussi NETGETLASTERROR$()

Refs:

NETGETLASTERROR


GETMOUSECOUNT()

num% = GETMOUSECOUNT()

Retourne le nombre de souris attaché au système . Cette extension sera mise en œuvre avec Windows 7 et le nouveau xserver-xorg.
Jusqu'à présent, seule la plate-forme "IPHONE" renvoyai une valeur différente à 1.

Pour les systèmes avec plusieurs périphériques de souris , utiliser SETACTIVEMOUSE pour en choisir une avant de vérifier sa position / boutons avec MOUSESTATE.

WHILE TRUE
   FOR i=0 TO GETMOUSECOUNT()-1
      SETACTIVEMOUSE i
      MOUSESTATE mx, my, b1, b2
      IF b1
         PRINT "_____"+i, mx, my
      ENDIF
   NEXT
   SHOWSCREEN
WEND

Refs:

MOUSEAXIS, SETACTIVEMOUSE


GETNUMJOYSTICKS

n% = GETNUMJOYSTICKS( )

Cet ensemble de commande vous donne la possibilité d'utiliser jusqu'à 10 joysticks (n%),La plage valide pour n% est 0-9 (maximum 10 joysticks), avec chacun jusqu'à 32 boutons (% m).

NOTE : Cette commande est disponible uniquement aux utilisateurs enregistrés .
exemple:

// ------------------------------------------------------------- //
// JOYSTICK DEMO II
// ------------------------------------------------------------- //

LOADFONT "minifont.bmp"

WHILE TRUE
 FOR i=0 TO GETNUMJOYSTICKS()-1 // Get Number of Joysticks
  PRINT GETJOYNAME$(i), 0, i*48 // Name of Device
  a$="X:"+GETJOYX(i) + " Y:"+GETJOYY(i)+ " Z:"+ GETJOYZ(i) // XYZ-Position
  a$=a$+"Rx:"+GETJOYRX(i) + " Ry:"+GETJOYRY(i)+ " Rz:"+GETJOYRZ(i) // XYZ-Rotation
  FOR n=0 TO 31 // Up to 32 Buttons
   a$=a$+" B"+n+":"+GETJOYBUTTON (i, n)
  NEXT
  PRINT a$, 0, i*48+16

  // DIGI-Joystick
  b$="DX:"+ GETDIGIX(i)+" DY:"+GETDIGIY(i)
  PRINT b$, 0, i*48+32
 NEXT
 SHOWSCREEN
WEND

Refs:

GETJOY...(), GETJOYNAME


GETPIXEL()

col% = GETPIXEL(x%, y%)

Renvoie une valeur de la couleur du pixel à la position x%, y%.
Avertissement : La couleur renvoyée peut varier de 13% de la valeur réelle pour le pixel . les Pixels de couleur 16 bits sont particulièrement susceptibles de renvoyer des informations erronées . La raison en est que certaines plates-formes 16 bits affichent des informations de couleur 24 bits est les converti vers le bas en 16 bits résultant en une perte de précision .
Avertissement : Cette commande lit de la mémoire APG et est donc extrêmement lente .

// --------------------------------- //
// Project: GetPixel
// IDE Version: 2.50316

LOADSPRITE "bubble.bmp", 0
WHILE TRUE
   MOUSESTATE mx, my, b1, b2
   DRAWSPRITE 0, 0, 0
   FOR x=0 TO 31
      FOR y=0 TO 31
         DRAWRECT x*8+160, y*8, 8, 8, GETPIXEL(x+mx,y+my)
      NEXT
   NEXT
   ALPHAMODE .1
   DRAWRECT mx, my, 32, 32, RGB(255,255,255)
   ALPHAMODE 0
   SHOWSCREEN
WEND

Refs:

RGB(), SETPIXEL


GETSCREENSIZE

GETSCREENSIZE sx##, sy##

Renvoie la résolution d'écran pour votre projet (comme spécifié dans les options du projet ) et les place dans les variables sx## et sy##. Vous pouvez utiliser cette information pour les échelles graphiques des différentes plates-formes (e.g. vous pouvez utiliser des sprites de taille différente en fonction de ce que retourne GETSCREENSIZE, ou utiliser zoom sprite pour redimensionner vos sprites ,ce qui est nécessaire pour divers affichages).

Pour les programmes console , GETSCREENSIZE essaie de trouver le nombre de colonnes et lignes de la fenêtre de console visibles . Si la commande est incapable de déterminer la taille de la fenêtre de la console, elle sera par défaut 80 x 40.

// GETSCREENSIZE

GETSCREENSIZE sx, sy
PRINT "Screen: "+sx + " : " + sy, 0,0
SHOWSCREEN
MOUSEWAIT

Refs:

GETFONTSIZE, GETSPRITESIZE


GETSPRITESIZE

GETSPRITESIZE id#, sx##, sy##

Retourne la hauteur (sx#) et la largeur (sy#) du sprite numéro id# en pixels .

GRABSPRITE 13, 15, 19, 10, 20
GETSPRITESIZE 13, sx, sy
PRINT "Sprite: "+sx + " : " + sy, 0,0
SHOWSCREEN
MOUSEWAIT

résultat :
Sprite: 10 : 20

Refs:

GETFONTSIZE, GETSCREENSIZE


GETTIMER()

n#=GETTIMER()

Retourne le temps en 1/1000 sec depuis le dernier appel de SHOWSCREEN. Utiliser GETTIMER() avant une commande SHOWSCREEN retournera un nombre assez important.

exemple:

// FPS counter
WHILE TRUE
 dtime = GETTIMER()
 fps = ((1000/dtime)+fps)/2
 delay=delay+dtime
 IF delay>500 // 1/2 sec
  delay=0
  showfps=fps
 ENDIF
 PRINT "FPS: "+showfps+" dtime:"+dtime, 0,0
 SHOWSCREEN
WEND

résultat example:
FPS: 60.09950381 dtime:16.66132454

Refs:

GETTIMERALL(), LIMITFPS


GETTIMERALL()

dtime# = GETTIMERALL()

Retourne le temps écoulé depuis le démarrage du programme en 1/1000 sec.

// --------------------------------- //
// Project: GETTIMERALL - Demo
// IDE Version: 1.40304

 LIMITFPS -1
 WHILE TRUE
  TextScroller("Hello World")
  SHOWSCREEN
 WEND

// ------------------------------------------------------------- //
// -=#  TEXTSCROLLER  #=-
// ------------------------------------------------------------- //
FUNCTION TextScroller: text$
 // Diese Variablen sind als LOCAL definiert:
 // These variables are defined as LOCAL:
 // text$

LOCAL fx, fy, xoffset, screenx
 screenx = 640 // Screen width / Bildschirmbreite
 GETFONTSIZE fx, fy
 xoffset = -GETTIMERALL()/10 // X-position of text / X-Stelle des Textes

 // Modulo the offset, so that text comes from the right after it completely
 // disappears left.
 // Modulo operation auf Offset anwenden, so dass der text von rechts
 // kommt, nachdem er komplett links verschwunden ist.
 xoffset= MOD(xoffset, screenx + LEN(text$)*fx) + screenx
 PRINT text$, xoffset, 100 - ABS(COS(GETTIMERALL()/5)) * 100
ENDFUNCTION

Refs:

GETTIMER(), LIMITFPS


GETVIEWPORT

GETVIEWPORT x%%, y%%, w%%, h%%

Retourne la position actuelle de la fenêtre .

Si vous appelez VIEWPORT 0,0,0,0 (i.e. réinitialiser le viewport à 0, 0, largeur écran , hauteur de l'écran ), Vous pouvez encore exécuter GETVIEWPORT sans elle, provoquant une erreur, elle retournera 0, 0, largeur écran , hauteur de l'écran.

// --------------------------------- //
// Project: Multiple Viewports
// Start: Wednesday, August 11, 2004
// IDE Version: 2.40811

WHILE TRUE
 PRINT "Test", 0, 0

 MOUSESTATE mx, my, b1, b2
 GOSUB Scene // 3D Scene

 VIEWPORT mx, my, 150, 100
 // Draw more than the viewport's boundaries
 DRAWRECT -100, -100, 400, 600, RGB(0, 0, 64)
 PRINT "Viewport.....", 0, 0
 GETVIEWPORT vx,vy,vw,vh   // Returns mx,my,150,100
 GOSUB Scene

 VIEWPORT 0,0,0,0 // Reset
 PRINT "Back to normal", 0, 20
 PRINT "Viewport x="+vx+" y="+vy+" width="+vw+" height="+vh,0,40
 SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  SCENE  #=-
// ------------------------------------------------------------- //
SUB Scene:
 X_MAKE3D 1, 100, 45
 X_CAMERA 0,0,10, 0,0,0
 X_OBJSTART 1
  X_OBJADDVERTEX  0, 0, 0, 0,0, RGB(255,255,255)
  X_OBJADDVERTEX  1, 1, 0, 1,1, RGB(255,255,255)
  X_OBJADDVERTEX  0, 1, 0, 0,1, RGB(255,255,255)
 X_OBJEND
 X_ROTATION GETTIMERALL()/30, 0, 1, 0
 X_DRAWOBJ 1, 0
 X_DRAWAXES 0,0,0
ENDSUB  // SCENE

Refs:

VIEWPORT


GLOBAL

GLOBAL var#$, var#$[]

GLOBAL var#=value#, var#=value(), ...

GLOBAL a#$ = LOCAL b#$
LOCAL a#$ = GLOBAL b#$

Le commande GLOBAL permet à des variables d'être utilisées globalement, pouvant ainsi être accessibles depuis l'intérieur de n'importe quelle procédure. .

Si vous utilisez le mot-clé GLOBAL pour un nom de variable LOCAL (dans un fonction / sous-routine etc), il fera référence à la version version globale de cette variable -- même si variable locale du même nom existe.

Sans préciser LOCAL ou GLOBAL d'un nom de variable, GLBasic essaie d' utiliser la variable en tant que LOCAL avec ce même nom. S'il n'y a pas de variable LOCAL définie avec ce nom alors GLOBAL est utilisé.

Vous définissez une variable GLOBAL avec :

GLOBAL var#$

Si vous ne créez pas une variable global avant d'y attribuer une valeur vous obtiendrez une alerte «implicitly created GLOBAL" .
Si vous assignez un résultat de commande comme MOUSESTATE ou GETSCREENSIZE à une variable qui n'a pas été explicitement créé, vous obtiendrez un avertissement du compilateur " variable probably unassigned".

exemple:

LOCAL text$
text$="LOCAL_MAIN"
GLOBAL text$="GLOBAL"

GOSUB show
PRINT text$, 100, 150
SHOWSCREEN
MOUSEWAIT
END

// ------------------------------------------------------------- //
// -=#  SHOW  #=-
// ------------------------------------------------------------- //
SUB show:
LOCAL text$

// Creating and defining LOCAL arrays:
LOCAL array[]; DIM array[5]

text$="LOCAL_SUB"

PRINT text$, 100, 50
// Is equal to
// PRINT LOCAL text$, 100, 50
PRINT GLOBAL text$, 100, 100
ENDSUB // SHOW

Output:
LOCAL_SUB
LOCAL_MAIN

Refs:

BYREF, LOCAL, STATIC


GOSUB

GOSUB mysub

SUB mysub:
RETURN
ENDSUB

Utilisez la commande GOSUB pour sauter au code contenu dans un sous-programme . A la fin du sous-programme (défini par la commande 'ENDSUB' ), le contrôle du Programme de sera renvoyé à la commande, après le 'GOSUB' .
Voir la commande SUB pour plus de détails sur la façon de créer une sous-programme "subroutine".

Vous pouvez abandonner un sous-programme avant la commande ENDSUB avec l'usage de la commande RETURN . GOSUB peuvent être appelées depuis une autre routine .

exemple:

GOSUB draw
SHOWSCREEN
MOUSEWAIT
END

SUB draw:
   PRINT "Eine Sub / A subroutine", 100, 100
    RETURN // Jump back to GOSUB
    PRINT "You won't see this!", 100, 150
ENDSUB

résultat:
Eine Sub / A subroutine

Refs:

FUNCTION, GOTO


GOTO

mark:
...
GOTO mark

Passe à la JumpMark «marque» dans votre code. Un JumpMark est une ligne contenant un mot suivi d'un : .
Vous ne pouvez pas sauter de l'intérieur d'une sous-routine à une JumpMark soit dans un sous-programme différent ou dans le programme principal. L' inverse s'applique aussi (vous ne pouvez pas sauter du programme principal à un JumpMark dans une sous-routine).
Contrairement à un GOSUB, GOTO ne se souvient pas où est votre code est passé .

exemple:

PRINT "This appears", 100, 100
GOTO shortcut
PRINT "This won't appear", 100, 150 // This won't appear
shortcut:
SHOWSCREEN
MOUSEWAIT

résultat:
This appears

Refs:

FUNCTION, GOSUB


GRABSPRITE

GRABSPRITE no%, x%, y%, width%, height%

Copie une partie de la mémoire tampon d'arrière plan à l'emplacement x%, y%, avec une largeur width% et hauteur height%, et le stocke comme sprite numéro no%.
Cette commande est très pratique pour les programmes de fond d'écran ou effet miroir renversé , ainsi que la génération dynamique de texture pour les objets 3D .

exemple:

FOR i=0 TO 256
 DRAWLINE 0,i,256,i,RGB(0, i, 255-i)
NEXT

GRABSPRITE 0, 0,0,7, 256

BLACKSCREEN
DRAWSPRITE 0, 100, 100
SHOWSCREEN
MOUSEWAIT

Note : Sur l' iPhone, cette commande ne fonctionne que dans le mode Portrait.

Refs:

DRAWSPRITE, LOADBMP, LOADSPRITE, SAVESPRITE, SETTRANSPARENCY, X_OBJ...


HIBERNATE

HIBERNATE

La commande HIBERNATE met le programme dans un mode veille jusqu'à ce que l'utilisateur fasse quelque chose (déplace la souris, presse une touche, touche le joystick , ...)
Avec cette commande de charge du processeur peut être réduite de façon importante . Si vous écrivez par exemple un éditeur de niveaux , vous n'avez pas à mettre à jour l'affichage de toutes les images pour des animations , en mettant une commande HIBERNATE dans votre code vous permettez à d'autres programmes d'utiliser le processeur alors qu'aucun travail est nécessaire par votre programme.
Grâce à cette commande les appareils portables peuvent profiter d'une plus longue durée de vie de la batterie .

// --------------------------------- //
// Project: Hibernate
// Start: Tuesday, May 04, 2004
// IDE Version: 1.40430
WHILE TRUE
   a$=""
   FOR i=0 TO 255
      IF KEY(i) THEN a$=a$+i+", "
   NEXT
   MOUSESTATE mx, my, b1, b2
   JOYSTATE jx,jy,jb1,jb2
   PRINT a$, 0,0
   PRINT "Mx:"+mx+" My:"+my+" b1:"+b1+" b2:"+b2, 0,40
   PRINT "Jx:"+jx+" Jy:"+jy+" b1:"+jb1+" b2:"+jb2, 0,80
   SHOWSCREEN
   HIBERNATE
WEND

Refs:

SHOWSCREEN, SLEEP


HUSH

HUSH

HUSH sarrête immédiatement la lecture de tous les sons (sauf music).

exemple:

LOADSOUND "Super.wav", 0
PRINT "STOP", 100, 100
SHOWSCREEN
PLAYSOUND 0,0
MOUSEWAIT
HUSH
PRINT "OK", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

LOADSOUND, PLAYMUSIC, PLAYSOUND()


IF

IF a#$ = < <= > >= <> b#$
...
| ELSEIF ...
| ...
| ELSE
| ...
ENDIF

ou:

IF a#$ = < <= > >= <> b#$ THEN ...

Une instruction IF permet d'exécuter un bloc de code si une certaine condition (a#...b#) est vraie - i.e. il exécute le code entre IF et ENDIF si la comparaison des variables a#$ et b#$ sont TRUE. Si la comparaison évalue est FALSE, le code entre ELSE et ENDIF n'est pas exécuté ( une déclaration ELSE peu être utilisée ).

La commande ELSEIF vous permet d'ajouter un autre test à effectuer si la condition test précédent évalué est fausse "false" :

IF a>5
   PRINT "a>5", 0,0
ELSEIF b>5
   PRINT "a<=5, but b>5", 0,0
ELSE
   PRINT "Neither a nor b > 5", 0,0
ENDIF

Si la comparaison est TRUE vous pouvez utiliser la commande THEN si vous souhaitez exécuter une seule commande .

exemple:

a=5; b=3

IF a < b
    PRINT "a < b", 100, 100
ELSE
    PRINT "a < b is FALSE" style="color:white;">, 100, 100
ENDIF

IF a<>b THEN PRINT "a is not b", 100, 150

SHOWSCREEN
MOUSEWAIT

résultat:
a < b is FALSE
a is not b

Refs:

AND, DEFAULT, ELSE, ELSEIF, ENDIF, FOR, GOTO, OR, WHILE


IMPORT

IMPORT "C" __stdcall MessageBoxA(int hwnd, const char* text, char* caption, int flags)
IMPORT "C" int foo()
IMPORT void bar(int a, double& d)

Cette commande est destinée aux utilisateurs avancés .

Avec cette commande, vous pouvez importer directement des fonctions externes à partir d'une library, un fichier externe ou d'une fonction INLINE pour une utilisation en tant que commande native GLBasic .

Le type de conversion est :
int, long, short, char, void* -> DGNat
double, float -> DGInt
int& -> DGNat BYREF
double& -> DGInt BYREF
char*, const char* -> DGStr

IMPORT "C" int __stdcall MessageBoxA(int hwnd, const char* text, char* caption, int flags)

MessageBoxA(0, "Test", "test", 0)

Refs:

INLINE, REQUIRE


INC

INC x## [, num#$=1]
INC x$$ [, num#$]

Augmente la valeur de la variable x## ou x$$ par le montant num#$. Cette commande peut être utilisé directement sur des valeurs dans des tableaux (voir l'exemple ci-dessous ).

a = 100
DIM b[5]
b[3] = 200
INC a, 5
INC b[3], 5
PRINT a, 100, 100
PRINT b[3], 100, 120
SHOWSCREEN
MOUSEWAIT

Output:
105
205

Refs:

DEC


INIGET$

value$ = INIGET$(section$, key$ [, nodata$])

Obtient la valeur de "key$" de la rubrique "section$" d'un fichier ini précédemment ouvert avec la commande INIOPEN() .
Si l'une des , section$ ou key$ n'existent pas , la valeur retournée est "NO_DATA" resp. nodata$.

section$ et key$ ne sont pas sensibles à la casse (majuscule indifférent) .

Voir INIOPEN Pour plus d'informations.

Example:

// just to be sure, remove the file
KILLFILE "test.ini"

INIOPEN "test.ini"

color$ = "Colors"
shape$ = "Shapes"

INIPUT color$, "red", 1
INIPUT color$, "green", 2
INIPUT shape$, "Circle", 1
INIPUT shape$, "Poly", "fine"

// write "test.ini" to disk
INIOPEN ""

// Now re-read the file
INIOPEN "test.ini"
PRINT "Red  = " + INIGET$(color$, "rEd"), 0, 0
PRINT "Poly = " + INIGET$(shape$, "polY"), 0, 20

PRINT "after removal: ", 0, 50

// remove Color Section
INIPUT color$, "", ""
// remove Poly key
INIPUT shape$, "pOLy", ""

// show again
PRINT "Red  = " + INIGET$(color$, "Red"), 0, 70
PRINT "Poly = " + INIGET$(shape$, "PoLy"), 0, 90

SHOWSCREEN
MOUSEWAIT

résultat:
Red = 1
Poly = fine

après élimination :
Red = NO_DATA
Poly = NO_DATA

Refs:

INIOPEN


INIOPEN

INIOPEN filename$

Ouvre un fichier .ini . Si un fichier .ini a déjà été ouverts et modifié (INIPUT) , les changements du précédent fichier .ini seront écrit sur le disque avant que le nouveau fichier soit ouvert. Les fichiers .ini peut être de n'importe quelle taille.
Utiliser INIOPEN sur un fichier. Ini qui n'existe pas le créera.

Un fichier. Ini a la syntaxe suivante :

; Comment
[Section1]
Key1 = Value String
Key2 = Value

; Comment
[Section2]
...

Example:

// just to be sure, remove the file
KILLFILE "test.ini"

INIOPEN "test.ini"

color$ = "Colors"
shape$ = "Shapes"

INIPUT color$, "red", 1
INIPUT color$, "green", 2
INIPUT shape$, "Circle", 1
INIPUT shape$, "Poly", "fine"

// write "test.ini" to disk
INIOPEN ""

// Now re-read the file
INIOPEN "test.ini"
PRINT "Red  = " + INIGET$(color$, "rEd"), 0, 0
PRINT "Poly = " + INIGET$(shape$, "polY"), 0, 20

PRINT "after removal: ", 0, 50

// remove Color Section
INIPUT color$, "", ""
// remove Poly key
INIPUT shape$, "pOLy", ""

// show again
PRINT "Red  = " + INIGET$(color$, "Red"), 0, 70
PRINT "Poly = " + INIGET$(shape$, "PoLy"), 0, 90

SHOWSCREEN
MOUSEWAIT

Output:
Red = 1
Poly = fine

after removal:
Red = NO_DATA
Poly = NO_DATA

Refs:

GETFILE, GETFILELIST()


INIPUT

INIPUT section$, key$, value$

Ecrit une valeur à un .ini ouvert précédemment . Si vous souhaitez supprimer une clé dans le fichier , définir value$="". Pour la suppression complète des sections et ensemble key$="".

INIPUT "mysection", "mykey", "myvalue" // Add the values to the ini file
INIPUT "mysection", "mykey", "" // remove the value for  key mykey from section mysection
INIPUT "mysection", "", "" // remove the section called mysection

Voir INIOPEN pour plus de détails .

Example:

// just to be sure, remove the file
KILLFILE "test.ini"

INIOPEN "test.ini"

color$ = "Colors"
shape$ = "Shapes"

INIPUT color$, "red", 1
INIPUT color$, "green", 2
INIPUT shape$, "Circle", 1
INIPUT shape$, "Poly", "fine"

// write "test.ini" to disk
INIOPEN ""

// Now re-read the file
INIOPEN "test.ini"
PRINT "Red  = " + INIGET$(color$, "rEd"), 0, 0
PRINT "Poly = " + INIGET$(shape$, "polY"), 0, 20

PRINT "after removal: ", 0, 50

// remove Color Section
INIPUT color$, "", ""
// remove Poly key
INIPUT shape$, "pOLy", ""

// show again
PRINT "Red  = " + INIGET$(color$, "Red"), 0, 70
PRINT "Poly = " + INIGET$(shape$, "PoLy"), 0, 90

SHOWSCREEN
MOUSEWAIT

résultat:
Red = 1
Poly = fine

après élimination :
Red = NO_DATA
Poly = NO_DATA

Refs:

INIOPEN


INKEY$

a$=INKEY$( )

Cette commande renvoie si l'utilisateur a appuyé sur la touche au lieu d'un key-ID comme la fonction KEY( ) . e.g. Si l'utilisateur appuie sur la touche 'b', INKEY$ renvoi 'b' où le recours à KEY( ) le résultats est KEY(48)=1.

La fonction KEY( ) est plus rapide, mais le retour de la véritable touche enfoncée peut parfois être plus utile (comme le montre la fonction INPUT en dessous dans l'example).

La touche enter retourne "\n", la touche d'effacement arrière "\b".

exemple:

// ------------------------------------------------------------- //
// INPUT via INKEY$ - Input with starfield background
// ------------------------------------------------------------- //

// Setup Starfield data
DIM spd[640]
DIM sy[640]
 FOR x=0 TO 639
  spd[x]=RND(3)+1
  sy[x]=-RND(480)
 NEXT

 name$=""
 WHILE TRUE
  IF KEY(14)
   name$=MID$(name$, 0, LEN(name$)-1) // Backspace
  ELSE
   in$=INKEY$()
   IF in$<>"" THEN name$=name$+in$
  ENDIF
  PRINT name$, 0, 100
  GOSUB ShowStarfield
  SHOWSCREEN
 WEND
END

// ------------------------------------------------------------- //
// -=#  SHOWSTARFIELD  #=-
// ------------------------------------------------------------- //
SUB ShowStarfield:
LOCAL x
 FOR x=0 TO 639
  c=spd[x]
  y=sy[x]
  y=y+c
  IF y>480 THEN y=0
  sy[x]=y
  c=c*64 -1
  SETPIXEL x, y, RGB(c, c, c)
 NEXT
ENDSUB // SHOWSTARFIELD

Refs:

INPUT, KEY(), KEYWAIT, STDOUT


INLINE

INLINE
C++ commands
ENDINLINE

Cette commande est pour les utilisateurs avancés sachant ce qu'ils font !

Cette commande vous permet d'inclure du code C++ directement dans votre programme GLBasic . GLBasic cesse d'être un langage de programmation facile avec l'utilisation de la commande INLINE !

- Les nombres sont de type "DGInt". C'est un double 64 bits sur un PC , 32bit flottant sur PocketPC .
- Les chaînes sont de type "DGStr". Les chaînes sont toujours en 8bit ASCII. La conversion en Unicode est fait à travers les commandes GLBasic .
- A $ est remplacé par _Str. So a$ est a_Str.
- Vous obtenez un const char* à partir d'un DGStr avec a_Str.c_str();
- Vous obtenez une char* partir d'une chaîne avec la taille de la mémoire tampon 'x' bytes: a_Str.GetStrData(x);
- Toutes les fonctions GLBasic ont une liste de paramètres : e.g. MOUSEWAIT( );
- Un nombre long est de type DGIntArray
- Une chaîne longue est de type DGArray. DGArray est un modèle de classe pour DIM/REDIM. Elle exige seulement une ( ) et d'un opérateur = .
- Accès tableaux : a[x][y] devient a(x,y)
- Il n'ya rien de défini! Si vous avez besoin d'une fonction, il faut la déclarer .
- INLINE vous met dans le namespace __GLBASIC__ . Si vous le quittez, restaurer le après !
- GLBASIC_HWND() donne la HWND de la fenêtre principale GLBasic .
- GETSUBADDRESS(const DGStr& name) renvoie un pointeur vers une SUB - analogue à CALLBYNAME. A SUB est du type : DGInt(*sub)();
- Avec get_sprite_texture(id), Vous pouvez obtenir id de la texture nécessaires pour glBindTexture.

Call DLL-Functions

La caractéristique la plus utilisée de INLINE est la disponibilité de charger des fonctions externes à partir d'une DLL pour leur utiliser dans GLBasic . À cet effet, certaines fonctions très pratiques vous sont proposés:

Charger manuellement :

// Loads the function "foo" from "my.dll" into the pointer: foo
void (__stdcall* foo)(int, char); // Declaration
void LoadDllFunction()
{
   DLLCALL("my.dll", "foo", (void**) &foo);
}

Demandez-leur de se charger automatiquement :

// outside of functions:
// DECLARE(name, "dll", (parameters), return_type)
DECLARE(foo, "my.dll", (int, char), void);

// DECLARE_ALIAS(name, "dll", "real_name", (parameters), return_type)
DECLARE_ALIAS(foo, "my.dll", "foo@4", (int, char), void);

Les paramètres doivent être présentés dans et entre des {}. Vous trouverez que nom de la fonction dans la DLL diffère du nom du prototype. Dans ce cas, la fonction DECLARE_ALIAS peut être utilisée.

Si une fonction a a __cdecl calling convention (Ainsi, il est no __stdcall), Ajoutez simplement a _C à DECLARE:

DECLARE_C(foo, "my.dll", (int, char), void);
DECLARE_C_ALIAS(foo, "my.dll", "foo@4", (int, char), void);

La DLL et la fonction seront chargées au début du programme et libérées quand il clôturera. Vous devez vous assurer que la fonction peut être chargée correctement par des tests :

if(foo)
{
   // everything's fine
}

// INLINE

LOCAL C
C = 41
INLINE
   C++;
ENDINLINE

PRINT "C="+C, 100, 100

Output:
C=42

Refs:

ENDINLINE, IMPORT


INPUT

INPUT in#$, x#, y#

Attend une entrée d'utilisateur à l'endroit ou clignote un carré x#, y#. L'arrière-plan utilisé pour l'entrée est l'arrière-buffer courant . Si vous avez besoin d'un arrière-plan différent pour rendre votre vos lettres visibles (e.g. une boîte à lettres noire ), n'oubliez pas d'afficher le fond en premier.

exemple:

PRINT "Name:", 100, 100
INPUT name$, 100, 150
BLACKSCREEN
PRINT "Name: " + name$, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

INKEY$, KEY(), PRINT


INSTR()

pos% = INSTR(word$, find$, start%=0)

INSTR recherche dans la chaîne word$ pour voir si elle contient la chaîne find$. La valeur retournée est la position dans word$ où la première instance de find$ se trouve (l'index du premier caractère dans la chaîne = 0). Si la sous-chaîne find$ n'existe pas dans word$, -1 est retourné .

Le paramètre optionnel start% précise la position de départ à la recherche . La valeur par défaut est 0 , Donc, à moins d'indication contraire la recherche commence au premier caractère.

pos = INSTR("Dream Design", "sign")
PRINT pos, 0,0
SHOWSCREEN
MOUSEWAIT

Output:
8

Refs:

MID$(), REPLACE$(), SPLITSTR()


INTEGER()

a%=INTEGER(b#)

La commande INTEGER suprime la partie décimale d'un nombre . En fonction du format des nombres dans votre pays, cela pourrait être soit la partie après le point ou la virgule.
e.g.
INTEGER(2,000,000.01) = 2000000
INTEGER(2.000.000,01) = 2000000
INTEGER(2000000.01) = 2000000

// INTEGER() Demo
FOR i = 0 TO 1 STEP .1
 PRINT i + " - "+INTEGER(i), 0, i*200
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
0 - 0
0.1 - 0
0.2 - 0
0.3 - 0
0.4 - 0
0.5 - 0
0.6 - 0
0.7 - 0
0.8 - 0
0.9 - 0
1 - 1


ISFULLSCREEN()

fs#$ = ISFULLSCREEN()

Retourne si la fenêtre est plein écran "fullscreen" (TRUE) ou "windowed" mode fenêtré (FALSE).

IF ISFULLSCREEN() = TRUE
   PRINT "Fullscreen!",0,0
ELSE
   PRINT "Not fullscreen!",0,0
ENDIF
SHOWSCREEN
MOUSEWAIT

résultat :
Not fullscreen!

Refs:

SETSCREEN


ISMUSICPLAYING()

ok% = ISMUSICPLAYING()

Retourne si la musique se joue actuellement (TRUE) ou non (FALSE).

exemple:

PLAYMUSIC "Music.mp3"
PRINT "Music!", 100, 100
SHOWSCREEN
MOUSEWAIT
if (ISMUSICPLAYING() = 1) then STOPMUSIC // GLBasic does this automatically when ending

Refs:

PLAYMUSIC, STOPMUSIC


JOYSTATE

JOYSTATE jx##, jy##, jba##, jbb##

Définit les valeurs jx## et jy## pour la position actuelle joystick . jba## et jbb## représentent les états des boutons A et B. (1=Appuyé , 0=Relaché)
-1 = Gauche / Vers le haut
0 = Sans Direction
+1 = Droit / Vers le bas

Exemple:

// End with ESC
WHILE TRUE // Endless loop
   JOYSTATE jx, jy, ba, bb
    a$="JX:" + jx + " JY:" + jy + " ButtonA:" + ba + " ButtonB" +bb
    PRINT a$, 10, 100
    SHOWSCREEN
WEND

Refs:

GETJOY...(), INKEY$, KEY()


KEY()

a%=KEY(code%)

Retourne 1 si le code de la touche correspondant au key-code code% est actuellement appuyé , sinon il retourne 0 .

Toutes les touches ont un code-clé "key-code" qui leur sont assignées (e.g. la touche "tabulation" est attribué le code 15, la touche "B" est attribuée code 48 ).
Pour connaitre tous les key-code des touches , utiliser le programme 'Keycode.exe' dans le dossier Outils .

Sur un SmartPhone/PocketPC ces touches sont mappées à la PC-keyboard:

// D-Pad (any device)
   Key PC-Key
--------------
<- 203 Cursors
-> 205
^  200
V  208
o   28 Return

// Application_Buttons (PocketPC)

Key    iPAQ3600 PC-Key
----------------------
199    calendar home
207    mail     end
210    Q        insert
211    ->       del
157,29 audiorec ctrl

Num-Pad (Smartphone)

SMPH   | Key
-------+--------------------
       | PC-NUMPAD     PC-Main
1 2 3  | 71 72 73     2   3  4 (Number keys)
4 5 6  | 75 76 77     5   6  7
7 8 9  | 79 80 81     8   9 10
* 0 #  | 55 81 83     27 11 43 ( ]  0  \ )

SMPH   Key PC-Key
-----------------
dial   211 del
hangup 207 end
home   199 home
back     1 esc

Application Buttons - SmartPhone

SMPH Key PC-Key
---------------
(@t)  67 F9
prev  68 F10
play  87 F11
next  88 F12

Application Buttons - GP2X

GP2X     Key(s)              PC-Key
--------------------------------------------
DPad     203,205,200,208,57  Cursor Keys/Space
Volume   201,209             PageDn/PageUp
Shoulder 42, 54              LShift/RShift
Start    28                  Enter
Select   15                  Tab
A,B,X,Y  44,45,29,58         A,D,S,W
         30,32,31,17         Y,X,LCtr,CapsLock
Vol +&-  01                  ESC

exemple:

// End with ESC
WHILE TRUE // Endless-Loop
    IF KEY(57) = 1; PRINT "Space Bar is Pressed", 100, 100; ENDIF
    SHOWSCREEN
WEND

Refs:

ALLOWESCAPE, INKEY$, INPUT, KEYWAIT


KEYWAIT

KEYWAIT

Attend l'appui d'une touche .

PRINT "Hit me", 100, 100
SHOWSCREEN
KEYWAIT
PRINT "OK", 100, 100
SHOWSCREEN
KEYWAIT

Refs:

INKEY$, INPUT, KEY()


KILLFILE

KILLFILE filename$

Supprime un fichier du disque dur .

// Write a file
PUTFILE "test.txt", 0, "test"
// remove it
KILLFILE "test.txt"

// sort of a stupid example ;)

Refs:

COPYFILE, DOESFILEEXIST(), FILEREQUEST$(), GETCURRENTDIR$(), GETFILELIST(), SHELLCMD()


LCASE$()

down$ = LCASE$(text$)

Convertit tous les caractères majuscules dans la chaîne text$ en minuscules .

// UCASE$ - LCASE$
PRINT UCASE$("123 - miniMIN"), 0, 20
PRINT LCASE$("123 - MAXImax" style="color:white;">), 0, 40
SHOWSCREEN
MOUSEWAIT

résultat:
123 - MINIMIN
123 - maximax

Refs:

UCASE$


LEN()

len%= LEN(word$)

La commande LEN retourne le nombre de caractères (longueur) d'une chaîne de caractères "string".

LEN(array[]) peut également être utilisé comme une abréviation pour BOUNDS(array[], 0).

exemple:

a$="Super"
b=LEN(a$)
PRINT b, 100, 100 // Prints '5'
SHOWSCREEN
MOUSEWAIT

Output:
5

Refs:

BOUNDS(), INSTR(), MID$(), SPLITSTR()


LET

LET a#$ = b#$

Affecte la valeur de la variable b#$ à la variable a#$. Les chaînes sont converties en nombre, si possible, et vice versa . Cette commande est facultative et peut être ignorée (i.e. il suffit de mettre la même déclaration sans le commande "LET").

exemple:

LET a=5   // Or simply a=5
LET b=a+3 // Or simply b=a+3
PRINT a, 100, 100
PRINT b, 100, 150
SHOWSCREEN
MOUSEWAIT

résultat:
5
8

Refs:

IF, PRINT


LIMITFPS

LIMITFPS n#

Cette commande sert à commander la synchronisation de votre programme . Il vous permet de définir le nombre maximal d'images par seconde que l'écran va rafraîchir.
Vous pouvez utiliser cette commande pour créer des ralentissements à la demande, ou pour faire exécuter son intro rapide.

exemple:

LIMITFPS 12
FOR i=0 TO 640
 PRINT "*", i, 100
  SHOWSCREEN
NEXT

Refs:

SHOWSCREEN


LOADANIM

LOADANIM filename$, id%, w%, h%

LOADANIM charge des fichiers images 'éclatés en morceaux' filename$ (animation frames) qui sont w% pixels de large et h% pixels de haut .
Les images individuelles peuvent être affichées avec la commande DRAWANIM .

Le nombre d'images va augmenter de 1 pour chaque image dans l'image. Les images seront créés à partir de gauche à droite sur l'image à partir du coté gauche au coin haut. Quand il n'y a pas plus de place dans l'image horizontalement pour faire un autre cadre, et s'il y a de la place en vertical pour un autre ensemble d'images alors la création de la frame recommencera à partir de la colonne de gauche , h% pixels vers le bas .

e.g. Les cadres "frames" sont créés à partir d'une image comme ça :

// 0 1 2 3
// 4 5 6 7

Example

LOADANIM "test.bmp", 0, 32,32
FOR x=0 TO 16
   FOR y=0 TO 16
      DRAWANIM 0, x + y*16, 36*x, 36*y
   NEXT
NEXT
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWANIM, LOADSPRITE


LOADBMP

LOADBMP bmp$

Charge le fichier bmp$ et modifie l'image du buffer de fond . En conséquence, il servira de base pour l'affichage de votre programme lors du prochain appel SHOWSCREEN.

exemple:

LOADBMP "Image.bmp"
PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

BLACKSCREEN, BLENDSCREEN, LOADSPRITE, USEASBMP


LOADBUMPTEXTURE

LOADBUMPTEXTURE datei$, num%

Charge une image bitmap en niveaux de gris comme une heightmap (blanc est un point élevé sur la heightmap, le noir est un point bas) et crée une map normale de celui-ci. Le heightmap est nécessaire pour dot3 bump mapping.
Les chargement de textures normales peut être spécifié comme 2ème paramètre avec la commande X_SETTEXTURE3D.

exemple:

// Bump Mapping Demo
// -----------------

// Image data
LOADSPRITE      "image.bmp",0
// Like LOADSPRITE but converts heightmap to normal map
LOADBUMPTEXTURE "bump.bmp", 1

// a simple square
X_OBJSTART 1
 X_OBJADDVERTEX   -20, -20, 0,  0,1, RGB(255,255,255)
 X_OBJADDVERTEX   -20,  20, 0,  0,0, RGB(255,255,255)
 X_OBJADDVERTEX    20, -20, 0,  1,1, RGB(255,255,255)
 X_OBJADDVERTEX    20,  20, 0,  1,0, RGB(255,255,255)
X_OBJEND

// main loop
WHILE TRUE
 phi=phi+GETTIMER()/20; IF phi>=360 THEN phi=phi-360
 X_MAKE3D 1, 500, 45
 X_CAMERA 0, 10, 100, 0,0,0
 // Light no -1 is bump light position
 X_SPOT_LT -1, 0, 0,0,50, 0,0,0,90
 X_SETTEXTURE 0, 1 // 0=Texture, 1=Bump-normal-map
 X_ROTATION phi, 0, 1, 0
 X_DRAWOBJ 1, 0
 SHOWSCREEN
WEND

Refs:

LOADSPRITE, X_MAKE3D, X_OBJ..., X_SETTEXTURE


LOADFONT

LOADFONT bmp$, num%

Charge le fichier bmp$ et l'utilise comme la police en cours pour les commandes PRINT et INPUT. La police est une police bitmap - ce qui signifie que tous les caractères ont tous la même largeur et la même hauteur.
Font-bmps doit avoir la taille de 16*x et 8*y pixels. Utilisez l'utilitaire GLBasicFont à créer un BMP-font à partir d'un TrueTypeFont .

Voir aussi : PRINT, INPUT

exemple:

PRINT "Hello World", 100, 100
LOADFONT "comp_fnt.bmp", 1
SETFONT 1
PRINT "Computer", 100, 150
SHOWSCREEN
MOUSEWAIT

Refs:

INPUT, PRINT, SETFONT, SETTRANSPARENCY


LOADSOUND

LOADSOUND file$, num%, buffers%

Charge le fichier wav file$ (PCM-wav seulement ce format) pour être utilisé avec le ID num%.
buffers% est une valeur de 1 à 4 pour préciser le nombre de fois où le son peut être joué sans coupure .
Avertissement : Chaque demande son stockées dans la mémoire tampon.

exemple:

LOADSOUND "Super.wav", 0, 1
PRINT "SUPER", 100, 100
SHOWSCREEN
PLAYSOUND 0, 0
MOUSEWAIT

Refs:

GENSOUND(), PLAYMUSIC, PLAYSOUND()


LOADSPRITE

LOADSPRITE bmp$, num%

Charge un fichier graphique (bmp or png) dans la mémoire pour pouvoir l'utiliser plus tard avec la commande DRAWSPRITE . Chaque sprite chargé a besoin d'une unique numéro ID (num%) qui vous permet d'accéder à l'image-objet . Si un ID est réutilisé, l'image en mémoire pour cet ID sera remplacé par la nouvelle image.

exemple:

LOADSPRITE "Sprite.bmp", 0
PRINT "Hello World", 100, 100
DRAWSPRITE 0, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE, GENSPRITE(), LOADBMP, SETTRANSPARENCY


LOCAL

LOCAL var#$, var#$[]

LOCAL var#=value#, var#=value(), ...

GLOBAL a#$ = LOCAL b#$
LOCAL a#$ = GLOBAL b#$

Le mot clé LOCAL indique qu'une variable aura une utilisation locale . Cela signifie que la variable est uniquement disponible dans la section particulière du Code (program/subroutine/function) dans laquelle elle est définie. Si une variable est déclarée LOCAL dans le programme principal, elle n'est disponible que pour le programme principal et n'est pas à la disposition de tout sous-programmes / fonctions .

La mémoire utilisée par une variable LOCAL est libérée à la fin de la section du code (the main program/subroutine/function) qu'il l'a déclarée .

Si vous utilisez le mot-clé GLOBAL devant un nom de variable GLOBAL elle fera référence à la version GLOBAL de cette variable - même si une variable LOCAL du même nom existe.

Sans préciser LOCAL ou GLOBAL d'un nom de variable, GLBasic essaie d' utiliser la variable en tant que LOCAL avec ce même nom. S'il n'y a pas de variable LOCAL définie avec ce nom alors GLOBAL est utilisé.

Vous définissez une variable global avec :

GLOBAL var#$

Si vous ne créez pas une variable global avant d'y attribuer une valeur vous obtiendrez une alerte «implicitly created GLOBAL" .
Si vous assignez un résultat de commande comme MOUSESTATE ou GETSCREENSIZE à une variable qui n'a pas été explicitement créé, vous obtiendrez un avertissement du compilateur " variable probably unassigned".
exemple:

LOCAL text$
text$="LOCAL_MAIN"
GLOBAL text$="GLOBAL"

GOSUB show
PRINT text$, 100, 150
SHOWSCREEN
MOUSEWAIT
END

// ------------------------------------------------------------- //
// -=#  SHOW  #=-
// ------------------------------------------------------------- //
SUB show:
LOCAL text$

// Creating and defining LOCAL arrays:
LOCAL array[]; DIM array[5]

text$="LOCAL_SUB"

PRINT text$, 100, 50
// Is equal to
// PRINT LOCAL text$, 100, 50
PRINT GLOBAL text$, 100, 100
ENDSUB // SHOW

Output:
LOCAL_SUB
LOCAL_MAIN

Refs:

BYREF, FUNCTION, GLOBAL, STATIC, SUB


LOOPMOVIE

LOOPMOVIE file$

Cette commande va lire une vidéo (comme PLAYMOVIE), l'animation sera répétée jusqu'à ce que le joueur appuie sur la bar-espace-.

exemple:

// LOOPMOVIE
file$="Test.avi"

PRINT "Video: "+file$, 0, 120
PRINT "Hit mouse" ,140, 160
SHOWSCREEN
MOUSEWAIT
LOOPMOVIE file$

PRINT "Movie played" ,100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

PLAYMOVIE


MAX()

num#$ = MAX(a#$, b#$)

Retourne la plus grande valeur entre a#$ et b#$.

// MIN / MAX
   a = RND(100)
   b = RND(100)
   PRINT "a: "+a+" b: "+b, 0, 100
   PRINT "max: " + MAX(a,b), 0,120
   PRINT "min: " + MIN(a,b), 0, 140
   SHOWSCREEN
   MOUSEWAIT

résultat:
a: 53 b: 59
max: 59
min: 53

Refs:

MIN()


MID$()

aim$=MID$(source$, start%, length%=-1)

Retourne une "subset" (une sous-chaîne ) d'une chaîne source$. Start# est l'index de la première lettre à copier . La première lettre de la chaîne source$ a l'index 0.

Si le paramètre optionnel length% < 0, le texte sera utilisé jusqu'à la fin . length% = 0 ne retiendra pas de caractères .

exemple:

a$="GLBasic"
b$=MID$(a$, 3, 2) // "as"
PRINT a$, 100, 70
PRINT b$, 100, 100
SHOWSCREEN
MOUSEWAIT

résultat:
GLBasic
as

Refs:

ASC(), CHR$(), INSTR(), LEN(), REPLACE$(), SPLITSTR()


MIN()

num#$ = MIN(a#$, b#$)

Retourne la plus petite valeur entre a#$ et b#$.

// MIN / MAX
   a = RND(100)
   b = RND(100)
   PRINT "a: "+a+" b: "+b, 0, 100
   PRINT "max: " + MAX(a,b), 0,120
   PRINT "min: " + MIN(a,b), 0, 140
   SHOWSCREEN
   MOUSEWAIT

Example résultat:
a: 53 b: 59
max: 59
min: 53

Refs:

MAX()


MOD()

a% = MOD(b%, c%)

Retourne le reste entier d'une opération de division .

exemple:

// MOD
PRINT MOD(5,3), 0, 100 // 5/3=1 with reminder (MOD)=2
SHOWSCREEN
MOUSEWAIT

résultat:
2

Refs:

FMOD()


MOUSEAXIS

v%=MOUSEAXIS(ax%)

Retourne l'état de l'axe de la souris et des boutons / .
ax%:
0=X - Velocité
1=Y - Velocité
2=molette (1 vers le haut , -1 vers le bas )
3=bouton gauche de la souris
4=bouton droit de la souris
5=bouton du milieu de la souris

// --------------------------------- //
// Project: MOUSEAXIS
// Start: Tuesday, November 16, 2004
// IDE Version: 2.41111

WHILE TRUE
   PRINT "X:" + MOUSEAXIS(0), 0,  0
   PRINT "Y:" + MOUSEAXIS(1), 0, 20
   PRINT "Z:" + MOUSEAXIS(2), 0, 40
   PRINT "A:" + MOUSEAXIS(3), 0, 60
   PRINT "B:" + MOUSEAXIS(4), 0, 80
   PRINT "C:" + MOUSEAXIS(5), 0,100
   SHOWSCREEN
WEND

Refs:

GETMOUSECOUNT(), MOUSESTATE, MOUSEWAIT, SETACTIVEMOUSE


MOUSESTATE

MOUSESTATE mx##, my##, mba##, mbb##
SETMOUSE mx#, my#

MOUSESTATE retourne l'emplacement de la souris et l'état des boutons. mx## et my## sont les coordonnées du pointeur de la souris (qui est masqué par défaut ), mba## et mbb## sont l'état des boutons de la souris (1=appuyé, 0=relaché).

Pour définir les coordonnées de pointeur de la souris utiliser SETMOUSE mx#, my#.

exemple:

WHILE TRUE // Endless loop
  LimitMouse(100, 100, 400, 300)
  PRINT "<=", mx, my
  IF b1 THEN END
  SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  LIMITMOUSE  #=-
// MOUSESTATE mx, my, b1, b2 (GLOBAL)
// With limiting of the area
// ------------------------------------------------------------- //
FUNCTION LimitMouse: minx, miny, maxx, maxy
  // These variables are defined LOCAL:
  // minx, miny, maxx, maxy
  MOUSESTATE mx, my, b1, b2
  IF mx<minx THEN mx=minx
  IF mx>maxx THEN mx=maxx
  IF my<miny THEN my=miny
  IF my>maxy THEN my=maxy
  SETMOUSE mx, my
ENDFUNCTION // LIMITMOUSE

Refs:

GETJOY...(), INKEY$, JOYSTATE, KEY(), MOUSEAXIS, MOUSEWAIT


MOUSEWAIT

MOUSEWAIT

Attend que le joueur de frappe un bouton de la souris .

exemple:

PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT // Wait for mouse button to be triggered
END

Refs:

KEYWAIT, MOUSESTATE


MUSICVOLUME

MUSICVOLUME vol#$

Règle le volume de la musique qui est en cours de lecture . La valeur vol#$ est de l'ordre de 0 (silence) à 1 (bruyant ).

PLAYMUSIC "Music.mp3"

WHILE TRUE
   MOUSESTATE mx, my, b1, b2
   // vol = 0.0 ... 1.0
   vol = MIN(mx/640, 1.0)

   PRINT "Volume: " + INTEGER(vol * 100) + "%", 100,100
   MUSICVOLUME vol
   SHOWSCREEN
WEND

Refs:

PLAYMUSIC


NET...

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau.

NETHOSTGAME(tcp_port%)
NETJOINGAME(server$, tcp_port%)

Avec la commande NETHOSTGAME , vous pouvez acceuillir un nouveau serveur réseau.

La valeur pour tcp_port% specifie au reseau le port TCP que vous voulez utiliser pour communiquer. Si vous le metter à 0, il utilisera la valeur par defaut de port tcp de 27910.
Note : Les ports au dessous de 1024 sont connus comme "privilegié" et generallement utilisé par des fonctions importante du réseau (comme les mails le traffic internet). Il en resulte qu'il serais bien d'utiliser un port compris entre 1024 et 65535 ( le maximum autorisé).
Bien sure, vous pouvez utiliser les ports sous 1025 si vous ecrivez spécifiquement une application qui utilise les services connus comme les emails ou un serveur web.
NOTE : Les applications linux doivent avoir l'acces root pour ouvrir les ports entre 1 et 1024.
NOTE : Si vous avez des soucis de communication entre vos client et votre serveur, assurez vous que les ports choisi sont bien autorisés par tous les firewall existant.

NETSHUTDOWN

Cette commande termine toutes les commandes NET..., ferme toutes les connections ouverte et rends la mémoire utilisée.

ok% = NETISACTIVE()

Retourne si le moteur réseau fonctionne actuellement. Si le serveur quitte le réseau, tous les clients du moteur seront arrêtés aussi.

id% = NETCREATEPLAYER(name$)

Crée un joueur qui va être annoncé au serveur réseau. Les services réseau utilise "players" pour communiquer avec le serveur et avec les autres clients.
En cas d'erreur , 0 est retourné.

num% = NETNUMPLAYERS()

Cette commande retourne le nombre de joueurs que le serveur connais.
Si le serveur est arrêté, cette commande retourne 0. Note : cette commande fait des requetes sur le serveur réseau, cela risque d'être lent.

quitid% = NETGETQUITPLAYER()

Retourne l'ID du joueur supprimé par NETDESTROYPLAYER() ou perdu suite à une déconnection du client.
Cette commande fonctionne seulement sur le programme serveur. Si aucun joueur n'a quitté la commande retourne une valeur à 0.
Si un joueur a quitté, le serveur va envoyer un message à tous les clients pour les informer de cette perte. Vous pouvez continuer d'utiliser cette fonction jusqu'elle vous retourne une valeur à 0 autrement vous pouvez rater une déconnection si plusieurs joueurs sont supprimés simultanément.

id% = NETGETPLAYERID(index%)

Vous pouvez utiliser cette commande pour tout les indices dans la plage de 0 à NETNUMPLAYERS()-1 pour avoir l' IDs des joueurs.
En cas d'erreur , 0 est retourné.

name$ = NETPLAYERNAME$(id%)

Une fois que vous avez l' ID d'un joueur, vous pouvez demander de voir sont nom avec cette fonction.

ip$ = NETGETIP$()

Cette commande vous donne une liste des adresses IP allouées a votre ordinateur, Cette commande vous procure une liste des addresses IP qui sont attribués à votre ordinateur , donc vous pouvez dire au autres qui vous êtes.
Les IPs sont séparées par "|" et peuvent être séparé avec SPLITSTR.
Note : Si vous écrivez une application qui cause au system à travers internet et non a travers le réseau local, l' adresse IP retournée par cette commande risque de ne pas être la bonne pour les system connectés. Vous avez besoin de vérifier votre router internet pour savoir votre adresse IP public face à internet.

NETALLOWJOINING OK%

Afin d'éviter que d'avantage de personne se connecte au serveur ou d'éviter que l'ordinateur crée d'autre joueurs additionnel, vous devez régler NETALLOWJOINING à FALSE. Vous devez appeler cette fonction dans le programme serveur.
Appelez NETHOSTGAME pour revenir à TRUE.

NETDESTROYPLAYER id%

Cette commande supprime un joueur du serveur . Cette commande dois etre appeler sur la machine qui à crée ce joueur .

ok% = NETSENDMSG(id_from%, id_to%, text$)

Envoyer un message du joueur id_from% à la messagerie du joueur id_to%. Si id_to% = 0, le message va être envoyé a tout les joueurs connu du serveur (Sauf celui qui envoie ce message).
text$ est la chaine de caractère à être envoyé et ne peut pas dépasser 1023 caractères.

msg$ = NETGETMSG$(id%)

Avec cette commande vous retrouvez le message du joueur id% à partir de sa messagerie qui a été envoyé avec la commande NETSENDMSG. Le joueur id% dois être un des joueur que vous avez crée - Par exemple. vous pouvez retrouvez seulement vos propre messages. Si aucun message est disponible, LEN(msg$)=0.
Le message est supprimé après avoir été retrouvé.

id% = NETGETSENDER()

Retourne l'ID du joueur qui à envoyé le dernier message reçu par la commande NETGETMSG$().

err$ = NETGETLASTERROR$()

Retourne un numéro d'erreur suivi par une message d'erreur lisible pour la dernière action en erreur. Vous pouvez convertir l'erreur en un numéro en appelant ierr% = INTEGER(err$). Ce n'est pas assuré que ce numéro d'erreur soit identique sur tout les operating Systems.

contents$ = NETWEBGET$(server$, path$, port%, max_length%)

Lie le contenu d'un site web dans une variable de type string.
server$ - nom du serveur
path$ - chemin sur le serveur
port% - port à ouvrir. Normalement le 80
max_length% - le nombre maximum de caractères à être lu à partir du site web.

ok% = NETWEBGET(server$, path$, port%, local$)

Lie le contenu d'un site web dans une variable de type string.
server$ - nom du serveur
path$ - chemin sur le serveur
port% - port à ouvrir. Normalement le 80
max_length% - le nombre maximum de caractères à être lu à partir du site web.

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

07 Network Games, SOCK_...


NETALLOWJOINING

NETALLOWJOINING OK%

Afin d'éviter que d'avantage de personne se connecte au serveur ou d'éviter que l'ordinateur crée d'autre joueurs additionnel, vous devez régler NETALLOWJOINING à FALSE. Vous devez appeler cette fonction dans le programme serveur.
Appelez NETHOSTGAME pour revenir à TRUE.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau.

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETHOSTGAME, NETJOINGAME, NETSHUTDOWN


NETCREATEPLAYER

id% = NETCREATEPLAYER(name$)

Crée un joueur qui va être annoncé au serveur réseau. Les services réseau utilise "players" pour communiquer avec le serveur et avec les autres clients.
En cas d'erreur , 0 est retourné.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETHOSTGAME, NETISACTIVE, NETJOINGAME, NETSHUTDOWN


NETDESTROYPLAYER

NETDESTROYPLAYER id%

Cette commande supprime un joueur du serveur . Cette commande dois etre appeler sur la machine qui à crée ce joueur .

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETCREATEPLAYER, NETGETLASTERROR, NETSHUTDOWN


NETGETIP

ip$ = NETGETIP$()

Cette commande vous donne une liste des adresses IP allouées a votre ordinateur, Cette commande vous procure une liste des addresses IP qui sont attribués à votre ordinateur , donc vous pouvez dire au autres qui vous êtes.
Les IPs sont séparées par "|" et peuvent être séparé avec SPLITSTR.
Note : Si vous écrivez une application qui cause au system à travers internet et non a travers le réseau local, l' adresse IP retournée par cette commande risque de ne pas être la bonne pour les system connectés. Vous avez besoin de vérifier votre router internet pour savoir votre adresse IP public face à internet.
Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETCREATEPLAYER, NETGETLASTERROR, NETHOSTGAME, NETJOINGAME, NETSHUTDOWN


NETGETLASTERROR

err$ = NETGETLASTERROR$()

Retourne un numéro d'erreur suivi par une message d'erreur lisible pour la dernière action en erreur. Vous pouvez convertir l'erreur en un numéro en appelant ierr% = INTEGER(err$). Ce n'est pas assuré que ce numéro d'erreur soit identique sur tout les operating Systems.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETALLOWJOINING, NETCREATEPLAYER, NETDESTROYPLAYER, NETGETIP, NETGETMSG, NETGETPLAYERID, NETGETQUITPLAYER, NETGETSENDER, NETHOSTGAME, NETISACTIVE, NETJOINGAME, NETNUMPLAYERS, NETPLAYERNAME, NETSENDMSG, NETSHUTDOWN, NETWEBGET


NETGETMSG

msg$ = NETGETMSG$(id%)

Avec cette commande vous retrouvez le message du joueur id% à partir de sa messagerie qui a été envoyé avec la commande NETSENDMSG. Le joueur id% dois être un des joueur que vous avez crée - Par exemple. vous pouvez retrouvez seulement vos propre messages. Si aucun message est disponible, LEN(msg$)=0.
Le message est supprimé après avoir été retrouvé.
Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETGETSENDER, NETSENDMSG


NETGETPLAYERID

id% = NETGETPLAYERID(index%)

Vous pouvez utiliser cette commande pour tout les indices dans la plage de 0 à NETNUMPLAYERS()-1 pour avoir l' IDs des joueurs.
En cas d'erreur , 0 est retourné.
Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETNUMPLAYERS, NETPLAYERNAME


NETGETQUITPLAYER

quitid% = NETGETQUITPLAYER()

Retourne l'ID du joueur supprimé par NETDESTROYPLAYER() ou perdu suite à une déconnection du client.
Cette commande fonctionne seulement sur le programme serveur. Si aucun joueur n'a quitté la commande retourne une valeur à 0.
Si un joueur a quitté, le serveur va envoyer un message à tous les clients pour les informer de cette perte. Vous pouvez continuer d'utiliser cette fonction jusqu'elle vous retourne une valeur à 0 autrement vous pouvez rater une déconnection si plusieurs joueurs sont supprimés simultanément.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETDESTROYPLAYER, NETGETLASTERROR, NETSHUTDOWN


NETGETSENDER

id% = NETGETSENDER()

Retourne l'ID du joueur qui à envoyé le dernier message reçu par la commande NETGETMSG$().

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETGETMSG, NETPLAYERNAME


NETHOSTGAME

NETHOSTGAME(tcp_port%)

Avec la commande NETHOSTGAME , vous pouvez acceuillir un nouveau serveur réseau.

La valeur pour tcp_port% specifie au reseau le port TCP que vous voulez utiliser pour communiquer. Si vous le metter à 0, il utilisera la valeur par defaut de port tcp de 27910.
Note : Les ports au dessous de 1024 sont connus comme "privilegié" et generallement utilisé par des fonctions importante du réseau (comme les mails le traffic internet). Il en resulte qu'il serais bien d'utiliser un port compris entre 1024 et 65535 ( le maximum autorisé).
Bien sure, vous pouvez utiliser les ports sous 1025 si vous ecrivez spécifiquement une application qui utilise les services connus comme les emails ou un serveur web.
NOTE : Les applications linux doivent avoir l'acces root pour ouvrir les ports entre 1 et 1024.
NOTE : Si vous avez des soucis de communication entre vos client et votre serveur, assurez vous que les ports choisi sont bien autorisés par tous les firewall existant.

Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETCREATEPLAYER, NETGETLASTERROR, NETJOINGAME, NETSHUTDOWN


NETISACTIVE

ok% = NETISACTIVE()

Retourne si le moteur réseau fonctionne actuellement. Si le serveur quitte le réseau, tous les clients du moteur seront arrêtés aussi.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETCREATEPLAYER, NETDESTROYPLAYER, NETGETLASTERROR, NETHOSTGAME, NETJOINGAME, NETSHUTDOWN


NETJOINGAME

NETJOINGAME(server$, tcp_port%)

Avec la commande NETHOSTGAME , vous pouvez acceuillir un nouveau serveur réseau.

La valeur pour tcp_port% specifie au reseau le port TCP que vous voulez utiliser pour communiquer. Si vous le metter à 0, il utilisera la valeur par defaut de port tcp de 27910.
Note : Les ports au dessous de 1024 sont connus comme "privilegié" et generallement utilisé par des fonctions importante du réseau (comme les mails le traffic internet). Il en resulte qu'il serais bien d'utiliser un port compris entre 1024 et 65535 ( le maximum autorisé).
Bien sure, vous pouvez utiliser les ports sous 1025 si vous ecrivez spécifiquement une application qui utilise les services connus comme les emails ou un serveur web.
NOTE : Les applications linux doivent avoir l'acces root pour ouvrir les ports entre 1 et 1024.
NOTE : Si vous avez des soucis de communication entre vos client et votre serveur, assurez vous que les ports choisi sont bien autorisés par tous les firewall existant.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETCREATEPLAYER, NETDESTROYPLAYER, NETGETLASTERROR, NETHOSTGAME, NETISACTIVE, NETSHUTDOWN


NETNUMPLAYERS

num% = NETNUMPLAYERS()

Cette commande retourne le nombre de joueurs que le serveur connais.
Si le serveur est arrêté, cette commande retourne 0. Note : cette commande fait des requetes sur le serveur réseau, cela risque d'être lent.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETGETPLAYERID, NETGETQUITPLAYER, NETPLAYERNAME


NETPLAYERNAME

name$ = NETPLAYERNAME$(id%)

Une fois que vous avez l' ID d'un joueur, vous pouvez demander de voir sont nom avec cette fonction.
Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETGETPLAYERID, NETGETQUITPLAYER, NETSHUTDOWN


NETSENDMSG

ok% = NETSENDMSG(id_from%, id_to%, text$)

Envoyer un message du joueur id_from% à la messagerie du joueur id_to%. Si id_to% = 0, le message va être envoyé a tout les joueurs connu du serveur (Sauf celui qui envoie ce message).
text$ est la chaine de caractère à être envoyé et ne peut pas dépasser 1023 caractères.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETGETMSG, NETGETSENDER, NETHOSTGAME, NETJOINGAME, NETSHUTDOWN


NETSHUTDOWN

NETSHUTDOWN

Cette commande termine toutes les commandes NET..., ferme toutes les connections ouverte et rends la mémoire utilisée.
Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau

Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETDESTROYPLAYER, NETGETLASTERROR, NETGETQUITPLAYER, NETHOSTGAME, NETISACTIVE, NETJOINGAME


NETWEBEND

NETWEBEND url$

Termine le programme et appel dans votre browser web l'url specifié dans url$

STDOUT "Test\n"

NETWEBEND "http://www.glbasic.com"

STDOUT "Never comes here\n"


NETWEBGET

contents$ = NETWEBGET$(server$, path$, port%, max_length%)

Lie le contenu d'un site web dans une variable de type string.
server$ - nom du serveur
path$ - chemin sur le serveur
port% - port à ouvrir. Normalement le 80
max_length% - le nombre maximum de caractères à être lu à partir du site web.

Les commandes NET... requière d'avoir acheté soit GLBasic Premium ou l'addon GLBasic NET.

Les commandes NET... donnent des fonctionalités reseau a vos programmes GLBasic en utilisant le protocol TCP. Le TCP as l'avantage sur les autres protocoles d'assurer les transmissions et receptions de vos messages sur le réseau
Example :

FUNCTION ReadHighScores: names$[], scores[], username$, thescore
LOCAL ct, i, str$, proxy$, port

   str$ = "highscores/listgame.php"
   str$ = str$ + "?game=mygame"
   str$ = str$ + "&name="+username$
   str$ = str$ + "&score="+thescore
   str$ = str$ + "&secret=mycode"

   PRINT ".: WebGet scores :.", 0, 0
   SHOWSCREEN

   INIOPEN "config.ini"
   proxy$ = INIGET$("server", "proxy")
   port   = INIGET$("server", "port")
   KILLFILE "scores.ini"
   IF port=0 OR proxy$="NO_DATA"
      NETWEBGET("www.glbasic.com", "/"+str$, 80, "scores.ini")
   ELSE
      NETWEBGET(proxy$, "http://www.glbasic.com/" + str$, port, "scores.ini")
   ENDIF

   INIOPEN "scores.ini"
   ct = INIGET$("scores", "count")
   DIM names$[ct]
   DIM scores[ct]

   FOR i=1 TO ct
      names$[i-1] = INIGET$("scores", "n"+i)
      scores[i-1] = INIGET$("scores", "s"+i)
   NEXT
ENDFUNCTION

Refs:

NETGETLASTERROR, NETSHUTDOWN


NEXT

FOR counter# = start# TO end# |STEP steps#|
...
NEXT

La fonction FOR NEXT est utilisée pour produire une boucle dans le programme, avec les paramètres définis. A chaque cycle, <variable> est incrémentée de 1 (ou d'une valeur correspondant au pas indiqué dans STEP#). Le première valeur de Counter# est Start#. La boucle est interrompue dès que la valeur de Counter est supérieure à la valeur de End#. .
La déclaration BREAK fera immédiatement interrompre la boucle et continuer à exécuter le code immédiatement après NEXT.
La déclaration CONTINUE placé quelque part dans la boucle demandera au programme de se comporter comme il venait de lire NEXT.

Sample:

FOR i=0 TO 10 STEP 2
    PRINT i, 100, 32*i
NEXT

SHOWSCREEN
MOUSEWAIT

Output:
0
2
4
6
8
10

Refs:

FOR, STEP, TO


OPENFILE()

ok = OPENFILE(channel%, file$, mode%)

Ouvre le fichier file$ soit pour l'écriture (mode%=FALSE ou 0, ou -1 à ajouter au dossier ) ou de la lecture (mode%=TRUE or 1) et assigne les index pour le canal channel% . La valeur de retour est TRUE ou FALSE indiquant si le dossier peut être ouvert .

mode%:
-1 - ajouter au fichier
0 - écrire
1 - lire

Lecture de fichiers

READBYTE channel%, val%%
READUBYTE channel%, val%%
READWORD channel%, val%%
READUWORD channel%, val%%
READLONG channel%, val%%
READULONG channel%, val%%
READIEEE channel%, val##
READSHORTIEEE channel%, val##
READSTR channel%, val$#, nc%
READLINE channel%, val$#

Ecriture dans un fichier

WRITEBYTE channel%, val%
WRITEWORD channel%, val%
WRITELONG channel%, val%
WRITEUBYTE channel%, val%
WRITEUWORD channel%, val%
WRITEULONG channel%, val%
WRITEIEEE channel%, val#
WRITESHORTIEEE channel%, val#
WRITESTR channel%, val$
WRITELINE channel%, val$

BYTE = 1 Byte, (0..255)
WORD = 2 Byte, (0..65535)
U = sans signe . (e.g. 0..255 au lieu de -127..128 for BYTE)
LONG = 4 Byte, (0..4294967295)
IEEE = 8 Byte, IEEE 64 Bit nombre à virgule flottante
SHORTIEEE = 4 Byte, IEEE 32 Bit nombre à virgule flottante

Les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Avec IEEE Vous pouvez charger des nombres à virgule flottante. C'est la meilleure façon de conserver les numéros en GLBasic .

La valeur nc% pour READSTR spécifie le nombre de caractères (BYTE) à lire dans la chaîne .

READLINE peut être utilisé avec les fichiers produits sur les deux systèmes de type Unix (lines end with only a new line character) ou système non Unix (lines end with a carriage-return/line feed sequence).
Les données seront lues jusqu'à ce que a "\n" (newline) survienne dans le fichier . les retourq chariot ("\r") sur la ligne seront supprimés si elle existe .
Lors de la rédaction , WRITELINE ajoutera les carriage-return/line feed sequence ("\r\n") à la ligne . Si vous voulez écrire en format UNIX, utilisez :
WRITESTR 1, text$ + "\n"

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, GENFILE(), INIOPEN, READBYTE, READIEEE, READLINE, READLONG, READSHORTIEEE, READSTR, READUBYTE, READULONG, READUWORD, READWORD, WRITEBYTE, WRITEIEEE, WRITELINE, WRITELONG, WRITESHORTIEEE, WRITESTR, WRITEUBYTE, WRITEULONG, WRITEUWORD, WRITEWORD


OR

a# = b# OR c#

Logique OR: Retours TRUE si l'une variable (b# ou c#) est non nulle .
(Voir bOR pour Binary OR).

Attention:
AND et OR Si aucune parenthèse n'est utilisée le GLBasic operator-style évalue de gauche à droite .

istwo = 2
   isthree = 3
   isfour = 4

   IF (istwo = 2) AND (isthree = 3)
      // Will print as both conditions are true (i.e. 1)
      // AND needs both conditions to be true
      PRINT "istwo = 2 and isthree = 3",0,0
   ENDIF

   IF (istwo = 2) AND (isthree = 2)
      // This wont print as second condition is false (i.e. 0)
      // AND needs both conditions to be true

      PRINT "isone = 1 and istwo = 1",0,10
   ENDIF

   IF (istwo = 4) OR (isthree = 3)
      // Will print as only one condition needs to be true (i.e. 1) for an OR condition
      PRINT "isone = 1 and istwo = 2",0,20
   ENDIF

   IF ((isthree = 6) AND (isfour = 4)) OR (istwo = 2)
      // ((isthree = 6) and (isfour = 4)) = FALSE
      // (istwo = 2) = TRUE
      // FALSE "OR" TRUE = TRUE therefore this will print
      PRINT "((isthree = 6) AND (isfour = 4)) or (istwo = 2)",0,30
   ENDIF

   SHOWSCREEN
   MOUSEWAIT

résultat:
istwo = 2 and isthree = 3

isone = 1 and istwo = 2
((isthree = 6) AND (isfour = 4)) or (istwo = 2)

Refs:

AND, bAND(), bNOT(), bOR(), bXOR()


PLATFORMINFO$()

info$ = PLATFORMINFO$(what$)

Retourne une chaîne avec les informations sur plate-forme utilisée. Le paramètre what$ décide de la valeur à retourner dans info$.

what$ = "" (empty): la plate-forme seront communiqués :
"LINUX" = Linux operating system
"WIN32" = Windows Desktop (9x, NT, XP, 2003, ...)
"WINCE" = PocketPC
"GP2X" = GP2X
"MACOSX"= Mac OS X
"IPHONE"= iPhone or iPod Touch

what$ = "DOCUMENTS" renvoie le répertoire pour les documents de l'utilisateur . Vous devriez être capable d'écrire des fichiers dans ce répertoire si nécessaire .

what$ = "ID" retourne un ordinateur unique id composé de personnalités de 0-9 et des lettres 'A'-'F' uniquement.

what$ = "DEVICE" retourne le matériel qui exécute le programme . les valeurs de retour possibles sont :
"DESKTOP" - Any PC avec clavier et souris
"POCKETPC" - WinCE, touchscreen
"SMARTPHONE" - WinCE, no touchscreen, number block
"WINCE" - WinCE, aucune autre information
"F100" - a GP2X-F100 device
"F200" - a GP2X-F200 device (with touchscreen)
"IPHONE" - iPhone
"IPOD" - iPod Touch

what$ = "BATTERY" retourne la durée de vie de la batterie en % .

what$ = "TIME" renvoie la date et l'heure actuelles . Vous pouvez utiliser SPLITSTR .

was$ = "GLEXT:xxxx" Retours 1 ou 0, dépendant de l'extension OpenGL 'xxxx' trouvée (wglGetProcAddress). e.g. "GLEXT:glBindFramebufferEXT" est nécessaire pour un rapide USESCREEN.

what$ = "COMPILED" retourne la date à laquelle le programme a été conçu : "Oct 2008 5-16:35:27"

what$ = "HOSTID" renvoie le numéro de série de l'ordinateur sur lequel a été établi ce programme . Le numéro est indiqué pour le précompilateur comme "SN:xxxxxxxx".

was$ = "LOCALE" retourne la langue du système d'exploitation dans la syntaxe HTTP des codes de pays , minuscule .
http://goes.gsfc.nasa.gov/text/web_country_codes.html
Les plus importantes pourraient être :
us, uk, es, fr, de, au

info$ = PLATFORMINFO$("") // What device is this
PRINT "Platform = " + info$, 0, 20

info$ = PLATFORMINFO$("ID") // Get unique device id
PRINT "ID = " + info$, 0,40

// 2006-7-28 18:59:45
info$ = PLATFORMINFO$("TIME") // Get date + time
PRINT "Time = " + info$, 0, 80

SHOWSCREEN
MOUSEWAIT

Refs:

GETFILELIST(), GETFONTSIZE, GETSCREENSIZE, GETTIMER(), GETTIMERALL(), SPLITSTR()


PLAYMOVIE

PLAYMOVIE animation$

Interrompt le programme en cours et joue le fichier vidéo animation$. Tous les formats vidéo avec les codecs installés sont pris en charge . (AVI, MPG, MP2...)

exemple:

PLAYMOVIE "animation.avi"
PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

LOOPMOVIE


PLAYMUSIC

PLAYMUSIC file$, bLoop%

Joue un fichier de musique en arrière-plan . Tous les formats de fichiers musicaux avec les codecs installés sont pris en charge . (midi, wav, mp3...)
Pour mettre fin à l'appel de la musique STOPMUSIC.

Le paramètre bLoop% indique si la musique doit être mise en boucle (TRUE) ou non (FALSE).

Avec ISMUSICPLAYING() vous pouvez tester si la musique est en cours de lecture ou non .

exemple:

PLAYMUSIC "Music.mp3", TRUE
PRINT "Music!", 100, 100
SHOWSCREEN
MOUSEWAIT
STOPMUSIC // GLBasic does this automatically when ending

Refs:

ISMUSICPLAYING(), LOADSOUND, MUSICVOLUME, STOPMUSIC


PLAYSOUND()

channel% = PLAYSOUND(num%, pan#, volume#)

Lectures de l'échantillon wav qui avait été à charge en mémoire tampon num%.

pan# spécifie la valeur d'effet stéréo :
-1.0 gauche
0.0 Moyen
+1.0 droit

volume# spécifie le volume de l'échantillon .
0.0 calme
1.0 bruyant

channel% est le canal sur lequel le son est diffusée . Voir SOUNDPLAYING().

exemple:

LOADSOUND "Super.wav", 0, 1

PRINT "SUPER", 0, 100
PLAYSOUND (0, -1, 1)
SHOWSCREEN
MOUSEWAIT
HUSH

PRINT "SUPER", 500, 100
PLAYSOUND (0, 1, 1)
SHOWSCREEN
MOUSEWAIT

Refs:

HUSH, PLAYMUSIC, SOUNDPLAYING()


Polyvector

Polyvector x%, y%,% tx, ty%, col%

Polyvector est utilisé pour spécifier l'emplacement d'un point pour STARTPOLY pour un polygone créé.
Les valeurs de couleurs peuvent être fixés pour chaque polygon's corner. Il doit y Avoir au moins 3 Polyvector Appels Entre-Deux STARTPOLY et ENDPOLY sinon rien ne sera Considéré . Entre STARTPOLY et ENDPOLY aucun des appels fonctions DRAWSPRITE autorisés ou PRINT sont. Utilisez si vous DRAWSPRITE ou des fonctions d'impression, des pannes du Système Peuvent se Produire!

o x% et y% sont l'écran coordonnée du vecteur.
S'il vous plaît faire attention les polygones doivent être inscrits en anti-horaire.
o% tx et ty% donne les coordonnées x et y sur le bitmap spriteID% pour les pixels de la texture.
col% o est une valeur de couleur RGB () pour les couleurs des des coins, en plus de la texture bitmap.
L'utilisation RGB (255, 255, 255) (White) pour le col% signifie que la couleur de la texture ne sera pas changée.

exemple:

/ / POLYSPRITES

LOADSPRITE   "Block.bmp" , 0 / / 64x64 Bitmap
LOADBMP   "Test.bmp"
  STARTPOLY 0 / / Bitmap = No.0
Polyvector 0, 0, 0, 0, RGB (255, 255, 255)
Polyvector 0, 300, 0, 64, RGB (255, 255, 255)
Polyvector 300, 300, 64, 64, RGB (255, 255, 255)
Polyvector 250, 50, 64, 0, RGB (0, 255, 0)
  ENDPOLY
SHOWSCREEN
MOUSEWAIT

Refs:

DrawLine , DrawRect , DRAWSPRITE , ENDPOLY , SetPixel


POW()

a#=POW(b#, c#)

Porte b# à la puissance c#.

exemple:

// POW
PRINT POW(5, 3), 100, 100 // 5*5*5 = 125
SHOWSCREEN
MOUSEWAIT

Output:
125


PRINT

PRINT text#$, x#, y#

Imprime le texte (mots ou chiffres ) sur le tampon arrière (surface cachée ).

exemple:

PRINT "Hello World", 100, 100
SHOWSCREEN
MOUSEWAIT

resultat:
Hello World

Refs:

INPUT, STDOUT


PROTOTYPE

PROTOTYPE proto: arg1%$ arg2%$ ...

Ce sujet est très complexe et n'est donc pas recommandé pour les débutants .

Un prototype est une fonction vide qui pointe vers une fonction différente. Vous appelez votre pointeur et il redirige votre programme en exécutant une fonction sous-jacente . L'avantage, en utilisant un prototype au lieu de simplement appeler le fonction est que vous pouvez changer dynamiquement le rôle du pointeur du prototype .De cette façon vous pouvez appeler votre prototype plusieurs fois avec les mêmes paramètres, et chaque fois que votre programme est libre selon la fonction qu'il termine .

Créer un prototype en utilisant la commande 'PROTOTYPE'.

PROTOTYPE FunctionProto: a

Vous pouvez ensuite utiliser le prototype comme une variable . i.e.
'LOCAL/GLOBAL [variable] AS [prototype name]'.

Example:

PROTOTYPE FunctionProto: a
LOCAL PointerVariable AS FunctionProto

Une fois le prototype créé, vous désignez une fonction avec la commande '[prototype name] = [function name]'

PROTOTYPE FunctionProto: a, b // Create the prototype "FunctionProto" that takes two arguments - a and b.
LOCAL FunctionPointer AS FunctionProto // Create "FunctionPointer" as a variable of type "prototype"
FunctionPointer= MyTestFunction // Point "FunctionPointer" at the function "MyTestFunction"
FunctionPointer(1,2) // Call "FunctionPointer(1,2)" which will actually call "MyTestFunction(1,2)"

FUNCTION MyTestFunction: a,b
ENDFUNCTION

Les pointeurs de fonction peuvent être du même TYPE:

TYPE MyType
FunctionPointer AS FunctionProto
ENDTYPE

Vous pouvez utiliser la commande "IF" pour déterminer si un pointeur a été affecté à une fonction . S'il a été attribué alors la commande "IF [prototype]" retourenaTRUE.

Example:

LOCAL FunctionPointer AS FunctionProto
IF FunctionPointer = FALSE THEN STDOUT "Pointer has NOT been assigned to a function\n"
FunctionPointer = MyTestFunction
IF FunctionPointer = True THEN STDOUT "Pointer has now been assigned to a function\n"

Si vous utilisez un pointeur de fonction non attribuée, le programme va s'arrêter avec le message d'erreur : "Error: Argument Error-Type or count unsupported."
Des prototypes seront souvent très utile lorsque vous avez une grande instruction switch dans votre Code .

Pointer usage example:

PROTOTYPE func_proto: a

TYPE Tfoo
moo AS func_proto
ENDTYPE

LOCAL pFoo AS func_proto
IF pFoo=FALSE THEN STDOUT "has no pointer\n"
pFoo = f1
pFoo(1)

pFoo = f2
pFoo(2)

call(pFoo)

LOCAL tp AS Tfoo
tp.moo = f1
tp.moo(4)

ALIAS fkt AS tp.moo
fkt(5)
KEYWAIT

FUNCTION f1: one
STDOUT "f1: "+one+"\n"
ENDFUNCTION

FUNCTION f2: a
STDOUT "f2: "+a+"\n"
ENDFUNCTION

FUNCTION call: foo AS func_proto
foo(3)
ENDFUNCTION

résultat:
has no pointer
f1: 1
f2: 2
f2: 3
f1: 4
f1: 5

Refs:

FUNCTION


PUTFILE

PUTFILE file$, lin#, dat#$

Écrit la valeur de la variable dat#$ dans le fichier file$ au numéro de ligne lin#.La première ligne a l'index 0. Il n'est pas possible d'utiliser PUTFILE avec des fichiers de plus de 256 lignes .

Utilisater PUTFILE pour écrire des données dans une ligne existante écrasera les données originales avec les nouvelles .
PUTFILE va insérer des lignes vides dans le fichier si nécessaire . Pour example, Si votre fichier contient 20 lignes et vous insérer dans la ligne 25 , les lignes 21-24 seront automatiquement créés en tant que lignes vides.

exemple:

a$="NAME";
PUTFILE "Test.txt", 0, s$
a$=""
GETFILE "Test.txt", 0, a$
PRINT a$, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

DOESFILEEXIST(), FILEREQUEST$(), GETFILE


READ

READ a##$$, ...

La commande READ est utilisé pour obtenir une ou plusieurs valeurs de données "data" à l'actuelle position "readpoint" (à l'origine défini par la commande RESTORE ) et de les stocker dans des variables . Avec READ Vous pouvez spécifier plusieurs variables séparées par une virgule plutôt que de répéter un READ par variable .

RESTORE name
READ a  // returns 1
READ b  // returns 2
READ a$, b$, c, d // returns "x", "y", 3, 4
PRINT a+", "+b+", "+a$+", "+b$+", "+c+", "+d, 0,0

SHOWSCREEN
MOUSEWAIT
READ xxx // Error - out of data

STARTDATA name:
   DATA 1,2
   DATA "x", "y", 3,4
ENDDATA

résultat:
1, 2, x, y, 3, 4

Refs:

DATA, DIMDATA, ENDDATA, RESTORE, STARTDATA


READBYTE

READBYTE channel%, val%%

Lit la valeur val%% à partir du fichier qui a été ouvert sur le canal channel%.

BYTE = 1 Byte, (0..255)

les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 aura BYTE 255.

Avec IEEE Vous pouvez charger des nombres à virgule flottante . Il s'agit de la meilleure façon de stocker des nombres en GLBasic .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEBYTE


READIEEE

READIEEE channel%, val##

Lit la valeur IEEE val## à partir du fichier qui a été ouvert sur le canal channel%.

IEEE = 8 Bit, IEEE 64 Bit pour les nombres à virgule flottante

Avec IEEE Vous pouvez charger des nombres à virgule flottante . Il s'agit de la meilleure façon de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEIEEE


READLINE

READLINE channel%, val$#

Lit la ligne de texte "STRING" val$# à partir du fichier qui a été ouvert sur le canal channel%.

READLINE peut être utilisé avec les fichiers produits sur les deux systèmes de type Unix (les lignes se terminent avec seulement un caractère de nouvelle ligne ) ou les systèmes non Unix (les lignes se terminent avec une séquence de retour à la ligne ).
Les données seront lues jusqu'à un "\n" (newline) survenue dans le fichier . Un retour ("\r") seront supprimés sur la ligne si il existe .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITELINE


READLONG

READLONG channel%, val%%

Lit un chiffre long val%% à partir du fichier qui a été ouvert sur le canal channel%.

LONG = 4 Byte, (0..4294967295)

Les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Avec la norme IEEE, vous pouvez charger les nombres à virgule flottante . Il s'agit de la meilleure façon de stocker des nombres en GLBasic .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITELONG


READSHORTIEEE

READSHORTIEEE channel%, val##

Lit la valeur SHORTIEEE val## à partir du fichier qui a été ouvert sur le canal channel%.

SHORTIEEE = 4 Byte, IEEE 32 Bit pour les nombres à virgule flottante

Avec la norme IEEE, vous pouvez charger les nombres à virgule flottante . Il s'agit de la meilleure façon de stocker des nombres en GLBasic

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITESHORTIEEE


READSTR

READSTR channel%, val$#, nc%

Lit la chaîne val$# à partir du fichier qui a été ouvert sur le canal channel%. La valeur nc% pour READSTR spécifie combien de caractères (BYTE) sont à lire dans la chaîne .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITESTR


READUBYTE

READUBYTE channel%, val%%

Lit la valeur UBYTE val%% à partir du fichier qui a été ouvert sur le canal channel%.

BYTE = 1 Byte, (0..255)
U = sans sign. (e.g. 0..255 au lieu de -127..128 pour BYTE)

Les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEUBYTE


READULONG

READULONG channel%, val%%

Lit la valeur ULONG val%% à partir du fichier qui a été ouvert sur le canal channel%.

U = sans sign. (e.g. 0..255 au lieu de -127..128 for BYTE)
LONG = 4 Byte, (0..4294967295)

les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEULONG


READUWORD

READUWORD channel%, val%%

Lit la valeur UWORD val%% à partir du fichier qui a été ouvert sur le canal channel%.

WORD = 2 Byte, (0..65535)
U = sans signe . (e.g. 0..255 au lieu de -127..128 pour BYTE)

les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEUWORD


READWORD

READWORD channel%, val%%

Lit la valeur WORD val$ à partir du fichier qui a été ouvert sur le canal channel%.

BYTE = 1 Byte, (0..255)
WORD = 2 Byte, (0..65535)
U = sans signe . (e.g. 0..255 au lieu de -127..128 for BYTE)
LONG = 4 Byte, (0..4294967295)
IEEE = 8 Byte, IEEE 64 Bit Nombre à virgule flottante
SHORTIEEE = 4 Byte, IEEE 32 Bit Nombre à virgule flottante

les nombres entiers seront chargés sans signe (unsigned). Ainsi, la valeur -127 sera BYTE 255.

Avec IEEE Vous pouvez charger des nombres à virgule flottante . Il s'agit de la meilleure façon de stocker des nombres en GLBasic.
La valeur nc% pour READSTR spécifie combien de caractères (BYTE) sont à lire dans la chaîne .

READLINE peut être utilisé avec les fichiers produits sur les deux systèmes de type Unix (les lignes se terminent avec seulement un caractère de nouvelle ligne ) ou les systèmes non Unix (les lignes se terminent avec une séquence de retour à la ligne ).
Les données seront lues jusqu'à un "\n" (newline) survenue dans le fichier . Un retour ("\r") seront supprimés sur la ligne si il existe .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, OPENFILE(), WRITEWORD


REDIM

REDIM array#$[a1] | [a2][a3]...

Affecte une nouvelle taille à un tableau (soit plus grand ou plus petit ) et conserve les données du tableau qui se trouve dans l'ancienne et nouvelle taille .

Vous pouvez également utiliser ReDim array#$[0] - Cela offre un moyen plus rapide pour effacer les données dans un tableau sans avoir à désallouer et réallouer de la mémoire en créeant un tableau vide.

// --------------------------------- //
// Project: REDIM
DIM a[5][4]
   Fill(a[])
   view(a[], 0)

REDIM a[6][3]
   view(a[], 256)

SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  FILL  #=-
// ------------------------------------------------------------- //
FUNCTION Fill: f[]
   FOR x=0 TO BOUNDS(f[],0)-1
      FOR y = 0 TO BOUNDS(f[],1)-1
         f[x][y] = x+10*(y+1)
      NEXT
   NEXT
ENDFUNCTION // FILL

// ------------------------------------------------------------- //
// -=#  VIEW  #=-
// ------------------------------------------------------------- //
FUNCTION view: f[], dy
   FOR x=0 TO BOUNDS(f[],0)-1
      FOR y = 0 TO BOUNDS(f[],1)-1
         PRINT f[x][y], x*80, y*20 + dy
      NEXT
   NEXT
ENDFUNCTION // VIEW

Refs:

DIM


REPLACE$()

new$ = REPLACE$(where$, find$, repl$)

Remplace le texte find$ dans la chaîne where$ avec le texte repl$. Il remplacera aussi de multiples occurrences .
Si la chaîne find$ n'est pas trouvée dans la chaîne d'origine where$ sera retourné .

// Replace

PRINT "Turn a Frog into a Prince", 0, 0

a$ = "Frog"
PRINT a$, 0, 20

a$ = REPLACE$(a$, "F", "P")
PRINT a$, 0, 40

a$ = REPLACE$(a$, "og", "ince")
PRINT a$, 0, 60

SHOWSCREEN
MOUSEWAIT

exemple:
Turn a Frog into a Prince
Frog
Prog
Prince

Refs:

INSTR(), LCASE$(), LEN(), MID$(), UCASE$


REQUIRE

REQURE "external.cpp"

Cette commande vous permet d'ordonner au compilateur d'inclure un fichier de code source supplémentaire dans le projet .
Ces fichiers seront transmis directement au compilateur GCC. En tant que tel, les formats de fichiers actuellement pris en charge sont C, CPP et (pour iPhone) .m / .mm .

// test1.cpp
#include "glb.h"

int Moo()
{
   STDOUT("Moo\n");
}

// main.gbas
REQUIRE "test1.cpp"
IMPORT int Muh()

Muh(

Refs:

IMPORT


RESTORE

RESTORE label

La commande "RESTORE label" est utilisée pour définir la position en lecture des données au premier élément du bloc défini dans «label». La commande READ renverra ensuite la lecture des données à cette position (et fera avancer la position de lecture à l'élément de données suivant).

RESTORE name
READ a  // returns 1
READ b  // returns 2
READ a$, b$, c, d // returns "x", "y", 3, 4
PRINT a+", "+b+", "+a$+", "+b$+", "+c+", "+d, 0,0

SHOWSCREEN
MOUSEWAIT
READ xxx // Error - out of data

STARTDATA name:
   DATA 1,2
   DATA "x", "y", 3,4
ENDDATA

résultat:
1, 2, x, y, 3, 4

Refs:

DATA, DIMDATA, ENDDATA, READ, STARTDATA


RETURN

RETURN n#$

La commande RETURN renvoie la valeur n#$ et retourne à la ligne de code qui a appellé la fonction . Si vous ne spécifiez pas une valeur de retour, elle sera '0'.

Les fonctions peuvent retourner qu'une seule valeur au code . Pour utiliser une fonction qui retourne des valeurs multiples , voir le commande BYREF.

Example:

// Function

// Sample shows the usage of the commands
// FUNCTION / ENDFUNCTION / EXIT
// Due to the complicated syntax of a function
// the command 'New Function' should be used
// from the 'Project' menu to create a function.
GLOBAL a
LOCAL a

 Title() // Title line

 a$=Right$("123456",  2); // 56
  PRINT a$, 100, 80

 a=7; b=12; GLOBAL a=15
 c=Maximum(a, b) // 7, 12
 Center("c="+c, 100) // 12
 Center ("a="+a, 140) // 7
 Center("b="+b, 180) // 12
 Center("GLOBAL a="+GLOBAL a, 220) // 0 (function: Max)
SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  MAX - größere Zahl(a, b) / bigger number(a, b) #=-
// ------------------------------------------------------------- //
FUNCTION Maximum: a, b
 // These variables are defined LOCAL:
 // a, b
LOCAL ret
 IF a>b
  ret=a
 ELSE
  ret=b
 ENDIF
 // This has no influence on the global variables
 a=0
 // This will
 GLOBAL a=0
RETURN ret
ENDFUNCTION // MAX

// ------------------------------------------------------------- //
// -=#  CENTER  - Center text #=-
// ------------------------------------------------------------- //
FUNCTION Center: text$, y
 // Diese Variablen sind als LOCAL definiert:
 // There variables are defined LOCAL:
  // text$, y
 PRINT text$, (640-LEN(text$)*16)/2, y
ENDFUNCTION // CENTER

// ------------------------------------------------------------- //
// -=#  TITLE  #=-
// ------------------------------------------------------------- //
FUNCTION Title:
 // There variables are defined LOCAL:
  // retval
  Center("Yippie", 50)     // Function call within a function
 RETURN                       // Exit the function
 PRINT "Boo hoo", 100, 100  // Never happens
ENDFUNCTION // NAME

// A Function with a string as a return value
// ------------------------------------------------------------- //
// -=#  RIGHT$  #=-
// ------------------------------------------------------------- //
FUNCTION Right$: word$, size
 // These values are defined LOCAL:
 // word$, size
 RETURN MID$(word$, LEN(word$)-size, size)
ENDFUNCTION// RIGHT$

Output:
56
Yippie
c=12
a=7
b=12
GLOBAL a=0

Refs:

ENDFUNCTION, FUNCTION, GOSUB


RGB()

color%=RGB(red%, green%, blue%)

Définit la valeur d'une couleur mélangée avec red%, green% et blue%. Les valeurs sont de 0 to 255.

exemple:

DRAWRECT 0, 0, 200, 200, RGB(255, 0, 255) // Purple
SHOWSCREEN
MOUSEWAIT

// Farben / Colors

//   R   G   B
//   0   0   0 - Schwarz / Black
//   0   0 255 - Blau    / Blue
//   0 255   0 - Grün    / Green
//   0 255 255 - Türkis  / Cyan
// 255   0   0 - Rot     / Red
// 255   0 255 - Lila    / Purple
// 255 255   0 - Gelb    / Yellow
// 255 255 255 - Weiß    / White

// 255   0 128 - Rosa    / Pink
//  80  40  10 - Braun   / Brown
//  80  80  80 - Grau    / Grey
//  80  80 255 - H-Blau  / sky blue

Refs:

DRAWLINE, DRAWRECT, GETPIXEL(), POLYVECTOR, SETPIXEL


RND()

a%=RND(max%)

Renvoie un nombre aléatoire entre [0; max%] inclusif (i.e. 0 et max% peuvent être retounés).

Sample:

PRINT "A random number between 0 and 100: " + RND(100), 100, 100
PRINT "A random number between 5 and 20: " + (RND(15)+5), 100, 110
SHOWSCREEN
MOUSEWAIT

Example de résultat:
A random number between 0 and 100: 74
A random number between 5 and 20: 13

Refs:

SEEDRND


ROTOSPRITE

ROTOSPRITE num%, x%, y%, phi#

Comparable à DRAWSPRITE en ce concerne l'affichage d'une image sprite sur la mémoire tampon arrière , mais il dispose en plus d'une rotation du sprite avec l'angle phi# (DEG) dans le sens anti-horaire . Vous pouvez utiliser la même image num% plusieurs fois pour afficher plusieurs copies du même sprite.

exemple:

LOADSPRITE "Sprite.bmp", 0
ROTOSPRITE 0, 100, 100, 45
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE


ROTOZOOMANIM

ROTOZOOMANIM id#, anim#, x#, y#, phi#, scale#

Cette commande est similaire à ROTOZOOMSPRITE, Toutefois, elle est seulement utilisée sur la trame "frame" numéro anim# de l'image de l'animation id#.
L'animation id# doit avoir étée préalablement chargée avec LOADANIM .

Example:

LOADANIM "test.bmp", 0, 32,32
ROTOZOOMANIM 0, 1, 100, 100, 45, 50
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWANIM, LOADANIM, ROTOZOOMSPRITE


ROTOZOOMSPRITE

ROTOZOOMSPRITE num%, x%, y%, phi#, rel#

Un mélange de ROTOSPRITE et ZOOMSPRITE pour faire pivoter , Zoom, puis dessiner un sprite sur la mémoire du tampon arrière . Pour faire pivoter le sprite et le déformer vous auriez besoin d'utiliser la commande POLYVECTOR. Vous pouvez utiliser la même image num% plusieurs fois pour afficher plusieurs copies du même sprite .

exemple:

LOADSPRITE "Sprite.bmp", 0
ROTOZOOMSPRITE 0, 100, 100, 45, 50
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE


SAVEBMP

SAVEBMP bmp$

Enregistre l'image de la mémoire tampon arrière actuelle dans le fichier bmp$. Cette commande est utile pour les captures d'écran.
L'image sera enregistrée en tant que 24-bit en couleur sur toutes les plateformes.

Les fichiers peuvent être enregistrés dans un BMP ou PNG. Le format de fichier est déterminé par le nom du fichier .

exemple:

PRINT "Hello World", 100, 100
SAVEBMP "Test.bmp"   // Save in bmp format
SAVEBMP "Test.png"  // Save in png format

Refs:

LOADBMP, SAVESPRITE


SAVESPRITE

SAVESPRITE file$, num%

Enregistre le sprite avec l'id = num% dans le fichier file$ dans le format BMP/PNG.
L'image sera enregistrée en tant qu'image 24-bit en couleur sur toutes les plateformes .

// SaveSprite
FOR i = 0 TO 1000
   SETPIXEL RND(100), RND(100), RND(1677215)
NEXT
GRABSPRITE 0, 0,0, 100,100
SAVESPRITE "ugly.bmp", 0
SAVESPRITE "ugly.png", 0

// MSPaint?
SHELLCMD("explorer.exe ugly.bmp", FALSE, TRUE, i)

Refs:

GRABSPRITE, SAVEBMP


SEEDRND

SEEDRND start%

Initialise le générateur de nombre aléatoire pour RND() avec une valeur de départ.

La valeur de départ pour le générateur (la graine the seed) détermine la configuration des 'random', pour la création des chiffres aléatoires par le générateur.

En conséquence vous pouvez créer un ensemble prévisible de nombres aléatoires en lui donnant le même seed (graine) chaque fois que votre programme s'execute.

Pour rendre le générateur de nombres aléatoires et générer une séquence de nombres différente à chaque fois que votre programme démarre,
GLBasic appelle automatiquement SEEDRND(GETTIMERALL()) avant que s'exécute votre première ligne de code .

SEEDRND 505
PRINT "A random number between 0 and 100: " + RND(100), 100, 100
PRINT "A random number between 5 and 20: " + (RND(15)+5), 100, 110
SHOWSCREEN
MOUSEWAIT

résultat de l'example:
A random number between 0 and 100: 74
A random number between 5 and 20: 13

Refs:

RND()


SELECT

SELECT n
CASE 3; ...
CASE >3; ...
CASE 2 TO 5; ...
DEFAULT; ...
ENDSELECT

Le mot-clé SELECT démarre un bloc de code SELECT . Dans le bloc SELECT votre code donne la possibilité de faire différentes actions en fonction sur la valeur de n.

Dans la commande SELECT il y a un ou plusieurs cas des déclarations qui comparent n à une valeur donnée.

Si la valeur de n satisfait aux conditions du cas particulier énoncé , le bout de code suivant la déclaration de ce cas sera exécuté. Si plus d'une instruction case correspondent aux conditions, seule le premièr bout de code correspond sera exécuté.

DEFAULT (optionel) est un type spécial de déclaration CASE . Si aucun des déclarations CASE ne correspondent, le code-bloc de la déclaration DEFAULT (si un cas par DEFAULT existe ) sera exécuté .

exemples déclaration CASE
-CASE 3
'n' doit être exactement 3
-CASE >3
'n' doit être plus grand que 3
-CASE 2 TO 5
'n' doit être au moins 2 et pas plus de 5
-DEFAULT
Aucun des énoncés ci-dessus correspondent 'n'

Example:

// SELECT CASE DEFAULT ENDSELECT

FOR n=0 TO 10

PRINT "n="+n, 100, 100

  SELECT n
  CASE 7
   PRINT "n="+n+": CASE 7", 0, n*10
  CASE >9
   PRINT "n="+n+": CASE >9", 0, n*10
  CASE >3
   PRINT "n="+n+": CASE >3", 0, n*10
  CASE 3 TO 8
   PRINT "n="+n+": CASE 3 TO 8", 0, n*10
  DEFAULT
   PRINT "n="+n+": DEFAULT" style="color:white;">, 0, n*10
 ENDSELECT
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
n=0: DEFAULT
n=1: DEFAULT
n=2: DEFAULT
n=3:
CASE 3 TO 8
n=4: CASE >3
n=5: CASE >3
n=6: CASE >3
n=7:
CASE 7
n=8: CASE >3
n=9: CASE >3
n=10: CASE >9

Refs:

CASE, DEFAULT, ENDSELECT, IF


SETACTIVEMOUSE

SETACTIVEMOUSE index%

Sélectionne la souris active . uniquement si GETMOUSECOUNT() retourne plus de 1.

...
   SETACTIVEMOUSE 1
   ...

Refs:

GETMOUSECOUNT()


SETCURRENTDIR()

ok = SETCURRENTDIR(dir$)

Définit le répertoire de travail courant utilisé à : dir$.

exemple:

// --------------------------------- //
// Project: Files and Folders
// Start: Tuesday, November 25, 2003
// IDE Version: 1.31125

 LOADFONT "minifont.bmp", 0
 GETFONTSIZE font_x, font_y

 ok = SETCURRENTDIR("..") // One up
 cur$ = GETCURRENTDIR$()
 num = GETFILELIST("*.*", files$[])
 num_dir  = INTEGER(num / 0x10000) // Hi-Word
 num_file = MOD(num, 0x10000)      // Lo-Word
 PRINT cur$, 0, 0
 PRINT "ok? " + ok+ " num: " + num + " -> nDir: "+num_dir+" nFile: "+num_file, 0, font_y
 FOR i=0 TO BOUNDS(files$[], 0)-1 // BOUNDS(files$[], 0)-1 = num = num_dir+num_file
  PRINT files$[i], 0, (i+3)*font_y
 NEXT

 SHOWSCREEN
 MOUSEWAIT

Refs:

DOESFILEEXIST(), FILEREQUEST$(), GETCOMMANDLINE$(), GETCURRENTDIR$(), GETFILELIST(), SHELLCMD()


SETFONT

SETFONT num%

SETFONT Définit la police courante pour les commandes PRINT et INPUT. La police est une police bitmap - Cela signifie que tous les caractères ont la même largeur et hauteur.
Font-bmps doit être la taille de 16*x par 8*y pixels. Utilisez l'utilitaire GLBasicFont utility pour créer un BMP-font à partir d'un TrueTypeFont.

exemple:

PRINT "Hello World", 100, 100
LOADFONT "comp_fnt.bmp", 1
SETFONT 1
PRINT "Computer", 100, 150
SHOWSCREEN
MOUSEWAIT

Refs:

INPUT, LOADFONT, PRINT


SETMOUSE

SETMOUSE mx#, my#

Définit la position de la souris à mx#, my#. Utile pour limiter le mouvement de la souris .

// SETMOUSE

   WHILE TRUE
      LimitMouse(100, 100, 400, 300)
      PRINT "<=", mx, my
      IF b1 THEN END
      SHOWSCREEN
   WEND

// ------------------------------------------------------------- //
// -=#  LIMITMOUSE  #=-
// MOUSESTATE mx, my, b1, b2 (GLOBAL)
// With limiting of the area
// ------------------------------------------------------------- //
FUNCTION LimitMouse: minx, miny, maxx, maxy
   // These variables are defined LOCAL:
   // minx, miny, maxx, maxy
   MOUSESTATE mx, my, b1, b2
   IF mx<minx THEN mx=minx
   IF mx>maxx THEN mx=maxx
   IF my<miny THEN my=miny
   IF my>maxy THEN my=maxy
   SETMOUSE mx, my
ENDFUNCTION // LIMITMOUSE

Refs:

MOUSESTATE


SETPIXEL

SETPIXEL x%, y%, color%

Dessine un pixel de couleur à la position (x%, y%).

exemple:

// Draw Circle
FOR i=0 TO 359
    SETPIXEL 200*SIN(i) + 320, 200*COS(i)+240, RGB(255, 255, 255)
NEXT
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWLINE, DRAWRECT, GETPIXEL()


SETSCREEN

SETSCREEN width#, height#, fullscreen#

Modifie la taille de l'écran . Si width# ou height# sont 0, leur taille actuelle reste inchangée . Le paramètre "fullscreen" doit être fournie .
Vous pouvez obtenir l'état actuel du plein écran "fullscreen" avec ISFULLSCREEN().

SETSCREEN 640, 480, 1
PRINT "Fullscreen", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

ISFULLSCREEN(), LIMITFPS


SETSHOEBOX

SETSHOEBOX data$, media$

Spécifie un "shoebox" fichier archive à partir duquel les données peuvent être chargés. Les Commandes qui peuvent utiliser les "shoebox" (comme LOADBMP) vont d'abord essayer de trouver le nom du fichier spécifié dans la commande . Si le fichier ne peut pas être trouvée, il va corriger le fichier (en supprimant les informations de chemin ) dans le "shoebox".

Les Shoeboxes sont des archives de fichiers compressées dans un dossier unique . Dans le menu outil, vous pouvez trouver un programme (shoebox) que vous pouvez utiliser pour créer des shoeboxes.

data$ spécifie un fichier shoebox pour les commandes LOADSPRITE, LOADSOUND, LOADFONT, LOADBMP, BLENDSCREEN, GETFILE

media$ spécifie un shoebox file pour les commandes PLAYMUSIC, PLAYMOVIE, LOOPMOVIE

Les Informations de chemin est ignoré lors de la vérification d'un shoebox pour un datafile.

// Create a ShoeBox with the tool from the menu:
// Tools/ShoeBox
// - Select a folder (..\GLBasic\Projects\Samples\Media\ShoeBox)
// - Shoebox will be created: ..\Media\ShoeBox.sbx

//         data files,  | media files
SETSHOEBOX "ShoeBox.sbx", ""

// Try loading the file from the HDD. If it does not exist,
// try to load it from the specified shoebox. Path does not matter
LOADBMP "blah/blah/ShoeBox_file.bmp"

SHOWSCREEN
MOUSEWAIT

Refs:

GETFILE, LOADBMP, LOADFONT, LOADSOUND, LOADSPRITE, LOOPMOVIE, PLAYMOVIE, PLAYMUSIC, PLAYSOUND(), X_LOADOBJ


SETTRANSPARENCY

SETTRANSPARENCY color%

Définit la couleur transparente pour les commandes LOADFONT, GRABSPRITE et LOADSPRITE .

Avant d'appeler cette fonction , LOADFONT utilise la transparence par défaut RGB(0,0,0) et GRABSPRITE/LOADSPRITE utilisent RGB(255,0,128).

Example:

SETTRANSPARENCY RGB(0,255,0) // Green pixels are to be transparent
LOADSPRITE "Sprite.bmp", 0
PRINT "Hello World", 100, 100
DRAWSPRITE 0, 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

GRABSPRITE, LOADFONT, LOADSPRITE


SGN()

s#% = SGN(n#%)

Retourne le signe d'un nombre :
n>0 -> 1
n=0 -> 0
n<0 -> -1

Example

n1=5
n2=-350
n3=0
PRINT "SGN of "+n1+" is "+SGN(n1), 0, 0
PRINT "SGN of "+n2+" is "+SGN(n2), 0, 10
PRINT "SGN of "+n3+" is "+SGN(n3), 0, 20
DRAWSPRITE 0, 100, 100
SHOWSCREEN
MOUSEWAIT

résultat:
SGN of 5 is 1
SNG of -350 is -1
SNG of 0 is 0

Refs:

ABS()


SHELLCMD()

ok# = SHELLCMD(cmd$, wait#, show#, rv##)

Exécute un autre programme . Si vous souhaitez exécuter des commandes DOS , vous devez appeler CMD ou COMMAND (pour Win9x/ME) puis entrez la commande DOS . e.g. "CMD /C dir > files.txt"

wait# spécifie s'il faut attendre la fin de l'autre programme (TRUE / FALSE)
show# vous permet de démarrer le programme caché (TRUE / FALSE).
ok# Retourne TRUE ou FALSE, selon que le programme pourrait être lancé ou pas .

La valeur de retour de l'autre programme sera transféré à rv##

// --------------------------------- //
// Project: SHELLCMD

// Warning: Sophisticated program ahead!

DIM files$[1]

 ListFiles(files$[])

 FOR i=0 TO BOUNDS(files$[], 0)-1
  PRINT "-" + i + ":" + files$[i], 0, i*16+32
 NEXT
 SHOWSCREEN
MOUSEWAIT

// ------------------------------------------------------------- //
// -=#  LISTFILES  #=-
// ------------------------------------------------------------- //
FUNCTION ListFiles: names$[]
 // Diese Werte werden per Referenz übergeben:
 // names$[],
 LOCAL tmp$[]
 win9x=FALSE
 ok = SHELLCMD("CMD /C dir /B /ON /OG > dir.txt", TRUE, FALSE, rv)
 IF ok =FALSE
  ok = SHELLCMD("COMMAND /C dir /B /ON /OG > dir.txt", TRUE, FALSE, rv)
  win9x=TRUE
 ENDIF
 IF ok=FALSE
  PRINT "Strange error - no cmd supplied!?", 0, 0
 ELSE
  IF win9x
   PRINT "Windows 9x based", 0, 0
  ELSE
   PRINT "Windows NT based", 0, 0
  ENDIF
 ENDIF

 FOR i=0 TO 255
  GETFILE "dir.txt", i, data$
  IF data$ = "NO_DATA" OR data$ = "NO_FILE" THEN RETURN i
  // realloc space for old files + new file
  DIM tmp$[i+1]
  // copy existing files into temp array
  FOR n=0 TO i-1
   tmp$[n] = names$[n]
  NEXT
  // realloc space for original array
  DIM names$[i+1]
  // copy temp files to array
  FOR n=0 TO i-1
   names$[n] = tmp$[n]
  NEXT
  // add new file
  names$[i] = data$
 NEXT
 RETURN i
ENDFUNCTION

Refs:

SHELLEND


SHELLEND

SHELLEND cmd$

Démarre le programme cmd$ et termine le programme en cours .

Example:

// SaveSprite
FOR i = 0 TO 1000
   SETPIXEL RND(100), RND(100), RND(1677215)
NEXT
GRABSPRITE 0, 0,0, 100,100
SAVESPRITE "ugly.bmp", 0
SAVESPRITE "ugly.png", 0

// MSPaint?
SHELLEND "explorer.exe ugly.bmp"

Refs:

SHELLCMD(), NETWEBEND


SHOWSCREEN

SHOWSCREEN

Affiche le contenu de la mémoire du tampon arrière "backbuffer " sur l'écran. La zone tampon arrière est alors remplacé soit par l'image de remplacement "backbuffer" (préalablement spécifiée par le biais des commandes comme LOADBMP ou USEASBMP) ou noir si aucune image n'a été configuré .

Lorsque l'on travaille en 3D , SHOWSCREEN réinitialise tout X_ROTATION, X_MOVEMENT et Paramètres X_SCALING .

exemple:

// Writing to the back buffer
PRINT "Hello World", 100, 100
// Showing the back buffer
SHOWSCREEN
MOUSEWAIT

Refs:

BLACKSCREEN, BLENDSCREEN, HIBERNATE, LOADBMP, USEASBMP


SIN()

a=SIN(angle#)

Retourne le sinus d'un angle # en DEG-mode (0-360°).

Le résultat sera dans la gamme -1 to +1.

exemple:

// Circle flight of an X
FOR alpha=0 TO 360
    PRINT "X", 150*SIN(alpha) + 150, 150*COS(alpha) +150
    SHOWSCREEN
NEXT

Refs:

ACOS(), ASIN(), ATAN(), COS(), TAN()


SLEEP

SLEEP ms#

Arrête le programme pour ms# millisecondes . (1/1000 de seconde ).

Example

LOADSOUND "Super.wav", 0, 1

PLAYSOUND (0, -1, 1)   // Play the sound
SLEEP 500            // delay for half a second
STOPSOUND 1            // Stop the sound

Refs:

GETTIMERALL(), HIBERNATE


SMOOTHSHADING

SMOOTHSHADING mode%

Cette commande permet de basculer entre le mode soft (mode#=TRUE: GL_LINEAR) et rapide (mode%=FALSE: GL_NEAREST) pour l'interpolation de la mise à l'échelle des sprites .
Le graphisme mode%=FALSE deviendront plus carrés et donc égal à la sortie sur PocketPC et GP2X.
Si vous rencontrez des contours laids lors de l'utilisation GRABSPRITE, cette commande peut aider à les corriger.

Un X_MAKE2D ou SHOWSCREEN réinitialise le paramètre mode% par la valeur par défaut : TRUE.

Example / Bsipiel:

DRAWRECT 0,0,129,65,RGB(255,0,128)
PRINT "test", 1,0
DRAWRECT 1,16,64,16,RGB(255,0,0)
DRAWRECT 1,32,64,16,RGB(0,255,0)
DRAWRECT 1,44,64,16,RGB(0,0,255)

GRABSPRITE 0, 0,0,128,64
DRAWRECT 160,0,160,240,RGB(255,255,255)

DRAWSPRITE 0, 162,2
// SAVESPRITE "out.png", 0
// LOADSPRITE "out.png", 0

ROTOZOOMSPRITE 0, 40,80, 45, 1.5
SMOOTHSHADING FALSE
ROTOZOOMSPRITE 0, 200,80, 45, 1.5

SHOWSCREEN
MOUSEWAIT

Refs:

ROTOZOOMANIM, ROTOZOOMSPRITE, STRETCHANIM, STRETCHSPRITE


SOCK_...

Ce chapitre decrit les commandes SOCK_ avec lesquelles vous pouvez envoyer des messages TCP et UDP. Vous trouverez que la programmation réseau avec GLBasic est

capable d'égaler ou meme de depasser n'importe

quel autre language de programmation.
Les commande plus simple NET... existeront toujours, car elles sont faciles à utiliser par les programmeurs de jeux.

Pour référence, un socket est un objet qui a une adresse local (L'IP de votre carte reseau) une adresse hote (là où vous vous connectez) et un port (avec lequel vous pourez envoyer ou recevoir).
D'autres informations à propos des sockets peut être trouvé ici:
http://beej.us/guide/bgnet/
http://www.freebsd.org/doc/en/books/developers-handbook/sockets.html

ok% = SOCK_INIT()

Appelez cette commande en premier pour initialiser les commandes réseau. Sur Windows ca va appeler SAStartup et initialiser quelques mémoire utilisée en interne. La valeur de retour est soit TRUE si tout est OK ou FALSE pour indiquer une erreurs.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

SOCK_SHUTDOWN

Si vous n'avez plus besoin de commandes SOCK_ , vous pouvez appeler cette commande pour chaque appel de SOCK_INIT.

sock% = SOCK_TCPLISTEN(port%)

Cette commande crée un socket() et va le relier à un port local "port%". A partir de maintenant ce programme va ' écouter ' les messages TCP envoyés sur ce port.
La valeur de retour est soit un socket ou -1 si une erreur est apparue.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

sock% = SOCK_TCPCONNECT(server$, port%)

Avec cette commande vous crée un socket qui va essayer de ce connecter au serveur (c'est l'opposé de SOCK_TCPLISTEN()).
server$ est un nom d'ordinateur ou une adresse IP , par exemple " www.glbasic.com ", "PC-GF" or "129.128.0.25".
Avec port% vous pouvez spécifier à quel port vous voulez vous connecter. Ce qui corresponds avec le port du serveur en 'écoute' avec la commande SOCK_TCPLISTEN .
La valeure de retour est soit un socket valide soit -1, qui indiquera une erreure.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

sock% = SOCK_TCPACCEPT(sock_listen%, BYREF ip%)

Cette fonction retourne un socket valide (<> -1) si un autre processus a utilisé avec succès SOCK_TCPCONNECT () pour se connecter à votre port SOCK_TCPLISTEN.

Vous pouvez maintenant communiquer avec d'autres processus en lisant ou en écrivant via ce socket.
Quand vous n'aurez plus besoin de cette connexion, appelez SOCK_CLOSE() pour fermer ce socket.

Le nombre entier ip% va donner l'adresse IP de l'ordinateur distant. Vous pouvez l'utiliser dans SOCK_UDPSEND pour envoyer un message UDP à cet ordinateur.
Avec SOCK_GETIP$() vous pouvez traduire cette IP dans une forme lisible.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

rv% = SOCK_TCPSEND(dest_sock%, msg$)

Envoie un message via TCP à un socket connecté - celui que vous avez connecté au moyen d'une commande comme SOCK_TCPACCEPT () ou SOCK_TCPCONNECT ().

msg$ est un message texte à envoyer. GLBasic va envoyer le texte exact sans lui rajouter de caractère spécial, donc tous les caractères supplémentaires que vous souhaitez envoyer (par exemple \ 0 -> CHR $ (0)), vous aurez besoin de les rajouter vous même.
La valeur de retour rv% indique le nombre de caractères envoyés (bytes). Si rv% = -1, une erreur est apparu.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

UDP Commands

sock% = SOCK_UDPOPEN(port%)

Cette commande crée un socket qui va vous permettre d'envoyer ou de recevoir des messages UDP via le port local port%.
La valeur de retour est soit un socket valide soit -1 si une erreur s'est produite.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().
Les sockets UDP en GLBasic ont toujours un paramètre interne SO_BROADCAST activé, Ainsi vous pourriez diffuser des messages à tout le monde avec eux.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

rv% = SOCK_UDPSEND(sockudp%, msg$, dest_ip%, dest_port%)

Envoyer un message via UDP en utilisant un socket précédemment crée avec SOCK_UDPOPEN().
msg$ est un message texte à envoyer. La longueur du message envoyé est exactement la longueur du texte donné. Pas de terminaison comme '\0' qui est rajouté comme le font habituellement les application TCP .
dest_ip% est l'adresse IP de destination. Vous pouvez avoir cette information avec SOCK_GETIP().
dest_port% est l'adresse IP à partir de lequel le destinataire lit.

La valeur de retour rv% indique le nombre de bytes envoyé. Si la valeur est -1, alors il y a erreur.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Common Commands

rv% = SOCK_RECV(sock%, BYREF msg$, length%)

Avec cette fonction vous lisez des donnée a partir du flux TCP crée precedemment avec SOCK_TCPACCEPT() or SOCK_TCPCONNECT().
Vous pouvez aussi utiliser cette fonction pour recevoir des messages UDP envoyé à un port précédemment relié avec SOCK_UDPOPEN().

msg$ est le message transmis, ou vide en cas d'erreur.
length% spécifie le nombre maximum de caractères à être reçu.
Ce message est lu jusqu'a soit le maximum est atteint ou que le premier caractère '\0' est lus. Si vous lisez des données binaire avec INLINE, vous devez vérifier la valeur de retour pour savoir la longueur réel.

Depuis que GLBasic utilise des sockets non bloquant par défaut, il pourrais y avoir une erreur si le socket n'est pas prêt encore a recevoir des données.

La valeur de retour veux dire:
-2 : un socket non bloquant n'est pas prêt à être lus et va bloquer. Essayez de lire sur ce socket un peu plus tard.
-1 : Il y a une erreur.
0 : Le host c'est déconnecté (seulement pour TCP). Il en résulte que ce socket est utilisé pour rien et dois être fermé avec SOCK_CLOSE().
>0 : Nombre de bytes lus avec succès.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

ip% = SOCK_GETIP(server$)

Essai de récupérer l'adresse IP de l'ordinateur distant "server$".
server$ est le nom de l'ordinateur - par exemple " www.glbasic.com " or "PC-GF".
L'adresse IP retournée devra être une entier 32-bit.

Si rien est trouvé, 0 va être retourné.

ip$ = SOCK_GETIP$(ip%)

Convertis une adresse IP (un entier 32-bit ) retourné a partir de SOCK_GETIP() en une adresse IP lisible sous forme d'une chaine comme: "127.0.0.1".

rv% = SOCK_CLOSE(sock%)

Ferme un socket qui n'est plus utilisé. Assurez vous de ne pas essayer de l'utiliser après qu'il à été fermé car Glbasic va très vite réutiliser ce socket pour une nouvelle connexion.
La valeur de retour est à TRUE si aucune erreur est arrivée.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NET...


SOCK_CLOSE

rv% = SOCK_CLOSE(sock%)

Ferme un socket qui n'est plus utilisé. Assurez vous de ne pas essayer de l'utiliser après qu'il à été fermé car Glbasic va très vite réutiliser ce socket pour une nouvelle connexion.
La valeur de retour est à TRUE si aucune erreur est arrivée.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_INIT, SOCK_TCPCONNECT, SOCK_UDPOPEN


SOCK_GETIP$

ip$ = SOCK_GETIP$(ip%)

Convertis une adresse IP (un entier 32-bit ) retourné a partir de SOCK_GETIP() en une adresse IP lisible sous forme d'une chaine comme: "127.0.0.1".

Refs:

SOCK_..., SOCK_GETIP


SOCK_GETIP

ip% = SOCK_GETIP(server$)

Essai de récupérer l'adresse IP de l'ordinateur distant "server$".
server$ est le nom de l'ordinateur - par exemple " www.glbasic.com " or "PC-GF".
L'adresse IP retournée devra être une entier 32-bit.

Si rien est trouvé, 0 va être retourné.

Refs:

NETGETLASTERROR, SOCK_..., SOCK_GETIP$


SOCK_INIT

ok% = SOCK_INIT()

Appelez cette commande en premier pour initialiser les commandes réseau. Sur Windows ca va appeler SAStartup et initialiser quelques mémoire utilisée en interne. La valeur de retour est soit TRUE si tout est OK ou FALSE pour indiquer une erreurs.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_CLOSE, SOCK_TCPCONNECT, SOCK_UDPOPEN


SOCK_RECV

rv% = SOCK_RECV(sock%, BYREF msg$, length%)

Avec cette fonction vous lisez des donnée a partir du flux TCP crée precedemment avec SOCK_TCPACCEPT() or SOCK_TCPCONNECT().
Vous pouvez aussi utiliser cette fonction pour recevoir des messages UDP envoyé à un port précédemment relié avec SOCK_UDPOPEN().

msg$ est le message transmis, ou vide en cas d'erreur.
ength% spécifie le nombre maximum de caractères à être reçu.
Ce message est lu jusqu'a soit le maximum est atteint ou que le premier caractère '\0' est lus. Si vous lisez des données binaire avec INLINE, vous devez vérifier la valeur de retour pour savoir la longueur réel.

Depuis que GLBasic utilise des sockets non bloquant par défaut, il pourrais y avoir une erreur si le socket n'est pas prêt encore a recevoir des données.

La valeur de retour veux dire:
-2 : un socket non bloquant n'est pas prêt à être lus et va bloquer. Essayez de lire sur ce socket un peu plus tard.
-1 : Il y a une erreur.
0 : Le host c'est déconnecté (seulement pour TCP). Il en résulte que ce socket est utilisé pour rien et dois être fermé avec SOCK_CLOSE().
>0 : Nombre de bytes lus avec succès.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_CLOSE, SOCK_TCPACCEPT, SOCK_TCPCONNECT, SOCK_UDPOPEN


SOCK_SHUTDOWN

SOCK_SHUTDOWN

Si vous n'avez plus besoin de commandes SOCK_ , vous pouvez appeler cette commande pour chaque appel de SOCK_INIT.

Refs:

NETGETLASTERROR, SOCK_..., SOCK_INIT


SOCK_TCPACCEPT

sock% = SOCK_TCPACCEPT(sock_listen%, BYREF ip%)

Cette fonction retourne un socket valide (<> -1) si un autre processus a utilisé avec succès SOCK_TCPCONNECT () pour se connecter à votre port SOCK_TCPLISTEN.

Vous pouvez maintenant communiquer avec d'autres processus en lisant ou en écrivant via ce socket.
Quand vous n'aurez plus besoin de cette connexion, appelez SOCK_CLOSE() pour fermer ce socket.

Le nombre entier ip% va donner l'adresse IP de l'ordinateur distant. Vous pouvez l'utiliser dans SOCK_UDPSEND pour envoyer un message UDP à cet ordinateur.
Avec SOCK_GETIP$() vous pouvez traduire cette IP dans une forme lisible.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_CLOSE, SOCK_GETIP$, SOCK_TCPCONNECT, SOCK_TCPLISTEN, SOCK_UDPSEND


SOCK_TCPCONNECT

sock% = SOCK_TCPCONNECT(server$, port%)

Avec cette commande vous crée un socket qui va essayer de ce connecter au serveur (c'est l'opposé de SOCK_TCPLISTEN()).
server$ est un nom d'ordinateur ou une adresse IP , par exemple "www.glbasic.com ", "PC-GF" or "129.128.0.25".
Avec port% vous pouvez spécifier à quel port vous voulez vous connecter. Ce qui corresponds avec le port du serveur en 'écoute' avec la commande SOCK_TCPLISTEN .
La valeure de retour est soit un socket valide soit -1, qui indiquera une erreure.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_GETIP, SOCK_GETIP$, SOCK_INIT, SOCK_SHUTDOWN, SOCK_TCPLISTEN


SOCK_TCPLISTEN

sock% = SOCK_TCPLISTEN(port%)

Cette commande crée un socket() et va le relier à un port local "port%". A partir de maintenant ce programme va ' écouter ' les messages TCP envoyés sur ce port.
La valeur de retour est soit un socket ou -1 si une erreur est apparue.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_CLOSE, SOCK_TCPACCEPT, SOCK_TCPCONNECT


SOCK_TCPSEND

rv% = SOCK_TCPSEND(dest_sock%, msg$)

Envoie un message via TCP à un socket connecté - celui que vous avez connecté au moyen d'une commande comme SOCK_TCPACCEPT () ou SOCK_TCPCONNECT ().

msg$ est un message texte à envoyer. GLBasic va envoyer le texte exact sans lui rajouter de caractère spécial, donc tous les caractères supplémentaires que vous souhaitez envoyer (par exemple \ 0 -> CHR $ (0)), vous aurez besoin de les rajouter vous même.
La valeur de retour rv% indique le nombre de caractères envoyés (bytes). Si rv% = -1, une erreur est apparu.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_TCPACCEPT, SOCK_TCPCONNECT, SOCK_TCPLISTEN


SOCK_UDPOPEN

sock% = SOCK_UDPOPEN(port%)

Cette commande crée un socket qui va vous permettre d'envoyer ou de recevoir des messages UDP via le port local port%.
La valeur de retour est soit un socket valide soit -1 si une erreur s'est produite.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().
Les sockets UDP en GLBasic ont toujours un paramètre interne SO_BROADCAST activé, Ainsi vous pourriez diffuser des messages à tout le monde avec eux.

Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_CLOSE, SOCK_INIT, SOCK_SHUTDOWN, SOCK_UDPSEND


SOCK_UDPSEND

rv% = SOCK_UDPSEND(sockudp%, msg$, dest_ip%, dest_port%)

Envoyer un message via UDP en utilisant un socket précédemment crée avec SOCK_UDPOPEN().
msg$ est un message texte à envoyer. La longueur du message envoyé est exactement la longueur du texte donné. Pas de terminaison comme '\0' qui est rajouté comme le font habituellement les application TCP .
dest_ip% est l'adresse IP de destination. Vous pouvez avoir cette information avec SOCK_GETIP().
dest_port% est l'adresse IP à partir de lequel le destinataire lit.

La valeur de retour rv% indique le nombre de bytes envoyé. Si la valeur est -1, alors il y a erreur.
Vous pouvez retrouver n'importe quel message d'erreur avec NETGETLASTERROR$().

Refs:

NETGETLASTERROR, SOCK_..., SOCK_GETIP, SOCK_RECV, SOCK_UDPOPEN


SORTARRAY

SORTARRAY array[], cmp%

Trie un tableau dans l'ordre croissant - i.e. array[0] a le plus petit élément .

L'algorithme de tri peuvent être aussi appliqué à des tableaux de TYPEs . Lorsqu'il est utilisé avec un tableau de TYPEs, la premiere variable membre du TYPE est utilisée pour la comparaison.

Le paramètre cmp% peut être utilisée pour injecter votre propre fonction de comparaison pour l'algorithme de tri . Si vous laissez ce paramètre égal à 0, le comportement par défaut tel que décrit ci-dessus sera utilisé.
cmp% doit être l'adresse d'une fonction , accepter 2 x BYREF arguments qui sont du type des éléments du tableau.

Attention: Si la fonction fournie des paramètres différents, le programme va planter .

LOCAL arr[]

   // default sort
   Fill(arr[])
   SORTARRAY arr[], 0
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 0, i*16
   NEXT

   // sort by function
   Fill(arr[])
   SORTARRAY arr[], ADDRESSOF(compare)
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 100, i*16
   NEXT

   // inverse sort by function
   Fill(arr[])
   SORTARRAY arr[], ADDRESSOF(inverse_compare)
   FOR i=0 TO LEN(arr[])-1
      PRINT arr[i], 200, i*16
   NEXT

   SHOWSCREEN
   MOUSEWAIT

FUNCTION Fill: arr[]
   DIM arr[0]
   FOR i=0 TO 10
      DIMPUSH arr[], RND(100)
   NEXT
ENDFUNCTION

FUNCTION compare: BYREF a, BYREF b
   IF a<b THEN RETURN -1
   IF a>b THEN RETURN 1
   RETURN 0
ENDFUNCTION

FUNCTION inverse_compare: BYREF a, BYREF b
   IF a<b THEN RETURN 1
   IF a>b THEN RETURN -1
   RETURN 0
ENDFUNCTION

Refs:

ADDRESSOF(), FOREACH, LEN()


SOUNDPLAYING()

status% = SOUNDPLAYING(channel%)

Retourne 1 si le son est joué , sinon 0 . Le channel% est la valeur retournée par PLAYSOUND().

LOADSOUND "super.wav", 0, 1

ch = PLAYSOUND(0, 0,1)
WHILE SOUNDPLAYING(ch)
   PRINT "Playing...", 100,100
    SHOWSCREEN
WEND
PRINT "Stop!", 100, 100
SHOWSCREEN
MOUSEWAIT

Refs:

PLAYSOUND()


SPLITSTR()

countl% = SPLITSTR(text$, array#$[], split$)

Fractionne la chaîne text$ en blocs distincts . Chaque caractère de la chaîne split$ sera considéré comme un délimiteur . La valeur retournée est le nombre de blocs créés .

num = SPLITSTR("  Dream.Design - Entertainment", splits$[], ". -")
PRINT num, 0, 0
FOR i=0 TO num-1
   PRINT ">"+splits$[i]+"<", 0, 20*(i+1)
NEXT
SHOWSCREEN
MOUSEWAIT

résultat:
3
>Dream<
>Design<
>Entertainment<

Refs:

INSTR(), MID$()


SPRCOLL()

col%=SPRCOLL(id1%, x1%, y1%, id2%, x2%, y2%)

Cette commande fait une fonction de test de détection de collisions aux pixels entre les sprites ID id1 et id2. Cette commande interne à BOXCOLL vérifie les variations de vitesse avant de vérifier si des pixels de deux sprites se chevauchent . En conséquence, il n'est pas nécessaire d'exécuter manuellement un BOXCOLL avant cette commande.

Le résultat sera 1 si des pixels des deux sprites se chevauchent, sinon 0 .

exemple:

// SPRCOLL DEMO

LOADBMP "test.bmp"
LOADSPRITE "Bubble.bmp", 0    // LOADSPRITE $name, #num
LOADSPRITE "Block.bmp",  1

WHILE TRUE
 MOUSESTATE mx, my, b1 ,b2
 DRAWSPRITE 0, mx, my, 0
 DRAWSPRITE 1, 100, 150, 0

 IF SPRCOLL (0, mx, my, 1, 100, 150)
  PRINT "Wahoooo", 100, 100
 ENDIF
 SHOWSCREEN
WEND

Refs:

ANIMCOLL(), BOXCOLL


SQR()

n# = SQR(number#)

Calcule la racine carrée d'un nombre .

exemple:

// SQR
PRINT SQR(9), 0, 100 // = 3
SHOWSCREEN
MOUSEWAIT

résultat:
3


STARTDATA

STARTDATA label:

La commande "STARTDATA label:" définie le début d'un bloc de données . Un bloc de données peut se composer de nombres ou chaînes de toutes sortes.

Example:

RESTORE name
READ a  // returns 1
READ b  // returns 2
READ a$, b$, c, d // returns "x", "y", 3, 4
PRINT a+", "+b+", "+a$+", "+b$+", "+c+", "+d, 0,0

SHOWSCREEN
MOUSEWAIT
READ xxx // Error - out of data

STARTDATA name:
   DATA 1,2
   DATA "x", "y", 3,4
ENDDATA

résultat:
1, 2, x, y, 3, 4

Refs:

DATA, DIMDATA, ENDDATA, READ, RESTORE


STARTPOLY

STARTPOLY spriteID%, bTriangles%=FALSE

La commande POLY est la plus puissant de la famille SPRITE , avec elle vous pouvez dessiner n'importe quelle forme polygone . Les valeurs de couleurs peuvent également être fixées pour chaque coins de Polygon.
Il doit y avoir au moins 3 POLYVECTOR appels entre-deux STARTPOLY et ENDPOLY sinon rien ne sera considéré .
Entre STARTPOLY et ENDPOLY l'appels de commandes DRAWSPRITE ou PRINT n'est pas sont autorisés . Si vous utilisez DRAWSPRITE ou des fonctions d'impression , des pannes du système peuvent se produire!

spriteID% est un ID d'un bitmap chargé avec LOADSPRITE
-1 signifie pas de texture (=bitmap) seront utilisées .
bTriangles :le GLBasic conseille d'utiliser des triangles unique (p1,p2,p3 p4,p5,p6 ...) au lieu d'un eventail de triangle (p1,p2,p3 p1,p4,p5 p1,p6,p7 ...)

exemple:

// POLYSPRITES

LOADSPRITE "Block.bmp", 0 // 64x64 Bitmap
LOADBMP "Test.bmp"
 STARTPOLY 0 // Bitmap = No.0
  POLYVECTOR  0,   0,  0,  0, RGB(255, 255, 255)
  POLYVECTOR   0, 300,  0, 64, RGB (255, 255, 255)
  POLYVECTOR 300, 300, 64, 64, RGB(255, 255, 255)
  POLYVECTOR 250,  50, 64,  0, RGB(  0, 255,   0)
 ENDPOLY
  SHOWSCREEN
  MOUSEWAIT

Refs:

ENDPOLY, POLYVECTOR


STATIC

STATIC var#$

STATIC: variable se comporte comme LOCAL en ce sens qu'elle n'est pas accessible en dehors de la section du code, elle y est déclarée dedans . Cependant, contrairement à une variable LOCAL, la valeur de la variable est conservée lorsque la fonction est terminée. Après un nouvel appel dans la fonction, l'ancienne valeur est encore attribuée à la variable.

// STATIC / LOCAL
FOR i=0 TO 5
   foo()
NEXT
SHOWSCREEN
MOUSEWAIT

FUNCTION foo:
LOCAL  l = 5
STATIC s = 5
   INC l, 1
   INC s, 1
   PRINT "l="+l+" s="+s, 0, s*20
ENDFUNCTION

résultat:
l=6 s=6
l=6 s=7
l=6 s=8
l=6 s=9
l=6
s=10
l=6 s=11

Refs:

GLOBAL, LOCAL


STDCOLOR

STDCOLOR iForegnd%=15, iBackgnd%=1

Définit la couleur pour la prochaine console de sortie STDOUT
.

Les couleurs sont :
0=noir
1=bleu
2=vert
3=cyan
4=rouge
5=pourpre
6=jaune
7=ltgray
8=Gray
9=light
blue
10=light green
11=light cyan
12=light red
13=light
purple
14=light yellow
15=blanc

Refs:

STDOUT


STDERR

STDERR text#$

STDERR:
Écrit dans le flux d'erreur standard . Vous pouvez trouver cela utile lorsque vous souhaitez pipe (recherche sur Internet pour "pipe output") output un programme vers un fichier et toujours apparaître le message d'erreur sur la fenêtre console .

les commandes STDOUT/STDIN/STDERR sont utilisées et seulement faite pour un programme console . Voir le menu Project/Options.

STDOUT "Name:\n"
name$ = STDIN$()

STDERR "This is sent to STDERR : "+name$ + "\n"

Refs:

STDIN$(), STDOUT


STDIN$()

text$ = STDIN$()

STDIN$():
Lit une chaîne à partir du flux d'entrée standard - généralement la fenêtre de la console d'entrée .
L'entrée est terminée par le caractère de nouvelle ligne ("\n") qui sera tronqué de la chaîne entrée . La mémoire tampon est limitée à 4095 characters, GLBasic empêche les débordements de buffer.

les commandes STDOUT/STDIN/STDERR sont utilisées et seulement faite pour un programme console . Voir le menu Project/Options.

STDOUT "Name:\n"
name$ = STDIN$()

STDOUT "You are: "+name$ + "\n"

WHILE TRUE
   ink$ = INKEY$()
   IF LEN(ink$) THEN STDOUT "Key: "+ink$+"\n"
WEND

Refs:

STDERR, STDOUT


STDOUT

STDOUT text#$

STDOUT:
Ecrit une chaîne dans le flux de sortie standard - c'est généralement la fenêtre console.

les commandes STDOUT/STDIN/STDERR sont utilisées et seulement faite pour un programme console . Voir le menu Project/Options.

STDOUT "Name:\n"
name$ = STDIN$()

STDOUT "You are: "+name$ + "\n"

WHILE TRUE
   ink$ = INKEY$()
   IF LEN(ink$) THEN STDOUT "Key: "+ink$+"\n"
WEND

Refs:

INKEY$, STDERR


STEP

FOR counter# = start# TO end# |STEP steps#|
...
NEXT

STEP (si spécifié) définir dans une bouche FOR / NEXT de combien est incrémenter ou décrémenter counter# pour chaque exécution de la boucle . Si steps# n'est pas défini , steps# est par défaut = +1.

exemple:

FOR i=0 TO 10 STEP 2
    PRINT i, 100, 32*i
NEXT

SHOWSCREEN
MOUSEWAIT

résultat:
0
2
4
6
8
10

Refs:

FOR, NEXT, TO


STOPMUSIC

STOPMUSIC

Pour arrêter la musique qui joue actuellement utiliser STOPMUSIC.

Avec ISMUSICPLAYING() vous pouvez tester si la musique est en cours de lecture ou non .

exemple:

PLAYMUSIC "Music.mp3", TRUE
PRINT "Music!", 100, 100
SHOWSCREEN
MOUSEWAIT
if ISMUSICPLAYING() = TRUE then STOPMUSIC // GLBasic does this automatically when ending

Refs:

HUSH, PLAYMUSIC


STOPSOUND

STOPSOUND channel%

Arrête un son qui est en cours de lecture .

Example

LOADSOUND "Super.wav", 0, 1

PLAYSOUND (0, -1, 1)   // Play the sound
SLEEP 500            // delay for half a second
STOPSOUND 1            // Stop the sound

Refs:

HUSH, LOADSOUND, PLAYSOUND(), SOUNDPLAYING()


STRETCHANIM

STRETCHANIM id#, anim#, x#, y#, width#, height#

Cette commande est similaire à STRETCHSPRITE sauf qu'il ne tire que le cadre animation anim# plutôt que l'image complète id#.
L'animation doit avoir été préalablement chargés de LOADANIM.

Example:

LOADANIM "test.bmp", 0, 32,32
STRETCHANIM 0, 1, 100, 100, 45, 50   // make it 45x50 pixels
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWANIM, LOADANIM, STRETCHSPRITE


STRETCHSPRITE

STRETCHSPRITE num%, x%, y%, width%, height%

Une image sprite sera affichée sur le tampon arrière . Vous pouvez utiliser la même image num% plusieurs fois pour afficher plusieurs copies du même sprite .

STRETCHSPRITE

Comparable à ZOOMSPRITE en ce sens qu'elle va dessiner un sprite redimensionnée pour la mémoire tampon d'arrière , sauf que l'étirement du sprite vous permet de spécifier la taille en pixel pour redimensionner le sprite plutôt qu'un facteur zoom.

exemple:

LOADSPRITE "Bubble.bmp", 0
STRETCHSPRITE 0, 100, 100, 128, 128 // make it 128x128 pixels
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE, ROTOSPRITE, ROTOZOOMSPRITE, ZOOMSPRITE


SUB

SUB name:
...
ENDSUB

...
GOSUB name

La commande SUB définit un sous-programme à un regroupement logique des commandes comme une FUNCTION , sauf que contrairement à une FUNCTION elle ne retourne pas une valeur ou ne prend pas d'argument.

Définir un SUB avec SUB marque : (vous assurer d'inclure les deux points!) Et la Fin du SUB avec ENDSUB.
SUB doivent être placés après le programme principal . Entre ENDSUB et la prochaine commande SUB le code n'est pas autorisé .
SUB peut être quitté si nécessaire avant l'instruction ENDSUB en utilisant la commande RETURN . Vous pouvez utiliser GOSUB pour passer à une autre sous-routine à partir d'une sous-routine.
Une bonne façon de créer des nouveaux sous-programmes est d'utiliser la commande "new SUB" de la menu Project.

// GOSUB subcode; <-> RETURN;

a$="-"
GOSUB Setup
PRINT a$, 0, 0
SHOWSCREEN
MOUSEWAIT
// End of main program

// From here on just SUBs
// No more code out of SUB and ENDSUB

SUB Setup:
  a$="Setup_Complete"
  RETURN          // Back to GOSUB call
  a$="Das erscheint nie / This won't appear"
ENDSUB

Refs:

ENDSUB, FUNCTION, GOSUB, RETURN


SYSTEMPOINTER

SYSTEMPOINTER mode#

Cette commande affecte le mode actuel du pointeur de la souris (mouse) S'il est visible mode#=TRUE, ou s'il est cache mode#=FALSE. Ceci est très pratique si vous souhaitez programmer une interface graphique ou de simuler le stylo avec une souris sur PocketPC un PC .

Example:

...
   SYSTEMPOINTER=TRUE
   ...

Refs:

MOUSEAXIS, MOUSESTATE, MOUSEWAIT, SETMOUSE


TAN()

a=TAN(angle#)

Retourne la tangente d'un angle# en degré (0-360°).

Le résultat sera dans la gamme -1 to +1.

Example:

a# = -45
result# = TAN(a#)
PRINT "TAN result = " + result,0,0
SHOWSCREEN
MOUSEWAIT

résultat:
TAN result = 1

Refs:

ACOS(), ASIN(), ATAN(), COS(), SIN()


THEN

IF a#$ = < <= > >= <> b#$ THEN ...

La commande THEN spécifie une seule commande à exécuter si la condition est évalue Vraie "TRUE". Pour plusieurs commandes à exécuter , oublie THEN et utilisez un bloc de code suivie d'une instruction ENDIF.

Example:

a=5; b=3

IF a < b
    PRINT "a < b", 100, 100
ELSE
    PRINT "a < b is FALSE" style="color:white;">, 100, 100
ENDIF

IF a<>b THEN PRINT "a is not b", 100, 150

SHOWSCREEN
MOUSEWAIT

résultat:
a < b is FALSE
a is not b

Refs:

ELSEIF, ENDIF, IF


THROW

TRY
...
IF ... THEN THROW "Error"
...
CATCH err$
DEBUG err$ + "\n"
ASSERT 0
FINALLY
...

Les commandes TRY/THROW/CATCH/FINALLY sont utilisées pour tester si une section de code fonctionne, et d'effectuer une action si elle ne fonctionne pas .

Pour signaler une erreur (known as raising an exception) dans le bloc-code TRY utilisez la commande THROW . THROW prend une chaîne d'erreur comme un argument . Quand une exception est lancée, le programme passe immédiatement au bloc-code de CATCH.

Example

TRY
   FOR i=0 TO 5
      STDOUT "call "+i+"\n"
      int_div_by_2(i)
   NEXT
CATCH err$
   STDERR "Exception: " + err$ + "\n"
FINALLY

STDOUT "ok, done\n"
KEYWAIT
END

FUNCTION int_div_by_2: number%
   IF MOD(number%, 2)<>0 THEN THROW "Odd: "+number%
   STDOUT "dividing "+number%+"\n"
   RETURN number / 2
ENDFUNCTION

Refs:

CATCH, FINALLY, TRY


TO

FOR counter# = start# TO end# |STEP steps#|
...
NEXT

la déclaration TO définie la valeur jusqu'à (end#) dans une boucle FOR/NEXT. La variable counter# prendra d'abord la valeur de start# et incrémenter ou décrémenter jusqu'à ce qu'elle atteigne la valeur de end#.

Example:

FOR i=0 TO 10 STEP 2
    PRINT i, 100, 32*i
NEXT

SHOWSCREEN
MOUSEWAIT

résultat :
0
2
4
6
8
10

Refs:

FOR


TRY

TRY
...
IF ... THEN THROW "Error"
...
CATCH err$
DEBUG err$ + "\n"
ASSERT 0
FINALLY
...

Les commandes TRY/THROW/CATCH/FINALLY sont utilisées pour tester si une section de code fonctionne, et pour effectuer une action si elle ne fonctionne pas.

Pour marquer le début d'une section de code que vous souhaitez tester vous utilisez la commande TRY . Et la fin du bloc TRY avec la commande FINALLY.

Example:

TRY
   FOR i=0 TO 5
      STDOUT "call "+i+"\n"
      int_div_by_2(i)
   NEXT
CATCH err$
   STDERR "Exception: " + err$ + "\n"
FINALLY

STDOUT "ok, done\n"
KEYWAIT
END

FUNCTION int_div_by_2: number%
   IF MOD(number%, 2)<>0 THEN THROW "Odd: "+number%
   STDOUT "dividing "+number%+"\n"
   RETURN number / 2
ENDFUNCTION

Refs:

CATCH, FINALLY, THROW


TYPE

TYPE name
members
ENDTYPE

la commande TYPE est utilisé pour créer une structure de données . Une description détaillée peut être trouvée dans le tutoriel .
Afin de créer une variable de type 'name', vous devez effectuer les opérations suivantes :

LOCAL variable AS name
GLOBAL variable AS name

Example:

TYPE CAR
   company$
   costs
ENDTYPE

LOCAL Audi AS CAR

Audi.company$ = "Audi AG, Ingolstadt"
Audi.costs = 40000

Vous pouvez aussi avoir un tableau de TYPEs

TYPE TWorker
   Name$
   Annual_Wage
ENDTYPE

GLOBAL Employees[] AS TWorker
DIM Employees[5]

Vous pouvez facilement faire qu'un tableau multi-dimensionnel en

GLOBAL Employees[] AS TWorker
DIM Employees[5][4]

Si vous avez un tableau de TYPEs, vous pouvez supprimer des éléments avec DIMDEL et DELETE ou DIMPUSH pour ajourter de nouveaux éléments à la suite du tableau.

Si vous souhaitez parcourir chaque élément d'un tableau de TYPEs, utiliser la commande FOREACH .

La dernière valeur d'un tableau est soit un [LEN(a[])-1], ou tout simplement un [-1].


UCASE$

up$ = UCASE$(text$)

Convertit tous les caractères minuscules dans la chaîne text$ en majuscules .

Example:

// UCASE$ - LCASE$
PRINT UCASE$("123 - miniMIN"), 0, 20
PRINT LCASE$("123 - MAXImax" style="color:white;">), 0, 40
SHOWSCREEN
MOUSEWAIT

résultat:
123 - MINIMIN
123 - maximax

Refs:

ASC(), CHR$(), FORMAT$(), INKEY$, INPUT, INSTR(), LCASE$(), MID$()


USEASBMP

USEASBMP

Copie la mémoire du tampon arrière en cours (back buffer) à la mémoire tampon de l'image de fond . En conséquence, il servira de base pour l'affichage de votre programme au prochain appel SHOWSCREEN.

exemple:

// Star background
FOR i=0 TO 1000
    PRINT "*", RND(800), RND(600)
NEXT
USEASBMP // Save as background

FOR i=0 TO 600
    PRINT "-=v=-", 100, i
    SHOWSCREEN
NEXT
MOUSEWAIT

Note : Sur l'iPhone, cette commande fonctionne uniquement en mode portrait .

Refs:

BLACKSCREEN, BLENDSCREEN, LOADBMP


USESCREEN

USESCREEN id%

Cette commande envoie la sortie de toutes les commandes graphique suivantes à un écran virtuel précédemment créé . L'écran utilisé sera le numéro id%.
Si vous spécifiez -1 comme id%, la sortie sera envoyé à la mémoire tampon arrière.

Example:

// CREATESCREEN
PRINT "Monitor", 0,0
GRABSPRITE 1, 0,0,32,32

// Screen 0, Sprite 13
CREATESCREEN 0, 13, 128,128
// Use screen for all output
USESCREEN 0
   PRINT "Offscreen", 0,0
   DRAWSPRITE 1,0,32
// Switch back to the window
USESCREEN -1

// Draw the screen
DRAWSPRITE 13, 100,100
SHOWSCREEN
MOUSEWAIT

Refs:

CREATESCREEN


VIEWPORT

VIEWPORT x%, y%, width%, height%

Définit la zone de visualisation utilisées pour l'élaboration d'un rectangle spécifié . Cette commande est utile pour les programmes sur écran partagé ou par exemple l'affichage d'un miroir rétroviseur pour une voiture .
Le pixel de coordonnées 0,0 pour le viewport seront pour l'écran à l'emplacement x%, y%.
Les graphiques en 3D sera réduite comme si le viewport était la fenêtre principale .
Les paramètres width% ou height% <=0 réinitialise la zone de visualisation de la fenêtre entière .

// --------------------------------- //
// Project: Multiple Viewports
// Start: Wednesday, August 11, 2004
// IDE Version: 2.40811

WHILE TRUE
 PRINT "Test", 0, 0

 MOUSESTATE mx, my, b1, b2
 GOSUB Scene // 3D Scene

 VIEWPORT mx, my, 150, 100
 // Draw more than the viewport's boundaries
 DRAWRECT -100, -100, 400, 600, RGB(0, 0, 64)
 PRINT "Viewport.....", 0, 0
 GETVIEWPORT vx,vy,vw,vh   // Returns mx,my,150,100
 GOSUB Scene

 VIEWPORT 0,0,0,0 // Reset
 PRINT "Back to normal", 0, 20
 PRINT "Viewport x="+vx+" y="+vy+" width="+vw+" height="+vh,0,40
 SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  SCENE  #=-
// ------------------------------------------------------------- //
SUB Scene:
 X_MAKE3D 1, 100, 45
 X_CAMERA 0,0,10, 0,0,0
 X_OBJSTART 1
  X_OBJADDVERTEX  0, 0, 0, 0,0, RGB(255,255,255)
  X_OBJADDVERTEX  1, 1, 0, 1,1, RGB(255,255,255)
  X_OBJADDVERTEX  0, 1, 0, 0,1, RGB(255,255,255)
 X_OBJEND
 X_ROTATION GETTIMERALL()/30, 0, 1, 0
 X_DRAWOBJ 1, 0
 X_DRAWAXES 0,0,0
ENDSUB  // SCENE

Refs:

GETVIEWPORT


WEND

WHILE a#$ = < <= > >= <> b#$
WEND

La commande WEND signifie la fin d'une boucle (bloc-code) WHILE . Le code entre WHILE et WEND sera exécuté tant que la condition relative à l'instruction while est Vraie "TRUE".

exemple:

i=0

WHILE i < 5
    i=i+1
    PRINT i, i*32, 100
WEND

SHOWSCREEN
MOUSEWAIT

résultat:
1 2 3 4 5

Refs:

WHILE


WHILE

WHILE a#$ = < <= > >= <> b#$
WEND

Boucles dans le code entre WHILE et WEND aussi longtemps que la comparaison entre a#$ et b#$ est TRUE "vraie".

exemple:

i=0

WHILE i < 5
    i=i+1
    PRINT i, i*32, 100
WEND

SHOWSCREEN
MOUSEWAIT

résultat:
1 2 3 4 5

Refs:

BREAK, CONTINUE, FOR, GOTO, WEND


WRITEBYTE

WRITEBYTE channel%, val%

Écrit la valeur de l'octet val% sur le fichier qui a été ouvert sur le canal channel%.

BYTE = 1 Byte, (0..255)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READBYTE


WRITEIEEE

WRITEIEEE channel%, val#

Écrit un valeur IEEE val% sur le fichier qui a été ouvert sur le canal channel%.

IEEE = 8 Byte, IEEE 64 Bit nombre à virgule flottante

WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READIEEE


WRITELINE

WRITELINE channel%, val$

Ecrit la "string" ligne de chaîne de caractères val$ sur le fichier qui a été ouvert sur le canal channel%.

Lors de la rédaction , WRITELINE fera un retour à la ligne ("\r\n") . Si vous voulez écrire en format UNIX, utilisez :
WRITESTR 1, text$ + "\n"

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READLINE


WRITELONG

WRITELONG channel%, val%

Écrit une valeur LONG val% sur le fichier qui a été ouvert sur le canal channel%.

LONG = 4 Byte, (0..4294967295)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic. .

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READLONG


WRITESHORTIEEE

WRITESHORTIEEE channel%, val#

Écrit la valeur SHORTIEEE val% sur le fichier qui a été ouvert sur le canal channel%.

SHORTIEEE = 4 Byte, IEEE 32 Bit Nombre à virgule flottante

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READSHORTIEEE


WRITESTR

WRITESTR channel%, val$

Ecrit la "string" ligne de chaîne de caractères val$ sur le fichier qui a été ouvert sur le canal channel%.

Lors de la rédaction , WRITELINE fera un retour à la ligne ("\r\n") . Si vous voulez écrire en format UNIX, utilisez :
WRITESTR 1, text$ + "\n"

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READSTR


WRITEUBYTE

WRITEUBYTE channel%, val%

Écrit la valeur UBYTE val% sur le fichier qui a été ouvert sur le canal channel%.

BYTE = 1 Byte, (0..255)
U = sans signe . (e.g. 0..255 au lieu de -127..128 pour BYTE)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READUBYTE


WRITEULONG

WRITEULONG channel%, val%

Écrit la valeur ULONG val% sur le fichier qui a été ouvert sur le canal channel%.

U = sans signe . (e.g. 0..255 au lieu de -127..128 for BYTE)
LONG = 4 Byte, (0..4294967295)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.
Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READULONG


WRITEUWORD

WRITEUWORD channel%, val%

Écrit la valeur UWORD val% sur le fichier qui a été ouvert sur le canal channel%.

WORD = 2 Byte, (0..65535)
U = sans signe . (e.g. 0..255 au lieu de -127..128 pour BYTE)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READUWORD


WRITEWORD

WRITEWORD channel%, val%

Écrit la valeur WORD val% sur le fichier qui a été ouvert sur le canal channel%.

WORD = 2 Byte, (0..65535)

Vous pouvez consulter WRITEIEEE/WRITESHORTIEE. Avec ces commandes vous pouvez charger et sauver "load/save" des nombres à virgule flottante - ils sont le meilleur moyen de stocker des nombres en GLBasic.

Example

// Files
test$ = "test.bin"
OPENFILE(1, test$, FALSE)

WRITEBYTE 1, 42
WRITEBYTE 1, -42
WRITEWORD 1, 16767
WRITEWORD 1, -16767
WRITEIEEE 1, 1.234E-4

xx$= "Hello World\nYes, Hello\n"
WRITESTR  1, xx$
WRITELONG 1, 16767
WRITELONG 1, -16767
CLOSEFILE 1

LOCAL b1%, b2%, w1%, w2%, l1%, l2%, ieee
LOCAL x2$, _x1$, _x2$
OPENFILE(1, test$, TRUE)
READBYTE 1, b1
READBYTE 1, b2
READWORD 1, w1
READWORD 1, w2
READIEEE 1, ieee

// READSTR 1, x2$, LEN(xx$)
READLINE 1, _x1$
READLINE 1, _x2$
READLONG 1, l1
READLONG 1, l2
CLOSEFILE 1

LOCAL i%
PRINT "b1="+b1, 0,i); INC(i, 10);
PRINT "b2="+b2, 0,i); INC(i, 10);
PRINT "w1="+w1, 0,i); INC(i, 10);
PRINT "w2="+w2, 0,i); INC(i, 10);
PRINT "ie="+ieee, 0,i); INC(i, 10);
PRINT "st="+_x1 + "-" + _x2, 0,i); INC(i, 10);
PRINT "l1="+l1, 0,i); INC(i, 10);
PRINT "l2="+l2, 0,i); INC(i, 10);

SHOWSCREEN
MOUSEWAIT

OPENFILE(1, "test.txt", FALSE)
WRITELONG 1, 1234
WRITELONG 1, 5678
WRITELONG 1, 9911
CLOSEFILE 1

LOCAL i

// 1234
OPENFILE(1, "test.txt", TRUE)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, 0, 0)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 1234
FILESEEK(1, -12, -1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

// 9911
FILESEEK(1, 4, 1)
DEBUG "pos(0)="+FILEPOSITION(1)+"\n"
READLONG 1,i%; DEBUG "read="+i+"\n"

CLOSEFILE 1

Refs:

CLOSEFILE, ENDOFFILE(), FILEPOSITION, FILESEEK, OPENFILE(), READWORD


X_AMBIENT_LT

X_AMBIENT_LT num#, col#

Allume une lumière ambiante (une source de lumière qui viens de toutes les directions).
num# spécifie l'id de la lumière. OpenGL supporte jusque 8 lumières différentes de type variable (lumière ambiante / projecteur), donc les valeurs de 0 à 7 sont valide.
col# spécifie la couleur de la source de lumière. Voir RGB().

Il n'y a pas de réglage d'intensité pour les source de lumière ambiante.

Il n'ya pas beaucoup de point dans de multiples sources de lumière ambiante donc il est recommandé d'utiliser une lumière ambiante et le reste (si nécessaire) pour les projecteurs.

En raison de la charge système des sources de lumière, l'utilisation de plus de 2 sources de lumière (soit ambiante ou spot) n'est pas recommandée.

Si vous voulez éteindre la source de lumière ambiante, vous pouvez le faire en utilisant la commande X_SPOT_LT num#,0,0,0,0,0,0,0,0 - où num# est

le numéro de lumière ambiante.

Refs:

X_SPOT_LT


X_AUTONORMALS

X_AUTONORMALS mode#

X_AUTONORMALS va sélectionner quel mode utiliser pour le calcul des normaux de l'éclairage. Ceci affecteras tous les objets crées après ce point.
mode#:
0: aucun
1: plat
2: surface avec les normales

Mode 1 vous permet de créer des objets comme des cubes avec des bords réels.
Mode 2 suppose que tous les triangles qui partagent un point commun appartiennent à la même surface. Un sommet normal pour cette surface sera utilisé pour chaque point partagés, ainsi les bords seront lissées dans les courbures.

// --------------------------------- //
// Project: AutoNormals
// Start: Thursday, September 30, 2004
// IDE Version: 2.40924

X_AUTONORMALS 1
Cube(0)
X_AUTONORMALS 2
Cube(1)

WHILE TRUE
   X_MAKE3D 1, 100, 45
   X_CAMERA 0,2,7, 0,.5,0
   X_SPOT_LT 0, RGB(255,255,255), 0,2,7, 0,0,-1, 45
   phi=phi+GETTIMER()/50
   X_MOVEMENT -2, 0, 0
   X_ROTATION phi, 0,1,0
   X_DRAWOBJ 0, 0
   X_MOVEMENT 2, 0, 0
   X_ROTATION phi, 0,1,0
   X_DRAWOBJ 1, 0
   SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION Cube: num
LOCAL col
   col=RGB(0xff, 0xff, 0xff) // white
   X_OBJSTART num
      // Front Face
      X_OBJADDVERTEX  .5, -.5,  .5, 1, 0, col
      X_OBJADDVERTEX -.5, -.5,  .5, 0, 0, col
      X_OBJADDVERTEX  .5,  .5,  .5, 1, 1, col
      X_OBJADDVERTEX -.5,  .5,  .5, 0, 1, col
      X_OBJNEWGROUP
      // Back Face
      X_OBJADDVERTEX -.5,  .5, -.5, 1, 1, col
      X_OBJADDVERTEX -.5, -.5, -.5, 1, 0, col
      X_OBJADDVERTEX  .5,  .5, -.5, 0, 1, col
      X_OBJADDVERTEX  .5, -.5, -.5, 0, 0, col
      X_OBJNEWGROUP
      // Top Face
      X_OBJADDVERTEX -.5,  .5,  .5, 0, 0, col
      X_OBJADDVERTEX -.5,  .5, -.5, 0, 1, col
      X_OBJADDVERTEX  .5,  .5,  .5, 1, 0, col
      X_OBJADDVERTEX  .5,  .5, -.5, 1, 1, col
      X_OBJNEWGROUP
      // Bottom Face
      X_OBJADDVERTEX  .5, -.5, -.5, 0, 1, col
      X_OBJADDVERTEX -.5, -.5, -.5, 1, 1, col
      X_OBJADDVERTEX  .5, -.5,  .5, 0, 0, col
      X_OBJADDVERTEX -.5, -.5,  .5, 1, 0, col
      X_OBJNEWGROUP
      // Right face
      X_OBJADDVERTEX  .5,  .5, -.5, 1, 1, col
      X_OBJADDVERTEX  .5, -.5, -.5, 1, 0, col
      X_OBJADDVERTEX  .5,  .5,  .5, 0, 1, col
      X_OBJADDVERTEX  .5, -.5,  .5, 0, 0, col
      X_OBJNEWGROUP
      // Left Face
      X_OBJADDVERTEX -.5, -.5,  .5, 1, 0, col
      X_OBJADDVERTEX -.5, -.5, -.5, 0, 0, col
      X_OBJADDVERTEX -.5,  .5,  .5, 1, 1, col
      X_OBJADDVERTEX -.5,  .5, -.5, 0, 1, col
      X_OBJNEWGROUP
   X_OBJEND

ENDFUNCTION // sz

Refs:

X_DRAWANIM, X_DRAWOBJ, X_OBJ..., X_SPOT_LT


X_CAMERA

X_CAMERA x#, y#, z#, px#, py#, pz

Règle la position de la camera à x#, y#, z# et la fait pointer vers ce point px#, py#, pz#. Le vecteur haut de la caméra pointe vers l'axe Y positif sans avoir

préalablement réglée avec X_CAMERAUP

X_CAMERAUP, X_FOG, X_MAKE3D, X_WORLD2SCREEN


X_CAMERAUP

X_CAMERAUP x#, y#, z#

Règle la direction vertical de la camera. Utiliser ca avant X_CAMERA.

Le réglage par defaut après chaque X_MAKE3D est à 0,1,0.

Refs:

X_CAMERA, X_MAKE3D


X_CLEAR_Z

X_CLEAR_Z

Efface les bits du buffer de profondeur.
Avec cette commande, tous les objets 3D dessiné avant cette commande deviendront des objet d'arrière plan . En tant que tel, les objets que vous dessiné à partir de ce point, peu importe la distance dont ils sont éloignés de la caméra, seront toujours dessiné devant les objets d'arrière-plan.

This command is useful for example when it comes to drawing a skybox (a skybox is a box that surrounds your whole 3D environment with images of distant scenery to add realism to your 3D world).

Cette commande est utile par exemple quand il s'agit de dessiner une skybox (une skybox est une zone qui englobe l'ensemble de votre environnement 3D avec des images de paysages lointains d'ajouter du réalisme à votre monde en 3D).

Pour dessiner les skybox, créer un cube texturé de 1 unité de taille au environ de la camera, exécutez X_CLEAR_Z, puis dessinez le reste de votre monde. Même si les objets dans votre monde sont à 1000 unités de distance de la caméra, ils pourront être dessiné devant votre skybox.

Refs:

BLACKSCREEN, X_MAKE3D


X_COLLISION()

col#=X_COLLISION(num#, frame#, rad#, x#, y#, z#)

Fait une sphère 3D de contrôle de collision d'objet.

frame# specifie la frame d'animation de l'objet num# a sont emplacement/grossissement/rotation et position coutrante.
x#, y#, z# specifie le centre de la sphere avec un rayon de rad#.

Refs:

X_COLLISIONAABB(), X_COLLISIONRAY(), X_COLLISIONSPHEREBOX, X_GETCOLLISIONFACE()


X_COLLISIONAABB()

col#=X_COLLISIONAABB( num#, frame#, xcenter#, ycenter#, zcenter#, width_x#, height_y#, width_z#)

Fait un axe aligné sur une boite anglobante de control de collision d'objet.
Cette axe aligné sur la boite anglobante à sont point central en xcenter#, ycenter#, zcenter#, et ses dimensions avec width_x#, width_z# et height_y#

num# specifie l'objet 3D, et frame# sa frame d'animation.

Refs:

X_COLLISION(), X_COLLISIONRAY(), X_COLLISIONSPHEREBOX, X_GETCOLLISIONFACE()


X_COLLISIONRAY()

scal# = X_COLLISIONRAY(num#, frame#, x#, y#, z#, dirx#, diry#, dirz#)

Vérifie sur l'objet 3D num# va rentrer en collision avec le rayon à travers x#,y#,z# regardant vers la direction dir#.

Si l'objet et le rayon entre en collision, scal# va être la distance entre le point x#,y#,z# et la direction regardé par dir#.

Si l'objet et le rayon n'entre pas en collision alors scal# = 0.

scal# < 0 va être retourné si aucune collision dans une direction positive est trouvée.
Si il y a collision dans les 2 directions positives et négatives alors la distance positive sera seulement retournée, Indépendamment de la collision la plus proche.

En mode débug les lignes du rayon sont dessinées:
- Verte = collision, scal# > 0
- Jaune = collision, scal# < 0 (à l'envers)
- Rouge = pas de collision du tout

// --------------------------------- //
// Project:
// Start: Saturday, July 20, 2002

// First we need an object. Here: a simple paper plane
// We assume Z is down, as most 3d programs will export
// Also we assume the x axis (positive) is the direction
// the plane will fly forwards, so in a right hand system
// y will be left side of plane.

// Triangle Strips will be drawn:
//
//  1---2---5
//   \ / \ /|
//    3---4 |
//         \|
//          6

   LOADSPRITE "News.bmp", 0

   col = RGB(0xff, 0xff, 0xff)
   X_OBJSTART 0 // PlaneID = 0
      // Right wing:                 side updown
      X_OBJADDVERTEX -7,  5,  0,     1.0, 1.0, col // Outer point
      X_OBJADDVERTEX -7,  1,  0,     1.0, 0.5, col // Inner edge
      X_OBJADDVERTEX  7,  0,  0,     0.0, 1.0, col // Top
      // Right body:
      X_OBJADDVERTEX -7,  0,  3,     0.0, 1.0, col
   X_OBJNEWGROUP
      // Left wing:
      X_OBJADDVERTEX -7, -5,  0,     0.0, 0.0, col
      X_OBJADDVERTEX -7, -1,  0,     0.0, 0.5, col
      X_OBJADDVERTEX  7,  0,  0,     1.0, 0.0, col
      // Left body:
      X_OBJADDVERTEX -7,  0,  3,     0.0, 1.0, col
   X_OBJEND

   X_SAVEOBJ "plane.ddd", 0
   X_LOADOBJ "plane.ddd", 0

LIMITFPS -1
WHILE TRUE

   MOUSESTATE mx, my, mb1, mb2

   DRAWRECT mx-8,my-8,16,16, RGB(255,0,0)

   X_MAKE3D 1, 1000, 45 // Turn to 3D Viewport
   X_CAMERA   200*SIN(mx*360/640), my*2-100, 200*COS(mx), 0,0,0 // Rotate CAMERA with mouse
   dtime = GETTIMER()
   psi=psi+(dtime/64); IF psi>=360 THEN psi=0
   FOR phi = 0 TO 360 STEP 30
      X_DRAWAXES 0,0,0 // Draw global axes (red=x, green=y, blue=z)

      alpha = (phi+psi)*4
      LOCAL px=200*SIN(phi+psi),py=SIN(alpha)*20,pz=100*COS(phi+psi)
      X_MOVEMENT px,py,pz

      X_SCALING 2,2,2
      X_ROTATION 90,1,0,0      // Make plane body point down global y
      X_ROTATION 45*COS(alpha),0,0,1      // make plane look up/down with mouse
      X_ROTATION phi+psi, 0,1,0   // Rtoation due to position in circle

      X_SETTEXTURE 0, -1
      X_DRAWOBJ 0, 0 // Draw Object#0. Frame# is always 0 with user def. objects

      // PICKING PART!
      LOCAL x,y,z, x2,y2,z2
      X_SCREEN2WORLD mx, my,  0, x, y, z
      X_SCREEN2WORLD mx, my, -1, x2,y2,z2
      IF X_COLLISIONRAY(0,0, x,y,z, x2-x, y2-y, z2-z)<>0
         X_PRINT "PICK", px,py,pz, 0
      ENDIF

   NEXT

   fps = ((1000/dtime)+fps)/2
   delay=delay+dtime
   IF delay>1000 // 1/2 sec
      delay=0
      showfps=fps
   ENDIF
   X_MAKE2D
   PRINT "FPS: " +INTEGER(showfps), 100, 100 // + dtime, 0,0
   SHOWSCREEN
WEND

Refs:

X_COLLISION(), X_COLLISIONAABB(), X_COLLISIONSPHEREBOX, X_GETCOLLISIONFACE()


X_COLLISIONSPHEREBOX

X_COLLISIONSPHEREBOX cx#,cy#,cz#,R#, bx#,by#,bz#

Cette commande vérifie que une sphère et une boite entre en collision une fois que la boite à été transformé avec la matrice courante (X_MOVEMENT, X_ROTATION, X_MULTMATRIX) .

L'axe aligné à la boite anglobente a ces dimensions : bx#, by#, bz#.

Le point au centre de la sphere est là cx#,cy#,cz#, avec un rayon de R#.

// X_COLLISIONSPHERE Example
cube = 0
sphere=1
CreateCube(cube, 3, RGB(255,255,0))
CreateSphere(sphere, 2, 8, RGB(0,255,0))

// Sphere: x,y,z (R=2)
x = 2
y = 2
z = -2
WHILE TRUE
   INC phi, .5
   X_MAKE3D 1,100,45
   X_CAMERA -5,3,20, 0,0,0
   X_MOVEMENT -1,-1,-2
   X_ROTATION phi, 0,1,0
   X_DRAWOBJ cube, 0

   // R=2, BX,BY,BZ=3
   col = X_COLLISIONSPHEREBOX(x,y,z,2, 3,3,3)

   X_MOVEMENT x,y,z
   X_DRAWOBJ sphere,0
   X_MAKE2D
   PRINT col, 0,0
   SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  SPHERE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
   pi = ACOS(0)*2
   IF r < 0 THEN r = -r
   IF n < 4 THEN n = 4

   X_AUTONORMALS 2 // smooth edges
   X_OBJSTART num
   FOR j=0 TO INTEGER(n/2) -1
      theta1 = j * 2*pi / n - pi/2;
      theta2 = (j + 1) * 2*pi / n - pi/2;
      FOR i=0 TO n
         theta3 = i * 2*pi / n;
         X_OBJADDVERTEX   r*COS(theta2) * COS(theta3), r*SIN(theta2), _
                     r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
         X_OBJADDVERTEX   r*COS(theta1) * COS(theta3), r*SIN(theta1), _
                     r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // n

// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
   // Diese Variablen sind als LOCAL definiert:
   // These variables are defined LOCAL:
   // num, sz,
   X_AUTONORMALS 1 // For a cube, hard edges
   sz=sz/2
   X_OBJSTART num
      // Front Face
      X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
      X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
      X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
      X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
      X_OBJNEWGROUP
      // Back Face
      X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
      X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
      X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
      X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
      X_OBJNEWGROUP
      // Top Face
      X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
      X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
      X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
      X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
      X_OBJNEWGROUP
      // Bottom Face
      X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
      X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
      X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
      X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
      X_OBJNEWGROUP
      // Right face
      X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
      X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
      X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
      X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
      X_OBJNEWGROUP
      // Left Face
      X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
      X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
      X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
      X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
      X_OBJNEWGROUP
   X_OBJEND

ENDFUNCTION // sz

Refs:

X_COLLISION(), X_COLLISIONAABB(), X_COLLISIONRAY(), X_MOVEMENT, X_MULTMATRIX


X_CULLMODE

X_CULLMODE cmode#

Avec cette commande vous pouvez spécifier si vous voulez afficher soit les faces avant soit les faces arriere soit les deux en meme temps de votre objet 3D.

cmode#=0 - les faces des deux coté seront dessiné
cmode#=1 - seulement la face avant sera dessiné.
cmode#=-1 - seulement la face arriere sera dessiné.

C'est une bonne idée que de n'afficher qu'un coté des faces quand cela est possible pour décharger la carte video ou le processeur. Avec chaque appel de la fonction X_MAKE3D le ' cull mode 'est remis à 0.

La face coté 'arriere' est définie par le coté de l'objet ou le verteurs normal ne pointe pas. La normale pour chaque triangle dans un objet 3D est calculé automatiquement par le moteur graphique. Quand vous creez un triangle, en dessinant ses points dans le sens inverse des aiguille d'une montre vous demander au moteur graphique de pointer vers la camera plutot que de s'en eloigner.

Exemple:

// Simple 3D
X_OBJSTART 1
 X_OBJADDVERTEX   0,  0, 0,  0,0, RGB(255,255,255)
 X_OBJADDVERTEX -20, 40, 0,  0,0, RGB(255,  0,  0)
 X_OBJADDVERTEX  20, 40, 0,  0,0, RGB(  0,  0,255)
X_OBJEND

WHILE TRUE
 phi=phi+1
 IF phi>=360 THEN phi=0

 X_MAKE3D 1, 1500
 X_CAMERA 0,0,400, 0,0,0

 FOR cmode=-1 TO 1
  X_CULLMODE cmode
  X_MOVEMENT cmode * 50, 0, 0
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 1, 0
 NEXT
 SHOWSCREEN
WEND

Refs:

X_CAMERA, X_DRAWOBJ, X_MAKE3D, X_MOVEMENT, X_OBJ..., X_ROTATION


X_DOT

X_DOT x#,y#,z#, size#, color#

Dessine un point 3D à la position x#, y#, z# qui a size# pixels de diamètre .

Refs:

RGB(), X_LINE


X_DRAWANIM

X_DRAWANIM num#, from#, to#, interpol#, full_anim#

X_DRAWANIM calcul la 'frame' de l'animation à afficher et l'affiche à partir de la sequence d'animation.
num# specifie l'objet à animer.
Les 'frames' from# et to# spécifie le debut et la fin de l'animation à interpoler. La premiere frame a l' index '0'.
interpol# specifie une valeur de 0 à 1.0 indique qu'elle est la distance entre from# et to# pour trouver la frame à afficher.
full_anim# doit être regler à TRUE si vous Si vous souhaitez interpoler sur une plage de frame d'animation, ou FALSE pour inclure seulement le début et la frame de fin.

Exemple :
Regler from# = 3 et end#=6 dire à X_DRAWANIM que vous voulez dessiner une frame entre 3 et 6 (inclusif).
Si vous réglez full_anim# à FALSE, soit la frame 3 ou la frame 6 sera dessiné, tout va dépendre de la valeur de interpol#. Toute valeur de interpol# < 0.5 va dessiner la frame 3, et toute valeur > 0.5 va dessiner la frame 6.
Si vous réglez full_anim# à TRUE, n'importe laquelle de ces frames sera dessinées 3,4,5,6 . Si interpol# est reglé à 0.333, vous lui demanderez d'afficher la frame d'un tiers de la distance séparant les frame 3 à 6 - ce qui corespond a la frame 4.

Exemple:

// Animation Demo

ddd_file$ = "moon" // "trooper"
scale = 7

X_LOADOBJ ddd_file$+".ddd", 1
LOADSPRITE ddd_file$+".bmp", 1

WHILE TRUE
// X_MAKE2D
// DRAWRECT 0,0,640,480,RGB(80,80,255)

 X_MAKE3D
 X_CAMERA 0, 20, 900, 0, 0, 0
 X_AMBIENT_LT 0, RGB(128,128,128)

 X_DRAWAXES 0,0,0

 phi=phi+(0.5)
 permil=permil+.001
 IF permil>=1 THEN permil=0

 X_SCALING scale, scale, scale
 X_ROTATION 270, 1,0,0
 X_ROTATION phi, 0.5,1,0

 X_SETTEXTURE 1

 X_DRAWANIM 1, 0, 128, permil, TRUE
// X_DRAWOBJ 1, 0 // ID of Object, Number of Keyframe to Render

 X_MAKE2D
 PRINT "PRINT/DRAWSPRITE ? MAKE2D !", 10, 20
 SHOWSCREEN
WEND

Refs:

X_DRAWOBJ, X_LOADOBJ, X_OBJ...


X_DRAWAXES

X_DRAWAXES x#, y#, z#

Dessines un system de coordonnées à la position donnée. C'est sympa pour tester le code. Cet axe va avoir ces couleurs :
X: rouge
Y: vert
Z: bleu


X_DRAWOBJ

X_DRAWOBJ num#, frame#

Dessines des frames d'animation d'un objet 3d chargé. num# specifie l'id de cet objet, frame# est la frame d'animation qui démarre avec un index '0'.
Il va etre placer à l'emplacement indiqué par X_MOVEMENT et X_ROTATION.

// DRAWOBJ Demo

ddd_file$ = "moon"
scale = 7

X_LOADOBJ ddd_file$+".ddd", 1
LOADSPRITE ddd_file$+".bmp", 1

WHILE TRUE
 X_MAKE3D
 X_CAMERA 0, 20, 900, 0, 0, 0
 X_AMBIENT_LT 0, RGB(128,128,128)

 X_DRAWAXES 0,0,0

 phi=phi+(0.5)
 X_SCALING scale, scale, scale
 X_ROTATION 270, 1,0,0
 X_ROTATION phi, 0.5,1,0

 X_SETTEXTURE 1
 X_DRAWOBJ 1, 0

 X_MAKE2D
 PRINT "PRINT/DRAWSPRITE ? MAKE2D !", 10, 20
 SHOWSCREEN
WEND

Refs:

X_DRAWANIM, X_LOADOBJ, X_OBJ...


X_FOG

X_FOG color#, exp_mode#, par1#, par2#

Active le brouillard. Le brouillard peut avoir l'un des deux types - linéaire (Le brouillard à une distance fixe du debut à la fin par rapport à la camera) ou expotentiel (La camera est au centre du brouillard.) Le brouillard expotentiel est bien plus réaliste mais va consommer plus de puissance CPU.

Si color# = -1, le brouillard est désactivé.
La variable exp_mode# va décider si vous utilisez le brouillard linéaire (exp_mode# = FALSE) ou brouillard expotentiel (exp_mode# = TRUE).
Les parametres par1# et par2# dépende de la variable exp_mode#:

exp_mode# = TRUE: (brouillard expotentiel)
par1 = Densitée du brouillard - Valeur de 0 à 1
par2 = Ignoré

exp_mode# = FALSE: (brouillard linéaire)
par1 = zNear - Debut du brouillard (distance à partir de la camera)
par2 = zFar - Fin du brouillard
Si par1=0 et par2=0, les valeurs zNear et zFar de la camera courante vont être utilisées.

Refs:

X_CAMERA


X_GETCOLLISIONFACE()

id% = X_GETCOLLISIONFACE()

Retourne un index de la surface qui à déclanché la requete de collision dans la derniere commande X_COLLISION...

L' information à propos de cette face peut etre retrouvée avec la commande X_GETFACE id%, f[].

Refs:

X_COLLISION(), X_COLLISIONAABB(), X_COLLISIONRAY(), X_COLLISIONSPHEREBOX, X_GETFACE


X_GETFACE

X_GETFACE obj#, frame#, index#, face[]

Avec cette commande vous pouvez avoir une information à propos d'un triangle dans un model 3D obj# dans une frame d'animation frame#.
index# est l'index du triangle dans le modele et dois être à l'interieur de la plage 0 et X_NUMFACES(obj#) - 1.
L'information est écrite dans le tableau face[] qui est dimensioné à [3][9] en interne. Le premier tableau est l'index des données (exemple: triangle coin 0,1 or 2).
Le second tableau est responsables des données:

face[i][0] = x
face[i][1] = y
face[i][2] = z
face[i][3] = tx
face[i][4] = ty
face[i][5] = color
face[i][6] = nx
face[i][7] = ny
face[i][8] = nz

x,y,z = Coordonnées des points.
tx,ty = Coordonnées des points de la texture.
nx,ny,nz = direction des points de la normal du vecteur.

Cette commande vous permet d'analyser complétement un objet 3D.

LOCAL face[]
   X_LOADOBJ "wumbo.ddd", 0

   X_MAKE3D 1,500,45
   X_CAMERA 10,2,-1, 0,2,0
   X_DRAWOBJ 0, 2
   count = X_NUMFACES(0)
   FOR i=0 TO count-1
      X_GETFACE 0, 2, i, face[]
      // face[node 0..2][x,y,z,tx,ty,col]
      X_LINE face[0][0], face[0][1], face[0][2], face[1][0], face[1][1], face[1][2], 4, RGB(0,0,255)
      X_LINE face[2][0], face[2][1], face[2][2], face[1][0], face[1][1], face[1][2], 4, RGB(0,0,255)
      X_LINE face[0][0], face[0][1], face[0][2], face[2][0], face[2][1], face[2][2], 4, RGB(0,0,255)

      X_DOT face[0][0], face[0][1], face[0][2], 8, RGB(0,255,0)
      X_DOT face[1][0], face[1][1], face[1][2], 8, RGB(0,255,0)
      X_DOT face[2][0], face[2][1], face[2][2], 8, RGB(0,255,0)
   NEXT

   SHOWSCREEN
   MOUSEWAIT

Refs:

X_NUMFACES(), X_OBJ...


X_LINE

X_LINE xa#,ya#,za#, xb#,yb#,zb#, width#, color#

Dessine une ligne 3D à partir de (xa#, ya#, za#) jusqu'à (xb#, yb#, zb#) avec une largeur de width# pixels et de la couleur color#.

Refs:

RGB(), X_DOT, X_DRAWAXES


X_LOADOBJ

X_LOADOBJ file$, num#

Charge un objet 3D en mémoire. L'objet va être associé avec une id de réference : num#.
Cet objet peut contenir une animation. Seulement les fichiers .ddd, .dda ou .ddw peuvent être chargés.

Un fichier .ddd est un fichier objet 3d spécial. Afin de convertir un fichier MD2 ou 3DS en fichier compressée. DDD , utilisez le programme 3DConvert dans le menu Outils dans l'IDE.

Un fichier .dda est un fichier texte ASCII qui décrit un object 3D. Le programme 3DConvert peut convertir ce fichier en fichier .ddd. Utilisez plutot les fichier .ddd que les fichier .dda qui vont diminuer le temps de chargement.

Un fichier .ddw est un fichier .ini qui decris le 'monde'.

Le format de fichier (.ddw) ressemble à ca:

;DDW1.0
[objects]
count=3 ; Number of objects
1=House.ddd
ta1=1 ; Material.bmp
tb1=-1; No 2. Texture (e.g. Bump Mapping)

2=Garden.ddd
ta2=2 ; Nature.bmp
tb2=-1

3=Tree.ddd
ta3=2
tb1=-1

[textures]
count=2
1=Material.bmp
2=Nature.bmp

Le format de fichier (.dda) ressemble à ca:

DDDA 1.0 # DDA file, version=1.0
# this must be the first bytes of the file
# a # indicates a comment for the
# rest of the line

6 # tex count - number of texture coordinates
1.000 0.004 # uv 0
0.996 0.992 # uv 1
0.000 0.992 # uv 2
1.008 0.000 # uv 3
0.000 0.988 # uv 4
0.176 0.281 # uv 5

2 # number of faces

# face description
142 142 142 # rgb for this face

# now the vertices
# n p1 p2 px ... t1 t2 tx ...
# n = number of points for surface
# px = index of position vertex (see below)
# tx = index of texture coordinate (see above)
3  0 0 3 1 2 2 # nxyz nuv ...

# next face
142 142 142 #col
3  0 3 2 4 1 5 # nxyz nuv ...

2 #number of keyframes

# keyframe description
4 # number of position vertices for keyframe
-0.988 3.000 0.000 # x y z 0
-2.017 1.966 -0.724 # x y z 1
-2.988 1.000 0.000 # x y z 2
-0.988 1.000 0.000 # x y z 3

# next keyframe
4
 0 1 0 # x y z 0
-1 1 0 # x y z 1
-1 0 0 # x y z 2
 0 0 0 # x y z 3

Example:

file$ = "robot.ddd"
X_LOADOBJ file$, 1
X_DRAWOBJ 1, 0

Refs:

GENX_OBJ(), X_OBJ..., X_SAVEOBJ


X_LOADSHADER()

ok# = X_LOADSHADER(index#, vertex$, fragment$)

Cette commande va charger un fichier shader GLSL (OpenGL Shading Language) dans l'index index#.
Si le shader est chargé avec succes, ok# va être TRUE.
Vous pouvez utiliser ce shader avec la commande : X_SETSHADER index#

X_SETSHADER index#

// --------------------------------- //
// Project: Shaders
// Start: Monday, September 25, 2006
// IDE Version: 3.262

LOCAL shaders$[], num, current$
   IF X_LOADSHADER(13, "toon.vert", "toon.frag") = FALSE
      PRINT "Shader failed to load: ", 100,100
      SHOWSCREEN
      MOUSEWAIT
      END
   ENDIF

   CreateTorus(0, 5, 10, 12, 9, 2, 2, RGB(0xff, 0xff, 0xff))
   // CreateSphere(0, 10, 9, RGB(0xff, 0xff, 0xff) )
   WHILE TRUE
      DRAWRECT 0,0,640,480,RGB(255,128,0)
      X_MAKE3D 1,500, 45
      X_CAMERA 0,0,-100, 0,0,0

      X_SPOT_LT 0, RGB(255,255,255),100,100,-1000, -.1,-.1,1, 360

      X_ROTATION 45, 1,1,0
      X_ROTATION GETTIMERALL()/100, 0,1,.2
      X_SETSHADER 13
      X_DRAWOBJ 0, 0
      SHOWSCREEN
   WEND

Refs:

X_PUTSHADER, X_SETSHADER, X_SPOT_LT


X_MAKE2D

X_MAKE2D

Retour au mode 2D . Vous pouvez utiliser n'importe quelle commande 2D cependant en mode 3D le résultat de certaine commande vont etre étrange (comme PRINT et DRAWSPRITE) .

Faite attention que vous pouvez lancer n'importe quelle commande 3D dans le mode 2D, mais vous aurez d'étrange résultat avec la plupart des commandes (elle vont dessiner sur un écran orthogonal). Il est préférable de basculer en mode 3D avant d'utiliser les commandes 3d. Vous pouvez basculer de l'un à l'autre autant de fois que vous voulez avant d'appeler la commande SHOWSCREEN

Example:
Voir les tutoriels 3D.

Refs:

X_MAKE3D


X_MAKE3D

X_MAKE3D znear#, zfar#, field_of_view#

Bascule en mode 3D.
Pendant que vous êtes en mode 3D , seulement les object ou partie d'objets qui ont leur distance de camera entre znear# et zfar# vont être affichés.
Une petite différence entre znear # et # zfar donnera une meilleure idée de la profondeur lors de l'affichage des polygones.La raison pour ceci est que le Z buffer est un entier 32-bit qui est dimensionné pour représenter les valeurs de znear à zfar.Moins elles seront réduites, plus de precision vous aurez.

La variable field_of_view va régler l'angle de zoom de l'objectif de la camera.

Une valeur négative de field_of_view# va créer une vue orthogonale (Les objets 3D objects ne vont pas retrècir en s'éloignant de la camera). Dans ce mode cette valeur represente le facteur grossissant de tout les objets 3D.

Faite attention que vous pouvez lancer n'importe quelle commande 3D dans le mode 2D, mais vous aurez d'étrange résultat avec la plupart des commandes (elle vont dessiner sur un écran orthogonal). Il est préférable de basculer en mode 3D avant d'utiliser les commandes 3d. Vous pouvez basculer de l'un a l'autre autant de fois que vous voulez avant d'appeler la commande SHOWSCREEN

exemple:

X_LOADOBJ "pyramid.ddd", 5
WHILE TRUE
 MOUSESTATE mx, my, b1 ,b2
 phi=mx*360 / 640

 X_MAKE3D 1,1000,45 // Viewport 3D

 X_CAMERA 0, 150, -300,      0 ,0 ,0
 X_AMBIENT_LT 0, RGB(255,255,0)

 X_MOVEMENT mx-230, 0, 0
 X_SCALING 3, 3, 3
 X_ROTATION phi*3, 0, 1, 0
 X_DRAWOBJ 5, 0

 SHOWSCREEN
WEND

Refs:

X_CAMERA, X_DRAWOBJ, X_MAKE2D, X_OBJ...


X_MIPMAPPING

X_MIPMAPPING status#

Active ou non d'utiliser le mipmapping pour les objets 3D.

Le MipMapping est une technique qui utilise différentes textures pour les objets qui sont les plus éloignés.

Il en résulte une image de meilleur qualité (pas d'arrête vive sur les pixel ) quand vous affichez des objets éloignés.
X_MIPMAPPING dois être activé avant LOADSPRITE pour générer les niveaux de MipMapping . La commande X_MIPMAPPING va affecter tous les objets afficher après son appel.

Refs:

X_SETTEXTURE


X_MOVEMENT

X_MOVEMENT x#, y#, z#

Règle la position pour afficher le prochain objet 3D aux coordonnées x#, y#, z#.
Cette commande dois être appelée avant d'appeler X_ROTATION, sinon toutes les rotations précédente seras éliminées.

Refs:

X_MULTMATRIX, X_ROTATION, X_SCALING


X_MULTMATRIX

X_MULTMATRIX mat[]

Cette commande est équivalente à la commande OpenGL "glMultMatrix".
Avec cette commande vous pouvez multiplier une matrice 4x4 avec la matrice en cours (Exemple: La matrice qui décris les paramétrages courant de rotation et de zoom qui va être appliqué à un objet à afficher). La matrice mat[] dois être dimensionsée ' DIMed [16] ' et avoir cette structure:

| a0  a4  a8 a12 |
| a1  a5  a9 a13 |
| a2  a6 a10 a14 |
| a3  a7 a11 a15 |

Refs:

X_MOVEMENT, X_ROTATION, X_SCALING


X_NUMFACES()

count = X_NUMFACES(obj#)

Cette commande va déterminer le nombre de triangles dans un modèle 3D obj.

Refs:

X_GETFACE


X_OBJ...

X_OBJSTART num#
X_OBJADDVERTEX x#, y#, z#, tx#, ty#, col#
X_OBJNEWGROUP
X_OBJEND

Crée un objet 3D définie par l'utilisateur pendant l'execution.
num# spécifie l'ID d'un objet à créer. Tout objet éxistant avec cette ID va être écrasé.
x#, y#, z# specifie les coordonnées les des sommets.
tx#, ty# règle les coordonnées de la texture pour ce point - 0=top/left, 1.0=bottom/right.
col# est la couleur à appliquer à ce point.

Les triangles n, n-1, n-2 seront connectés . Pour chaque groupe de trianges n-2 sera tracé .

1---2---5
   \ / \ /|
    3---4 |
         \|
          6

Exemple:

// Pyramid demo
// ------------

// Create a Pyramid
 X_OBJSTART 5
  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,   0,  0, 0,0,RGB(255,255,255) // Peak
  X_OBJADDVERTEX  5, -10,  5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
// ..new Group
  X_OBJNEWGROUP
// ...or Bottom
//  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
//  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)

  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,  0,   0, 0,0,RGB(255,255,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
 X_OBJEND

//  X_SAVEOBJ "Pyramid.ddd", 5
//  X_LOADOBJ "Pyramid.ddd", 5

 WHILE TRUE
  MOUSESTATE mx, my, b1 ,b2
  phi=mx*360 / 640

  X_MAKE3D
  X_CAMERA 0, 150, -300,   0 ,0 ,0
  X_DRAWAXES 0, 0, 0

  X_AMBIENT_LT 0, RGB(255,255,0)

  X_MOVEMENT mx-230, 0, 0
  X_SCALING 3, 3, 3
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 5, 0

  SHOWSCREEN
 WEND
END

Refs:

X_AUTONORMALS, X_COLLISION(), X_DRAWANIM, X_DRAWOBJ, X_LOADOBJ, X_OBJADDVERTEX, X_OBJEND, X_OBJNEWGROUP, X_OBJSTART, X_SAVEOBJ, X_SETTEXTURE


X_OBJADDVERTEX

X_OBJADDVERTEX x#, y#, z#, tx#, ty#, col#

X_OBJADDVERTEX est utilisé dans le block avec X_OBJSTART / X_OBJEND pour ajouter un sommet à l'objet crée.
x#, y#, z# spécifie les coordonnées des sommets.
tx#, ty# Règle les coordonnées de la texture pour ce point - 0=haut/gauche, 1.0=bas/droite.
col# est la couleur à appliquer à ce point.

L'objet va être fait à partir des triangle entre ces sommets. Pour chaque sommet (n) un triangle va être crée entre lui et le sommet (n-1) et (n-2). Il va en résulter, que pour chaque groupe de sommets, n-2 triangles vont être dessinés (exemple: si 8 sommets sont spécifiés, 6 triangles vont être dessinés).

1---2---5
   \ / \ /|
    3---4 |
         \|
          6

Exemple:

// Pyramid demo
// ------------

// Create a Pyramid
 X_OBJSTART 5
  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,   0,  0, 0,0,RGB(255,255,255) // Peak
  X_OBJADDVERTEX  5, -10,  5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
// ..new Group
  X_OBJNEWGROUP
// ...or Bottom
//  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
//  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)

  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,  0,   0, 0,0,RGB(255,255,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
 X_OBJEND

//  X_SAVEOBJ "Pyramid.ddd", 5
//  X_LOADOBJ "Pyramid.ddd", 5

 WHILE TRUE
  MOUSESTATE mx, my, b1 ,b2
  phi=mx*360 / 640

  X_MAKE3D
  X_CAMERA 0, 150, -300,   0 ,0 ,0
  X_DRAWAXES 0, 0, 0

  X_AMBIENT_LT 0, RGB(255,255,0)

  X_MOVEMENT mx-230, 0, 0
  X_SCALING 3, 3, 3
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 5, 0

  SHOWSCREEN
 WEND
END

Refs:

X_OBJ..., X_OBJEND, X_OBJNEWGROUP, X_OBJSTART


X_OBJEND

X_OBJEND

X_OBJEND est utilisé pour signifier que tous les sommets pour un objet donné on été crées.

Exemple:

// Pyramid demo
// ------------

// Create a Pyramid
 X_OBJSTART 5
  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,   0,  0, 0,0,RGB(255,255,255) // Peak
  X_OBJADDVERTEX  5, -10,  5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
// ..new Group
  X_OBJNEWGROUP
// ...or Bottom
//  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
//  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)

  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,  0,   0, 0,0,RGB(255,255,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
 X_OBJEND

//  X_SAVEOBJ "Pyramid.ddd", 5
//  X_LOADOBJ "Pyramid.ddd", 5

 WHILE TRUE
  MOUSESTATE mx, my, b1 ,b2
  phi=mx*360 / 640

  X_MAKE3D
  X_CAMERA 0, 150, -300,   0 ,0 ,0
  X_DRAWAXES 0, 0, 0

  X_AMBIENT_LT 0, RGB(255,255,0)

  X_MOVEMENT mx-230, 0, 0
  X_SCALING 3, 3, 3
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 5, 0

  SHOWSCREEN
 WEND
END

Refs:

X_OBJ..., X_OBJADDVERTEX, X_OBJNEWGROUP, X_OBJSTART


X_OBJNEWGROUP

X_OBJNEWGROUP

X_OBJNEWGROUP est utilisé pour créer un nouveau groupe de sommets dans d'un objet.

X_OBJNEWGROUP dois être utilisé entre les commandes X_OBJSTART et X_OBJEND.

Exemple:

// Pyramid demo
// ------------

// Create a Pyramid
 X_OBJSTART 5
  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,   0,  0, 0,0,RGB(255,255,255) // Peak
  X_OBJADDVERTEX  5, -10,  5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
// ..new Group
  X_OBJNEWGROUP
// ...or Bottom
//  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
//  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)

  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,  0,   0, 0,0,RGB(255,255,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
 X_OBJEND

//  X_SAVEOBJ "Pyramid.ddd", 5
//  X_LOADOBJ "Pyramid.ddd", 5

 WHILE TRUE
  MOUSESTATE mx, my, b1 ,b2
  phi=mx*360 / 640

  X_MAKE3D
  X_CAMERA 0, 150, -300,   0 ,0 ,0
  X_DRAWAXES 0, 0, 0

  X_AMBIENT_LT 0, RGB(255,255,0)

  X_MOVEMENT mx-230, 0, 0
  X_SCALING 3, 3, 3
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 5, 0

  SHOWSCREEN
 WEND
END

Refs:

X_OBJ..., X_OBJADDVERTEX, X_OBJEND, X_OBJSTART


X_OBJSTART

X_OBJSTART num#

X_OBJSTART est utilisé pour créer un objet 3D définie par l'utilisateur pendant l'exécution.
num# spécifie l'ID de l'objet qui va être crée. Tout objet avec le même ID va être écrasé.
utiliser X_OBJADDVERTEX pour ajouter chaque sommet à un objet, X_OBJNEWGROUP pour séparer des sommets en groupes, et X_OBJEND pour indiquer que chaque sommet à été utilisé.

L'objet va être fait à partir de triangles entre les sommets spécifiés. Pour chaque sommet (n) un triangle va être crée entre ce sommet et les sommets (n-1) et (n-2). Il va en résulter, que pour chaque groupe de sommets, n-2 triangles vont être dessinés ; exemple. si 8 sommets et spécifiés, 6 triangles vont être dessinés
1---2---5
\ / \ /|
3---4 |
\|
6

Exemple:

// Pyramid demo
// ------------

// Create a Pyramid
 X_OBJSTART 5
  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,   0,  0, 0,0,RGB(255,255,255) // Peak
  X_OBJADDVERTEX  5, -10,  5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
// ..new Group
  X_OBJNEWGROUP
// ...or Bottom
//  X_OBJADDVERTEX  5, -10, -5, 0,0,RGB(0,0,255)
//  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)

  X_OBJADDVERTEX -5, -10, -5, 0,0,RGB(0,0,255)
  X_OBJADDVERTEX  0,  0,   0, 0,0,RGB(255,255,255)
  X_OBJADDVERTEX -5, -10,  5, 0,0,RGB(0,0,255)
 X_OBJEND

//  X_SAVEOBJ "Pyramid.ddd", 5
//  X_LOADOBJ "Pyramid.ddd", 5

 WHILE TRUE
  MOUSESTATE mx, my, b1 ,b2
  phi=mx*360 / 640

  X_MAKE3D
  X_CAMERA 0, 150, -300,   0 ,0 ,0
  X_DRAWAXES 0, 0, 0

  X_AMBIENT_LT 0, RGB(255,255,0)

  X_MOVEMENT mx-230, 0, 0
  X_SCALING 3, 3, 3
  X_ROTATION phi, 0, 1, 0
  X_DRAWOBJ 5, 0

  SHOWSCREEN
 WEND
END

Refs:

X_OBJ..., X_OBJADDVERTEX, X_OBJEND, X_OBJNEWGROUP


X_POPMATRIX

X_POPMATRIX

X_POPMATRIX va vous permettre de retrouver la matrice 3D stockée. La matrice 3D stock les détailles des mouvements, des zooms et des rotation des objets 3D .

La commande X_PUSHMATRIX/X_POPMATRIX est utile pour afficher plusieurs objets en une seul fois en poussant la matrice et dessinent les objets de leur position relative vers une autre et remet la matrice à sa position d'origine.

// --------------------------------- //
// Project: PushPopMatrix
// Start: Thursday, November 03, 2005
// IDE Version: 2.50920

donut  = 0
sphere = 1

// Create a donut
CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Create a sphere
CreateSphere(sphere, 24, 12, RGB(255,255,255))

LOCAL mx, my, b1, b2

WHILE TRUE
   // 1000 is far enough here
   X_MAKE3D 1, 1000, 45

   // one angle for everything
   phi = GETTIMERALL() / 150

   X_CAMERA 300,300,300, 0,0,0
   X_SPOT_LT  0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180

   // Ring-a-ring-a-rosies
   FOR i=0 TO 5
      psi = phi + i/6*360
      px = SIN(psi)*100
      py = COS(psi)*50
      pz = (SIN(psi)+COS(psi)*2)*120
      // move and rotate a bit
      X_MOVEMENT px, py, pz
      X_ROTATION psi*40, 3,4,5

      // now relative to the donut the spheres
      X_PUSHMATRIX
         FOR j=0 TO 5
            X_MOVEMENT SIN(j/6*360)*50, 0, COS(j/6*360)*50
            X_SCALING .3, .3, .3
            X_DRAWOBJ sphere, 0
         NEXT
      X_POPMATRIX
      X_DRAWOBJ donut,0
   NEXT
   SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  SPHERE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
   pi = ACOS(0)*2
   IF r < 0 THEN r = -r
   IF n < 4 THEN n = 4

   X_AUTONORMALS 2 // smooth edges
   X_OBJSTART num
   FOR j=0 TO INTEGER(n/2) -1
      theta1 = j * 2*pi / n - pi/2;
      theta2 = (j + 1) * 2*pi / n - pi/2;
      FOR i=0 TO n
         theta3 = i * 2*pi / n;
         X_OBJADDVERTEX   r*COS(theta2) * COS(theta3), r*SIN(theta2), _
                     r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
         X_OBJADDVERTEX   r*COS(theta1) * COS(theta3), r*SIN(theta1), _
                     r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // n

// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
   // Diese Variablen sind als LOCAL definiert:
   // These variables are defined as LOCAL:
   // x, y,
   // Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

   X_AUTONORMALS 2
   X_OBJSTART num
   FOR di=0 TO NumWraps-1
      FOR j=0 TO NumPerWrap
         FOR i=di+1 TO di STEP -1
            wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
            wrapFracTex = j/NumPerWrap
            phi = 360*wrapFrac
            thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
            thetaFracTex = (i+wrapFracTex)/NumWraps
            theta = 360*thetaFrac
            r = MajorRadius + MinorRadius*COS(phi)
            x = SIN(theta)*r
            z = COS(theta)*r
            y = MinorRadius*SIN(phi)
            X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
                        RGB(255, 255, 255)
         NEXT
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION

Refs:

X_PUSHMATRIX


X_PRINT

X_PRINT text#$, x#, y#, z#, scale#

Écrit le texte text#$ dans une scène 3D . Les parties du texte situé derrière les objets 3D seront cachés .
scale# est utilisé pour agrandir la taille du texte . Si vous définissez scale# à 0, la hauteur du texte original sera utilisé ainsi le texte positionné au loin ne sera pas plus petit.
Le point d'insertion se trouve en bas au centre (comme dans X_SPRITE).

Refs:

X_SPRITE


X_PUSHMATRIX

X_PUSHMATRIX

X_PUSHMATRIX vous permet de stocker temporairement la position de la matrice courante . Toutes les modifications ultérieures X_MOVEMENT/X_SCALING/X_ROTATION seront relative à la position de la matrice comme elle était quand X_PUSHMATRIX a été appelé . Quand X_POPMATRIX est utilisé, la matrice d'origine est restaurée.

Cette commande est utile pour créer plusieurs objets avec une seule unité - Poussez la matrice, dessiner les objets dans leur position relative les uns aux autres , puis revenir ensuite à la matrice originale .

// --------------------------------- //
// Project: PushPopMatrix
// Start: Thursday, November 03, 2005
// IDE Version: 2.50920

donut  = 0
sphere = 1

// Create a donut
CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Create a sphere
CreateSphere(sphere, 24, 12, RGB(255,255,255))

LOCAL mx, my, b1, b2

WHILE TRUE
   // 1000 is far enough here
   X_MAKE3D 1, 1000, 45

   // one angle for everything
   phi = GETTIMERALL() / 150

   X_CAMERA 300,300,300, 0,0,0
   X_SPOT_LT  0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180

   // Ring-a-ring-a-rosies
   FOR i=0 TO 5
      psi = phi + i/6*360
      px = SIN(psi)*100
      py = COS(psi)*50
      pz = (SIN(psi)+COS(psi)*2)*120
      // move and rotate a bit
      X_MOVEMENT px, py, pz
      X_ROTATION psi*40, 3,4,5

      // now relative to the donut the spheres
      X_PUSHMATRIX
         FOR j=0 TO 5
            X_MOVEMENT SIN(j/6*360)*50, 0, COS(j/6*360)*50
            X_SCALING .3, .3, .3
            X_DRAWOBJ sphere, 0
         NEXT
      X_POPMATRIX
      X_DRAWOBJ donut,0
   NEXT
   SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// -=#  SPHERE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
   pi = ACOS(0)*2
   IF r < 0 THEN r = -r
   IF n < 4 THEN n = 4

   X_AUTONORMALS 2 // smooth edges
   X_OBJSTART num
   FOR j=0 TO INTEGER(n/2) -1
      theta1 = j * 2*pi / n - pi/2;
      theta2 = (j + 1) * 2*pi / n - pi/2;
      FOR i=0 TO n
         theta3 = i * 2*pi / n;
         X_OBJADDVERTEX   r*COS(theta2) * COS(theta3), r*SIN(theta2), _
                     r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
         X_OBJADDVERTEX   r*COS(theta1) * COS(theta3), r*SIN(theta1), _
                     r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // n

// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
   // Diese Variablen sind als LOCAL definiert:
   // These variables are defined as LOCAL:
   // x, y,
   // Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

   X_AUTONORMALS 2
   X_OBJSTART num
   FOR di=0 TO NumWraps-1
      FOR j=0 TO NumPerWrap
         FOR i=di+1 TO di STEP -1
            wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
            wrapFracTex = j/NumPerWrap
            phi = 360*wrapFrac
            thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
            thetaFracTex = (i+wrapFracTex)/NumWraps
            theta = 360*thetaFrac
            r = MajorRadius + MinorRadius*COS(phi)
            x = SIN(theta)*r
            z = COS(theta)*r
            y = MinorRadius*SIN(phi)
            X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
                        RGB(255, 255, 255)
         NEXT
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION

Refs:

X_MOVEMENT, X_POPMATRIX, X_ROTATION, X_SCALING


X_PUTSHADER

X_PUTSHADER name$, wert#

Avec cette commande, vous pouvez changer la valeur d'une variable "float" dans le courant (X_SETSHADER) programme shader. Cela vous permet de transmettre des valeurs comme GETTIMERALL () , RGB ,des valeurs à vos vertex ou dans des fragments de programmes .

// test.frag
uniform float t;
varying float u, v;

void main()
{
   u += sin(t);
   v += t;
   gl_FragColor = vec4(sin(40*u),sin(40*v),0.0,1.0);
}

// test.vert
uniform float t;
const float pi = 3.1415926535;

varying float u, v;

void main()
{
   // Convert from the [-5,5]x[-5,5] range provided into radians
   // between 0 and 2pi
   u = (gl_Vertex.x + 5.0) / 10.0 * 2 * pi;
   v = (gl_Vertex.y + 5.0) / 10.0 * 2 * pi;
   float r = sin(4*u+t)/4+1;
   float R = cos(6*cos(u)-t)/4+3;

   float a = R+r*cos(v);
   vec3 world = vec3(a*cos(u), a*sin(u), r*sin(v));

   gl_Position = gl_ModelViewProjectionMatrix * vec4(world,1.0);
}

// --------------------------------- //
// Project: Shaders
// Start: Monday, September 25, 2006
// IDE Version: 3.262

LOCAL shaders$[], num, current$
   IF X_LOADSHADER(13, "toon.vert", "toon.frag") = FALSE
      PRINT "Shader failed to load: ", 100,100
      SHOWSCREEN
      MOUSEWAIT
      END
   ENDIF

   CreateTorus(0, 5, 10, 12, 9, 2, 2, RGB(0xff, 0xff, 0xff))
   // CreateSphere(0, 10, 9, RGB(0xff, 0xff, 0xff) )
   WHILE TRUE
      DRAWRECT 0,0,640,480,RGB(255,128,0)
      X_MAKE3D 1,500, 45
      X_CAMERA 0,0,-100, 0,0,0

      X_SPOT_LT 0, RGB(255,255,255),100,100,-1000, -.1,-.1,1, 360

      X_ROTATION 45, 1,1,0
      X_ROTATION GETTIMERALL()/100, 0,1,.2
      X_SETSHADER 13
      X_PUTSHADER "t", GETTIMERALL()
      X_DRAWOBJ 0, 0
      SHOWSCREEN
   WEND

Refs:

X_LOADSHADER(), X_SETSHADER


X_ROTATION

X_ROTATION phi#, x#, y#, z#

Fait pivoter l'autre objet 3D autour de l'axe x#, y#, z# par l'angle phi#. Vous pouvez appliquer plusieurs rotations à un objet . Tous les objets suivants seront dessinés avec cette rotation jusqu'à ce que la rotation soit de nouveau changée ou il est étée effacée.
Appeler X_MOVEMENT or X_SCALING pour réinitialiser les valeurs de rotation.

Refs:

X_MOVEMENT, X_MULTMATRIX, X_SCALING


X_SAVEOBJ

X_SAVEOBJ file$, num#

Sauvegarde l'objet 3D avec id: num# au nom de fichier donné . L'objet a pu être crée ou chargé à partir d'un fichier .
Pour un exemple voir X_OBJ...

Refs:

X_LOADOBJ, X_OBJ...


X_SCALING

X_SCALING fx#, fy#, fz#

Définit l'échelle actuelle pour les objets 3D . Les facteurs d'échelle fx#, fy# et fz# affectera tous les objets dessinés après l'appel de X_SCALING.
Cette commande doit être appelée avant tout appel de X_ROTATION comme pour la mise en rotation actuelle .
Scaled objets - en particulier les objets qui ne sont pas également réduit dans toutes les directions - ne fonctionne pas avec la commande X_COLLISION.

Refs:

X_MOVEMENT, X_MULTMATRIX, X_ROTATION


X_SCREEN2WORLD

X_SCREEN2WORLD sx#, sy#, sz#, wx##, wy##, wz##

affecte des coordonnées de l'écran 2D sx#, sy# dans l'écran aux coordonnées 3D wx##, wy##, wz##.
sz# indique si le point 3D est en face de la position de la caméra (sz<0) ou derrière (sz>0)

Refs:

X_WORLD2SCREEN


X_SETCELSHADES

X_SETCELSHADES shades#[]

Définit les mesures de luminosité qui doivent être utilisés pour cel shading. shades#[] est un tableau de valeurs à partir 0.0 (noir ) à 1.0 (brillant ) qui indiquent la luminosité qui est à appliquer pour chaque réflexion d'angle.
La fonction doit être appelée au début du programme, une fois que toutes les textures ont être recréés pour le prochain rendu. Sinon vous éprouverez un léger retard pour chaque appel de la fonction.

Utilisation de base :

DIMDATA sh[], 0.1, 0.3, 1.0
X_SETCELSHADES sh[]
WHILE TRUE
   Render()
WEND

Un exemple qui montre le résultat obtenu :

// --------------------------------- //
// Project: ToonShading

   CreateTorus(1, 5, 10, 22, 22, 2, 2)
   // Image data
   LOADSPRITE      "image.bmp", 0

   DIMDATA cheap[], .5, 1
   DIMDATA nice[], .3, .6, .6, .6, .6, .6, .6, .7, 1, 1, 1, 1, 1, 1, 1, 1

   WHILE TRUE
   // main loop
      DRAWRECT 0,0,640,480,RGB(0,0,200)
      phi=phi+GETTIMER()/30

      VIEWPORT 0,0,320,480
      // optional - set cel shading steps
      X_SETCELSHADES cheap[]
      Render(phi)

      VIEWPORT 320,0,320,480
      X_SETCELSHADES nice[]
      Render(phi)

      dtime = GETTIMER()
      fps = ((1000.0/dtime)+fps)/2
      delay=delay+dtime
      IF delay>1000 // 1/2 sec
         delay=0
         showfps=fps
      ENDIF
      X_MAKE2D
      PRINT "FPS: "+FORMAT$(0,1,showfps), 100, 0 // + dtime, 0,0

      SHOWSCREEN
   WEND

// ------------------------------------------------------------- //
// Renders a Donut
// ------------------------------------------------------------- //
FUNCTION Render: phi
   X_MAKE3D 1, 250, 45
   X_CAMERA 0, 10, 50, 0,0,0
   // Licht Nr. -2 is Cel-Shading Postition / Light no -2 is for cel shading
   X_SPOT_LT -2, 0, 0,0,100, 0,0,0,90
   X_CULLMODE 1 // niemals 0 verwenden bei toons / Never use 0 with toon shading
   X_SETTEXTURE 0, -1 // 0=Tex
   X_ROTATION 80, 1,0,0
   X_ROTATION phi, 0, 1, 0.1
   X_DRAWOBJ 1, 0
ENDFUNCTION

// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
// Donut Objekt machen / Make a donut object
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

   X_AUTONORMALS 2 // smooth
   X_OBJSTART num
   FOR di=0 TO NumWraps-1
      FOR j=0 TO NumPerWrap
         FOR i=di+1 TO di STEP -1
            wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
            wrapFracTex = j/NumPerWrap
            phi = 360*wrapFrac
            thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
            thetaFracTex = (i+wrapFracTex)/NumWraps
            theta = 360*thetaFrac
            r = MajorRadius + MinorRadius*COS(phi)
            x = SIN(theta)*r
            z = COS(theta)*r
            y = MinorRadius*SIN(phi)
            X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, 1-wrapFracTex*TextureWrapHoriz, _
                        RGB(0xff,0xff,0xff)
         NEXT
      NEXT
      X_OBJNEWGROUP
   NEXT
   X_OBJEND
ENDFUNCTION // y

Refs:

X_SPOT_LT


X_SETSHADER

X_SETSHADER index#

Cette commande active le GLSL (OpenGL Shading Language) shader qui a été préalablement chargée dans l'indice index# avec X_LOADSHADER.

// --------------------------------- //
// Project: Shaders
// Start: Monday, September 25, 2006
// IDE Version: 3.262

LOCAL shaders$[], num, current$
   IF X_LOADSHADER(13, "toon.vert", "toon.frag") = FALSE
      PRINT "Shader failed to load: ", 100,100
      SHOWSCREEN
      MOUSEWAIT
      END
   ENDIF

   CreateTorus(0, 5, 10, 12, 9, 2, 2, RGB(0xff, 0xff, 0xff))
   // CreateSphere(0, 10, 9, RGB(0xff, 0xff, 0xff) )
   WHILE TRUE
      DRAWRECT 0,0,640,480,RGB(255,128,0)
      X_MAKE3D 1,500, 45
      X_CAMERA 0,0,-100, 0,0,0

      X_SPOT_LT 0, RGB(255,255,255),100,100,-1000, -.1,-.1,1, 360

      X_ROTATION 45, 1,1,0
      X_ROTATION GETTIMERALL()/100, 0,1,.2
      X_SETSHADER 13
      X_DRAWOBJ 0, 0
      SHOWSCREEN
   WEND

Refs:

X_LOADSHADER()


X_SETTEXTURE

X_SETTEXTURE n#, nbump#

Utilise une image sprite chargée par LOADSPRITE comme la texture actuelle . La texture en cours sera utilisée pour le texturage 3D de tout les objets suivants . n# = -1 indique que l'absence de texture doit être utilisé.
Le paramètre nbump# précise quelle texture normale devrait être utilisé pour Dot3 Bump Mapping. La texture normale peut être créé à l'aide LOADBUMPTEXTURE au lieu de LOADSPRITE. Une valeur de -1 indique qu'aucun bump mapping doit être effectuée.

exemple:
PaperPlanes2 in 3D samples

Refs:

LOADBUMPTEXTURE, LOADSPRITE


X_SETTEXTUREOFFSET

X_SETTEXTUREOFFSET dx#, dy#

Change la texture pour tous les polygones suivants par dx#, dy#. Une fois qu'un objet a été dessiné avec une commande DRAW/X_DRAW sa texture est définie et les modifications par X_SETTEXTUREOFFSET n'aura aucun effet sur lui.
Cet outil vous permet de simuler l'eau qui coule ou le déplacement des nuages dans le ciel sans changer les objets 3D, simplement en transférant leurs textures à chaque frame .

Refs:

X_SETTEXTURE


X_SPHEREMAPPING

X_SPHEREMAPPING status#$

Mode "spheremapping" on (TRUE) ou off (FALSE). Ce mode est utilisé pour des effets comme des reflets métalliques et affectera tous les objets dessinés après l'utilisation de X_SPHEREMAPPING .
Avant d'appeler X_SPHEREMAPPING vous devez charger une projection sphérique de l'environnement à l'index de la texture active avec X_SETTEXTURE .
Les textures sphériques peuvent être créés avec des programmes de dessin comme Photoshop ou GIMP.

Original

Sphere-Map

// --------------------------------- //
// Project: SphereMapping - metallic reflection

   X_LOADOBJ "donut.ddd", 1
   // Bild-Daten / Load Graphic data
   LOADSPRITE    "back.bmp", 1
   LOADSPRITE "reflect.bmp", 0

   // Hauptschleife / Main Loop
   WHILE TRUE
      GETSCREENSIZE screenx, screeny
      STRETCHSPRITE 1, 0,0, screenx, screeny
      phi=phi+GETTIMER()/30
      X_MAKE3D 1, 250, 45
      X_CAMERA 0, 10, 50, 0,0,0

      X_SETTEXTURE 0, -1 // 0=Tex
      X_ROTATION phi, 0, 1, 0.1

      X_SPHEREMAPPING TRUE
      X_DRAWOBJ 1, 0
      X_SPHEREMAPPING FALSE
      SHOWSCREEN
   WEND

Refs:

X_FOG, X_MIPMAPPING, X_SETTEXTUREOFFSET, X_SPOT_LT


X_SPOT_LT

X_SPOT_LT num#, col#, x#, y#, z#, dirx#, diry#, dirz#, cutoff#

Configure un éclairage spot .

num# spécifie l'ID de l'éclairage . Valeurs de 0-7 sont valables pour les éclairages normaux , -3 to -1 pour les éclairages spéciaux .
col# spécifie la couleur de la source lumineuse . Voir RGB().
x#, y#, z# sont les coordonnées de la éclairage.
dirx#, diry#, dirz# spécifie un vecteur décrivant la direction de l'éclairage .
cutoff# spécifie un angle coupé pour les éclairages . Les valeurs valides pour cutoff# sont :-
0 : Tournez la lumière sur
1-179 : Spot-Lumière
180 : Source de lumière paralleles.
360 : Point source de lumière.

Special effects lights

Avec X_SPOT_LT vous pouvez créer des sources de lumière pour des effets spéciaux . num# détermine l'effet à appliquer .
Attention
CULLMODE pour les effets spéciaux doivent être mis à -1 ou 1! (See X_CULLMODE)

num# = -1: Bump Mapping

La 2em texture sera utilisée comme une texture bump map . Les Pixels de la texture les plus sombres représentent un point d'éclairage faible et les pixels lumineux un éclairage vif .
Seules les coordonnées x#, y#, z# sont pris en compte . Vous devez charger les textures avec LOADSPRITE et LOADBUMPTEXTURE et les sélectionner avec X_SETTEXTURE avant utilisation. Pour un exemple voir la commande LOADBUMPTEXTURE.

num# = -2 : Cel or Toon Shading

Cet effet spécial est également connu comme Cartoon Rendering .

Ce shaders effectue un calcul de lumière qui n'entraîne pas de changements progressif dans la lumière, mais renforcé les niveaux de luminosité. L'image obtenue avec cet effet ressemble à une image de dessin animé.
Si vous définissez en premier une texture avec X_SETTEXTURE , elle sera superposée . Cela peut par exemple être utilisée pour les visages de modèle et des précisions sur un personnage. Uniquement la position de la lumière (x#, y#, z#) est pris en compte .
Pour un exemple voir l'échantillon "Cel-Shading" dans le dossier d'exemples 3D.

num# = -3: Shadows

Le numéro effets spéciaux -3 est l'ombre en temps réel avec le tampon pochoir . Il fonctionne comme suit :
- rendre toute la scène
- X_SPOT_LT -3, 0, x,y,z, 0,0,0, 360
(cette éclairage est la source pour la direction de l'ombre )
- X_DRAWOBJ pour tous les objets de projection d'ombres
- X_MAKE2D/SHOWSCREEN/X_MAKE3D
attire l'ombre .

// --------------------------------- //
// Project: ToonShading
// Start: Wednesday, October 07, 2004
// IDE Version: 2.41007

 CreateTorus(1, 5, 10, 24, 24, 2, 2)
 // Bild-Daten / Image data
// LOADSPRITE      "image.bmp", 0
 DRAWRECT 0,0,64,64,RGB(0xff,0xff,0xff)
 DRAWRECT 0,28,64,9,RGB(0,0,0xff)
 PRINT "GLBASIC", 0,24
 GRABSPRITE 0, 0,0, 64,64

 // Hauptschleife / main loop
 WHILE TRUE
    DRAWRECT 0,0,640,480,RGB(0,0,200)
    phi=phi+GETTIMER()/30
    X_MAKE3D 1, 250, 45
    X_CAMERA 0, 10, 100, 0,0,0
    // Licht Nr. -2 is Cel-Shading Postition / Light no -1 is cel shading position
    X_SPOT_LT -2, 0, 0,0,100, 0,0,0,90
    X_SETTEXTURE 0, -1 // 0=Tex
    X_ROTATION 90, 1,0,0
    X_ROTATION phi, 0, 1, 0.1
    X_DRAWOBJ 1, 0
    SHOWSCREEN
 WEND

// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
// Donut Objekt machen / Make a donut object
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

 X_AUTONORMALS 2 // smooth
 X_OBJSTART num
 FOR di=0 TO NumWraps-1
  FOR j=0 TO NumPerWrap
   FOR i=di+1 TO di STEP -1
    wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
    wrapFracTex = j/NumPerWrap
    phi = 360*wrapFrac
    thetaFrac = (MOD(i, NumWraps + wrapFracTex)/NumWraps
    thetaFracTex = (i+wrapFracTex)/NumWraps
    theta = 360*thetaFrac
    r = MajorRadius + MinorRadius*COS(phi)
    x = SIN(theta)*r
    z = COS(theta)*r
    y = MinorRadius*SIN(phi)
    X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, 1-wrapFracTex*TextureWrapHoriz, _
                    RGB(0xff,0xff,0xff)
   NEXT
  NEXT
  X_OBJNEWGROUP
 NEXT
 X_OBJEND
ENDFUNCTION // y

Refs:

LOADBUMPTEXTURE, X_AMBIENT_LT, X_AUTONORMALS, X_SETCELSHADES, X_SPHEREMAPPING


X_SPRITE

X_SPRITE no#, x#, y#, z#, scaling#

Dessine un sprite en 2D à une position 3D . Cette technique est également connu comme Billboarding . Le point chaud du sprite (la partie qui sera établie pour ses coordonnées) est en bas au centre du sprite.

exemple:

// --------------------------------- //
// Project: Billboards

LOADBMP "back.bmp"
LOADSPRITE "tree.bmp", 0
LOADSPRITE "grass.bmp", 1

WHILE TRUE
 X_MAKE3D 1,1500,45
 MOUSESTATE mx, my, b1, b2
 X_CAMERA SIN(mx)*200, 44, COS(mx)*200, 0, 75, 0

 // Billboard trees
 FOR phi=0 TO 360 STEP 30
  FOR ny=0 TO 360 STEP 45
   // Draw a 3D (so called Billboard) sprite
   // A 3D sprite, that's always facing the camera
   X_SPRITE 0, SIN(phi)*500+COS(ny)*300, 0, COS(phi)*300+SIN(ny)*500, .5
  NEXT
 NEXT

 // Grass...
 X_OBJSTART 0
  f=RGB(255,255,255)
  X_OBJADDVERTEX -2000,0,-2000,  0 ,0,f
  X_OBJADDVERTEX  2000,0,-2000, 50, 0,f
  X_OBJADDVERTEX -2000,0, 2000,  0,50,f
  X_OBJADDVERTEX  2000,0, 2000, 50,50,f
 X_OBJEND
 X_SETTEXTURE 1; X_DRAWOBJ 0,0

 X_MAKE2D // LOADBMP requires this before a SHOWSCREEN
 SHOWSCREEN
WEND

Refs:

LOADSPRITE, DRAWSPRITE, X_WORLD2SCREEN


X_WORLD2SCREEN

X_WORLD2SCREEN wx#, wy#, wz#, sx##, sy##, sz##

Convertit les coordonnées de l'écran 3D en coordonnées 2D en utilisant la matrice de caméra en cours .
Note: Afin d'utiliser les coordonnées 2D, vous devez appeler en premier X_MAKE2D.

sz# indique si le point 3D est en face de la position de la caméra (sz<0) ou derrière lui (sz>0)

Refs:

X_MAKE2D, X_MAKE3D, X_SPRITE


ZOOMSPRITE

ZOOMSPRITE num%, x%, y%, relx#, rely#

L' image sprite sera affichée sur le tampon arrière de mémoire . Vous pouvez utiliser la même image num% plusieurs fois pour tirer plusieurs copies du même sprite .

ZOOMSPRITE

Dimensionner une image de sprite horizontalement relx# et verticalement rely#. Le centre reste le même que lors de l'utilisation DRAWSPRITE.

Sample:

LOADSPRITE "Sprite.bmp", 0
ZOOMSPRITE 0, 100, 100, 50, 200 // Veeeery looong
SHOWSCREEN
MOUSEWAIT

Refs:

DRAWSPRITE


Program contol

Controle Programme

.

Refs:

ALIAS, ALLOWESCAPE, ASSERT(), AUTOPAUSE, BREAK, BYREF, CALLBACK, CALLBYNAME(), CASE, CATCH, CODEFILE$(), CODELINE(), CONTINUE, DELETE, DIM, DIMDATA, DIMDEL, DIMPUSH, ELSE, ELSEIF, END, ENDFUNCTION, ENDIF, ENDSELECT, FINALLY, FOR, FOREACH, FUNCTION, GETLASTERROR$(), GLOBAL, GOSUB, GOTO, HIBERNATE, IF, IMPORT, INLINE, LOCAL, NEXT, PROTOTYPE, REDIM, REQUIRE, RETURN, SELECT, SHELLCMD(), SLEEP, STATIC, STEP, SUB, THEN, THROW, TO, TRY, TYPE, WEND, WHILE


Math and logic

Math et logic

.

Refs:

ABS(), ACOS(), AND, ASIN(), ASL(), ASR(), ATAN(), COS(), DEC, FINDPATH(), FMOD(), INC, LEN(), LET, MAX(), MIN(), MOD(), OR, POW(), RND(), SEEDRND, SGN(), SIN(), SORTARRAY, SQR(), TAN(), X_SCREEN2WORLD, X_WORLD2SCREEN, bAND(), bNOT(), bOR(), bXOR()


Input-Output

.

Refs:

COPYFILE, CREATEDIR(), DATA, DEBUG, DIMDATA, DOESDIREXIST(), DOESFILEEXIST(), ENDDATA, FILEPOSITION, FILEREQUEST$(), FILESEEK, FORCEFEEDBACK, GENFILE(), GENSOUND(), GENSPRITE(), GENX_OBJ(), GETCOMMANDLINE$(), GETCURRENTDIR$(), GETFILE, GETFILELIST(), GETFILESIZE(), GETFONTSIZE, GETJOY...(), GETMOUSECOUNT(), GETSCREENSIZE, GETTIMER(), GETTIMERALL(), INIGET$, INIOPEN, INIPUT, INKEY$, INPUT, JOYSTATE, KEY(), KEYWAIT, KILLFILE, LOADBMP, LOADBUMPTEXTURE, LOADFONT, LOADSOUND, LOADSPRITE, MOUSEAXIS, MOUSESTATE, MOUSEWAIT, NET..., PLATFORMINFO$(), PRINT, PUTFILE, READ, RESTORE, SAVEBMP, SAVESPRITE, SETACTIVEMOUSE, SETCURRENTDIR(), SETFONT, SETMOUSE, SHELLCMD(), SHELLEND, STARTDATA, STDCOLOR, STDERR, STDIN$(), STDOUT, SYSTEMPOINTER


Sound and Multimedia

Son et Multimedia

.

Refs:

HUSH, ISMUSICPLAYING(), LOADSOUND, LOOPMOVIE, MUSICVOLUME, PLAYMOVIE, PLAYMUSIC, PLAYSOUND(), SOUNDPLAYING(), STOPMUSIC


Word manipulation

Manipulation de texte

.

Refs:

ASC(), CHR$(), FORMAT$(), INSTR(), LCASE$(), MID$(), REPLACE$(), SPLITSTR(), UCASE$


Graphics (2D)

.

Refs:

ALPHAMODE, ANIMCOLL(), BLACKSCREEN, BLENDSCREEN, CREATESCREEN, DRAWANIM, DRAWLINE, DRAWRECT, DRAWSPRITE, ENDPOLY, GETFONTSIZE, GETPIXEL(), GETSCREENSIZE, GETSPRITESIZE, GRABSPRITE, ISFULLSCREEN(), LIMITFPS, LOADANIM, LOADBMP, LOADFONT, LOADSPRITE, LOOPMOVIE, PLAYMOVIE, POLYVECTOR, PRINT, RGB(), ROTOSPRITE, ROTOZOOMANIM, ROTOZOOMSPRITE, SAVEBMP, SAVESPRITE, SETFONT, SETPIXEL, SETSCREEN, SETTRANSPARENCY, SMOOTHSHADING, SPRCOLL(), STARTPOLY, STRETCHANIM, STRETCHSPRITE, USEASBMP, USESCREEN, VIEWPORT, ZOOMSPRITE


Graphics (3D)

.

Refs:

LOADBUMPTEXTURE, VIEWPORT, X_AMBIENT_LT, X_AUTONORMALS, X_CAMERA, X_CAMERAUP, X_CLEAR_Z, X_COLLISION(), X_COLLISIONAABB(), X_COLLISIONRAY(), X_COLLISIONSPHEREBOX, X_CULLMODE, X_DOT, X_DRAWANIM, X_DRAWAXES, X_DRAWOBJ, X_FOG, X_GETCOLLISIONFACE(), X_GETFACE, X_LINE, X_LOADOBJ, X_LOADSHADER(), X_MAKE2D, X_MAKE3D, X_MIPMAPPING, X_MOVEMENT, X_MULTMATRIX, X_NUMFACES(), X_OBJ..., X_POPMATRIX, X_PRINT, X_PUSHMATRIX, X_PUTSHADER, X_ROTATION, X_SAVEOBJ, X_SCALING, X_SCREEN2WORLD, X_SETCELSHADES, X_SETSHADER, X_SETTEXTURE, X_SETTEXTUREOFFSET, X_SPHEREMAPPING, X_SPOT_LT, X_SPRITE, X_WORLD2SCREEN


GLB_ON_QUIT

Cette sous-routine (qui doit être définie en utilisant la commande SUB ), est appelée lorsque le programme se termine

Aucun appel aux commandes graphique ou sonore ne doit être fait .


GLB_WIN32_MSG

Ceci est appelée quand un message windows SDL or Win32 est disponible . Il doit être défini en utilisant la commande SUB .

Afin de traiter ces messages , une routine C devra être écrite .

Malgré son nom, cette routine peut être utilisée par toutes les plateformes, et pas seulement Windows .