编写小游戏《贪头蛇》第三篇

源码下载地址:http://download.csdn.net/detail/oyangyufu/7492917

点击NEW GAME按钮,进入游戏主场景

代码:

游戏背景

layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_BACKGROUND);
		layer->setTouchEnabled(false);

		//游戏背景
		CCSize size = CCDirector::sharedDirector()->getWinSize();
		CCTMXTiledMap *pTMXTiledMap = CCTMXTiledMap::create("map.tmx");
		pTMXTiledMap->setAnchorPoint( ccp(0.5f, 0.5f) );
		pTMXTiledMap->setPosition(ccp(size.width/2 , size.height/2));
		layer->addChild(pTMXTiledMap);  

退出键

		layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_UI);
		CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
			"CloseNormal.png",
			"CloseSelected.png",
			this,
			menu_selector(SnakeScene::menuCloseCallback));
		CC_BREAK_IF(! pCloseItem);
		pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

		CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
		pMenu->setPosition(CCPointZero);
		CC_BREAK_IF(! pMenu);
		layer->addChild(pMenu);

4个方向键:

		CCMenuItemImage* pUpImage = CCMenuItemImage::create("u1.png", "u2.png", this, menu_selector(SnakeScene::upCallBack));
		pUpImage->setAnchorPoint(ccp(0.5, 0));
		pUpImage->setPositionY(6.0f);

		CCMenuItemImage* pDownImage = CCMenuItemImage::create("d1.png", "d2.png", this, menu_selector(SnakeScene::downCallBack));
		pDownImage->setAnchorPoint(ccp(0.5, 1));
		pDownImage->setPositionY(-6.0f);

		CCMenuItemImage* pLeftImage = CCMenuItemImage::create("b1.png", "b2.png", this, menu_selector(SnakeScene::leftCallBack));
		pLeftImage->setAnchorPoint(ccp(1, 0.5));
		pLeftImage->setPositionX(-6.0f);

		CCMenuItemImage* pRightImage = CCMenuItemImage::create("f1.png", "f2.png", this, menu_selector(SnakeScene::rightCallBack));
		pRightImage->setAnchorPoint(ccp(0, 0.5));
		pRightImage->setPositionX(6.0f);

		CCMenu* ArrowMenu = CCMenu::create(pUpImage, pDownImage, pLeftImage, pRightImage, NULL);
		ArrowMenu->setPosition(50, 50);
		layer->addChild(ArrowMenu);

游戏分数:

		mScoreText = CCLabelTTF::create("Score: 0", "Plok.ttf", 20);
		mScoreText->setPosition(ccp(0, size.height - 10));
		mScoreText->setAnchorPoint(ccp(0, 0.5));
		layer->addChild(mScoreText);

游戏开始语

		mTitleText = CCLabelTTF::create("Play Game Snake!", "Plok.ttf", 30);
		mTitleText->setPosition(ccp(size.width/2, size.height/2));
		layer->addChild(mTitleText);
		mTitleText->setScale(0.0f);

游戏结束语

		mGameOverText = new CCLabelTTF();
		mGameOverText->initWithString("Game Over!", "Plok.ttf", 30);
		mGameOverText->setPosition(ccp(size.width/2, size.height/2));
		mGameOverText->retain();
		mGameOverText->autorelease();

两个定时器

		schedule(schedule_selector(SnakeScene::ScheduleTick1), 0.4f); //播放游戏开始语
		schedule(schedule_selector(SnakeScene::GameCircle), 0.5f); //判断游戏是否结束
//游戏开始语
void SnakeScene::ScheduleTick1( float dt )
{
	float scale = mTitleText->getScale();
	if(scale < 0.8)//从0倍缩放到0.8倍
	{
		mTitleText->setScale(scale+0.1);
	}
	else //删除游戏开始语
	{
		CCLayer* layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_UI);
		unschedule(schedule_selector(SnakeScene::ScheduleTick1));
		layer->removeChild(mTitleText);

		m_bGameRunning = true;//开始运行游戏
	}
}

0.5秒蛇移动一次

void SnakeScene::GameCircle( float dt )
{
	if(m_bGameRunning)
	{
		if(!mSnake->Move())//0结束
		{
			OnGameOver();
		}

		HandleNewSnakePosition();
	}
}

蛇的称动及碰撞检测

boolean Snake::Move()
{
	mLastMoveDirection = mDirection;

	if(m_bGrow)
	{
		m_bGrow = false;
		/* If the snake should grow,
		* simply add a new part in the front of the tail,
		* where the head currently is. */
		SnakeTailPart* newTailPart = new SnakeTailPart(m_pSnakeHead);//每一节
		newTailPart->setScale(0.6f);
		this->addChild(newTailPart);
		marrTail.insertObject(newTailPart, 0);//marrTail管理整条蛇
	}
	else
	{

		if(marrTail.count() > 0)
		{
			/* First move the end of the tail to where the head currently is. */
			SnakeTailPart* tailEnd = (SnakeTailPart*)marrTail.lastObject();
			marrTail.removeLastObject(false);
			tailEnd->SetCell(*m_pSnakeHead);

			marrTail.insertObject(tailEnd, 0);
		}

	}

	/* The move the head into the direction of the snake. 重设蛇头的位置*/
	m_pSnakeHead->SetCell(GetNextX(), GetNextY());
	//检查蛇头跟蛇尾相撞
	for(int i = marrTail.count() - 1; i >= 0; i--)
	{
		if(m_pSnakeHead->IsInSameCell(*(SnakeTailPart*)marrTail.objectAtIndex(i)))
		{
			return false;
		}
	}

	return true;
}

创建蛇与青蛙

		//主角蛇
		mSnake = new Snake(RIGHT, 0, SnakeConstants::CELLS_VERTICAL/2);
		mSnake->autorelease();
		mSnake->GetHead()->Animate(1);
		mSnake->Grow();
		layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_SNAKE);
		layer->addChild(mSnake);

		//青蛙
		mFrog = new Frog(0, 0);
		mFrog->autorelease();
		mFrog->Animate(1);
		this->SetFrogToRandomCell();//随机出现一个青蛙
		layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_FOOD);
		layer->addChild(mFrog);

检测蛇是否吃了青蛙

void SnakeScene::HandleNewSnakePosition()
{
	const SnakeHead* snakeHead = mSnake->GetHead();

	if(snakeHead->GetCellX() < 0 || snakeHead->GetCellX() >= SnakeConstants::CELLS_HORIZON
		|| snakeHead->GetCellY() < 0 || snakeHead->GetCellY() >= SnakeConstants::CELLS_VERTICAL) //蛇活动的区域
	{
		OnGameOver();
	}
	else if(snakeHead->IsInSameCell(*mFrog))//蛇吃了青蛙加分、显示下一个青蛙
	{
		m_nScore += 50;

		char score[128] = {0};
		sprintf(score, "Score: %d", m_nScore);
		mScoreText->setString(score);

		mSnake->Grow();
		PlayMunchSound();//吃到的声音
		this->SetFrogToRandomCell();//随机显示下一个青蛙

方向键回调函数,根据上下左右键方向旋转蛇的方向

void SnakeScene::upCallBack( CCObject* sender )
{
	mSnake->SetDirection(UP);
}

void SnakeScene::downCallBack( CCObject* sender )
{
	mSnake->SetDirection(DOWN);
}

void SnakeScene::leftCallBack( CCObject* sender )
{
	mSnake->SetDirection(LEFT);
}

void SnakeScene::rightCallBack( CCObject* sender )
{
	mSnake->SetDirection(RIGHT);
void Snake::SetDirection( const Direction dirction )
{
	if(mLastMoveDirection != Opposite(dirction))
	{
		mDirection = dirction;
		m_pSnakeHead->SetRotation(dirction);
	}
}

蛇的方向度

void SnakeHead::SetRotation(const Direction dirction)
{
	switch(dirction)
	{
	case UP:
		this->setRotation(180);
		break;
	case DOWN:
		this->setRotation(0);
		break;
	case LEFT:
		this->setRotation(90);
		break;
	case RIGHT:
		this->setRotation(270);
		break;
	}
}

编写小游戏《贪头蛇》第三篇,布布扣,bubuko.com

时间: 2024-10-10 06:49:34

编写小游戏《贪头蛇》第三篇的相关文章

编写小游戏《贪头蛇》第一篇

小游戏<贪头蛇>设计场景有: 主菜单.游戏主场景.游戏继续.游戏设置.游戏暂停.关于 进入游戏第一场景,显示该款游戏由哪家工作室或个人开发的 代码: SnakeSceneManager类用来管理游戏所有场景的切换,包括创建新的场景,切换下一个场景,和关卡场景 OpenLayer类用来创建该场景 CCScene *SnakeSceneManager::createscene() { CCScene *Scene = CCScene::create(); //进入游戏第1个图层 OpenLayer

C语言 小游戏之贪吃蛇

还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半的编程,如今认为这个C语言的贪吃蛇还是比較简单的,花的时间不非常多! 我认为主要是思路正确,基本上就米什么大的问题. 如今贴上我的代码和我的详解,希望大家多交流. 首先说下我这个贪吃蛇仅仅是一个简单的,游戏结束有2种可能:一碰墙,二自杀即蛇头碰到蛇身. 如有不好之处,请见谅把. 首先说下我这个贪吃蛇

蓝懿iOS编写小游戏实现新功能

今天是练习日,通过几天的系统学习,我对基础的一些知识有了简单的了解,今天用了一天的时间通过整理几天所学到的东西,成功编写了一个简单的小游戏.游戏中几乎用到了学到的所有控件功能,Label,text,UiImageView,UiButton,NsTimer等. 今天我自己编写的游戏是实现一个角色图片通过设置好的四个button 按钮点击控制它的移动,中间有三个障碍图片,碰到障碍会减少血量,并且回到起始点.检测碰撞的地方用到了NsTimer的知识,其中还有一个雷区,雷区里通过问李国斌老师学会了新知识

cocos2d-x 3.2 之 三消类游戏——万圣大作战 (第三篇)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 这是第三篇了, 前面已经建立了界面,建立的精灵,并且能自动消除精灵. 现在就要做我们的触摸事件了 本文内容: > 实现触摸事件 > 实现交换的功能 1.触摸事件 我们玩三消游戏,就要对屏幕进行滑动,所以需要做一个触摸事件来处理对屏幕的触摸. 这里主要是要获得

【C语言小游戏】 贪吃蛇

windows编译运行 源代码: /*这是一个贪吃蛇代码,运行环境VC++6.0(亲测完美运行)*/ /*该程序在dos系统下运行,不需要graphics.h头文件*/ #include <windows.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #include <string.h> #include <conio.h> #define N 21 int 

关于第一次用java写小游戏(贪吃蛇)的体会记录

作为一只菜鸡,对于编程的世界还一无所知,但是感觉应该要写点实用的东西.突然发现好像贪吃蛇应该能写出来(那种几乎没有用户界面的),于是就开始了. 1.关于对简单的动画呈现的资料准备 因为只有一些捉襟见肘的知识,所以这些资料还得一步步来. 首先我发现动画呈现和键盘输入这些都可以用 awt/swing + Thread线程类 的组合来搞定.首先是线程类在这方面的应用 2 关于主面板(JFrame 和 JPanel) 和 画图工具Graphics JPanel 和其子类可以被添加到JFrame中 作为一

c++小游戏之贪吃蛇

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<time.h> #include<math.h> #define sqr(x) x*x int i,j,x,y,d,k,f,stx,sty,score,e,l,w,h; char s[21][21]; int a[21][21]; int hard[13]={1,2,5

【小命令大作用】第三篇 ls 命令 - 查看目录或文件

ls命令查看目录或文件 [语法] ls [选项] (路径) [常用选项] -l    长文本查看文件=windows的右键属性 -d    查看目录 PS:一般配合-l使用 -a    查看目录下所有文件(包括隐藏文件) -i    显示索引号(inode) -F    给文件加标识 -t    以文件修改时间排序 -r    倒序排列 -k    以K为单位显示大小 [实例] 查看/etc/最近修改的文件并以长格式显示 [[email protected] ~]# ls -lrt /etc/ 

Python编写微信打飞机小游戏(一)

最近开始学习Python语言,发现Python有一个神奇的Pygame模块,在编写小游戏时显得非常方便,于是参照教学视频编写了一个微信打飞机的小游戏,网上有很多相关的博客,但都不是很详细,大都是直接贴代码,于是决定沉下心来把编写程序的过程记录下来,与大家分享. 首先声明一点,这篇博客完全参照了小甲鱼的<零基础入门学习Python>教学视频,为了尊重原创,特将原作者的视频地址公布如下:<零基础入门学习Python> Python编译器和Pygame模块的安装网上的教程很多,这里不再赘