#include "GameScene.h"
#include "StartScene.h"
Scene * GameScene::createScene() {
auto scene = Scene::create();
auto layer = GameScene::create();
scene->addChild(layer);
return scene;
}
bool GameScene::init() {
if (!Layer::init()) {
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
timeval tv;
gettimeofday(&tv, NULL);
unsigned long int seed = tv.tv_sec * 1000 + tv.tv_usec / 100;
srand(seed);
auto backLabel = Label::createWithTTF("Main Menu", "fonts/Marker Felt.ttf", 24);
auto backItem = MenuItemLabel::create(backLabel, CC_CALLBACK_1(GameScene::menuCallBack, this));
backItem->setAnchorPoint(Point::ANCHOR_BOTTOM_RIGHT);
backItem->setPosition(Vec2(visibleSize.width, 0));
auto menu = Menu::create(backItem, NULL);
menu->setPosition(Vec2::ZERO);
addChild(menu);
_sHead = new SnakeNode();
_sHead->row = rand() % 10;
_sHead->col = rand() % 15;
_sHead->preNode = NULL;
_sFood = new SnakeNode();
_sFood->row = rand() % 10;
_sFood->col = rand() % 15;
auto snakeNode = Sprite::create("snake_head.png");
snakeNode->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
snakeNode->setPosition(Vec2(_sHead->col * 32, _sHead->row * 32));
_sHead->nodeSprite = snakeNode;
addChild(snakeNode);
auto foodNode = Sprite::create("snake_food.png");
foodNode->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
foodNode->setPosition(Vec2(_sFood->col * 32, _sFood->row * 32));
_sFood->nodeSprite = foodNode;
addChild(foodNode);
/*
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
*/
this->schedule(SEL_SCHEDULE(&GameScene::logic), 0.2f);
rocker = HRocker::createHRocker("rocker.png", "rockerBG.png", Vec2(70, 70));
rocker->startRocker();
addChild(rocker);
_dir = -1;
return true;
}
/*
bool GameScene::onTouchBegan(Touch * touch, Event * event) {
auto point = touch->getLocation();
int touchRow = (int)(point.y / 32);
int touchCol = (int)(point.x / 32);
if (abs(touchRow - _sHead->row) > abs(touchCol - _sHead->col)) {
if (touchRow > _sHead->row) {
if (_dir != DIR_DEF::DOWN || _dir == -1) {
_dir = DIR_DEF::UP;
_sHead->dir = DIR_DEF::UP;
}
}
else {
if (_dir != DIR_DEF::UP || _dir == -1) {
_dir = DIR_DEF::DOWN;
_sHead->dir = DIR_DEF::DOWN;
}
}
}
else {
if (touchCol > _sHead->col) {
if (_dir != DIR_DEF::LEFT || _dir == -1) {
_dir = DIR_DEF::RIGHT;
_sHead->dir = DIR_DEF::RIGHT;
}
}
else {
if (_dir != DIR_DEF::RIGHT || _dir == -1) {
_dir = DIR_DEF::LEFT;
_sHead->dir = DIR_DEF::LEFT;
}
}
}
return true;
}
*/
void GameScene::logic(float dt) {
if (rocker->_rockerDirection == rocker_up) {
if (_dir != DIR_DEF::DOWN || _dir == -1) {
_dir = DIR_DEF::UP;
_sHead->dir = DIR_DEF::UP;
}
}
else if (rocker->_rockerDirection == rocker_down) {
if (_dir != DIR_DEF::UP || _dir == -1) {
_dir = DIR_DEF::DOWN;
_sHead->dir = DIR_DEF::DOWN;
}
}
else if (rocker->_rockerDirection == rocker_left) {
if (_dir != DIR_DEF::RIGHT || _dir == -1) {
_dir = DIR_DEF::LEFT;
_sHead->dir = DIR_DEF::LEFT;
}
}
else if (rocker->_rockerDirection == rocker_right) {
if (_dir != DIR_DEF::LEFT || _dir == -1) {
_dir = DIR_DEF::RIGHT;
_sHead->dir = DIR_DEF::RIGHT;
}
}
for (int i = _allBody.size() - 1; i >= 0; --i) {
auto sn = _allBody.at(i);
sn->row = sn->preNode->row;
sn->col = sn->preNode->col;
sn->dir = sn->preNode->dir;
}
switch (_sHead->dir) {
case DIR_DEF::UP:
_sHead->row++;
break;
case DIR_DEF::DOWN:
_sHead->row--;
break;
case DIR_DEF::LEFT:
_sHead->col--;
break;
case DIR_DEF::RIGHT:
_sHead->col++;
break;
default:
break;
}
if (_sHead->row >= 10 || _sHead->row < 0 || _sHead->col >= 15 || _sHead->col < 0) {
gameOver();
return;
}
for (int i = _allBody.size() - 1; i >= 0; --i) {
auto sn = _allBody.at(i);
if (_sHead->row == sn->row && _sHead->col == sn->col) {
gameOver();
return;
}
}
for (int i = _allBody.size() - 1; i >= 0; --i) {
auto sn = _allBody.at(i);
sn->nodeSprite->runAction(MoveTo::create(0.2f, Vec2(sn->col * 32, sn->row * 32)));
}
_sHead->nodeSprite->runAction(MoveTo::create(0.2f, Vec2(_sHead->col * 32, _sHead->row * 32)));
if (_sHead->row == _sFood->row && _sHead->col == _sFood->col) {
_sFood->row = rand() % 10;
_sFood->col = rand() % 15;
_sFood->nodeSprite->setPosition(Vec2(_sFood->col * 32, _sFood->row * 32));
auto snakeNode = new SnakeNode();
if (_allBody.empty()) {
snakeNode->preNode = _sHead;
}
else {
snakeNode->preNode = _allBody.back();
}
switch (snakeNode->preNode->dir) {
case DIR_DEF::UP:
snakeNode->row = snakeNode->preNode->row - 1;
snakeNode->col = snakeNode->preNode->col;
break;
case DIR_DEF::DOWN:
snakeNode->row = snakeNode->preNode->row + 1;
snakeNode->col = snakeNode->preNode->col;
break;
case DIR_DEF::LEFT:
snakeNode->row = snakeNode->preNode->row;
snakeNode->col = snakeNode->preNode->col + 1;
break;
case DIR_DEF::RIGHT:
snakeNode->row = snakeNode->preNode->row;
snakeNode->col = snakeNode->preNode->col - 1;
break;
default:
break;
}
auto nodeSprite = Sprite::create("snake_head.png");
nodeSprite->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
nodeSprite->setPosition(Vec2(snakeNode->col * 32, snakeNode->row * 32));
snakeNode->nodeSprite = nodeSprite;
addChild(nodeSprite);
_allBody.pushBack(snakeNode);
}
}
void GameScene::menuCallBack(Ref * pSender) {
Director::getInstance()->getScheduler()->unschedule(schedule_selector(GameScene::logic), this);
Director::getInstance()->replaceScene(StartScene::createScene());
}
void GameScene::gameOver() {
this->unschedule(SEL_SCHEDULE(&GameScene::logic));
auto visibleSize = Director::getInstance()->getVisibleSize();
auto label = Label::createWithTTF("Game Over", "fonts/Marker Felt.ttf", 48);
label->setAnchorPoint(Point::ANCHOR_MIDDLE);
label->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
addChild(label);
this->scheduleOnce(SEL_SCHEDULE(&GameScene::menuCallBack), 2.0f);
}
Cocos2d-x贪吃蛇代码
2星 需积分: 0 98 浏览量
2017-12-21
18:40:32
上传
评论 1
收藏 58KB ZIP 举报
lzmxqh
- 粉丝: 2
- 资源: 1
最新资源
- 最入门的爬虫代码 python.docx
- 爬虫零基础入门-爬取天气预报.pdf
- 最通俗易懂的 MongoDB 非结构化文档存储数据库教程.zip
- 以mongodb为数据库的订单物流小项目.zip
- 腾讯云-mongodb数据库, 项目部署.zip
- 腾讯 APIJSON 的 MongoDB 数据库插件.zip
- 理解非关系型数据库和关系型数据库的区别.zip
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈