Hello Friends
Today I will show you how to save data in cocos2D android in a database and reload it when the game starts.
This has been always a problem withe game developers for cocos2D android.
I will show you a way to save almost any number of data in a database using SQlite in android.
Check these examples for how to use SQlite databases in android
1. Working with SQLite Database in ANDROID.
2. Using SQLite in ANDROID, A really simple example.
First thing you need to know is cocos2d.
Downlod a sample project for cocos2D from here and copy the libraries into your project
Assuming all are familiar with Cocos2D. I am starting this tutorial.
Create a fresh project named SaveDataDemo.
then create a class named SQlite.java and copy this code into it.
This file contains the table definition and methods for accessing the data in the table. All you need is call these functions in your main file and insert, update or get the data from the database.
SQlite.java
package com.coderzheaven.pack; import java.util.Set; import java.util.Map.Entry; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; class MyTable { private String TABLE_NAME = "my_table"; int DATABASE_VERSION = 1; private String _ID = "id"; private String _SCORE = "score"; public String getTableName(){ return TABLE_NAME;} public int getDatabaseVersion() { return DATABASE_VERSION;} public String getID() { return _ID; } public String getScore() { return _SCORE; } public String getDatabaseCreateQuery() { final String DATABASE_CREATE = "create table IF NOT EXISTS " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY, " + _SCORE + " TEXT NOT NULL)"; return DATABASE_CREATE; } } class dbOperation { static String DB_TABLE ; static int DB_VERSION = GlobalClass.DATABASE_VERSION; static String[] DATABASE_CREATE; private Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; public dbOperation(Context ctx,String[] query) { this.context = ctx; DATABASE_CREATE = query; DBHelper = new DatabaseHelper(context); } public dbOperation(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } public dbOperation(String tablename) //for inner calling { DB_TABLE = tablename; DBHelper = new DatabaseHelper(context); } public dbOperation open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } public void close() { DBHelper.close(); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, GlobalClass.DBNAME, null, DB_VERSION); } public void onCreate(SQLiteDatabase db) { try { for (String s : DATABASE_CREATE) { db.execSQL(s); } } catch (Exception e) { System.out.println("Error creating items Per screen in the constructor" + e.getMessage()); } } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); onCreate(db); } } public long insertTableData(String tablename,ContentValues values) throws SQLException { DB_TABLE = tablename; ContentValues initialValues2 = new ContentValues(); Set<Entry<String, Object>> s = values.valueSet(); String new_val = ""; for (Entry<String, Object> entry : s) { new_val = values.getAsString(entry.getKey()); initialValues2.put(entry.getKey(), new_val); } return db.insert(DB_TABLE, null, initialValues2); } public boolean deleteTableData(String tablename,String condition) throws SQLException { DB_TABLE = tablename; return db.delete(DB_TABLE, condition, null) > 0; } public Cursor getAllTableData(String tablename,String[] fields) throws SQLException { DB_TABLE = tablename; return db.query(DB_TABLE, fields,null, null, null, null, null); } public Cursor getTableRow(String tablename,String[] dbFields, String condition,String order,String limit) throws SQLException { DB_TABLE = tablename; Cursor mCursor = db.query(false, DB_TABLE, dbFields,condition, null,null,null, order, limit); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } public boolean updateTable(String tablename,ContentValues args,String condition) { DB_TABLE = tablename; return db.update(DB_TABLE, args,condition , null) > 0; } public int lastInsertedID(String tablename) { int retVar=0; Cursor mCursor = db.rawQuery("select max(id) from "+tablename, null); if (mCursor != null) { mCursor.moveToFirst(); retVar =Integer.parseInt(mCursor.getString(0)); } mCursor.close(); mCursor.deactivate(); return retVar ; } }
Now create a file named “GameLayer.java” file and copy this code into it.
GameLayer.java
package com.coderzheaven.pack; import org.cocos2d.actions.instant.CCCallFuncN; import org.cocos2d.actions.interval.CCMoveTo; import org.cocos2d.actions.interval.CCSequence; import org.cocos2d.layers.CCColorLayer; import org.cocos2d.layers.CCScene; import org.cocos2d.nodes.CCDirector; import org.cocos2d.nodes.CCLabel; import org.cocos2d.nodes.CCSprite; import org.cocos2d.types.CGPoint; import org.cocos2d.types.CGSize; import org.cocos2d.types.ccColor3B; import org.cocos2d.types.ccColor4B; import android.content.ContentValues; import android.database.Cursor; import android.view.MotionEvent; public class GameLayer extends CCColorLayer { protected CCLabel _label = null; CGSize winSize = CCDirector.sharedDirector().displaySize(); int myscore = 0; public static CCScene scene() { CCScene scene = CCScene.node(); CCColorLayer layer = new GameLayer(ccColor4B.ccc4(255, 255, 255, 255)); scene.addChild(layer); return scene; } protected GameLayer(ccColor4B color) { super(color); this.setIsTouchEnabled(true); DBOperations(); } public void DBOperations(){ addAndroid(); createAndInitializeTables(); insertData(myscore); myscore = getDataFromTable(); System.out.println("SCORE : " + myscore); updateTable(myscore); myscore = getDataFromTable(); System.out.println("SCORE : " + myscore); showLabel(myscore); } public void createAndInitializeTables(){ try{ MyTable mytable = new MyTable(); String[] tableCreateArray = {mytable.getDatabaseCreateQuery()}; dbOperation operation = new dbOperation(CCDirector.sharedDirector().getActivity(),tableCreateArray); operation.open(); operation.close(); }catch(Exception e){ System.out.println("Error creating table " + e.getMessage()); } System.out.println("Table successfully created!!"); } public int getDataFromTable(){ dbOperation operationObj = new dbOperation(CCDirector.sharedDirector().getActivity()); operationObj.open(); MyTable mytable = new MyTable(); int score = 0; String condition2 = mytable.getID() +" = 1 "; String[] dbFields4 = {mytable.getScore()}; Cursor cursor = operationObj.getTableRow(mytable.getTableName(),dbFields4,condition2,mytable.getID() + " ASC ",1 +""); if(cursor.getCount()>0) { cursor.moveToFirst(); do{ score = cursor.getInt(0); }while(cursor.moveToNext()); } cursor.close(); cursor.deactivate(); operationObj.close(); return score; } public void insertData(int score){ MyTable mytable = new MyTable(); dbOperation operationObj = new dbOperation(CCDirector.sharedDirector().getActivity()); operationObj.open(); ContentValues initialValues = new ContentValues(); initialValues.put(mytable.getScore(),score+""); operationObj.insertTableData(mytable.getTableName(),initialValues); int maxID = operationObj.lastInsertedID(mytable.getTableName()); System.out.println("LAST INSERTED ID : " + maxID); operationObj.close(); } public void updateTable(int scr){ MyTable mytable = new MyTable(); dbOperation operationObj = new dbOperation(CCDirector.sharedDirector().getActivity()); operationObj.open(); String condition = mytable.getID() + " = 1"; ContentValues initialValues = new ContentValues(); initialValues.put(mytable.getScore(),scr+""); operationObj.updateTable(mytable.getTableName(),initialValues,condition); operationObj.close(); } public void showLabel(int scr){ if(_label != null){ this.removeChild(_label,true); } _label = CCLabel.makeLabel("Score : " + scr, "Verdana", 20); _label.setColor(ccColor3B.ccBLACK); _label.setPosition(5 5f, winSize.height - 15); addChild(_label); } public void addAndroid(){ CGSize winSize = CCDirector.sharedDirector().displaySize(); CCSprite player = CCSprite.sprite("android.png"); player.setPosition(CGPoint.ccp(player.getContentSize().width / 2.0f, winSize.height / 2.0f)); addChild(player); CCMoveTo actionMove = CCMoveTo.action(3, CGPoint.ccp(winSize.getWidth(), winSize.getHeight()/2.0f)); CCCallFuncN actionMoveDone = CCCallFuncN.action(this, "spriteMoveFinished"); CCSequence actions = CCSequence.actions(actionMove, actionMoveDone); player.runAction(actions); } public void spriteMoveFinished(Object sender) { CCSprite sprite = (CCSprite)sender; this.removeChild(sprite, true); myscore++; updateTable(myscore); showLabel(myscore); addAndroid(); } @Override public boolean ccTouchesBegan(MotionEvent event) { return true; } }
Note : copy a file named “android.png” into the assets folder.
Now create a file named “GlobalClass.java” and copy this code into it.
GlobalClass.java
package com.coderzheaven.pack; public class GlobalClass { public static String DBNAME = "mytest.db"; public static final int DATABASE_VERSION = 1; }
Now this is the main file that calls this gamelayer which is named “SaveDataDemo.java”
package com.coderzheaven.pack; import org.cocos2d.layers.CCScene; import org.cocos2d.nodes.CCDirector; import org.cocos2d.opengl.CCGLSurfaceView; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class SaveDataDemo extends Activity { protected CCGLSurfaceView _glSurfaceView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); _glSurfaceView = new CCGLSurfaceView(this); setContentView(_glSurfaceView); } @Override public void onStart() { super.onStart(); CCDirector.sharedDirector().attachInView(_glSurfaceView); CCDirector.sharedDirector().setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft); CCDirector.sharedDirector().setDisplayFPS(true); CCDirector.sharedDirector().setAnimationInterval(1.0f / 60.0f); CCScene scene = GameLayer.scene(); CCDirector.sharedDirector().runWithScene(scene); } @Override public void onPause() { super.onPause(); CCDirector.sharedDirector().pause(); } @Override public void onResume() { super.onResume(); CCDirector.sharedDirector().resume(); } @Override public void onStop() { super.onStop(); CCDirector.sharedDirector().end(); } }
Inside the GameLayer class check these functions that loads the data from the database or insert or update the database.
public void DBOperations(){ addAndroid(); createAndInitializeTables(); insertData(myscore); myscore = getDataFromTable(); System.out.println("SCORE : " + myscore); updateTable(myscore); myscore = getDataFromTable(); System.out.println("SCORE : " + myscore); showLabel(myscore); }
Here are the screenshots.
Download the complete source code from here.
If you find this post useful please leave your valuable comments and +1 this post to share more and give me encouragement for future posts.
Pingback: How to save data or score in Android Cocos2D? | Android News Feed
Pingback: Working with SQLite databases through command Line in android. | Coderz Heaven
Pingback: Working with SQLite databases through command Line in android … | Programmer Solution
Pingback: Show Alert in cocos2D Android. | Coderz Heaven
HI,
IT WAS VERY NICE 🙂
can u please tell me how to use . tmx file in cocos2d android?
kindly help
how can i play a video in background????
what do u mean? Video is for viewing not hearing? If you said this audio, it was ok.
hello how can i add tables to the existing database?
you can write a create table query and execute using executeQuery(), like other “select” and “delete” queries.
Thanks a Lot for this code but i am experienceing an error in SQlite.class
Says Globalclass cannot be resolved to a variable.
Please Help.
Thank you
Sandeep, you can just replace the GlobalVars.DB_NAME with your databasename that’s all
Oh thank you.
I just forgot basics.
I need to create a Database using DbHelperclass.
Thank you very much………….:-)
Nice blog, Can you tell me how to reset “score” to zero once game over or game completed?
Pass zero as parameter to the saveScore() function.