1.httpClient和ScrollView
1 在服務器端使用sqllite編寫數據庫
常見命令是:sqlite3 tank.db
進入之后創建表:
| create table tscore ( id integer primary key autoincrement, username varchar(32) unique not null, totalscore integer not null, score integer not null );
|
在服務器端編寫程序:
| #include<stdio.h> #include<sqlite3.h> #include<string.h> #include<stdlib.h> ? int main() ???? printf("Content-type:text/html\n\n"); ???? //set Score to Database ???? char * queryString = getenv("QUERY_STRING"); ???? if(queryString == NULL) ???? { ???????? printf("Err:queryString is NULL"); ???????? return 0; ???? } ? ???? //totalscore=%d&score=%d&user=user%d ???? //獲取參數 ???? char *totalScore = strtok(queryString,"&"); ???? char *score = strtok(NULL,"&"); ???? char *username = strtok(NULL,"&"); ? ???? strtok(totalScore,"="); ???? totalScore = strtok(NULL,"="); ? ???? strtok(score,"="); ???? score = strtok(NULL,"="); ? ???? //寫數據庫 ???? sqlite3* db; ???? int ret = sqlite3_open("/usr/lib/cgi-bin/tank.db",&db); ???? if(ret != SQLITE_OK) ???? { ???????? printf("open database error:%s",sqlite3_errstr(sqlite3_errcode(db))); ???????? return 0; ???? } ? ???? char sql[2048]; ???? sprintf(sql,"insert into tscore(username,totalScore,score) values('%s',%s,%s)",usernam|??? ??e,totalScore,score); ???? ret = sqlite3_exec(db,sql,NULL,NULL,NULL); ???? printf("%s<br>",sql); ? ???? if(ret != SQLITE_OK) ???? { printf("insert data error:%s",sqlite3_errstr(sqlite3_errcode(db))); ???????? sqlite3_close(db); ???????? return 0; ???? } ? ???? return 0; } |
| 編譯: sudo gcc setScore.c -o setScore.cgi -lsqlite3 注意要加上最后面的-lsqlite3,不然 設置tank.db的權限
在瀏覽器中輸入以下鏈接地址: http://192.168.28.155/cgi-bin/setScore.cgi?totalscore=100&score=1011&username=toto 網頁中的輸出運行結果:
tank.db中的內容如下:
|
2 游戲服務器端代碼,用于操作數據庫
| ? #include <stdio.h> #include <sqlite3.h> #include <string.h> #include <stdlib.h> int selectCallback(void* arg,int argc,char** argv,char** argvv) { ??? //argv[0] id ??? //argv[1] username ??? //argv[2] totalscore ??? //argv[3] score ? ??? // username&totalscore&score&.... ??? printf("%s&%s&%s&", argv[1], argv[2], argv[3]); ??? return 0; } ? int main() { ??? printf("Content-type:text/html\n\n"); #if 0 ??? printf("This is cocos cgi-test\n"); ??? // 打印環境變量 ??? extern char** environ; ??? int i; ??? for(i=0; ;++i) ??? { ??????? if(environ[i]) ??????????? printf("%s\n<br>", environ[i]); ??????? else ?????????? ?break; ??? } #endif ? ??? // set Score to Database ??? char* queryString = getenv("QUERY_STRING"); ??? if(queryString == NULL) ??? { ??????? printf("Err: queryString is NULL"); ??????? return 0; ??? } ? ??? // totalscore=%d&score=%d&user=user%d ??? // 獲取參數 ??? char* totalScore = strtok(queryString, "&"); ??? char* score = strtok(NULL, "&"); ??? char* username = strtok(NULL, "&"); ? ??? strtok(totalScore, "="); ??? totalScore = strtok(NULL, "="); ? ??? strtok(score, "="); ??? score = strtok(NULL, "="); ? ??? strtok(username, "="); ??? username = strtok(NULL, "="); ? ??? // 寫數據庫 ??? sqlite3* db; ??? int ret = sqlite3_open("/usr/lib/cgi-bin/tank.db", &db); ??? if(ret != SQLITE_OK) ??? { ??????? printf("open database error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? return 0; ??? } ? ??? char sql[2048]; ??? sprintf(sql, "insert into tscore (username, totalscore, score) values ('%s', %s, %s)", ??????????? username, totalScore, score); ??? ret = sqlite3_exec(db, sql, NULL, NULL, NULL); #if 0 ??? printf("%s<br>", sql); ??? return 0; #endif ??? if(ret != SQLITE_OK) ??? { ??????? printf("insert data error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? sqlite3_close(db); ??????? return 0; ??? } ? ??? sprintf(sql, "select * from tscore order by totalscore desc limit 10"); ??? ret = sqlite3_exec(db, sql, selectCallback, NULL, NULL); ??? if(ret != SQLITE_OK) ??? { ??????? printf("select data error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? sqlite3_close(db); ??????? return 0; ??? } ? ??? sqlite3_close(db); ? ??? return 0; } |
| Makefile文件 |
| cfiles := $(shell find -name "*.c") targets := $(cfiles:.c=.cgi) ? all: $(targets) ? %.cgi:%.c ???????? gcc -o $@ $^ -lsqlite3 ? .PHONY: clean clean: ???????? rm *.cgi |
| 編譯: sudo gcc setScore.c -o setScore.cgi -lsqlite3 瀏覽器訪問: http://192.168.28.155/cgi-bin/setScore.cgi?totalscore=90&score=121&username=toto23
|
?
較完整的服務器段代碼
| setScore.c |
| ? #include <stdio.h> #include <sqlite3.h> #include <string.h> #include <stdlib.h> int selectCallback(void* arg,int argc,char** argv,char** argvv) { ??? //argv[0] id ??? //argv[1] username ??? //argv[2] totalscore ??? //argv[3] score ? ??? // username&totalscore&score&.... ??? printf("%s&%s&%s&", argv[1], argv[2], argv[3]); ??? return 0; } ? int main() { ??? printf("Content-type:text/html\n\n"); #if 0 ??? printf("This is cocos cgi-test\n"); ??? // 打印環境變量 ??? extern char** environ; ??? int i; ??? for(i=0; ;++i) ??? { ??????? if(environ[i]) ?????? ?????printf("%s\n<br>", environ[i]); ??????? else ??????????? break; ??? } #endif ? ??? // set Score to Database ??? char* queryString = getenv("QUERY_STRING"); ??? if(queryString == NULL) ??? { ??????? printf("Err: queryString is NULL"); ??????? return 0; ??? } ? ??? // totalscore=%d&score=%d&user=user%d ??? // 獲取參數 ??? char* totalScore = strtok(queryString, "&"); ??? char* score = strtok(NULL, "&"); ??? char* username = strtok(NULL, "&"); ? ??? strtok(totalScore, "="); ??? totalScore = strtok(NULL, "="); ? ??? strtok(score, "="); ??? score = strtok(NULL, "="); ? ??? strtok(username, "="); ??? username = strtok(NULL, "="); ? ??? // 寫數據庫 ??? sqlite3* db; ??? int ret = sqlite3_open("/usr/lib/cgi-bin/tank.db", &db); ??? if(ret != SQLITE_OK) ??? { ??????? printf("open database error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? return 0; ??? } ? ??? char sql[2048]; ??? sprintf(sql, "insert into tscore (username, totalscore, score) values ('%s', %s, %s)", ??????????? username, totalScore, score); ??? ret = sqlite3_exec(db, sql, NULL, NULL, NULL); #if 0 ??? printf("%s<br>", sql); ??? return 0; #endif ??? if(ret != SQLITE_OK) ??? { ??????? printf("insert data error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? sqlite3_close(db); ??????? return 0; ??? } ? ??? sprintf(sql, "select * from tscore order by totalscore desc limit 10"); ??? ret = sqlite3_exec(db, sql, selectCallback, NULL, NULL); ??? if(ret != SQLITE_OK) ??? { ??????? printf("select data error: %s", sqlite3_errstr(sqlite3_errcode(db))); ??????? sqlite3_close(db); ??????? return 0; ??? } ??? sqlite3_close(db); ??? return 0; } |
?
3 HttpClient的客戶端:
| T24HttpClient.h(Get方式) |
| #ifndef __T24HttpClient_H__ #define __T24HttpClient_H__ ? #include "cocos2d.h" #include "cocos-ext.h" #include "TBack.h" USING_NS_CC; USING_NS_CC_EXT; ? class T24HttpClient :public TBack { public: ??? CREATE_FUNC(T24HttpClient); ??? bool init(); ??? static CCScene * scene(); ? ??? void HttpResponse(CCHttpClient* client, CCHttpResponse* response); }; ? #endif |
| T24HttpClient.cpp |
| #include "T24HttpClient.h" ? CCScene* T24HttpClient::scene() { ??? CCScene* scene = CCScene::create(); ??? T24HttpClient* layer = T24HttpClient::create(); ??? scene->addChild(layer); ??? return scene; } ? bool T24HttpClient::init() { ??? TBack::init(); ??? ??? //向服務器發送請求(http報文)單例 ??? CCHttpClient* client = CCHttpClient::getInstance(); ??? ??? //創建一個request對象 ??? CCHttpRequest* request = new CCHttpRequest(); ??? //設置訪問URL ??? request->setUrl("http://192.168.192.130/cgi-bin/setScore.cgi?username=xxx&score=xxxx&totalscore=xxx"); ??? request->setResponseCallback(this, httpresponse_selector(T24HttpClient::HttpResponse)); ? ??? //要對client進行release ??? client->release(); ? ??? return true; } ? //通過回調的方式實現 void T24HttpClient::HttpResponse(CCHttpClient* client, CCHttpResponse* response) { ??? if (!response->isSucceed()) ??? { ??????? CCLog("response error: %s", response->getErrorBuffer()); ??????? return; ??? } ? ??? //獲得相應的數據 ??? std::vector<char>* data = response->getResponseData(); ? ??? std::string strData; ??? std::vector<char>::iterator it; ??? for (it = data->begin(); it != data->end(); ++it) ??? { ??????? strData.push_back(*it); ??? } ? ??? CCLog("response data is: %s", strData.c_str()); } |
| 運行結果: ? |
| HttpClient(POST方式); |
| #ifndef __HttpClientPost_H__ #define __HttpClientPost_H__ ? #include "cocos2d.h" #include "cocos-ext.h" #include "TBack.h" USING_NS_CC; USING_NS_CC_EXT; ? class HttpClientPost:public TBack { public: ??? CREATE_FUNC(HttpClientPost); ??? bool init(); ??? static CCScene* scene(); ? ??? void HttpResponse(CCHttpClient* client, CCHttpResponse* response); }; ? #endif |
| HttpClientPost.cpp |
| #include "HttpClientPost.h" ? CCScene* HttpClientPost::scene() { ??? CCScene* scene = CCScene::create(); ??? HttpClientPost* layer = HttpClientPost::create(); ??? scene->addChild(layer); ??? return scene; } ? bool HttpClientPost::init() { ??? TBack::init(); ??? //向服務器發送請求(http報文) ??? CCHttpClient* client = CCHttpClient::getInstance(); ? ??? CCHttpRequest* req = new CCHttpRequest; ??? req->setUrl("http://192.168.192.131/cgi-bin/posttest.cgi"); ??? req->setRequestType(CCHttpRequest::kHttpPost); ??? req->setResponseCallback(this, httpresponse_selector(HttpClientPost::HttpResponse)); ? ??? char buf[8192]; ? ??? FILE* f = fopen("btn_go_0.png","rb"); ??? int len = fread(buf,1,8192,f); ??? fclose(f); ??? CCLOG("len=%d\n",len); ? ??? req->setRequestData((const char*)buf,len); ? ??? client->send(req); ??? req->release(); ? ??? return true; } ? void HttpClientPost::HttpResponse(CCHttpClient* client, CCHttpResponse* response) { ??? //如果相應失敗 ??? if (!response->isSucceed()) ??? { ??????? //獲取失敗信息 ??????? CCLog("response error: %s", response->getErrorBuffer()); ??????? return; ??? } ??? ??? //獲得相應的數據 ??? std::vector<char>* data = response->getResponseData(); ? ??? std::string strData; ??? std::vector<char>::iterator it; ??? for (it = data->begin(); it != data->end(); ++it) ??? { ??????? strData.push_back(*it); ??? } ? ??? CCLog("response data is:%s", strData.c_str()); } |
| 運行結果: ? |
?
?
2 CCScrollView案例
| T25ScrollView.h |
| #ifndef __T25ScrollView_H__ #define __T25ScrollView_H__ ? #include "cocos2d.h" #include "cocos-ext.h" #include "TBack.h" USING_NS_CC; USING_NS_CC_EXT; ? class T25ScrollView :public TBack { public: ??? CREATE_FUNC(T25ScrollView); ??? bool init(); ??? static CCScene * scene(); ? ??? bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); ??? void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); ??? void adjustViewPos(float dt); ? ??? CCNode* _node; ??? bool isSlider(CCTouch* t); }; ? #endif |
| T25ScrollView.cpp |
| #include "T25ScrollView.h" ? CCScene *T25ScrollView::scene() { ??? CCScene * scene = CCScene::create(); ??? T25ScrollView * layer = T25ScrollView::create(); ??? scene->addChild(layer); ??? return scene; } ? bool T25ScrollView::init() { ??? TBack::init(); ? ??? CCSize winSize = CCDirector::sharedDirector()->getWinSize(); ? ??? CCNode* node = CCNode::create(); ??? _node = node; ??? char buf[] = "a"; ??? //注意:ScrollView中的每個元素實際上都是一個精靈 ??? for (int i = 0; i < 5; ++i) ??? { ??????? //創建精靈 ??????? CCSprite* s = CCSprite::create("HelloWorld.png"); ??????? //將精靈添加到node中去 ??????? node->addChild(s); ??????? s->setPosition(ccp(0, winSize.height*i)); ??????? s->setAnchorPoint(ccp(0, 0)); ? ??????? //設置標簽 ??????? CCLabelTTF* label = CCLabelTTF::create(buf, "Arial", 24); ??????? buf[0]++; ??????? s->addChild(label); ??????? label->setPosition(ccp(winSize.width / 2, winSize.height / 2)); ??? } ? ??? //創建ScrollView,創建的時候需要node節點 ??? CCScrollView* view = CCScrollView::create(winSize, node); ??? addChild(view); ??? //設置滾動試圖的顯示方式,下面的設置表示的是垂直滾動 ??? view->setDirection(kCCScrollViewDirectionVertical); ??? //設置view的ContentSize,大小是5個精靈的高度 ??? view->setContentSize(CCSizeMake(winSize.width, winSize.height * 5)); ??? view->setBounceable(false);// 去掉彈性 ? ??? setTouchEnabled(true); ??? setTouchMode(kCCTouchesOneByOne); ? ??? return true; } ? bool T25ScrollView::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { ??? return true; } ? //判斷是否滾動了 bool T25ScrollView::isSlider(CCTouch* t) { ??? CCPoint ptCur = t->getLocation(); ??? CCPoint ptStart = t->getStartLocation(); ??? if (ptCur.getDistanceSq(ptStart) > 25) ??? { ??????? return true; ??? } ??? return false; } ? void T25ScrollView::adjustViewPos(float dt) { ??? //計算 ??? CCSize winSize = CCDirector::sharedDirector()->getWinSize(); ??? int fitPos[] = { ??????? 0,????????????????????? ??????? -winSize.height,?????? //向下移動一屏 ??????? -winSize.height * 2,?? //向下移動兩屏 ??????? -winSize.height * 3,?? //向下移動三屏 ??????? -winSize.height * 4??? //向下移動四屏 ??? }; ? ??? int y = _node->getPositionY(); ??? int i; ??? for (i = 0; i < 5; ++i) ??? { ??????? int dist = abs(fitPos[i] - y); ??????? if (dist < winSize.height / 2) ??????? { ??????????? break; ??????? } ??? } ? ??? //創建一個點 ??? CCPoint ptDest = ccp(0, fitPos[i]); ??? //讓點移動到指定的位置 ??? _node->runAction(CCMoveTo::create(.2f, ptDest)); } ? void T25ScrollView::ccTouchEnded(CCTouch* t, CCEvent* e) { ??? //判斷點擊的坐標,是哪個坐標 ??? if (isSlider(t)) ??? { ??????? //調整位置 ??????? scheduleOnce(schedule_selector(T25ScrollView::adjustViewPos), 0.05f); ??????? return; ??? } ? ??? //點擊的代碼 ??? CCSize winSize = CCDirector::sharedDirector()->getWinSize(); ? ??? CCPoint ptWorld = t->getLocation(); ??? //將世界坐標轉化成為本地坐標 ??? CCPoint ptNode = _node->convertToNodeSpace(ptWorld); ??? int index = ptNode.y / winSize.height; ??? CCLog("clicked index=%d", index); } |
| 運行結果(上下移動):
|
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的1.httpClient和ScrollView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优盘快捷方式打不开怎么回事 “优盘快捷方
- 下一篇: 下载到u盘的文件不见了怎么办啊 U盘上下