Aller au contenu

Most Liked Content


#25927 Liste des sources

Posted by ipodishima sur 24 septembre 2010 - 11:34

Bonjour à tous,

 

Les sources du premier livre ne sont plus disponibles. Il est de toute façon obsolète !

 

Aussi, pour récupérer les sources du second livre, il vous faudra simplement vous rendre ici : 

 

https://github.com/ipup/iPuP-Livre

 

Ensuite, vous verrez que c'est du git et des sous modules. Je vous invite donc à vous pencher sur git, c'est très intéressant !

Si git est installé sur votre machine, écrivez la ligne suivante dans votre terminal :

 

 

git clone https://github.com/ipup/iPuP-Livre.git && cd iPuP-Livre && git submodule update --init --recursive



#25862 Fiche 36 — Utiliser Core Data

Posted by ipodishima sur 23 septembre 2010 - 13:54

Bonjour,

Voici la discussion officielle de la fiche n°36.

"Ou comment se simplifier la vie lorsque l’on souhaite stocker des données."

Bonne lecture !


#25826 Fiche 3 — Où trouver les ressources adéquates ?

Posted by ipodishima sur 23 septembre 2010 - 13:25

Bonjour,

Voici la discussion officielle de la fiche n°3.

"Le Web regorge de ressources pour répondre à toutes vos questions. En voici une vue d’ensemble"

Bonne lecture !


#179 Un peu de pub : supporter le site

Posted by heyfeel sur 18 février 2009 - 11:27

Hello iPuP,


A titre purement informatif :
La pub logée dans la bannière iPuP, est et sera l'unique publicité du site : en espérant qu'elle ne gêne pas votre lecture.

Pourquoi mettre de la publicité ?
"Une geste pour la planète" vous connaissez ? :) Et bien, supporter le site iPuP fonctionne de la même manière. Si jamais vous voulez donner un petit coup de pouce au site, il vous suffit de cliquer :

sur la pub qui s'affiche sur la banière




Bien sûr, il n'y a rien d'obligatoire et c'est au bon vouloir de chacun ...  


Important : un seul clic suffit par 24h ! (les autres ne seront pas comptabilisés)


#10346 Tester son application sur son iphone sans payer la licence apple !

Posted by antho35 sur 16 février 2010 - 21:01

Pour ceux que ça intéresse m contacter par mail :-)

Bonjour,

En faite je voudrais savoir s'il existe un moyen de programmer des applications pour l'iphone sans forcément avoir de MAC. J'ai pas assez d'argent pour le moment je ne peux pas m'acheter de MAC pour l'instant mais j'ai pas envi de perdre de temps dans la programmation.

merci à vous :-)




#48343 CoreGraphics ou PNG?

Posted by tomy29 sur 05 mars 2013 - 10:52

Bonjour

 

Aux pro de CoreGraphics :

Je souhaite réaliser cette fleche

Est il judicieux d'utiliser Core Graphics ou plutot la dessiner sous GIMP par ex. ?

 

Merci.




#48096 [JEU] **NastySpider**

Posted by iSEBlog sur 13 janvier 2013 - 16:10

Bonjour,

NastySpider est un jeu de réflexion/action. Vous devez déployer la plus grande toile d'araignée et attraper les insectes pour nourrir l'araignée. NastySpider dispose de trois modes de jeux et la gestion des scores GameCenter.
C'est une application universelle compatible iPhone 3GS, iPhone 4, iPhone 5, iPod et iPad.

Bonne amusement :)

Lien:
https://itunes.apple...?l=fr&ls=1&mt=8

http://iseblog.blog.free.fr/

Codes promos:
N43LK3THMPP7
77AE7J36696A
ALHPKYJEN4XL


Image IPB


Image IPB


#44091 iTunes Connect permet (ENFIN) de changer la langue par défaut !

Posted by ipodishima sur 18 janvier 2012 - 10:11

iTunes Connect évolue !

Très bonne nouvelle ce matin ! iTunes Connect vient enfin de corriger un problème récurrent, surtout dans les pays non anglophones !

Avant : lorsque l’on créait une licence et qu’on soumettait notre première application, il nous était demandé de renseigner une langue par défaut que l’on ne pouvait changer … À quoi correspond cette langue ? C’est tout simplement la langue affichée par défaut dans les AppStores des pays pour lesquels vous n’avez pas fourni de traduction. En clair, vous mettiez français comme langue, si vous ne traduisiez pas en espagnol votre description, keywords, captures etc, alors les espagnols voyaient votre description en français …

Pas très pratique sachant qu’hors pays francophones, on est plus susceptible de comprendre l’anglais que le français … ! Il existait évidemment une solution mais qui prenait une bonne demi heure à mettre en place : mettre une description en anglais à la main pour toutes les traductions possibles sous iTunes Connect … Autant dire un travail rébarbatif dont on se passerait bien.

Il faut savoir en plus que le marché allemand par exemple est bien supérieur au marché français en Europe … Leur présenter une application en anglais est surement mieux qu’en Français … !

Il va sans dire que le minimum pour une application est d’être traduite en anglais + la langue dans laquelle vous développez.

Attention cependant, il faut bien distinguer ce problème de langue par défaut, de la langue de votre application. En effet, cette langue par défaut dans iTunes Connect ne concerne QUE les metadata de votre application dans l’App Store. Une fois que votre application est téléchargée sur un téléphone dans une langue X, c’est la valeur de la clé Localization native development region qui prend le dessus. Si votre application est traduite en français et en anglais, et si vous avez fr comme valeur, alors les espagnols auront votre application en français. Si vous mettez en, alors ils auront la version anglaise, etc.

Maintenant : nous pouvons changer la langue par défaut pour chaque application sur le store ! Quel gain de temps !

Pour cela, cliquez sur votre application, puis dans app informations, vous avez Edit. Enfin …

Image IPB

Voici le mail de iTunes Connect :

Dear …..

You can now edit the default language of your app’s metadata on iTunes Connect at the app level and it can be changed at any time. Customers are more likely to read about your app if they can do it in their native language, and we encourage you to translate your metadata for each of the countries in which you offer apps.

To edit the default language for an app, go to the Manage Your Applications module, then click Edit for your App Information. Any previously added localizations will be available for selection in the Default Language dropdown. If you wish to add a new localization to your app, you can do so from the App Localization section of your app’s version details page. Adding a new localization will require a binary update so that Apple can review it.

If you need assistance translating your metadata into additional languages, there are third party vendors who can provide internationalization and localization services for your app.

Regards,

The App Store team

Source : blog iPodishima


#25920 Universal Apps et le poids

Posted by GeorgioA sur 24 septembre 2010 - 09:58

Bonjour à tous.

Mon premier post ici est pour demander votre avis sur la question du poids des applis universelles.

Le soucis réside dans le poids des images. (le code est commun donc c'est un bon point).

Je viens de finir une appli pour iPad et une appli pour iPhone. Au final je me retrouve avec une applis iPad de 11Mo~ et iPhone 3Mo~.

Si je fais une appli unverselle, je vais me retrouver avec un applis de ~15 Mo.

Que pensez vous de cet embonpoint pour mes utilisateurs iPhone qui téléchargeront l'appli en 3G voir en EDGE....

Avez vous des solution pour ce genre de soucis?


#48805 Multiple TableView

Posted by touladi sur 17 mai 2013 - 13:21

Est-ce envisageable d'avoir jusqu'a 10 tableviews (environ 60 px de large chacun) en même temps dans la même view? Les 10 font des requêtes SQLite. J'imagine que non parce que trop demandant au point de vue ressource... Qu'en pensez-vous?




#48778 Les jeux de TonTon : ArbroMonstres

Posted by Paisible sur 10 mai 2013 - 12:41

Bonjour,

 

Le 1er opus de la série "Les jeux de TonTon" est disponible sur l'iTunes Store.

 

Il s'intitule ArbroMonstres et il s'agit d'un jeu ludo-éducatif ayant pour objectif d'accompagner les enfants de 4-6 ans dans leur apprentissage des formes, couleurs et dimensions de manière ludique et récréative.

 

ArbroMonstres.png

 

A télécharger sur : http://bit.ly/133z6Wc

Miniature(s) jointe(s)

  • 2013-05-04 13.22.10.png
  • 2013-05-04 13.22.34.png
  • 2013-05-04 13.22.39.png



#25931 Récupérer les codes sources du livre

Posted by ipodishima sur 24 septembre 2010 - 11:55

Bonjour à tous,

Si vous souhaitez récupérer les codes sources du livre, il y a plusieurs étapes à respecter :). Ce n'est pas pour vous embêter, juste pour s'assurer que le travail que nous avons fourni serve à quelque chose !

- Acheter le livre ! Et oui, cela paraît logique
- Vous inscrire sur le forum
- [nospam=livre@ipup.fr]Nous écrire un mail ici[/nospam] avec ce format :
Objet : Achat du livre - codes sources - Pseudo
Message : Ce que vous voulez :)
Il est important de nous donner votre pseudo lors de l'inscription

Ensuite, nous recevrons un mail, auquel nous répondrons dans un délai de 1-2 jours maximum pour vous poser une question ! Si c'est une bonne réponse, à vous les codes sources !

+


#25828 Fiche 5 — Coder quelques éléments simples

Posted by ipodishima sur 23 septembre 2010 - 13:27

Bonjour,

Voici la discussion officielle de la fiche n°5.

Bonne lecture !


#1784 Docs pour les nuls : Jouer un fichier Audio

Posted by Jennifer75a sur 03 mai 2009 - 19:42

Bonjour,

Documentation pas à pas inspirée du Tutoriel n°11 du site http://www.ipup.fr

mon site : http://web.me.com/jennifer.aubinais/

Jennifer


#1170 un site testeur d'applications ...

Posted by heyfeel sur 07 avril 2009 - 19:44

Ce n'est pas un coup de pub que j'effectue en ce moment même, mais plutôt un partage d'un petit coup de coeur pour ce site très intéressant.
Ce site se charge de tester un grand nombre d'applications, et de les juger : je le trouve, simple, beau et fonctionnel ... donc pourquoi pas vous ?!

lien : http://www.applicationiphone.com/


L'intérêt est aussi de dénicher quelques belles trouvailles qui seraient vouées à suffoquer dans les profondeurs de l'App Store sans un bon test poussé (comme ceux proposés par ce site).


#117 Exercice du tutoriel n°5

Posted by ipodishima sur 17 février 2009 - 22:54

Pour approfondir un peu (beaucoup :rolleyes: je l'avoue) le tuto 5, vous allez faire quelque chose ressemblant à ça :
Image IPB
Image IPB

Enoncé :

Ajouter un textField à votre UIImageView, autoriser les interactions pour cette vue(cocher "User Interaction Enabled")
Image IPB

Il vous faudra aller chercher dans les propriétés du textField pour que "Enter" soit "Done", mettre par défaut un clavier numérique, ...

Bon courage...

Pour vous aider :

Pour convertir un NSString en Integer :
// déclaration du NSInteger dans le .h
NSInteger indexTextField;

//dans le .m
//Conversion du chiffre dans le TextField en Integer
indexTextField = [[monTextField text]integerValue];
Vous avez réussi?

Compliquons un peu la chose en faisant ceci :
Image IPB

Le textField à droite vous permet d'ajouter un objet à la fin du tableau.

Aide : n'oubliez pas de réécrire dans votre fichier texte après avoir ajouté l'élément dans le tableau!

Les solutions sont ici :
Sources Exo 1 et Exo 2. Mais, pour progresser, rien ne vaut le fait de s'y mettre et patauger!

NB : dans les sources, suite à une remarque très pertinente de Bidou, j'ai changé la gestion du numéro d'index/objet à afficher


#1 Tutoriel n°1 : Pour commencer ...

Posted by ipodishima sur 14 février 2009 - 17:07

En guise d'introduction de notre série de tutoriels, j'ai la lourde tâche de te donner l'envie et les outils qui feront de toi un développeur iPhone de génie, un Mac Addict. Et qu'on se le dise tout de suite, quiconque entre dans l'univers Mac, de prêt ou de loin, tombe instinctivement sous le charme de la célèbre firme à la pomme croquée. ;)
Trêve de propagande, attelons nous aux pré-requis du parfait développeur iPhone.
Image IPB

1) Le matériel : un Mac, Xcode et le SDK d'Apple

° un Mac
Sans aucun détour je t'annonce que pour programmer sur iPhone, il te faut absolument un Mac qui soit au minimum basé sur une architecture Intel.(amateurs de PC passez votre chemin ou faites comme moi et faites vous offrir un Mac :cool:). Et si Steve Jobs était là, il dirait sûrement que plus ton Mac est récent, et mieux c'est !

° Xcode
Maintenant que tu as ton Mac entre les mains,  tu auras besoin de XCode. Ce logiciel fort utile pour nous est présent dans le CD d'installation de Mac OS. Bien sûr, je ne te fais pas l'offense de spécifier qu'il est fourni par Apple et qu'il te permet de développer confortablement ton code (Xcode est à l'Objective-C ce qu'Eclipse est au Java).
Aide : le dossier développeur est mis par défaut dans le répertoire "Macintosh HD". Il contient tous les logiciels de la suite "developer".

° SDK Apple
Génial tout ça, mais sans un bon SDK tu ne peux toujours pas coder :P. Il faut donc installer le SDK d'Apple sur ton Mac au plus vite.
"Monsieur, Monsieur c'est quoi un SDK ?" J'ai envie de te répondre simplement qu'un SDK est une grande bibliothèque dans laquelle tu as des fonctions toutes faites et prêtes à l'emploi.
Téléchargement du SDK : crée un compte ici, ou utilise ton compte Itunes par exemple. Clique sur "ADC Member Site"

Image IPB


Deux options s'offrent à toi. Soit télécharger le SDK gratuitement et développer tes applications uniquement sur simulateur, soit payer la licence pour mettre tes applications sur iPhone ou iPod Touch. (Dans un premier temps, le simulateur devrait suffire et c'est ton porte-monnaie qui te dira merci)
Ici pour télécharger ce fameux SDK.
Super ! A te voir comme ça, on dirait vraiment un développeur iPhone. :cool:


Mais d'ailleurs, sais-tu au moins quelle est l'utilité de programmer des applications pour iPhone ?
En premier lieu, je dirais que c'est toujours enrichissant de connaître un nouveau langage de programmation. Bon d'accord, j'avoue que c'est surtout super excitant de mettre au point sa propre application et de pouvoir l'exporter sur son iPhone et celui de ses potes. (tout de suite ça te rend plus populaire). Mais tu l'as deviné, programmer sur iPhone c'est aussi un effet de mode grâce auquel tu peux peut-être gagner un peu (beaucoup) d'argent de poche, à condition d'être bon mais ça tu l'es déjà ! :)

Car l'iPhone c'est ...
Un téléphone portable, et jusque là rien d'extraordinaire. Sauf que celui-ci est bourré de haute technologie : 3G pour l'internet, Multi-Touch pour un univers entièrement tactile, GPS pour une localisation en temps réel, accéléromètre, fonctions audio de l'iPod,  appareil photo numérique, ... et tout ça dans un seul appareil :P . D'autant plus qu'il est doté d'un processeur plus performant que celui d'une Nintendo DS ou d'une PSP. (Même 007 est à la traîne avec ces vieux portables japonais) Je te laisse donc imaginer toutes les possibilités qui s'offrent à toi, futur développeur d'applications sur iPhone.
Et au cas où tu n'arriverais vraiment pas à bien visualiser le panel de possibilités, je te laisse baver sur ces quelques exemples.

Image IPB

Image IPB

Image IPB


Pas besoin de se la jouer, car pour l'instant tu ne sais même pas quel langage de programmation tu vas utiliser pour coder tes futures applications. :lol:



2) Le langage de programmation : l'Objective-C

On va parler un peu de l'environnement de développement dans lequel tu vas être plongé à partir de ce jour. Sur le site développeur d'Apple, tu trouveras une mine de ressources : documentations très fournies, exemples de Code, ... Evidemment tous ces supports sont en anglais (je sens comme une atmosphère pesante d'un coup), mais comme tu es un super développeur, l'anglais technique ne te fait pas peur ! :D
On en vient directement à ce qui nous intéresse ici : pour développer sur iPhone, tu auras besoin d'apprendre, entre autres, l'Objective-C.

Qu'est ce que l'objective-C ?
Comme je suis un peu de la jeune génération qui adule wikipedia, voici un petit aperçu de ce qu'est l'Objective-C sur wikipedia.

Très très très important : ton apprentissage de l'Objective-C sera facilité si tu as au préalable des notions de C++ et Java (le langage Objet en général). Si tu es totalement novice en programmation, pas de panique! ;) L'équipe iPuP t'invite de ce pas à visiter ce site, le site du zéro, où tu trouveras les meilleurs cours pour débuter en C/C++/Java et autres langages exotiques.
Et pour les plus connaisseurs, je les invite à aller dans la section "Lectures utiles et autres supports" du forum pour y trouver des documents faisant l'analogie entre Objective-C et C++/Java. Je vous assure que ça aide énormément !


Ce tutoriel d'introduction est enfin terminé. La prochaine étape de ton apprentissage se situe au niveau 2.
Merci de ton attention et bons débuts en programmation iPhone.



Heyfeel

version imprimable


#2434 Tutoriel n°14 : Utiliser SQLite

Posted by Bidou sur 27 mai 2009 - 15:51

Pour ce 14ème tutoriel, nous allons voir comment lire et écrire dans une base de données grâce à sqlite.
Afin d'essayer de rendre ce tutoriel utile au plus grand nombre, j'ai décidé de montrer comment enregistrer le score d'un joueur puis afficher les trois meilleurs dans des labels.

Nous obtiendrons ceci :
Image IPB

Pour expliquer rapidement, on peut entrer le nom du joueur dans un textfield, générer un score avec un bouton puis enregistrer et actualiser les meilleurs scores.

[titre] 1) Créer le fichier sqlDatabase.sql [/titre]

C'est ce fichier qui va contenir physiquement la base de données. On pourra ensuite le lire, le trier et l'éditer.
Pour le créer, il faut utiliser le Terminal (spotlight->"terminal"). Placez-vous dans le dossier désiré et pour créer le fichier voici les commandes nécessaires :

  //création du fichier
sqlite3 sqlDatabase.sql

//création de la Base de Données (BDD)
CREATE TABLE score ( id INTEGER PRIMARY KEY, nom VARCHAR(50), scoreValue INT);
INSERT INTO score (nom, scoreValue) VALUES ('iPodishima', '5');
INSERT INTO score (nom, scoreValue) VALUES ('Heyfeel', '4');
INSERT INTO score (nom, scoreValue) VALUES ('Aurel', '3');
INSERT INTO score (nom, scoreValue) VALUES ('Bidou', '2');
Il faut maintenant mettre ce fichier dans les ressources d'un nouveau projet Xcode View-Based application nommé Score. Faire "copy items into destination group's folder".

[titre] 2) Édition du projet et interface builder[/titre]

Tout d'abord il faut importer le framework sqlite qui n'est pas vraiment aussi simple que les autres à ajouter : Faire "add->existing frameworks" ensuite avec le Finder cherchez un fichier qui se nomme “libsqlite3.0.dylib”. Si vous en trouvez plusieurs, le bon est celui qui se trouve ici :
“/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/usr/lib/”
Il suffit ensuite de l'ajouter.

Image IPB

Les déclarations de l'interface Builder dans ScoreViewController.h
@interface ScoreViewController : UIViewController <UITextFieldDelegate> {
	IBOutlet UILabel *lblScore;
	IBOutlet UILabel *mScoreUn;
	IBOutlet UILabel *mScoreDeux;
	IBOutlet UILabel *mScoreTrois;
	IBOutlet UITextField *textField;
}
ScoreViewController.m

int scoreI=0;

-(BOOL)textFieldShouldReturn:(UITextField *)leTextField {
	if (leTextField == textField )
	{
		[textField resignFirstResponder];
	}
	return YES;
}

-(IBAction)incrementScore:(id)sender{
	scoreI++;
	//Affichage du score
	lblScore.text = [[NSString alloc] initWithFormat:@"Score = %d",scoreI] ;
}

-(IBAction)incrementScore:(id)sender{
	scoreI++;
	//Affichage du score
	lblScore.text = [[NSString alloc] initWithFormat:@"Score = %d",scoreI] ;
}
[titre] 3) Lecture dans dans base[/titre]

Il faut commencer par créer une nouvelle classe "NSObject subclass" nommée Score.
Cette classe va nous permettre de créer un objet Score qui contiendra les valeurs de la BDD.

Score.h
#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface Score : NSObject {
	NSInteger primaryKey;
	NSString *nom;
	NSInteger scoreValue;
}

@property (assign, nonatomic, readonly) NSInteger primaryKey;
@property (nonatomic, retain) NSString *nom;
@property (assign, nonatomic, readonly) NSInteger scoreValue;

-(id)initWithName:(NSString *)n scoreValue:(NSInteger )s;

@end
Score.m
#import "Score.h"
@implementation Score
@synthesize nom,
			scoreValue,
			primaryKey;

-(id)initWithName:(NSString *)n scoreValue:(int )s {
	self.nom = n;
	scoreValue = s;
	return self;
}

@end
Il faut maintenant créer une nouvelle classe NSObject subclass qui va permettre d'administrer la BDD. Vous pouvez la nommer SQLmanager :  je me suis servi du tutoriel disponible ici auquel j'ai ajouté l'écriture comme on le verra par la suite.

SQLmanager.h
#import <Foundation/Foundation.h>
#import <sqlite3.h>	// Import du framework sqlite
#import "Score.h"	// Import de l'objet Score

@interface SQLManager : NSObject {
	// Variables de la Base de Données
	NSString *databaseName;
	NSString *databasePath;
	
	// Tableau de Scores
	NSMutableArray *scores;	
}

@property (nonatomic, retain) NSMutableArray *scores;

-(id) initDatabase;
-(void) checkAndCreateDatabase;
-(void) readScoresFromDatabase;

@end
SQLmanager.m
#import "SQLManager.h"


@implementation SQLManager
@synthesize scores;

-(id) initDatabase{
	//On définit le nom de la base de données
	databaseName = @"sqlDatabase.sql";
	
	// On récupère le chemin 
	NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDir = [documentPaths objectAtIndex:0];
	databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
	
	return self;
}

-(void) checkAndCreateDatabase{
	// On vérifie si la BDD a déjà été sauvegardée dans l'iPhone de l'utilisateur
	BOOL success;
	
	// Crée un objet FileManagerCreate qui va servir à vérifer le status
	// de la base de données et de la copier si nécessaire
	NSFileManager *fileManager = [NSFileManager defaultManager];
	
	// Vérifie si la BDD a déjà été créée  dans les fichiers system de l'utilisateur
	success = [fileManager fileExistsAtPath:databasePath];
	
	// Si la BDD existe déjà "return" sans faire la suite
	if(success) return;
	
	// Si ce n'est pas le cas alors on copie la BDD de l'application vers les fichiers système de l'utilisateur
	
	// On récupère le chemin vers la BDD dans l'application
	NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
	
	// On copie la BDD de l'application vers le fichier systeme de l'application
	[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
	
	[fileManager release];
}

-(void) readScoresFromDatabase {
	// Déclaration de l'objet database
	sqlite3 *database;
	
	// Initialisation du tableau de score
	scores = [[NSMutableArray alloc] init];
	
	// On ouvre la BDD à partir des fichiers système
	if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
				// Préparation de la requête SQL qui va permettre de récupérer les objets score de la BDD
                                //en triant les scores dans l'ordre décroissant
		const char *sqlStatement = "select * from score ORDER BY scoreValue DESC";
		
		//création d'un objet permettant de connaître le status de l'exécution de la requête
		sqlite3_stmt *compiledStatement;
		
		if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
			// On boucle tant que l'on trouve des objets dans la BDD
			while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
				// On lit les données stockées dans le fichier sql
				// Dans la première colonne on trouve du texte que l'on place dans un NSString
				NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
				// Dans la deuxième colonne on récupère le score dans un NSInteger
				NSInteger aScore = sqlite3_column_int(compiledStatement, 2);
				
				// On crée un objet Score avec les pramètres récupérés dans la BDD
				Score *score = [[Score alloc] initWithName:aName scoreValue:aScore];
				
				// On ajoute le score au tableau
				[scores addObject:score];
				[score release];
			}
		}
		// On libère le compiledStamenent de la mémoire
		sqlite3_finalize(compiledStatement);
		
	}
	//On ferme la BDD
	sqlite3_close(database);
	
}


@end
Nous allons maintenant voir comment utiliser ce code en réalisant l'affichage des trois meilleurs scores.

Dans le ScoreViewController.m
#import "ScoreViewController.h"
#import "ScoreAppDelegate.h"
#import "Score.h"
#import "SQLManager.h"

@implementation ScoreViewController

- (void)viewDidLoad {
	[super viewDidLoad];
	// initialisation de la BDD
	sqlManager = [[SQLManager alloc] initDatabase];
	//Vérification et création de la BDD
	[sqlManager checkAndCreateDatabase];
	//Lecture des scores et création du tableau
	[sqlManager readScoresFromDatabase];
	//On appelle l'affichage dans les labels
	[self afficherScore];

}

-(void)afficherScore{
	//On affiche les trois premiers scores du tableau
	//création d'un objet score qui est égal au premier du tableau
	Score *score = (Score *)[sqlManager.scores objectAtIndex:0];
	//on écrit dans le label le nom et le scoreValue du premier Score du tableau, c'est le meilleur puisqu'on a trié dans l'ordre décroisant
	mScoreUn.text = [score.nom  stringByAppendingString: [[NSString alloc] initWithFormat:@"\t \t %d points", score.scoreValue]];
	score = (Score *)[sqlManager.scores objectAtIndex:1];
	//même chose pour le deuxième et le troisième Score
	mScoreDeux.text = [score.nom  stringByAppendingString: [[NSString alloc] initWithFormat:@"\t \t %d points", score.scoreValue]];
	score = (Score *)[sqlManager.scores objectAtIndex:2];
	mScoreTrois.text = [score.nom  stringByAppendingString: [[NSString alloc] initWithFormat:@"\t \t %d points", score.scoreValue]];
}
Dans ScoreViewController.h il faut déclarer un SQLManager :
SQLManager *sqlManager;
[titre] 4) Ecriture dans dans base[/titre]

Il faut ajouter une méthode au SQLManager

- (void)insertIntoDatabase:(Score*)newScore {
	
	//initialisiation de la BDD
	[self initDatabase];
	
	//Vérification de la BDD
	[self checkAndCreateDatabase];
	
	// Déclaration de l'objet database
	sqlite3 *database;
	// On ouvre la BDD à partir des fichiers système
	if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
		// Préparation de la requête SQL qui va permettre d'ajouter un score à la BDD		
		NSString *sqlStat = [[[NSString alloc] initWithFormat:@"INSERT INTO score (nom, scoreValue) VALUES ('%@', '%d');",newScore.nom, newScore.scoreValue] autorelease];
		//Ici c'est pas génial comme méthode donc si vous trouvez mieux je suis prenneur
		const char *sqlStatement = [sqlStat cStringUsingEncoding : [NSString defaultCStringEncoding]];
		//On utilise sqlite3_exec qui permet très simplement d'exécuter une requète sur la BDD
		sqlite3_exec(database, sqlStatement,NULL,NULL,NULL);
	}
	sqlite3_close(database);
}
Et on ajoute l'appel dans le ScoreViewController

-(IBAction)saveScore:(id)sender{
	Score *score = [[Score alloc] initWithName:textField.text scoreValue:scoreI];
	[sqlManager insertIntoDatabase:score];
	[sqlManager readScoresFromDatabase];
	[self afficherScore];
}
[titre]conclusion[/titre]
Si ça fonctionne "Well Done" sinon vous pouvez vous aider des sources et venir poser vos questions sur le forum.

Bidou


#2154 Tutoriel n°6 : Débuter avec la gestion des vues

Posted by Jennifer75a sur 18 mai 2009 - 16:36

Coucou,

Qu'en penses-tu ?? J'ai trouvé cela sur le net
**************************************************************************
Ce problème a été évoqué dans la liste Apple cocoa-dev :
suivant la manière dont la vue est définie dans InterfaceBuilder initWithFrame sera ou non appelé.
Si l'on part d'une CustomView et que l'on change sa classe en la sous-classe de NSOpenGLView que l'on vient de définir alors initWithFrame sera appelé et il faudra initialiser correctement le contexte OpenGL (le pixel format), par contre si l'on crée la vue comme une NSOpenGLView et que l'on change ensuite sa classe c'est seulement init qui est appelé mais tout ce qui concerne le pixel format est initialisé automatiquement selon les paramètres définis dans InterfaceBuilder.

Donc,
soit supprime ta vue dans IB, place une CustomView à sa place, change sa classe et recrée les liens nécessaires
soit oublie initWithFrame et met ton code ailleurs...
**************************************************************************

Jennifer


#1759 Tutoriel OpenGL ES 4 - S'amuser avec un cube !

Posted by ipodishima sur 03 mai 2009 - 13:04

Bonjour,

Pour ce quatrième tuto, nous allons nous amuser un peu et mettre en pratique ce que nous avons appris jusqu'à maintenant.
Le but, arriver à ceci :

Image IPB

Nous allons créer un cube que nous pourrons déplacer, tourner et grossir avec nos doigts...

Prêt ? C'est parti !

1) Créons notre cube


Partons de ce source. Enlevez tout ce qui ne sert pas au cube.
Lancez, vous devriez obtenir ceci :
Image IPB

Ensuite, on va centrer notre carré au centre.
glTranslatef(0.0, 0.0, -5.0);
Au final, notre méthode drawView devrait ressembler à ça :

- (void)drawView {
	
	const GLfloat cubeVertices[] = {
        
        // face de devant
        -1.0, 1.0, 1.0,             
        -1.0, -1.0, 1.0,           
        1.0, -1.0, 1.0,             
        1.0, 1.0, 1.0,              
        
        // haut
        -1.0, 1.0, -1.0,           
        -1.0, 1.0, 1.0,             
        1.0, 1.0, 1.0,              
        1.0, 1.0, -1.0,             
        
        // arrière
        1.0, 1.0, -1.0,         
        1.0, -1.0, -1.0,           
        -1.0, -1.0, -1.0,           
        -1.0, 1.0, -1.0,            
        
        // dessous
        -1.0, -1.0, 1.0,
        -1.0, -1.0, -1.0,
        1.0, -1.0, -1.0,
        1.0, -1.0, 1.0,
        
        // gauche
        -1.0, 1.0, -1.0,
        -1.0, 1.0, 1.0,
        -1.0, -1.0, 1.0,
        -1.0, -1.0, -1.0,
        
        // droit
        1.0, 1.0, 1.0,
        1.0, 1.0, -1.0,
        1.0, -1.0, -1.0,
        1.0, -1.0, 1.0
    };  
	
	const GLshort cubeTextureCoords[] = {
		// devant
        0, 1,     
        0, 0,     
        1, 0,      
        1, 1,     
        
        // dessus
        0, 1,    
        0, 0,      
        1, 0,     
        1, 1,     
        
        // derrière
        0, 1,     
        0, 0,      
        1, 0,     
        1, 1,     
        
        // dessous
        0, 1,    
        0, 0,      
        1, 0,     
        1, 1,    
        
        // gauche
        0, 1,   
        0, 0,      
        1, 0,       
        1, 1,       
        
        // droite
        0, 1,      
        0, 0,       
        1, 0,       
        1, 1,       
    };
	
    [EAGLContext setCurrentContext:context];    
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);
	
	/*************** Debut du nouveau code ******************/
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	glMatrixMode(GL_MODELVIEW);
	
	// dessin du cube
	glLoadIdentity();
	glTranslatef(0.0, 0.0, -5.0);
	glRotatef(rotation, 0.0, 1.0, 0.0);

	glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
	glEnableClientState(GL_VERTEX_ARRAY);
	
	glTexCoordPointer(2, GL_SHORT, 0, cubeTextureCoords); // nouvelle ligne
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);		  // nouvelle ligne
	
	glColor4f(0.0, 0.0, 0.8, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
	
	glColor4f(0.0, 0.8, 0.0, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 4, 4);
	
	glColor4f(0.8, 0.0, 0.0, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 8, 4);
	
	glColor4f(0.8, 0.0, 0.8, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 12, 4);
	
	glColor4f(0.8, 0.8, 0.8, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 16, 4);
	
	glColor4f(0.8, 0.8, 0.0, 1.0); // R V B Alpha
    glDrawArrays(GL_TRIANGLE_FAN, 20, 4);
	
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	rotation += 1.0;
	
	/*************** Fin du nouveau code ********************/ 
	
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
2) Faisons le tourner

Pour faire tourner le cube, nous allons utiliser la méthode

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	
}
Cette méthode sera appelée automatiquement lorsque un ou plusieurs de vos doigts touchera l'écran.
Il faut maintenant l'implémenter :

Ajoutez

// On récupère les informations du touch
	UITouch *touch = [[touches allObjects] objectAtIndex:0];
	
	CGPoint location = [touch locationInView:touch.view];
	CGPoint previousLocation = [touch previousLocationInView:touch.view];
Les deux dernières lignes permettent de créer :
- un point (location) qui contient les données de l'endroit où on touche
- un autre point (previousLocation) correspondant à l'endroit où on a touché la dernière fois notre vue.

Notez qu'ici, on n'a qu'une vue. On prend donc en compte n'importe quelle touche sur l'écran entier. On peut choisir de gérer les touches sur vue spécifiée :
if([touch view] == cubeView)
{
// faire quelque chose pour cette vue
}
Revenons à nos moutons ! :D

Ajoutez ces lignes :

GLfloat difLocationX, difLocationY;
	difLocationX = (location.x - previousLocation.x);
	difLocationY = (location.y - previousLocation.y);
Elles nous permettent d'avoir la différence... Laquelle ?

Gardez à l'esprit que cette méthode est appelée à chaque fois qu'un de vos doigts sur l'écran bouge.  Vous aurez donc un delta de votre déplacement.

Notez que nous créons des GLfloat pour maximiser la compatibilité avec OpenGL.

Il nous faut utiliser ceci pour faire une rotation de l'objet :

Définir deux variables dans le .h :
GLfloat xRotate, yRotate;
NB : dans le source fourni, ces variables sont déjà définies !

Continuez d'ajouter ces lignes dans le .m, toujours dans la même méthode :
xRotate += difLocationX;
	yRotate += difLocationY;
	// On met à jour l'affichage
	[self drawView];
Remarquez que l'on écrit xRotate = xRotate + difLocationX car on souhaite avoir le delta de tout le mouvement, et non pas d'un fragment du mouvement donné par difLocationX. De plus, cela nous permet de garder la valeur précédente de la rotation. Si vous ne comprenez pas, remplacez :
xRotate += difLocationX;
	yRotate += difLocationY;
	// On met à jour l'affichage
	[self drawView];
par

xRotate = difLocationX;
	yRotate = difLocationY;
	// On met à jour l'affichage
	[self drawView];
Maintenant, retour dans la méthode drawView :

Remplacer le [c]glRotatef(rotation, 0.0, 1.0, 0.0);[/c]

Par :
glLoadIdentity();
	glTranslatef(0.0, 0.0, -5.0);
	glRotatef(xRotate, 0.0, 1.0, 0.0); // nouvelle ligne
	glRotatef(yRotate, 1.0, 0.0, 0.0); // nouvelle ligne
Prenons la première nouvelle ligne : on demande à OpenGL de faire une rotation de l'objet de la valeur xRotate. Si ce qui est écrit ne vous semble pas logique, voici coment j'ai raisonné pour nommer ma variable : un mouvement sur l'axe x va me faire tourner l'objet autour de l'axe y. D'où le nom xRotate qui me fait tourner l'objet autour de l'axe y (glRotatef(xRotate, 0.0, 1.0, 0.0).

Petit problème : si vous mettez deux doigts (alt + clic sur simulateur), vous faites aussi tourner votre cube... Or, ce n'est pas ce que l'on veut !

Il nous faut donc modifier notre méthode comme suit :
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	// On récupère les informations sur la touche
	UITouch *touch = [[touches allObjects] objectAtIndex:0];
	

	CGPoint location = [touch locationInView:touch.view];
	CGPoint previousLocation = [touch previousLocationInView:touch.view];
	
	CGFloat difLocationX, difLocationY;
	difLocationX = (location.x - previousLocation.x);
	difLocationY = (location.y - previousLocation.y);
	
	// si un doigt -> on fait rotation
	if([touches count] == 1) {
		xRotate += difLocationX;
		yRotate += difLocationY;
		// On met à jour l'affichage
	        [self drawView];
	}
}
Lancez, ... Ca ne marche pas ? Rooo. Il faut aller dans IB, en ouvrant MainWindow.xib, puis cliquez dans la fenêtre et autorisez le multitouch :
Image IPB

Et voilà !

3) Déplaçons-le

Nous allons déplacer de la même manière que la rotation notre cube. Nous autoriserons la rotation lorsque l'utilisateur double tapera sur l'écran.

Dans la méthode touchesMoved, on ajoute cette ligne :
NSInteger nombreTap = [touch tapCount];
Elle nous renvoie le nombre de tapes réalisées par l'utilisateur.

Ensuite, ajouter
if (nombreTap == 2)
	{
		xTranslation += difLocationX;
		yTranslation += difLocationY;
		// On met à jour l'affichage
		[self drawView];
	}
N'oubliez pas de définir [c]xTranslation[/c] et [c]yTranslation[/c] dans votre .h !

Retournez dans la méthode drawView, et modifiez

[c]glTranslatef(0.0, 0.0, -5.0);[/c]

par

[c]glTranslatef(xTranslation, yTranslation, -5.0);[/c]

Compilez, lancez, double cliquez et déplacez votre souris ou doigt, c'est selon... Votre cube bouge ! un peu vite... Qu'à cela ne tienne, dans votre .m :
#define USE_DEPTH_BUFFER 1
#define DEGREES_TO_RADIANS(__ANGLE) ((__ANGLE) / 180.0 * M_PI)
#define kNombrePas 40.0 // nouvelle ligne
et modifiez :
if (nombreTap == 2)
	{
		xTranslation += difLocationX / kNombrePas; // cette ligne
		yTranslation += difLocationY / kNombrePas; // cette ligne
		// On met à jour l'affichage
		[self drawView];
	}
Lancez, votre cube reste plus longtemps dans l'écran !

Notez que votre cube ne suit pas votre doigt... Pour ce faire :
glTranslatef(xTranslation, [b]-yTranslation[/b], -5.0);
4) Zoom - dézoom

Si on met deux doigts sur l'écran, et que l'on fait le mouvement du zoom dézoom, on souhaite modifier la taille de l'objet. Nous allons donc voir une nouvelle fonction : [c]glScale()[/c]. Mais tout d'abord, il nous faut modifier quelque peu notre code.

  1. Corrigeons nos erreurs

Je ne sais pas si vous avez remarqué, mais nous avons fait quelque chose de pas propre du tout... Si vous ne le voyez pas, c'est le bon moment pour en prendre conscience ! :lol:

En fait, lorsque vous déplacez votre cube, vous pouvez observer qu'il tourne en même temps. Ce n'est pas voulu du tout ! :D

Cela vient de nos tests, voici le déroulement de notre méthode touchesMoved :

[c]Si un doigt sur l'écran alors rotation

Si double tap sur l'écran alors déplacement[/c]


Mais si on fait un double tap avec un doigt. Laquelle des deux conditions va être prise en compte ? Ben on ne sait pas vraiment.

Il nous faut donc réécrire nos conditions avec une architecture switch ... case comme suit :
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	// On récupère les informations sur la touche
	UITouch *touch = [[touches allObjects] objectAtIndex:0];	
	
	CGPoint location = [touch locationInView:touch.view];
	CGPoint previousLocation = [touch previousLocationInView:touch.view];
	
	CGFloat difLocationX, difLocationY;
	difLocationX = (location.x - previousLocation.x);
	difLocationY = (location.y - previousLocation.y);
	
	switch ([touches count]) {
			
		case 1: { //Single touch
			
			switch ([touch tapCount])
			{
				case 1: {//Single Tap.
					xRotate += difLocationX;
					yRotate += difLocationY;
					// On met à jour l'affichage
					[self drawView];
				} break;
				case 2: {
					xTranslation += difLocationX / kNombrePas;
					yTranslation += difLocationY / kNombrePas;
					// On met à jour l'affichage
					[self drawView];
				} break;
			}
		}break;
			
		case 2: { //Double Touch
			
			switch ([touch tapCount])
			{
				case 1: //Single Tap.
				{
			
				} break;
				case 2: {//Double tap. 
					
				} break;
					
					
			}
		} break;
			
		default:
			break;
	}
	
}
Compilez et lancez, tout de suite ça va mieux !

  2. Récupérer la distance initiale entre vos deux doigts

Pour calculer notre facteur de zoom, il faut déjà connaître la distance initiale entre nos deux doigts lorsqu'ils touchent l'écran.
Voyez le déroulement d'un événements :
Image IPB

source Apple


Il va donc falloir implémenter la méthode
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
	
}
Créons une méthode permettant de donner la distance entre 2 points :
- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint {
	
	float x = toPoint.x - fromPoint.x;
	float y = toPoint.y - fromPoint.y;
	
	return sqrt(x * x + y * y);
}
Ne pas oublier de la déclarer dans le .h. Je ne pense pas avoir besoin d'expliquer ce qu'il se passe ici. C'est du pythagore tout simplement ! sqrt() renvoi la racine carrée.

Implémenter touchesBegan comme suit :
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
	
	// On prend le premier doigt qui touche
	UITouch *touch = [[touches allObjects] objectAtIndex:0];
	
	switch ([touches count]) {
		
		case 1: { //Single touch
			
			switch ([touch tapCount])
			{
				case 1: {//Single Tap.
					
				} break;
				case 2: {
					
				} break;
			}
		}break;
			
		case 2: { //Double Touch
			
			switch ([touch tapCount])
			{
				case 1: //Single Tap.
				{
					//Recuperer la distance entre les deux doigts
					UITouch *touch2 = [[touches allObjects] objectAtIndex:1]; // deuxieme doigt qui touche
					
					initialDistance = [self distanceBetweenTwoPoints:[touch locationInView:touch.view] 
															 toPoint:[touch2 locationInView:touch2.view]];
				} break;
				case 2: {//Double tap. 
					
				} break;
					
					
			}
		} break;
			
		default:
			break;
	}
	
}
Déclarer initialDistance dans le .h

  3. Zoomez !

Modifiez touchesMoved comme suit
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	// On récupère les informations sur la touche
	UITouch *touch = [[touches allObjects] objectAtIndex:0];	
	
	CGPoint location = [touch locationInView:touch.view];
	CGPoint previousLocation = [touch previousLocationInView:touch.view];
	
	CGFloat difLocationX, difLocationY;
	difLocationX = (location.x - previousLocation.x);
	difLocationY = (location.y - previousLocation.y);
	
	switch ([touches count]) {
			
		case 1: { //Single touch
			
			switch ([touch tapCount])
			{
				case 1: {//Single Tap.
					xRotate += difLocationX;
					yRotate += difLocationY;
					// On met à jour l'affichage
					[self drawView];
				} break;
				case 2: {
					xTranslation += difLocationX / kNombrePas;
					yTranslation += difLocationY / kNombrePas;
					// On met à jour l'affichage
					[self drawView];
				} break;
			}
		}break;
			
		case 2: { //Double Touch
			
			switch ([touch tapCount])
			{
				case 1: //Single Tap.
				{
					UITouch *touch2 = [[touches allObjects] objectAtIndex:1];
					
					CGFloat finalDistance = [self distanceBetweenTwoPoints:[touch locationInView:touch.view]
											 
																   toPoint:[touch2 locationInView:touch2.view]];
					
					// (kNombrePas * kNombrePas) pour zoomer moins vite
					scale += (finalDistance - initialDistance) / (kNombrePas * kNombrePas);
					
					[self drawView];
				} break;
				case 2: {//Double tap. 
					
				} break;
					
					
			}
		} break;
			
		default:
			break;
	}
	
}
Créer une variable CGfloat scale dans votre .h. L'initialiser à 1.0 dans setupView.

Dans notre méthode drawView, on va utiliser cette fameuse nouvelle méthode :

[c]glScalef(GLfloat x, GLfloat y, GLfloat z)[/c]

Cette méthode nous permet de faire un zoom sur l'objet. Comme nous souhaitons garder les proportions de notre objet, nous allons appliquer le même facteur sur x, y et z :

[c]glScalef(scale, scale, scale)[/c]
// dessin du cube
	glLoadIdentity();
	glTranslatef(xTranslation, -yTranslation, -5.0);
	glRotatef(xRotate, 0.0, 1.0, 0.0);
	glRotatef(yRotate, 1.0, 0.0, 0.0);
	
	if(scale > 0.0)
		glScalef(scale, scale, scale);
	else
		glScalef(0.0, 0.0, 0.0); // pour faire disparaitre quand on arrive "au bout"
	
	glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
// suite ...
Et bien voilà... Ce tutoriel est fini, j'espère qu'il vous a été utile et qu'il vous a permis de souffler dans ce monde de brute...

sources

exercice

A bientôt !

Ipodishima