myDrix
RSS
 

Projet 52 – #6 Briller

13 fév

Après 2 semaines sans participations au projet 52 de vivre la photo, j’essai de m’y remettre mais je manque grandement d’inspiration pour traiter le thème Briller.
Qu’est ce qui brille ou est brillant que je pourrai prendre en photo et essayer de faire une photo sympa?
Je me disais une partie d’une voiture, plutôt neuf, ça brille bien, avec une partie de chrome…..
Mais avec la neige, le sel sur la route, pas facile de trouver une voiture qui corresponde (enfin pas trop sale) sans allez chez un concessionnaire. Plus un rhume qui me colle un peu trop, je ne suis pas trop sorti.

J’ai fait comme d’hab, dimanche soir, avec ce que j’ai à la maison : le soleil qui se couche, la lumière des voisins, un bijou de ma femme :p

105mm – f/5.6 – 1/200s – ISO 400

48mm – f/6.3 – 1/5s – ISO 800

35mm – f/4.5 – 1/6s – ISO 800 – Flash

Toutes les photos ont étés traitées (recadrage et balance des blancs) avec Rawtherapee.
J’ai choisi la première photo qui me semble la plus sympa. Je pense que c’est celle avec le moins d’agrandissement (ou plus grand rapetissement par rapport à la photo original), et donc on voit moins le grain d’autant qu’elle à était faite avec une iso plus petite que les deux autres.

 
 

Air Hockey en JS – l’adversaire

10 fév

Après l’ajout du terrain, voici l’ajout de l’adversaire, ainsi que du serveur servant à synchroniser les données entre les deux clients (joueurs).

L’adversaire est un joueur comme le joueur principale, mais il est piloté par une autre source (pas les événements de la souris (ou tactile), mais il s’affiche de la même façon. Je réutilise donc la même classe.
Le serveur va nous servir à transmettre les informations du jeu, d’un joueur à un autre. Ayant commencé à faire mon code en JavaScript, et avec l’arrivé de node.js (depuis quelque temps), je voulais l’essayer, surtout avec le module Socket.io, qui répond tout à fait au besoin présent.

Je ne présenterais pas node.js, ni socket.io, tellement il y a des exemples, tutoriels, … et qu’il est facile de la trouver sur l’Internet en cherchant sur Google.

J’ai écrit un serveur assez simple qui lorsqu’il reçoit des informations d’un joueur les retransmets au second joueur :

var io = require('socket.io').listen(8080);
 
// une partie
function jeu() {
	this.joueur1 = null;
	this.joueur2 = null;
}
 
jeu.prototype.isReady = function() {
	return this.joueur1 !== null && this.joueur2 !== null;
}
 
// le serveur gere plusieurs partie de air hockey
var jeuList = new Array();
 
// tentative d'association de joeur entre eux pour faire une partie
function association(socket) {
	var currentJeux = null;
	for(var i=0;i<jeuList.length;i++) {
		if(!jeuList[i].isReady()) {
			currentJeux = jeuList[i];
		}
	}
 
	if(currentJeux == null) {
		jeuList.push(new jeu());
		currentJeux = jeuList[jeuList.length-1];
	}
 
	if(currentJeux.joueur1 === null){
		currentJeux.joueur1 = socket;
	} else if(currentJeux.joueur2 === null){
		currentJeux.joueur2 = socket;
	}
}
 
// déroulement d'une partie
function eventJeu(currentJeux) {
	currentJeux.joueur1.emit('debutJeu');
	currentJeux.joueur2.emit('debutJeu');
	currentJeux.joueur1.on('Bouge', function(data) {
		currentJeux.joueur2.emit('BougerSeul', data);
	});
	currentJeux.joueur2.on('Bouge', function(data) {
		currentJeux.joueur1.emit('BougerSeul', data);
	});
	currentJeux.joueur1.on('PaletChange', function(data) {
		currentJeux.joueur2.emit('ChangerPalet', data);
	});
	currentJeux.joueur2.on('PaletChange', function(data) {
		currentJeux.joueur1.emit('ChangerPalet', data);
	});
	currentJeux.joueur1.on('disconnect', function() {
		currentJeux.joueur1 = null;
		currentJeux.joueur2.emit('departAdversaire');
	});
	currentJeux.joueur2.on('disconnect', function() {
		currentJeux.joueur2 = null;
		currentJeux.joueur1.emit('departAdversaire');
	});
}
 
function connection(socket){
	association(socket);
	if(jeuList.length > 0 && jeuList[jeuList.length-1].isReady()) {
		eventJeu(jeuList[jeuList.length-1]);
	}
}
 
function deconnection(socket) {
	var deleteIndex = -1;
	for(var i=0;i<jeuList.length;i++) {
		if(jeuList[i].joueur1 === socket) {
			jeuList[i].joueur1 = null;
			jeuList[i].joueur2.emit("departAdversaire");
		}
 
		if(jeuList[i].joueur2 === socket) {
			jeuList[i].joueur2 = null;
			jeuList[i].joueur1.emit("departAdversaire");
		}
 
		if(jeuList[i].joueur1 === null && jeuList[i].joueur2 === null) {
			deleteIndex = i;
		}
	}
	if(deleteIndex > -1)
		jeuList.splice(deleteIndex, 1);
}
 
io.sockets.on('connection', function(socket) {
	connection(socket);
});

Les informations sont les déplacements du joueur, du palet, … c’est tout pour l’instant … mais il pourrait devrait y avoir le score aussi.
La petite subtilité c’est de géré une liste de parties, quand un joueur ce connecte, il est placé dans un partie, le joueur suivant sera dans la même partie. Le troisième joueur commencera une nouvelle partie et attendras une nouvelle connexion

Voici le code du client qui reçoit les événements du serveur :

    socket = io.connect('http://localhost:8080');
    socket.on('debutJeu', function(data) {
	    alert('Debut de la partie!');
    });
    socket.on('BougerSeul', function(data) {
	    adversaire.bougerSeul(data.x, data.y);
    });
    socket.on('ChangerPalet', function(data) {
    	  var newAngle = Math.atan2(data.vy, data.vx);
	  newAngle = 2 * Math.PI - newAngle;
	  ballon.bougera(newAngle, data.force, true);
    });
    socket.on('departAdversaire', function() {
	    alert('votre adversaire est parti');
    });

Cela ne fonctionne pas trop mal pour la synchronisation des joueurs, j’ai du faire quelque adaptations car j’ai considérais que le joueur jouant était forcement en bas. Il à fallu faire un changement sur les coordonnées.

// pour le retour du serveur: affichage en miroir. 
poussoir.prototype.bougerSeul = function(x, y) {
	this.x = env.width - x;
	this.y = env.height - y;
}

Le résultat est testable ici : V3 d’un air-hockey en javascript.
J’ai un peu plus de problème sur le palet, d’un part pour le bon calcul de son angle, et surtout pour la synchro de la direction du palet. Le calcul des collisions se fait sur les deux clients et est synchroniser avec l’autre client à chaque changement de direction du palet (collision). Mais chaque client à son propre timer, qui n’est pas synchroniser. Donc entre un décalage du calcul de collisions et un mauvais report des angles de direction du palet : il fait un peu n’importe quoi.

La correction de ce problème sera une prochaine étape. Ces calculs de trajectoire et mise à jour de la position du palet se sera faite sur le serveur qui emmétra des indications aux clients lors de changement. Et les clients s’occuperont uniquement de l’affichage et de l’input des data de la capture des déplacements du joueur. Mais ceci sera pour la prochaine fois.

Ps : si quelqu’un à envie de rendre le jeu plus jolie, qu’il n’hésite à allez voir sur les sources sur github. De même que toute amélioration technique ou pour consultation

 
2 commentaires

Classé dans code

 

Projet 52 – #3 Gourmandise

22 jan

Pour la troisième semaine, le thème est Gourmandise.
Pour moi les gourmandises c’est sucrées, surtout les petites : chocolat, bonbons, …
J’aimerai bien faire une belle scène de salon de thé, avec pleins de petits gâteaux. Mais la cuisine, je préfère la manger que la faire, et pour composer une scène c’est un peu pareil, je préfère en trouver une belle.
Alors j’ai fais quelques tentatives avec les moyens du bord: les fraises tagada

En ligne :Ligne de bonbons Haribo

55mm – f/4 – 1/20s

une ligne de bonbons Haribo

55mm – f/4 – 1/20s

Là ma petite miss de 2 ans m’a bien aidée :) fraise haribo croqués

55mm – f/2.8 – 1/10s

Avec du Nutella ça m’avait l’ai un plus mais peut être pas… : Fraise Haribo et Nutella sur une cuillère

55mm – f/4 – 1/13s

Y’a des petits doigts qui sont bien gourmand :p Fraise Haribo et Nutella pris par les petits doigts d'une gourmande

55mm – f/4 – 1/13s

Toutes les photos ont étés faites avec un Nikkor 55mm Macro AIS, tout en manuel (car obligé) et j’ai fait une légère reprise d’exposition et de la balance des blancs avec RawTherapee (sous Linux)

 
5 commentaires

Classé dans Projet 52

 

Air Hockey en JS – le terrain

20 jan

Un petit avancement de la V1 mon air hockey, mais qui prend quand même le nom de V2 :p
Un petit avancement car c’est juste un peu de design et quelque légère modification.

Alors les nouveautés :
– Le tour du terrain et la matérialisation des buts. Pour ça j’ai utilise une seconde balise canvas qui est superposé à la première (en dessous de la première) comme ça ce n’est pas nécessaire de redessiner à chaque fois le terrain.terrain air hockey
– Nouveauté pas visuel du tout, le découpage du javascript en plusieurs fichiers, uniquement pour pouvoir le parcourir plus facilement. J’ai essayer de le répartir par fonctionnalité ou classe selon les cas.

– Autre nouveautés c’est les quelque apports pour l’affichage sur mobile par l’utilisation des évènements des écrans tactiles qui exécutent les même fonctions que les évènements de la souris

    document.onmousedown = onStart;
    document.onmouseup = onEnd;
    document.onmousemove = onMove;
 
    document.ontouchstart = onStart;
    document.ontouchend = onEnd;
    document.ontouchmove = onMove;

Il y a aussi un essai d’affichage correct selon la taille de l’écran grâce aux méta du fichier html, mais le résultat n’est pas exploitable, il faudra trouver quelque chose de mieux

<meta name="viewport" content="height=device-height, initial-scale=2.0, user-scalable=yes" >

Sinon j’ai fait quelque petites corrections sur la gestion des collisions.

Autre changement pour la gestion de code cette fois-ci, je l’ai donc mis à disposition sur github sousle doux nom de JSAirHockey. Si le coeur, ou l’envie vous en dis, n’hésitez pas à apporter des modifications, améliorations.

Pour les prochaines fois, ce sera l’ajout d’un adversaire, et/ou la communication avec un serveur node.js

 
1 commentaire

Classé dans code

 

Projet 52 – #2 Résolution

15 jan

Seconde semaine de l’année, seconde photo du projet 52.
Le thème : Résolution

Les idées. Elles ne se bousculent pas au portillon. Résolution résolution résolution. Bonne résolution, Résolution d’un écran d’ordinateur, oui comment faire une photo de ça?

Ce sera donc la fameuse « bonne résolution » de début d’année, comme arrêter de fumer.
alors voici une série de plusieurs essais d’un paquet de clopes écrasé, pris sous différents point de vue.



en format portrait :



un peu autrement :



Avec un peu de hauteur:

en se tournant un peu :

Toutes les photos ont été faites avec un Nikon D90 et un 35mm fixe, avec une priorité à l’ouverture entre f/2 et f/3,2 et iso 1000 sans flash.

Je mets la photo N°2 pour la sélection, c’est celle qui me parait la plus jolie.

 
 

Projet 52 – #1 Direction

09 jan

C’est la reprise du projet 52 par vivre la photo (anciennement bento blog): une photo par semaine sur un thème indiqué.
J’aime bien l’idée, ça permet de se forcer bouger à faire des photos régulierment, mais aussi sur des choses qu’on ne ferait pas tout seul. En plus ça permet ensuite un échange sur les photos faites et de voir les photos d’autres personnes, comment ils ont traités le thèmes, …

Pour cette première participation le thème est « Direction »

Pour ce thème j’ai tout de suite pensé aux panneaux de direction, je voyais bien celui vert avec une pointe au bout et la fameuse note « toutes directions ».
Etant sur Lyon je pars à la recherche (en vélo) de ce panneau, mais impossible de la trouver. A croire qu’on le trouve uniquement quand on est perdu et qu’on a besoin d’une vrai direction.

Quoi qu’il en soit je fais quelque autres essais
une direction pour Paris et Marseille :

Panneau de direction   Panneau de direction   panneau de direction

au hasard de mes recherches, je suis tombé sur ce panneau de signalisation, qui en plus avait de l’espace derrière lui :

panneau d'indication

Puis au bout d’un moment j’ai enfin trouvé mon panneau « toutes directions », mais collé à un réverbère ;-(
panneau de direction
mais le résultat n’y était pas.

Au final ce sera la photo du panneau de signalisation de la piste cyclable avec le cycliste en vtt à coté que j’ai simpelement recadré.
velo sur piste cyclable avec le panneau bleu
Informations de prise de vue : 40mm (DX) – f4,5 – 1/30s – Priorité à l’ouverture – recadrage avec Gimp