Accueil > > > SIMPLE JEU DE TIR EN AS3
SIMPLE JEU DE TIR EN AS3
Information sur la source
Description
Après avoir vu un message sur le forum j'ai eu envie de creer une esquisse de jeu trés simpliste dans laquelle vous pourrez decouvrir les bases de quelques concept necessaires au codage de jeux en flash. Entre autre : - Dessiner sur un DisplayObject des formes simples avec l'api de dessin de flash - Utiliser un clip pour un hitTest - Creer une animation qui prend tout le navigateur, sans zoom (scalemode NO_SCALE) - Capturer les événements souris, enterFrame et redimensionnement du stage - Pivoter un clip suivant la position de la souris - Gérer la vitesse d'un clip en utilisant une pseudo gravité - Créer un Timer pour invoquer une fonction a intervalle régulier - Jouer un son de fond - Jouer un son FX lors d'un événemment - etc... Bien sur le tout en actionScript3. Un jeu digne de ce nom devrait avoir une architecture plus travaillée et une encapsulation plus efficace, mais ici j'ai voulu "simplifier" au maximum. Bien entendu, l'ajout de fonctionnalités, la mise a jour du code, ou la correction de bug serait bien plus difficile dans un code comme celui ci que dans un vrai projet orienté objet. En tout cas... Bonne lecture ;)
Source
- Classe principale :
- package
- {
- import flash.display.DisplayObject;
- import flash.display.Sprite;
- import flash.display.StageAlign;
- import flash.display.StageScaleMode;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.events.TimerEvent;
- import flash.media.Sound;
- import flash.net.URLRequest;
- import flash.text.TextField;
- import flash.utils.Timer;
-
- public class Canon extends Sprite
- {
-
- private static const GRAVITE:Number = 0.5;
- private static const XFORCE:Number = 20;
- private static const YFORCE:Number = 25;
- private static const NBMOUETTE:Number = 2;
- private static const DIFFICULTE:Number = 15;
-
-
-
- /* clip du canon */
- private var canon:Sprite;
-
- /* conteneur ennemis + boulets */
- private var cont:Sprite;
- private var contEnnemis:Sprite;
-
- private var score:int = 0;
- private var scoreText:TextField;
-
- /* reference vers le son FX qui sera préchargé*/
- private var fxSound:Sound;
- private var tim:Timer;
-
- private var lastStageWidth:int;
- private var lastStageHeight:int;
-
-
- /* Point d'entrée */
- public function Canon()
- {
- /* Reglage du stage */
- /* pas de scaling */
- stage.scaleMode = StageScaleMode.NO_SCALE;
- /* alignement en haut a gauche */
- stage.align = StageAlign.TOP_LEFT;
- /* sauvegarde des dimensions pour le ratio lors du redimmensionnement du stage */
- lastStageWidth = stage.stageWidth;
- lastStageHeight = stage.stageHeight;
-
- /* TextField de score */
- scoreText = new TextField();
- stage.addChild(scoreText);
- scoreText.text = "score : 0";
-
- /* Creation du canon */
- canon = createCanon();
- canon.x = stage.stageWidth /2;
- canon.y = stage.stageHeight - canon.height;
- addChild(canon);
-
- /* le conteneur va contenir les boulets et contEnnemis */
- cont = new Sprite();
- cont.x = stage.stageWidth/2 - cont.width/2;
- cont.y = stage.stageHeight - cont.height;
-
- /* contEnnimis contient les ennemis */
- contEnnemis = new Sprite();
- cont.addChild(contEnnemis);
- addChild(cont);
-
- /* ajout des ecouteurs */
- stage.addEventListener(Event.RESIZE, resizeStage);
- stage.addEventListener(MouseEvent.CLICK,mouseClick);
- stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
-
- /* le timer va faire apparaitre les oiseaux */
- tim = new Timer(1000/NBMOUETTE);
- tim.addEventListener(TimerEvent.TIMER, timerBird);
- tim.start();
-
- /* Lancement du son */
- var sound:Sound = new Sound();
- sound.load(new URLRequest("sound/bg.mp3"));
- /* On preferera gerer la boucle de son avec un listener dans un jeu */
- sound.play(0,int.MAX_VALUE);
-
- /* son FX */
- fxSound = new Sound();
- fxSound.load(new URLRequest("sound/fx.mp3"));
-
- }
-
- /* lance un boulet */
- private function mouseClick(evt:MouseEvent):void{
- /* on recuperere l'angle en radian */
- var angle:Number = getRadianAngle(canon, this.mouseX,this.mouseY);
- /* on instancie le boulet avec ses vecteurs de translation */
- var boulet:GameSprite = new GameSprite(GameSprite.BOULET,Math.cos(angle)*XFORCE,-Math.sin(angle)*YFORCE);
- /*on place le boulet juste au bout du canon */
- boulet.x = canon.x+Math.cos(angle)*10-cont.x;
- boulet.y = canon.y-Math.sin(angle)*10-cont.y;
- cont.addChild(boulet);
- boulet.addEventListener(Event.ENTER_FRAME, bouletEnterFrame);
- }
-
- /* pivote le cannon */
- private function mouseMove(evt:MouseEvent):void{
- var angle:Number = getRadianAngle(canon, this.mouseX,this.mouseY);
- canon.rotation = -angle*180/Math.PI+90;
- }
-
- /* Deplace les boulets */
- private function bouletEnterFrame(e:Event):void{
- /* on verifie que la cible est bien un GameSprite */
- if( e.target is GameSprite){
- var boulet:GameSprite = e.target as GameSprite;
- /* mouvement */
- boulet.x += boulet.getAccelX();
- boulet.y += boulet.getAccelY();
- /* on met a jour la vitesse sur l'axe Y */
- boulet.setAccelY(boulet.getAccelY() + GRAVITE);
- /* si le boulet sort du stage on l'enleve */
- if(boulet.y > stage.stageHeight) {
- boulet.removeEventListener(Event.ENTER_FRAME,bouletEnterFrame);
- cont.removeChild(boulet);
- }
- else {
- /* sinon on verifie si il touche un ennemi */
- for(var i:int = 0; i < contEnnemis.numChildren; i++){
- var bird:DisplayObject = contEnnemis.getChildAt(i);
- /* si le boulet touche un ennemi, on detruit les deux */
- if((bird is GameSprite) && boulet.hitTestObject((bird as GameSprite).getHitBound())) {
- boulet.removeEventListener(Event.ENTER_FRAME,bouletEnterFrame);
- bird.removeEventListener(Event.ENTER_FRAME,birdEnterFrame);
- cont.removeChild(boulet);
- contEnnemis.removeChild(bird);
- scoreText.text = "score : "+(++score);
- fxSound.play();
- }
- }
- }
- }
- }
-
- /* Deplace les oiseaux */
- private function birdEnterFrame(e:Event):void{
- if(e.target is GameSprite){
- var bird:GameSprite = e.target as GameSprite;
- bird.x += bird.getAccelX();
- bird.y += bird.getAccelY();
- if(bird.y > stage.stageHeight -cont.y|| bird.y < -cont.y || bird.x > stage.stageWidth-cont.x || bird.x < -cont.x ) {
- bird.removeEventListener(Event.ENTER_FRAME,birdEnterFrame);
- contEnnemis.removeChild(bird);
- }
- }
- }
-
- /* Crée les oiseaux */
- private function timerBird(e:Event):void{
- var accelx:int = Math.random()*DIFFICULTE-DIFFICULTE/2;
- var accely:int = Math.random()*DIFFICULTE-DIFFICULTE/2;
- accelx = accelx == 0 ? 1 : accelx;
- accely = accely == 0 ? 1 : accely;
- var bird:GameSprite = new GameSprite(GameSprite.BIRD,accelx,accely);
- bird.x = (accelx < 0 ? (Math.random()+1)*stage.stageWidth/2 : (Math.random())*stage.stageWidth/2) - cont.x;
- bird.y = (accely < 0 ? stage.stageHeight-1 : 0) - cont.y;
- contEnnemis.addChild(bird);
- bird.addEventListener(Event.ENTER_FRAME,birdEnterFrame);
- }
-
- /* replace les elements lors du redimmensionnement du stage */
- private function resizeStage(evt:Event):void{
- var ratioX:Number = stage.stageWidth / lastStageWidth;
- var ratioY:Number = stage.stageHeight / lastStageHeight;
- for(var i:int = 0; i< this.numChildren; i++){
- getChildAt(i).x *= ratioX;
- getChildAt(i).y *= ratioY;
- }
- lastStageWidth = stage.stageWidth;
- lastStageHeight = stage.stageHeight;
- }
-
- /* crée le canon */
- private function createCanon():Sprite{
- var spr:Sprite = new Sprite();
- spr.graphics.beginFill(0x000000,1);
- spr.graphics.drawRect(-10,-20,20,40);
- spr.graphics.endFill();
- return spr;
- }
-
- /* Retourne l'angle en radian entre le DisplayObject d1 et le point (x,y)
- On ne considere que la partie superieur du cercle trigonometrique donc
- l'angle retourné sera entre 0° et 180°
- */
- public static function getRadianAngle(d1:DisplayObject, x:int,y:int):Number{
- if(d1 != null){
- var ac:int = x - d1.x;
- var bc:int = d1.y - y;
- return Math.acos((ac)/Math.sqrt(Math.pow(ac,2)+Math.pow(bc,2)));
- }
- else return NaN;
- }
- }
- }
-
-
- Classe GameSprite :
- package
- {
- import flash.display.DisplayObject;
- import flash.display.Shape;
- import flash.display.Sprite;
-
- public class GameSprite extends Sprite
- {
-
- /* Ici par simplicité on utilise une enumeration plutot qu'une classe pour
- les ennemis et une autre pour les boulets */
- public static const BIRD:int = 1;
- public static const BOULET:int = 2;
-
- /* le vecteur d'acceleration sur l'axe X */
- private var accelx:Number;
-
- /* le vecteur d'acceleration sur l'axe Y */
- private var accely:Number;
-
- /* Le clip qui va etre utilisé pour le hitTest */
- private var hitBound:Shape;
-
- public function GameSprite(type:int,accelx:Number, accely:Number)
- {
-
- this.accelx = accelx;
- this.accely = accely;
-
- hitBound = new Shape();
-
- if(type == BOULET){
- /* on dessine un simple rond avec une couleur au hasard */
- hitBound.graphics.beginFill(Math.random()*0xFFFFFF,1);
- hitBound.graphics.drawEllipse(-5,-5,10,10);
- hitBound.graphics.endFill();
- }
-
- if(type == BIRD){
- /* aile gauche */
- graphics.beginFill(Math.random()*0xFFFFFF,1);
- graphics.moveTo(0,0);
- graphics.curveTo(15,-10,30,0);
- graphics.curveTo(15,-5,0,0);
-
- /* corps, qui sert aussi de clip pour le hitTest */
- hitBound.graphics.beginFill(Math.random()*0xFFFFFF,1);
- hitBound.graphics.drawEllipse(25,-5,10,10);
- hitBound.graphics.endFill();
-
- /* aile droite */
- graphics.moveTo(30,0);
- graphics.curveTo(45,-10,60,0);
- graphics.curveTo(45,-5,30,0);
-
- graphics.endFill();
- }
-
- addChild(hitBound);
-
- }
-
- public function getAccelX():Number{
- return this.accelx;
- }
- public function getAccelY():Number{
- return this.accely;
- }
-
- public function setAccelX(ax:Number):void{
- this.accelx = ax;
- }
- public function setAccelY(ay:Number):void{
- this.accely = ay;
- }
-
- public function getHitBound():DisplayObject{
- return hitBound;
- }
-
- }
- }
Classe principale :
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.utils.Timer;
public class Canon extends Sprite
{
private static const GRAVITE:Number = 0.5;
private static const XFORCE:Number = 20;
private static const YFORCE:Number = 25;
private static const NBMOUETTE:Number = 2;
private static const DIFFICULTE:Number = 15;
/* clip du canon */
private var canon:Sprite;
/* conteneur ennemis + boulets */
private var cont:Sprite;
private var contEnnemis:Sprite;
private var score:int = 0;
private var scoreText:TextField;
/* reference vers le son FX qui sera préchargé*/
private var fxSound:Sound;
private var tim:Timer;
private var lastStageWidth:int;
private var lastStageHeight:int;
/* Point d'entrée */
public function Canon()
{
/* Reglage du stage */
/* pas de scaling */
stage.scaleMode = StageScaleMode.NO_SCALE;
/* alignement en haut a gauche */
stage.align = StageAlign.TOP_LEFT;
/* sauvegarde des dimensions pour le ratio lors du redimmensionnement du stage */
lastStageWidth = stage.stageWidth;
lastStageHeight = stage.stageHeight;
/* TextField de score */
scoreText = new TextField();
stage.addChild(scoreText);
scoreText.text = "score : 0";
/* Creation du canon */
canon = createCanon();
canon.x = stage.stageWidth /2;
canon.y = stage.stageHeight - canon.height;
addChild(canon);
/* le conteneur va contenir les boulets et contEnnemis */
cont = new Sprite();
cont.x = stage.stageWidth/2 - cont.width/2;
cont.y = stage.stageHeight - cont.height;
/* contEnnimis contient les ennemis */
contEnnemis = new Sprite();
cont.addChild(contEnnemis);
addChild(cont);
/* ajout des ecouteurs */
stage.addEventListener(Event.RESIZE, resizeStage);
stage.addEventListener(MouseEvent.CLICK,mouseClick);
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
/* le timer va faire apparaitre les oiseaux */
tim = new Timer(1000/NBMOUETTE);
tim.addEventListener(TimerEvent.TIMER, timerBird);
tim.start();
/* Lancement du son */
var sound:Sound = new Sound();
sound.load(new URLRequest("sound/bg.mp3"));
/* On preferera gerer la boucle de son avec un listener dans un jeu */
sound.play(0,int.MAX_VALUE);
/* son FX */
fxSound = new Sound();
fxSound.load(new URLRequest("sound/fx.mp3"));
}
/* lance un boulet */
private function mouseClick(evt:MouseEvent):void{
/* on recuperere l'angle en radian */
var angle:Number = getRadianAngle(canon, this.mouseX,this.mouseY);
/* on instancie le boulet avec ses vecteurs de translation */
var boulet:GameSprite = new GameSprite(GameSprite.BOULET,Math.cos(angle)*XFORCE,-Math.sin(angle)*YFORCE);
/*on place le boulet juste au bout du canon */
boulet.x = canon.x+Math.cos(angle)*10-cont.x;
boulet.y = canon.y-Math.sin(angle)*10-cont.y;
cont.addChild(boulet);
boulet.addEventListener(Event.ENTER_FRAME, bouletEnterFrame);
}
/* pivote le cannon */
private function mouseMove(evt:MouseEvent):void{
var angle:Number = getRadianAngle(canon, this.mouseX,this.mouseY);
canon.rotation = -angle*180/Math.PI+90;
}
/* Deplace les boulets */
private function bouletEnterFrame(e:Event):void{
/* on verifie que la cible est bien un GameSprite */
if( e.target is GameSprite){
var boulet:GameSprite = e.target as GameSprite;
/* mouvement */
boulet.x += boulet.getAccelX();
boulet.y += boulet.getAccelY();
/* on met a jour la vitesse sur l'axe Y */
boulet.setAccelY(boulet.getAccelY() + GRAVITE);
/* si le boulet sort du stage on l'enleve */
if(boulet.y > stage.stageHeight) {
boulet.removeEventListener(Event.ENTER_FRAME,bouletEnterFrame);
cont.removeChild(boulet);
}
else {
/* sinon on verifie si il touche un ennemi */
for(var i:int = 0; i < contEnnemis.numChildren; i++){
var bird:DisplayObject = contEnnemis.getChildAt(i);
/* si le boulet touche un ennemi, on detruit les deux */
if((bird is GameSprite) && boulet.hitTestObject((bird as GameSprite).getHitBound())) {
boulet.removeEventListener(Event.ENTER_FRAME,bouletEnterFrame);
bird.removeEventListener(Event.ENTER_FRAME,birdEnterFrame);
cont.removeChild(boulet);
contEnnemis.removeChild(bird);
scoreText.text = "score : "+(++score);
fxSound.play();
}
}
}
}
}
/* Deplace les oiseaux */
private function birdEnterFrame(e:Event):void{
if(e.target is GameSprite){
var bird:GameSprite = e.target as GameSprite;
bird.x += bird.getAccelX();
bird.y += bird.getAccelY();
if(bird.y > stage.stageHeight -cont.y|| bird.y < -cont.y || bird.x > stage.stageWidth-cont.x || bird.x < -cont.x ) {
bird.removeEventListener(Event.ENTER_FRAME,birdEnterFrame);
contEnnemis.removeChild(bird);
}
}
}
/* Crée les oiseaux */
private function timerBird(e:Event):void{
var accelx:int = Math.random()*DIFFICULTE-DIFFICULTE/2;
var accely:int = Math.random()*DIFFICULTE-DIFFICULTE/2;
accelx = accelx == 0 ? 1 : accelx;
accely = accely == 0 ? 1 : accely;
var bird:GameSprite = new GameSprite(GameSprite.BIRD,accelx,accely);
bird.x = (accelx < 0 ? (Math.random()+1)*stage.stageWidth/2 : (Math.random())*stage.stageWidth/2) - cont.x;
bird.y = (accely < 0 ? stage.stageHeight-1 : 0) - cont.y;
contEnnemis.addChild(bird);
bird.addEventListener(Event.ENTER_FRAME,birdEnterFrame);
}
/* replace les elements lors du redimmensionnement du stage */
private function resizeStage(evt:Event):void{
var ratioX:Number = stage.stageWidth / lastStageWidth;
var ratioY:Number = stage.stageHeight / lastStageHeight;
for(var i:int = 0; i< this.numChildren; i++){
getChildAt(i).x *= ratioX;
getChildAt(i).y *= ratioY;
}
lastStageWidth = stage.stageWidth;
lastStageHeight = stage.stageHeight;
}
/* crée le canon */
private function createCanon():Sprite{
var spr:Sprite = new Sprite();
spr.graphics.beginFill(0x000000,1);
spr.graphics.drawRect(-10,-20,20,40);
spr.graphics.endFill();
return spr;
}
/* Retourne l'angle en radian entre le DisplayObject d1 et le point (x,y)
On ne considere que la partie superieur du cercle trigonometrique donc
l'angle retourné sera entre 0° et 180°
*/
public static function getRadianAngle(d1:DisplayObject, x:int,y:int):Number{
if(d1 != null){
var ac:int = x - d1.x;
var bc:int = d1.y - y;
return Math.acos((ac)/Math.sqrt(Math.pow(ac,2)+Math.pow(bc,2)));
}
else return NaN;
}
}
}
Classe GameSprite :
package
{
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.display.Sprite;
public class GameSprite extends Sprite
{
/* Ici par simplicité on utilise une enumeration plutot qu'une classe pour
les ennemis et une autre pour les boulets */
public static const BIRD:int = 1;
public static const BOULET:int = 2;
/* le vecteur d'acceleration sur l'axe X */
private var accelx:Number;
/* le vecteur d'acceleration sur l'axe Y */
private var accely:Number;
/* Le clip qui va etre utilisé pour le hitTest */
private var hitBound:Shape;
public function GameSprite(type:int,accelx:Number, accely:Number)
{
this.accelx = accelx;
this.accely = accely;
hitBound = new Shape();
if(type == BOULET){
/* on dessine un simple rond avec une couleur au hasard */
hitBound.graphics.beginFill(Math.random()*0xFFFFFF,1);
hitBound.graphics.drawEllipse(-5,-5,10,10);
hitBound.graphics.endFill();
}
if(type == BIRD){
/* aile gauche */
graphics.beginFill(Math.random()*0xFFFFFF,1);
graphics.moveTo(0,0);
graphics.curveTo(15,-10,30,0);
graphics.curveTo(15,-5,0,0);
/* corps, qui sert aussi de clip pour le hitTest */
hitBound.graphics.beginFill(Math.random()*0xFFFFFF,1);
hitBound.graphics.drawEllipse(25,-5,10,10);
hitBound.graphics.endFill();
/* aile droite */
graphics.moveTo(30,0);
graphics.curveTo(45,-10,60,0);
graphics.curveTo(45,-5,30,0);
graphics.endFill();
}
addChild(hitBound);
}
public function getAccelX():Number{
return this.accelx;
}
public function getAccelY():Number{
return this.accely;
}
public function setAccelX(ax:Number):void{
this.accelx = ax;
}
public function setAccelY(ay:Number):void{
this.accely = ay;
}
public function getHitBound():DisplayObject{
return hitBound;
}
}
}
Conclusion
Pour compiler les sources avec FlexSDK3 : mxmcl Canon.as
Pour ceux sous flash cs3, créez un nouveau FLA, mettez les fichiers décompressé de l'archive dans le même dossier. Ensuite cliquez sur un espace vide sur la scène, ouvrez le panneau propriété du document (CTRL+F3), et renseignez Canon dans la case "Classe du document". Vous pouvez lancer le jeu.
Historique
- 22 juin 2008 18:17:50 :
- Retour chariot oublié
- 22 juin 2008 18:20:04 :
- ajout commentaires
- 23 juin 2008 02:09:49 :
- compilation avec flash CS3
- 23 juin 2008 02:18:42 :
- idem
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Ressource pour jeux (perso, ...), ou les trouver ? [ par taxidogkiller ]
Bonjour, je souhaiterais créer un jeux en flash, mais je ne suis pas tres bon en design et en dessin. Je crois qu'il existe des site qui propose des p
Projet jeu flash [ par Nicorad ]
Bonjour a tous,Je suis étudiant en écriture multimedia actuelement en stage, but de celui ci, creer un jeux flash et le vendre...Avant de commencer la
progress bar sur un dessin [ par pouet1er ]
Bonjour, je voudrais savoir s'il est possible de faire un preload avec une barre de progression qui soit un dessin et non un rectangle basique. Je com
Table a dessin dynamique + reconnassaince des lettres [ par MatHouston ]
Bonjour,Je voudrais savoir si il est possible en AS de faire :1) Une table a dessin dynamique simple (1 couleur, 1 epaisseur de trait)2) Une fois que
Dessin en direct [ par velsato ]
Bonjour,je souhaiterai faireune animation d'un dessin fait sur illustrator ( tracés) et faire une anim où ce dessin se dessine tt seul....J'ai réussi
projet internet [ par ckad ]
bonjour a tousvoila nous somme a la rechercher d un ou deux champion pour transformer des jeux en flachle projet avance grace a vous car c est la que
projet internet [ par ckad ]
bonjour a tousvoila nous somme a la rechercher d un ou deux champion pour transformer des jeux en flachle projet avance grace a vous car c est la que
jeux en flach [ par ckad ]
bonsoir je suis toujours a la recherche d ame charitable pour nous apporter de l aide pour des jeux en flach ou en delphij espere que les chalange vou
Evenement : souris qui quitte l'animation [ par Kev33 ]
Bonjour, Je cherche comment implémenter en AS l'évènement déclenché lorsque la souris quitte une animation flash.ex : sur une page web, une animat
site de jeux pour enfants en flash [ par chrislechat ]
Bonjour , Voici un site de jeux pour enfants en flash que j'ai fais au départ pour amuser ma fille puis j'ai eu envie de faire partager aux autres enf
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|