**Le SDK pour fx-9860/Graph85** Topic officiel
Posté le 18/07/2007 15:08
Vu la multitude de topics sur le SDK de la 85, j'ai décidé d'en faire un seul et unique, où l'on posera nos problèmes et explications sur ce même topic, et non pas sur 50, par souci de clareté et de facilité.
Des nouveautés ? Des problèmes ? Des idées ?
Exposez les ici !
Voici une liste de commandes commencées par Muelsaco. N'hésitez pas à rajouter vos commandes dans le topic je les rajouterai pour en faire profiter tout le monde. Merci.
// Locate X,Y,"Texte"
:arrow: locate(x,y); Print("Texte");
// Text X,Y,"Texte"
:arrow: PrintMini(x,y,"Texte",0);
// F-Line x1,y1,x2,y2
:arrow: Bdisp_DrawLineVRAM(x1,y1,x2,y2);
// Tracer une ligne blanche
:arrow: Bdisp_ClearLineVRAM(x1,y1,x2,y2);
// PxlOn x,y & PxlOff x,y
:arrow: Bdisp_SetPoint_VRAM(x,y,<couleur>)
<couleur> : 0 pour le blanc, 1 pour le noir
// Cls
:arrow: Bdisp_AllClr_DDVRAM();
// Actualiser l'écran
:arrow: Bdisp_PutDisp_DD();
Fonction très importante. Elle permet d'afficher une image tracée virtuellement dans la VRAM. Toute image doit d'abord être dessinée dans la VRAM puis affichée à l'écran. Vous ne verrez donc pas votre image s'afficher tant que vous n'aurez pas appelé Bdisp_PutDisp_DD(). À noter que les fonctions GetKey() et Print() l'appellent automatiquement.
While <exp1>
<code>
WhileEnd
:arrow:
while(<exp1>)
{
<code>
}
// StoPict x
:arrow: SaveDisp(x);
x variant de 1 à 3 uniquement.
// RclPict x
:arrow: RestoreDisp(x);
x variant de 1 à 3 uniquement.
// Ouvrir un popup (comme les erreurs syntaxe, etc)
:arrow: PopUpWin(<taille>);
<taille> : de 1 à 8.
Rappels sur les variables globales : Source
* Les variables globales sont à utiliser avec précaution, puisqu'elles créent des liens invisibles entre les fonctions. La modularité d'un programme peut en souffrir et le programmeur risque de perdre la vue d'ensemble.
* Il faut faire attention à ne pas cacher involontairement des variables globales par des variables locales du même nom.
* Le codex de la programmation défensive nous conseille d'écrire nos programmes aussi 'localement' que possible.
L'utilisation de variables globales est jusitifiée, si
* Plusieurs fonctions qui ne s'appellent pas ont besoin des mêmes variables, ou
* Plusieurs fonctions d'un programme ont besoin du même ensemble de variables. Ce serait alors trop encombrant de passer toutes les variables comme paramètres d'une fonction à l'autre.
Citer : Posté le 03/05/2013 18:47 | #
J'ai essayé de faire une fonction d'input de caractères, mais je n'arrive même pas à faire une simple fonction qui renvoie un string . Dans cet exemple ma fonction "string" ne renvoie rien (comme inputstring de libg85), et si je rajoute la ligne "strcat (str,"ajout");" ça fait planter le SDK !
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
char *string(){
char str[]="test";
//strcat (str,"ajout"); //cette ligne fait planter le SDK
return str;
}
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int key;
char *texte;
texte = string();
locate(1,2);
Print(texte);
while(1){
GetKey(&key);
}
return 1;
}
Quelqu'un pourrait m'expliquer ce qui ne va pas, et comment faire pour qu'une fonction renvoie une chaine de caractère? Merci
Citer : Posté le 04/05/2013 02:09 | #
a quoi sert la fonction strcat? a allonger une chaîne de caractères? si oui, un équivalent qui marche pourrait être:
void strcatlike(char *str, const char *add)
{
int i,l;
while(!str[l++]) ;
while(!add[++i]) ;
str=realloc(str,i);
memcpy(str+l,add,i);
}
(n'ayant pas testé ce code, je ne peux te garantir son fonctionnement, mais moi il me semble assez correct)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 04/05/2013 02:24 | #
c'est bizarre, moi j'utilise tout le temps cette fonction sans probleme...
tu a essayé en disant la taille du tableau (str[20])?
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 04/05/2013 11:17 | #
Dodormeur> En mettant str[20] il y a un petit mieux, car la fonction strcat ne fait plus planter le SDK, mais ma fonction string() ne renvoie toujours rien. C'est ça le problème, je n'arrive pas à faire une fonction qui retourne une chaine de caractères. Ou alors c'est c'est moi qui ne sais pas afficher un résultat Pourtant avec les nombres je n'ai pas de prob. Voila mon code :
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
char *string(){
char str[20];
strcat (str,"ajout");
return str;
}
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int key;
char *texte;
texte = string();
locate(1,2);
Print(texte); //rien ne s'affiche !
Bdisp_PutDisp_DD();
while(1){
GetKey(&key);
}
return 1;
}
Limachi> Je n'arrive pas à utiliser ta fonction (je débute en langage C ). Tu pourrais donner un exemple complet comment l'utiliser?
Merci
Citer : Posté le 04/05/2013 11:40 | #
tu a essayé en declarant text comme un tableau et pas comme un pointeur?
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 04/05/2013 11:57 | # | Fichier joint
Aller les gars, c'est pas un problème compliqué à lui expliquer quand même.
char str[]="test"; [green]// Le compilateur comprend avec cette ligne que str est un tableau de 5 char.[/green]
strcat (str,"ajout"); [green]// Ici tu écris dans les cases d'index 4-9 d'un tableau de 5 cases.[/green]
return str; [green]// Ici tu retourne l'adresse d'un tableau qui (comme toute variable) est libéré à la fin de la fonction, donc un pointeur sur un truc qui n'existe plus.[/green]
}
Tu veux que ta fonction retourne un tableau utilisable par la fonction appelante ? Dans ce cas, soit c'est la fonction appelante qui déclare le tableau et l'envoie à ta fonction (comme le fait strcat, elle te demande la chaîne dans laquelle écrire), soit ta fonction alloue un tableau avec malloc (mais la fonction appelante devra alors libérer le buffer avec free, et c'est pas forcément très joli et un oublie provoque une fuite mémoire.
Faire une fonction d'input c'est pas compliqué. il te faut juste un grand buffer, le nombre total de caractères entrés, et la position du curseur. Lorsqu'une touche est enfoncée, si c'est un caractère on l'insert à la position du curseur (décaler toutes les lettres suivantes d'une case en commençant par la dernière, placer la lettre à la position du curseur, décaler le curseur d'une case). Sinon, ça peut être une touche de déplacement du curseur (gauche-droite seulement si tu veux faire simple), DEL pour décaler tous les caractères vers la gauche à partir du curseur, ou EXE pour quitter la fonction.
Et comme je suis sympa, je t'ai bricolé un truc vite-fait : http://pastebin.com/MCrSEzJ8
Citer : Posté le 04/05/2013 12:49 | #
Merci Pierrotll, ça marche !
Par contre je vois que tu as fais une fonction void, sans return donc. Chez moi le "return str" ne renvoyait rien. Tu dis que la variable str n'existe plus au moment de l'envoie?
Bon je vais revoir tout ça ce soir à tête reposée. Super pro en tout cas ton code
Merci encore !
Citer : Posté le 04/05/2013 15:58 | #
Bodgers, comme je te l'ai dis, je ne peux en rien garantir le bon fonctionnement de ma fonction car je ne l'ai pas testée, cela dit, théoriquement, si tu met:
char* str="test";
strcatlike(str,"ajout");
locate(1,2);
Print(texte);
Ce qui devrait s'afficher serait: "testajout"
et vu que tu débute, je vais reprendre ma fonction et expliquer ligne par ligne comment je l'ai pensée:
int i=0,l=0; [green]//ici, je déclare deux variables temporaires, le nom n'a pas vraiment d'importance, du moment que l'on fait attention de ne pas oublier la quelle sert a quoi[/green]
while(!str[l++]) ; [green]//ici, je fais une boucle a vide qui cherche le 0 de fin de chaîne (toutes les chaines de caractères sont des liste ayant 0 pour dernier terme) si je la traduis, sa donne: "tant que (while) str[] a la position l++ (str[l++]) (l++ veut dire que l'on utilise la valeur de l en premier, puis qu'on l'incrémente après utilisation) est différent de zero (!) alors on ne fait rien ( ; )
//en gros while(!str[l++]) ; est une bète boucle qui me sert a trouver la longeur de la chaîne str sans son 0 de fin et a la stocker dans l[/green]
while(!add[++i]) ;[green] //même principe que précédemment, sauf que cette fois je veux incrémenter i AVANT de l'utiliser, de manière a inclure le 0 a la fin cette fois[/green]
str=realloc(str,i+l); [green]//realloc est une fonction de ré-allocation de mémoire, autrement dit, cela sert a modifier la taille d'une liste allouée précédemment. ce que retourne cette fonction est éventuellement (pas toujours) un nouveau pointeur (dans le cas où le précédent ne pouvait plus s'étendre correctement dans la zone de la mémoire où il avait été stocké). Ici, "str" est le pointeur a ré-allouer, et i+l est la nouvelle logeur (en octet, ce qui est équivalent aux chars) de la liste.[/green]
memcpy(str+l,add,i); [green]//enfin vient la dernière ligne, un memcpy. Le memcpy est une fonction qui copie un bloc de donné vers un pointeur. Il est utilisé généralement pour copier une liste vers une liste. Ici, je demande de copier "i" octets de "add" dans "str+l". A quoi correspond str+l? je me suis juste permis de décaler le pointeur str en lui ajoutant l, l étant la valeur de la logeur de la chaîne de caractère str moins son 0 de fin.[/green]
(oui, j'ai fait une petite correction dans ce code là, parce que la première fois, je ne me suis pas relu )
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 04/05/2013 17:13 | #
Bondgers : Une variable (ou tableau) déclarée dans une fonction est supprimé à la fin de la fonction. Donc une fonction ne peut pas créer un tableau et le retourner. Ma fonction input demande une chaîne dans laquelle elle doit écrire. Elle pourrait aussi retourner le pointeur sur cette chaine, ça ne change rien, je ne lui ai pas mis de return juste pour ne pas t'embrouiller avec ça.
Ajouté le 05/05/2013 à 12:23 :
Limachi : Tu ne peux utiliser realloc qu\'avec un buffer alloué dynamiquement. Donc le faire dans une fonction comme ça avec un pointeur qui vient d\'on-ne-sait-où c\'est un peu crade.
Citer : Posté le 05/05/2013 14:27 | #
mmm... oui, c'est vrai (depuis quelques temps, j'ai perdu l'habitude d'utiliser des buffer déclaré normalement, non dynamiquement )
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 01/06/2013 17:33 | #
Salut à tous!
Je débute sur le c, j'ai planché sur le site du zéro le tuto... etc
MAIS, je suis bloqué dès les premières images de mon jeu au menu par le IsKeyDown.
Je veux que si j'appuie sur 1, ca démarre le jeu, et sur 2 que ca le stop.
Le p^roblème, c'est que je ne trouve pas la valeur des touches 1 et 2, et que mon add-in fait pour les définir ne marche pas...
Quelqu'un connaitrait les valeurs à mettre?
{
IsKeyDown(key);
sprintf( temp, "Valeur:%d", key );
locate (1,1);
Print(temp);
}
Quand j'essaie comme ca, ca me donne 0 quelque soit la touche pressé...
SVP aidez moi
Calcu: graph 35+ tweaké
Transformez votre graph 35+ SH4 en graph 75!
C'est par ici!
Etes vous un vrai trader???
Business
Saurez vous vaincre les puissances ennemis?
Swords and Sandals 2
Un 2048 ca vous tente??
2048
Citer : Posté le 01/06/2013 17:49 | #
la fonction IsKeyDown te renvoye 1 ou 0 si la touche dont tu passe le code en argument est pressée ou pas.
donc pour savoir si la touche 1 est pressée, tu utilise
if(IsKeyDown(KEY_CHAR_1))menu();
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 02/06/2013 14:09 | #
Et pour savoir quelle touche est pressée, il y a le Getkey:
{
GetKey(&key); [green]// il faut mettre un pointeur[/green]
sprintf( temp, "Valeur:%d", key );
locate (1,1);
Print(temp);
}
Citer : Posté le 05/06/2013 21:08 | #
Dites... moi j'ai abandonné la création d'add-in au début parce que le SDK me semblait un peu obscure et les menu était tout le temps grisés sans que je comprenne pourquoi... MAIS LA c'est décidé je veux faire des add-ins alors je vous le demande : Que faut-il mettre dans les différentes parties du SDK? parce qu'à chaque fois je ne peut pas cliquer sur les menus déroulants...
Help
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 05/06/2013 21:19 | #
Déjà , je sais pas si ça peux aider :
http://wiki.planet-casio.com/fr/Fx-9860G_SDK
Citer : Posté le 05/06/2013 23:50 | #
j'ai essayé ca marche! j'ai les valeurs des getkey!
mais malheureusement, mon prog ne marche pas!
j'utilise 49 pour [1] et 50 pour [2] mais ca marche pas, la calculoatrice ne semble pas reconnaitre l'appui!
{
if(IsKeyDown(49)==1)
{
Bdisp_AllClr_DDVRAM();
PrintMini(5,5,"OK",1);
}
if(IsKeyDown(50)==1)
PrintMini(5,5,"Flute",0);
}
}
et là ca me donne rien! pas le moindre texte! ><
quelqu'un peut-il m'aider s'il vous plait?
Calcu: graph 35+ tweaké
Transformez votre graph 35+ SH4 en graph 75!
C'est par ici!
Etes vous un vrai trader???
Business
Saurez vous vaincre les puissances ennemis?
Swords and Sandals 2
Un 2048 ca vous tente??
2048
Citer : Posté le 06/06/2013 01:56 | #
Tu as oublié d'utiliser la fonction Bdisp_PutDisp_DD();
Cette fonction permet d'afficher tout le contenue de la VRAM , place-le juste après les fonctions PrintMini
Citer : Posté le 06/06/2013 18:26 | #
Les valeurs du GetKey sont différentes que celles du Basic: met "KEY_CHAR_2" a la place de "49" et "KEY_CHAR_1" a la place de "50" (ou l'inverse, sais plus)
Tu as la liste de toutes les touches soit sur le wiki, soit dans le fichier "Key Chars" ou quelque chose comme ça fourni avec le SDK
Citer : Posté le 06/06/2013 20:21 | #
d'ailleurs les codes des touches sont donnés dans le code qui rend un add-in compatible SH4...
Sinon merci Ziqumu pour le wiki, ça m'a été effectivement d'une grande aide et maintenant je peux enfin compiler et donc ENFIN me lancer dans la programmation d'add-in
par contre ça m'explique pas à quoi ils servent les emplacement "keyboard" et "display"... ça sert à quoi? ^^'
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 08/06/2013 00:26 | #
ca marche pas
ca n'efface même pas l'écran alors que j'ai utilisé Bdisp_AllClr_DDVRAM();
j'ai l'impression qu'il ne rentre pas dans la boucle!
{
Bdisp_AllClr_DDVRAM();
if(IsKeyDown(KEY_CHAR_1)==1)
{
PrintMini(5,5,"OK",1);
}
if(IsKeyDown(KEY_CHAR_1)==1)
PrintMini(5,5,"Flute",0);
}
Calcu: graph 35+ tweaké
Transformez votre graph 35+ SH4 en graph 75!
C'est par ici!
Etes vous un vrai trader???
Business
Saurez vous vaincre les puissances ennemis?
Swords and Sandals 2
Un 2048 ca vous tente??
2048
Citer : Posté le 08/06/2013 01:29 | # | Fichier joint
Bdisp_AllClr_DDVRAM(); supprime juste le contenu de la VRAM, mais ne supprime pas le contenu de l'écran si je ne me trompe pasessaye avec ce code :
Bdisp_AllClr_DDVRAM();
while (1)
{
Bdisp_PutDisp_DD();
if(IsKeyDown(KEY_CHAR_1)==1)
{
Bdisp_AllClr_DDVRAM();
PrintMini(5,5,"OK",1);
}
if(IsKeyDown(KEY_CHAR_1)==1)
{
Bdisp_AllClr_DDVRAM();
PrintMini(5,5,"Flute",0);
}
}
La fonction Bdisp_PutDisp_DD(); est très importante pour afficher des choses à l'écran, en effet elle "actualise" l'affichage.
Voici un petit schéma que j'avais faites et qui explique assez rapidement le code.