Cocos2dx游戏教程(十一):“见缝插针”,主场景实现

微信小游戏实战--cocos creator实现wordle游戏(二) 根据上篇教程:微信小游戏实战--cocos creator实现wordle游戏(一)我们已经完成了开发环境的搭建并创建了一个项目,接下来就可以正式山寨,哦不对,应该是正式开发wordle这款小游戏了。 熟悉Cocos Creator 工欲善其事必先利其器,首先我们需要熟悉一下开发工具的使用。打开Cocos Creator进入到我们之前创建的项目,新建的2D项目大概如下图所示: 1、层级管理器:创建和管理游戏的内容节点。在Cocos Creator中所有的控件都被视为节点(node),在层级管理器中 阅读详情

前面是节介绍了Cocos2dx的相关知识,也实现了相关场景,这一节设计的游戏的具体实现啦,我们看一下新增的类,主要有小球类ball,定义类define,全局方法类GlobalManage,主场景类GameScene

这一节完成后大家就可以初步进行游戏啦,前介绍过的相关功能在本章节中都有体现哦,这章节主要就上代码吧。

下面我们看下文件列表,可以看到红框中新增的文件,下面介绍文件的具体实现。

大家将第二场景的跳转转向GameScene哦。
在这里插入图片描述

1、相关定义

#pragma once
#include "cocos2d.h"

USING_NS_CC;
using namespace std;

/*******************************************************************************
* 全局相关 
********************************************************************************/
//屏幕大小
#define WINSIZE (Director::getInstance()->getWinSize())
//可视区域
#define VISIBLE_SIZE (Director::getInstance()->getVisibleSize())
//可视区域起点坐标
#define VISIBLE_ORIGIN_SIZE (Director::getInstance()-getVisibleOrigin())


//重写to_string
#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
template<typename T>
string to_string(const T& t) {
	ostringstream os;
	os << t;
	return os.str();
}
#endif

2、小球对象

#pragma once
#include "cocos2d.h" 

USING_NS_CC;

class Ball : public Sprite {
public:
	Ball();
	~Ball();
	//创建小球
	static Ball *create(int num = 0);
public:
	Label *numTTF;
};
#include "Ball.h"
#include "Defines.h"

Ball::Ball() {
}

Ball::~Ball() {
}

//创建数字小球
Ball *Ball::create(int num) {
	Ball *ball = new Ball();
	ball->initWithFile("scene/ball_1.png");

	if(num != 0) {
		ball->numTTF = Label::createWithCharMap("fonts/label/label_ball.png", 14, 20, '0');
		ball->numTTF->setString(to_string(num));
		ball->numTTF->setPosition(ball->getContentSize() / 2);	
		ball->addChild(ball->numTTF);
	}
	else {
		ball->setTexture("scene/ball_0.png");
	}

	return ball;
}

3.主场景

#pragma once
#include "cocos2d.h" 
#include "cocos-ext.h" 
#include "Ball.h"

USING_NS_CC;

extern LanguageType type;

class GameScene : public Layer{
public:
    GameScene();
    ~GameScene();
	 //新建场景
    static Scene* createScene(); 
	 //create()方法
    CREATE_FUNC(GameScene);   
	//初始化
    virtual bool init();
	//触摸开始方法
    bool onTouchBegan(Touch* touch, Event* event);
    //触摸移动方法 
    void onTouchMoved(Touch* touch, Event* event);
    //触摸结束方法
    void onTouchEnded(Touch* touch, Event* event);
	//刷新游戏
 	void update(float dt);
public:
	void onKeyReleased(EventKeyboard::KeyCode keycode, Event* event);
public:
	//绘制场景
	void drawScene();
	//初始化玩家小球
	void initUserBall(int num);
	//绘制遮罩圆(以Y轴为0角度)(参数:绘制的坐标,开始角度,终止角度,内部圆半径,外部圆半径,绘制的颜色)
	void drawCoverCircle(Vec2 &point, int startAngle, int endAngle, int radiusSmall, int radiusBig, Color4F &color);
	//将玩家小球加入旋转
	void addUserBallToCircle(Ball *ball);
	//检测小球是否碰撞
	void checkIsBallCollision(Ball *userBall, Ball *circleBall);
	//获得旋转动作
	ActionInterval *getCircleAction(float speed);
	//创建失败层
	void createFailedLayer();
	//创建胜利层
	void createSuccessLayer();
	//绘制飞行小球
	void createFlyBall();
public:
	//游戏暂停按钮
	void onPauseBtnPressed(Ref* pSender);
	//点击显示辅助线
	void onAuxiliaryLineBtnPressed(Ref* pSender);
	//帮助按钮
	void onHelpBtnPressed(Ref* pSender);
private:
	//旋转速度(度/秒)
	float speed;
	//关卡用户小球个数
	int userBallNum;
	//中心圈
	Sprite *circle;
	//旋转动作
	ActionInterval *rotate;
	//所有小球列表
	std::vector<Ball *> ballList;
	//玩家小球列表
	std::vector<Ball *> userBallList;

	//飞行小球
	Sprite *flyBall;
	float flyBallX;
	float flyBallY;
private:
	bool isBallCollision;
	bool isCanTouch;
	bool isFlyBallCollision;
};
#include "GameScene.h"
#include "GlobalManage.h"
#include "GameDataManage.h"
#include "GameMenuScene.h"
#include "Defines.h"

GameScene::GameScene() :speed(0), userBallNum(0), rotate(NULL), isBallCollision(false), isCanTouch(false){
}

GameScene::~GameScene() {
}

//新建场景
Scene *GameScene::createScene()
{
	Scene *scene = Scene::create();
	Layer *layer = GameScene::create();
	scene->addChild(layer);
	return scene;
}

//初始化
bool GameScene::init() {
	if(!Layer::init()) { 
		return false;
	}

	ballList.clear();
	speed = GameDataManage::getInstance()->rotateSpeed;
	rotate = getCircleAction(speed);
	//绘制场景
	drawScene();
	//绘制玩家小球
	userBallNum = GameDataManage::getInstance()->userBallNum;
	initUserBall(userBallNum);
	
	//创建一个触摸监听 
	auto touchListener = EventListenerTouchOneByOne::create();   
	//向下传递触摸事件
	touchListener->setSwallowTouches(false);
	touchListener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
	touchListener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
	touchListener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this);
	touchListener->onTouchCancelled = CC_CALLBACK_2(GameScene::onTouchCancelled, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);

	//注册捕捉监听
	auto listenerkeyPad = EventListenerKeyboard::create();
	listenerkeyPad->onKeyReleased = CC_CALLBACK_2(GameScene::onKeyReleased, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerkeyPad, this);

	scheduleUpdate();
	return true;
}

//触摸开始方法
bool GameScene::onTouchBegan(Touch* touch, Event* event) {
	if(!isCanTouch) {
		return false;
	}
	if(isBallCollision) {
		return false;
	}
	if(userBallList.size() > 0) {
		userBallList.at(0)->runAction(Sequence::create(
			MoveTo::create(0.2f, Point(360, 620)),
			//CallFunc::create(CC_CALLBACK_0(GameScene::addUserBallToCircle, this, userBallList.at(0))),
			NULL));
		userBallList.at(0)->runAction(Sequence::create(
			CallFunc::create(CC_CALLBACK_0(GameScene::addUserBallToCircle, this, userBallList.at(0))),
			NULL));
	}
	return true;
}

//触摸移动方法 
void GameScene::onTouchMoved(Touch* touch, Event* event) {
}

//触摸结束方法
void GameScene::onTouchEnded(Touch* touch, Event* event) {
}

void GameScene::onKeyReleased(EventKeyboard::KeyCode keycode, Event* event) {
	if (keycode == EventKeyboard::KeyCode::KEY_ESCAPE) {
		Director::getInstance()->replaceScene(GameMenuScene::createScene());
	} else if (keycode == EventKeyboard::KeyCode::KEY_MENU) {

	}
}

//刷新游戏
void GameScene::update(float dt) {
	//刷新玩家小球位置
	auto max = userBallList.size() >= 4 ? 4 : userBallList.size();
	for(unsigned int i = 0; i < max; i++) {
		auto ball = userBallList.at(i);
		if(!ball) {
			continue;
		}
		ball->setPosition(360, 300 - 42 * i);
		ball->setVisible(true);
	}
	//检测是否碰撞,如果碰撞,游戏结束
	if(isBallCollision) {
		circle->stopAction(rotate);
		unscheduleUpdate();
	}

	if(!isBallCollision) {
		if(userBallNum == 0) {
			unscheduleUpdate();
		}
	}
}

//绘制场景
void GameScene::drawScene() {
	//绘制游戏背景
	auto bg = Sprite::create("scene/bg.jpg");
	bg->setPosition(WINSIZE / 2);
	this->addChild(bg);

	//关卡
	auto level = Sprite::create("scene/level.png");
	level->setPosition(WINSIZE.width / 2, WINSIZE.height - 83);
	this->addChild(level);
	
	auto levelTTF = Label::createWithCharMap("fonts/label/label_level_1.png", 31, 42, '0');
	levelTTF->setString(StringUtils::format("%d", GlobalManage::getInstance()->currentLevel));
	levelTTF->setPosition(level->getContentSize() / 2);
	level->addChild(levelTTF);

	//投影
	auto shadow = Sprite::create("scene/shadow.png");
	shadow->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 500);
	this->addChild(shadow, 1);
	shadow->runAction(MoveBy::create(0.3f, Point(0, 630)));
	
	//绘制中心圈

	std::string circleName;
	circleName = StringUtils::format("scene/circle_%d.png", GlobalManage::getInstance()->currentLevel % 3);
	circle = Sprite::create(circleName);
	circle->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 500);
	this->addChild(circle, 1); 
	circle->runAction(rotate);
	circle->runAction(Sequence::create(
		MoveBy::create(0.3f, Point(0, 700)), 
		CallFunc::create([&](){isCanTouch = true;}),
		NULL));

	//绘制关卡障碍物小球
	auto obsNum = GameDataManage::getInstance()->obsBallNum;
	for(int i = 0; i < obsNum; i++) {
		auto ball = Ball::create();
		auto pos = GlobalManage::getInstance()->getCirclePoint(obsNum, i, circle->getContentSize() / 2, Point(circle->getContentSize().width / 2, circle->getContentSize().height / 2 + 250.0f));
		ball->setPosition(pos.x, pos.y);	
		circle->addChild(ball);
		ballList.push_back(ball);

		//创建DrawNode,然后后加入到Layer层中
		DrawNode* drawNode = DrawNode::create();
		circle->addChild(drawNode, -1);
		//drawNode->drawSegment(circle->getContentSize() / 2, ball->getPosition(), 1, Color4F(57.0f / 255.0f, 60.0f / 255.0f, 77.0f / 255.0f, 1));
		drawNode->drawSegment(circle->getContentSize() / 2, ball->getPosition(), 1, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	}	


	//绘制点连接线
	DrawNode* drawDot = DrawNode::create();
	this->addChild(drawDot, 10, "drawdot");
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 340), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 380), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 420), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 460), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 500), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 540), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->drawDot(Vec2(WINSIZE.width / 2, 580), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	//drawDot->drawDot(Vec2(WINSIZE.width / 2, 620), 5, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));
	drawDot->setVisible(false);
	 
	//暂停按钮
	auto pause = MenuItemImage::create(
		"scene/pause.png",
		"scene/pause.png",
		CC_CALLBACK_1(GameScene::onPauseBtnPressed, this));
	pause->setPosition(80, WINSIZE.height - 80);

	//辅助圆按钮
	auto auxiliary = MenuItemImage::create(
		"scene/auxiliary.png",
		"scene/auxiliary.png",
		CC_CALLBACK_1(GameScene::onAuxiliaryLineBtnPressed, this));
	auxiliary->setPosition(640, WINSIZE.height - 80);

	//帮助按钮
	auto help = MenuItemImage::create(
		"scene/help.png",
		"scene/help.png",
		CC_CALLBACK_1(GameScene::onHelpBtnPressed, this));
	help->setPosition(80, WINSIZE.height - 200);

	auto menu = Menu::create(pause, auxiliary, help, NULL);
	menu->setPosition(Point::ZERO);
	this->addChild(menu);
}

//绘制遮罩圆(以Y轴为0角度)(参数:绘制的坐标,开始角度,终止角度,内部圆半径,外部圆半径,绘制的颜色)
void GameScene::drawCoverCircle(Vec2 &point, int startAngle, int endAngle, int radiusSmall, int radiusBig, Color4F &color) {

}

//获得旋转动作
ActionInterval *GameScene::getCircleAction(float speed) {
	auto action = RepeatForever::create(RotateBy::create(1.0f, speed));
	return action;
}

//初始化玩家小球
void GameScene::initUserBall(int num) {
	for(int i = 0; i < num; i++) {
		auto ball = Ball::create(num - i);
		ball->setPosition(360, 300 - 42 * i);
		ball->setVisible(false);
		this->addChild(ball);
		userBallList.push_back(ball);
	}
}

//将玩家小球加入旋转
void GameScene::addUserBallToCircle(Ball *ball) {
	//创建一个元素
	auto newBall = Ball::create(atoi(ball->numTTF->getString().c_str()));
	newBall->setPosition(circle->convertToNodeSpace(Point(360, 590)));
	circle->addChild(newBall);

	//创建DrawNode,然后后加入到Layer层中
	DrawNode* drawNode = DrawNode::create();
	circle->addChild(drawNode, -1);
	//drawNode->drawSegment(circle->getContentSize() / 2, newBall->getPosition(), 1, Color4F(57.0f / 255.0f, 60.0f / 255.0f, 77.0f / 255.0f, 1));
	drawNode->drawSegment(circle->getContentSize() / 2, newBall->getPosition(), 1, Color4F(142.0f / 255.0f, 72.0f / 255.0f, 12.0f / 255.0f, 1));

	for(unsigned int i = 0; i < ballList.size(); i++) {
		checkIsBallCollision(newBall, ballList.at(i));
	}
	ballList.push_back(newBall);

	//清空
	ball->removeFromParentAndCleanup(true);
	userBallNum--;
	//删除第一个元素
	userBallList.erase(userBallList.begin(), userBallList.begin()+1);
}

//检测小球是否碰撞
void GameScene::checkIsBallCollision(Ball *userBall, Ball *circleBall) {
	if(GlobalManage::getInstance()->getTwoPointDistance(userBall->getPosition(), circleBall->getPosition()) < 40) {
		isBallCollision = true;
		return;
	}
}

//创建失败层
void GameScene::createFailedLayer() {
}

//创建胜利层
void GameScene::createSuccessLayer() {
}

//游戏暂停按钮
void GameScene::onPauseBtnPressed(Ref* pSender) {
}

//点击显示辅助线
void GameScene::onAuxiliaryLineBtnPressed(Ref* pSender) {
}

//帮助按钮
void GameScene::onHelpBtnPressed(Ref* pSender) {
}

//绘制飞行小球
void GameScene::createFlyBall() {
	flyBall = Ball::create();
	flyBall->setPosition(Vec2(-20, 300));
	this->addChild(flyBall);
	flyBallX = flyBall->getPosition().x;
	flyBallY = flyBall->getPosition().y;
}

4.一些全局参数

#pragma once
#include "cocos2d.h"

USING_NS_CC;
using namespace std;

typedef struct {
	float x;
	float y;
}CirclePoint;

class GlobalManage {
public:
	GlobalManage();
	~GlobalManage();
	//全局单例
	static GlobalManage *singleInstance;
	//返回全局单例
	static GlobalManage *getInstance();
public:
	//圆内接多边形顶点
	CirclePoint getCirclePoint(int n, int i, Point circleCenter, Point point);
	//判断两点的距离
	float getTwoPointDistance(Point pos_1, Point pos_2);
	//绘制半圆
	void drawSolidSector(const Vec2 &orign,const Vec2 &beginVec, const float radius1, const float radius2, const float radian, const int segments, const cocos2d::Color4F &color);
public:
	//当前关卡
	int currentLevel;
public:
	//是否播放音乐
	bool isPlayMusic;
	//是否播放音效
	bool isPlayEffect;
};
#include "GlobalManage.h"
#include "GBK2UTF.h"

#define PI 3.1415926

USING_NS_CC;

//创建全局单例
GlobalManage* GlobalManage::singleInstance = NULL;

GlobalManage* GlobalManage::getInstance()
{
	if(singleInstance == NULL)
	{
		singleInstance = new GlobalManage();
	}
	return singleInstance;
}

GlobalManage::GlobalManage() 
	: currentLevel(1)
	, isPlayMusic(true)
	, isPlayEffect(true)
{

}

//圆内接多边形顶点
CirclePoint GlobalManage::getCirclePoint(int n, int i, Point circleCenter, Point point) {
	float a = 2 * 3.14159265 / n;
	float b = atan2(point.y - circleCenter.y, point.x - circleCenter.x);
	auto radius = sqrt((point.y - circleCenter.y) * (point.y - circleCenter.y) + (point.x - circleCenter.x) * (point.x - circleCenter.x));

	CirclePoint pos;
	pos.y = radius * sin(a * i + b) + circleCenter.y;
	pos.x = radius * cos(a * i + b) + circleCenter.x;

	return pos;
}

//判断两点的距离
float GlobalManage::getTwoPointDistance(Point pos_1, Point pos_2) {
	auto distance = pos_1.getDistance(pos_2);
	return distance;
}

到这里,我们游戏的主逻辑就实现了,大家已经可以点击小球进行玩耍了,整个游戏的主体玩法已经实现了,下面是不是要打开脑洞,想象如何让整个游戏更有趣呢?

下一章节将会一起实现游戏的结算界面和游戏音效,后面还会介绍如何增加趣味性哦。

使用cocoscreator开发的见缝插针小游戏 使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插 立即下载

相关推荐

⭐⭐⭐全网最详细YOLOv8教程,从环境配置到自己训练,再到数据集的制作,包的各位⭐⭐⭐

问题原因:当你“pip install ultralytics” 时,torch和torchvision会作为它的依赖一起安装了,当执行“pip install torch torchvision torchaudio --index-url。”时,会卸载torch,然后再安装torch+cuda版本,但是不会自动卸载torchvision已有版本,然后再安装torchvision+cuda版本。🎉🎉🎉恭喜各位道友,已经可以训练模型了,现在就是制作自己的数据集,所谓申神通秘境,随心所欲,万物皆可识别也

weixin_74840239的博客 7491

Cocos Creator 飞机大战微信小游戏开发

利用Cocos Creator开发工具进行飞机大战微信小游戏的实战开发,结合42个视频课程,带你实现该款飞机大战微信小游戏的开发,并最后上传到微信开发者工具进行体验! (注明:图片和音频素材、代码需要自行下载,下载链接已更新!)

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8519

cocos creator 3.0见缝插针(口红机)

cocos creator3.0 见缝插针效果展示实现思路关键代码试玩地址(加载慢,自己服务器带宽低)下载地址开源不易,仅学习使用 效果展示 ## gif 帧率较低 实际体验效果更好 实现思路 1、中间一个节点 里面有两个node 分别放背景橘子node,存放刀的node 然后只旋转这个中间节点让刀和背景一块旋转就行了 2、碰撞检测给每一把刀放上碰撞检测 3、下边放一把假的刀 用来做动画执行,刀子到达位置 将假的刀放回原来的位置,将复制新的刀到中间存刀的节点 4、判断下一关 将中间节点存刀的node判

张无忌的博客 1368

从SFF-8087到SFF-8643:详解服务器硬盘背板连接线缆的演变与实战接线

本文深度解析了服务器硬盘背板连接技术从SFF-8087到SFF-8643的演进历程,重点介绍了SAS、SATA和U.2接口的技术特点与实战接线方案。通过对比不同连接器标准的物理特性和电气规范,提供了混合环境下的线缆选择策略和常见故障排查指南,帮助IT专业人员优化存储系统性能与稳定性。

weixin_30603633的博客 272

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2103

Cocos2dx游戏教程(十二):“见缝插针”,游戏结算界面和音效

前面游戏主场景已经可以试玩了吧,但是是不是感觉很单调呢,如何进入下一关呢?要不要配置些音乐呢,在我的BGM中是不是有些无敌的感觉呢 首先我们来看一下需要添加的文件 我们可以看到,在这一节新增了GameFailedLayer,GameSuccessLayer,GameMusic,GameLevel四个类。 我们都知道如何创建一个层,我们首先来看一下胜利失败的界面吧 下面带领大家看看下如何实现界...

小白的专栏 922

Linux8.3上装Oracle 19c RAC,ssh互信总报INS-06006?别急着下补丁,试试这个临时替换scp的骚操作

本文针对在Linux 8.3上安装Oracle 19c RAC时遇到的SSH互信报错INS-06006问题,提供了一个无需官方补丁的临时解决方案。通过创建SCP包装脚本并添加-T参数,有效解决了OpenSSH 8.x版本与Oracle安装程序的兼容性问题,帮助用户顺利完成安装流程。

weixin_30764883的博客 401

Cocos2dx游戏教程(十四):“见缝插针”,点击事件

Cocos的事件分为大概6种,分别为屏幕点击事件、键盘输入、鼠标点击、加速度事件、focus、自定义事件,对事件的操作施行的是监听机制,就是每种事件都有一个监听者类型。 本节主要介绍屏幕/按键点击事件,其他不做详细说明,使用方式类似。 一、屏幕点击事件 我们首先来看屏幕点击事件的函数原型,屏幕点击事件分为单点触摸和多点触摸 1、单点触摸 std::function<bool(Touc...

小白的专栏 570

maya导入导出bvh 自动 脚本

maya打开bvh脚本

jacke121的专栏 1549

基于YOLOv8和时序模型的异常动作检测系统

异常动作检测是计算机视觉领域的重要应用,广泛应用于智能监控、安防系统、老人看护等场景。本项目结合YOLOv8目标检测和LSTM时序模型,实现对打架、摔倒、奔跑等异常动作的实时检测,并提供了完整的Web界面。多技术融合: 结合YOLOv8目标检测和LSTM时序建模实时检测: 支持实时视频流处理和文件分析用户友好: 提供完整的Web界面可扩展性: 模块化设计便于功能扩展高性能: 包含多种优化策略。

YOLO 763

Cocos2dx游戏教程(四):“见缝插针”,第一个场景的建立

从这一篇开始就正是进入游戏具体实现啦,前面都了解了核心类的基本操作,那么现在我们开始具体实现吧 一、见缝插针的玩法 简单的说,玩家有一些小球,将这些小球弹射到大球上且不能碰到大球上的小球哦,前面介绍的“口红机”就是这样的玩法,只不过我们把小球换成了口红而已。 看看广告词,说的还是很清楚的么 又是一款简单而不简略的游戏,游戏画面简略但玩法新颖。玩家手中有一定数量的针头,必须把所有的针头都插进旋转的球...

小白的专栏 736

【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏(附项目源码)

当今游戏产业中,经典游戏的复刻一直是一项受欢迎且具有挑战性的任务。俄罗斯方块是一个深入人心、令人上瘾的经典游戏,在过去几十年里一直享有广泛的流行度。其简单而富有策略性的玩法吸引了无数玩家的关注。因此,我决定利用Unity引擎来复刻这款经典游戏,以让更多的人重新体验其中的乐趣。通过使用Unity引擎,我能够利用其强大的工具和功能,从头开始构建一个与原版俄罗斯方块游戏相似的游戏。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2793

Cocos2dx游戏教程(一):“见缝插针”,游戏项目的搭建

前篇文章展示了“见缝插针”的游戏截图,下面带领大家一步一步完成自己的小游戏吧,前提是cocos2dx环境已经搭好了哦,官网有搭建的详细教程,这里不多说啦 cocos2dx 英文官网:http://www.cocos2d-x.org/ cocos2dx 中文社区:http://www.cocos.com/ 先说说自己,其实最开始根本没想到会走游戏这条路。曾经总是认为自己是小说里面的主角,最后才发现自...

小白的专栏 1589

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Cocos2dx游戏教程(二):“见缝插针”,从添加一幅图开始

前面的教程中我们已经完美的运行起了游戏工程,Cocos2dx是C/C++编写的呢,一个面向对象编程的游戏引擎哦,是不是有些心动呢,那么一起共勉吧! 错了,下面才是 一、认识工程目录结构 前面的教程已经认识了工程的目录结构,默认的目录有两个类 AppDelegate.cpp //程序入口文件 HelloWorldScene.cpp //默认场景文件 1.AppDelegate类 我们可以仔细看...

小白的专栏 1114

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Cocos2dx游戏教程(九):“见缝插针”,场景切换效果介绍

他来了,他来了,他带着炫酷的效果来了,前面我们一直想知道场景怎么切换,效果是什么,在这一节中将会给大家介绍Cocos2dx场景切换的效果。 一、游戏代码实现 前面我们已经介绍了游戏场景的跳转,现在结合游戏逻辑具体介绍下 1、将AppDelegate中的场景跳转还原到WelcomeScene auto scene = WelcomeScene::createScene(); 2、在welcomeS...

小白的专栏 492

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Cocos2dx游戏教程(五):“见缝插针”,第二个场景的建立

上一篇中我们建立了第一个场景,下面我们着手建立第二个场景哦,第二个场景比较复杂了,我们先看一下实现的效果吧,在本节中将会带大家一起实现第二场景。 场景的将会涉及到文件标签,菜单按钮等操作,下两节将会分别介绍文字标签和菜单的实现,现在可以先带着问题做下去哦。 看下对比图,是不是很有感觉了, 好像当时上数学课的样子~~ 开始准备今天的场景吧。 一、准备场景素材 场景中存在的元素有哪些呢? 对,有背...

小白的专栏 528

Cocos2dx游戏教程(六):“见缝插针”,菜单Menu与C++11新特性

上一节我们已经实现了第二个场景界面,最后按下按钮发现没有反应是不是,这一节将会给大家介绍下Cocos2dx另一个重要的对象,菜单Menu。 一、Menu介绍 提到Menu,不得不提到MenuItem,MenuItem继承自Node,所以它的子类菜单项都可以使用Node的相关操作。 MenuItem是所有菜单项的父类,建议不要直接使用该类,因为它并不包含具体显示的功能。 作为其它菜单项的父类,主要提...

小白的专栏 886

Cocos2dx游戏教程(三):“见缝插针”,Cocos2dx核心类介绍

前面给大家介绍了图片精灵的加载和相关核心类的描述,聪明的小伙伴们应该都已经了解了相关的使用方式吧,这次呢就详细的介绍下几个核心类的作用,使用方式和框架结构,巩固一下。 序、框架结构图 我们看一下将要实现的游戏的示意图,能看出哪些是场景,哪些是精灵么,还有文字和菜单按钮哦(后面介绍) 如下图所示,上章的Director,Node,Scene,Layer,Sprite结构图如下。 Node类是绝大部...

小白的专栏 633

Cocos2dx游戏教程(十三):“见缝插针”,更新函数Update

在前两个教程中是不是都出现了update方法呢?那么这个方法的左右时什么呢?本节将会给大家介绍下cocos2dx update方法以及定时器的运用。 相信大家在一看是创建空工程的时候应该就已经接触到了吧,运行工程后在屏幕的左下角有一个不停变换的数字,就在实时刷新哦,有一个方法 pDirector->setDisplayStats(true); pDirector->setAnimati...

小白的专栏 1383

Cocos2dx游戏教程(十):“见缝插针”,动作篇Action

一个成功的游戏如果只是一堆静态图片,那么和一幅画有什么区别呢?所以动静结合才是王道~~ 动作体系对于一款游戏的成功与否是有着非常重要的影响的。在这一节中将会带大家简单的认识动作体系。 常见的动作 我们在上节中发现场景的切换方式还可以采用runAction的方式使用 //跳转场景 this->runAction(Sequence::create( DelayTime::create(2.5f...

小白的专栏 744

Cocos2dx游戏教程(八):“见缝插针”,UserDefault数据存储与读取

前面已经介绍了前两个场景使用,中间涉及到了几个核心类,菜单,label标签等,同样我们也实现了两个场景的切换和关卡数字的显示。那么我们怎么记录游戏相关的信息呢? 下面我们将走进cocos2dx的数据存储,UserDefault。 一、UserDefault介绍 cocos2dx提供了一个数据存储类UserDefault,可以作为一个轻量级的数据库来使用。它支持五种基本数据bool、int、floa...

小白的专栏 669

Cocos2dx游戏教程(七):“见缝插针”,Label标签的使用

在创建第二场景中我们不仅看到了Menu的创建,其中是不是还有如下的创建方式啊? //关卡数字 auto levelTTF = Label::createWithCharMap("fonts/label/label_ball.png", 14, 20, '0'); levelTTF->setString(StringUtils::format("%d", 1)); levelTTF-&g...

小白的专栏 629

Cocos2dx游戏教程(十五):“见缝插针”,愿你走出半生,归来仍是少年

从决定写这个教程到第一个有戏教程结束也经历了好长时间,有的地方可能写的不好,也请大家多多包涵。决定写这个教程也是对自己学习的一个总结吧,写教程的过程也是自己学的过程。 一个小游戏所涉及到的知识点毕竟不是很全面,后续还是会继续写相关的内容介绍其他功能的使用,大家可以继续关注哦。 开篇 还记得夕阳下的奔跑,那是我逝去青春 2020年开春,一场突如其来的疫情打乱了大家的生活,让很多人一下陷入十分被动的...

小白的专栏 533

Cocos2dx游戏教程(序):火爆抖音的网红口红机真能扎到口红吗?

一、口红机是什么 最近口红机简直刷爆抖音,是不是看着都觉得手痒啦,它的玩法也很简单,扫码支付几块钱,然后就会获得一次闯三关的机会,用口红扎水果,三关如果口红全部扎上去了,就可以获得商家精心准备的各种大牌口红,那么小伙伴们是不是都去试了一式呢?到底能不能扎到口红呢?反正自己没试过~~~ ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020030723465794...

小白的专栏 990

Cocos2dx游戏教程(十六):绘制图形,DrawNode扇形以及环形

通过前面十五章的介绍,大家应该都能实现“见缝插针”的基本玩法了吧。 但从头玩到尾都是一个模式,是不是有些单调呢? 在这篇中将结合如何提升游戏难度和可玩性给大家介绍一下Cocos2dx 的DrawNode。 提到DrawNode我们可以通过cocos2dx自带的例子,其中有很多已经实现了的方法。 1、使用方法 //创建DrawNode,然后后加入到Layer层中 DrawNode* drawNode...

小白的专栏 1452
上一篇: Cocos2dx游戏教程(九):“见缝插针”,场景切换效果介绍
下一篇: Cocos2dx游戏教程(十):“见缝插针”,动作篇Action
胖胖的战士
博客等级 码龄18年 104粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值