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

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

前面游戏主场景已经可以试玩了吧,但是是不是感觉很单调呢,如何进入下一关呢?要不要配置些音乐呢,在我的BGM中是不是有些无敌的感觉呢

在这里插入图片描述
首先我们来看一下需要添加的文件
在这里插入图片描述
我们可以看到,在这一节新增了GameFailedLayer,GameSuccessLayer,GameMusic,GameLevel四个类。
我们都知道如何创建一个层,我们首先来看一下胜利失败的界面吧
在这里插入图片描述在这里插入图片描述
下面带领大家看看下如何实现界面

一、创建结算层

1、胜利层
头文件GameSuccessLayer.h

#pragma once
#include "cocos2d.h"

USING_NS_CC;

extern LanguageType type;

class GameSuccessLayer :public cocos2d::Layer{
public:
	CREATE_FUNC(GameSuccessLayer);
	virtual bool init();
public:
	//胜利对话框
	void initWinLayer();
public:
	//返回开始菜单
	void onReturnToMenuSceneBtnPressed(Ref* pSender);
	//返回选关
	void onReturnToSelectSceneBtnPressed(Ref* pSender);
	//分享
	void onShareBtnPressed(Ref* pSender);
	//下一关按钮回调
	void onNextLevelBtnPressed(cocos2d::Ref *pSender);
};

类文件 GameSuccessLayer.cpp

#include "GameSuccessLayer.h"
#include "GameLevelScene.h"
#include "Defines.h"
#include "GameMenuScene.h"
#include "GameScene.h"
#include "GameDataManage.h"
#include "GlobalManage.h"


bool GameSuccessLayer::init() {
	if(!Layer::init()) { 
		return false;
	}
	
	//胜利对话框
	initWinLayer();

	return true;
}

//胜利对话框
void GameSuccessLayer::initWinLayer() {
	//大背景
	auto bg = Sprite::create("scene/bg.jpg");
	bg->setPosition(WINSIZE / 2);
	this->addChild(bg);

	//过关背景
	auto bg2 = Sprite::create("win_or_lose/success.png");
	bg2->setPosition(Vec2(WINSIZE / 2));
	this->addChild(bg2, 1);

	//过关光效
	auto light = Sprite::create("win_or_lose/success_light.png");
	light->setPosition(Vec2(WINSIZE.width / 2, WINSIZE.height / 2 + bg2->getContentSize().height / 2 + light->getContentSize().height / 2 - 130));
	this->addChild(light);

	//过关文字
	auto title = Sprite::create("win_or_lose/success_title.png");
	title->setPosition(Vec2(WINSIZE.width / 2 - 30, WINSIZE.height / 2 + bg2->getContentSize().height / 2 + title->getContentSize().height / 2 - 30));
	this->addChild(title);

	//关卡
	auto level = Sprite::create("scene/level.png");
	level->setPosition(bg2->getContentSize().width / 2, 280);
	bg2->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 selectItem = MenuItemImage::create("win_or_lose/select.png", "win_or_lose/select.png");
	selectItem->initWithCallback(CC_CALLBACK_1(GameSuccessLayer::onReturnToSelectSceneBtnPressed, this));
	selectItem->setPosition(Vec2(200, 146));

	auto nextItem = MenuItemImage::create("win_or_lose/next.png", "win_or_lose/next.png");
	nextItem->initWithCallback(CC_CALLBACK_1(GameSuccessLayer::onNextLevelBtnPressed, this));
	nextItem->setPosition(Vec2(520, 146));

	auto menu = Menu::create(selectItem, nextItem, NULL);
	menu->setPosition(Vec2::ZERO);
	bg2->addChild(menu);
}

//返回开始菜单
void GameSuccessLayer::onReturnToMenuSceneBtnPressed(Ref* pSender) {
	GameDataManage::getInstance()->setCurrentMaxLevel(GlobalManage::getInstance()->currentLevel + 1);
	Director::getInstance()->replaceScene(GameMenuScene::createScene());
}

//返回选关
void GameSuccessLayer::onReturnToSelectSceneBtnPressed(Ref* pSender) {
	Director::getInstance()->replaceScene(GameLevelScene::createScene());
}

//分享
void GameSuccessLayer::onShareBtnPressed(Ref* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#endif
}

//重新开始
void GameSuccessLayer::onNextLevelBtnPressed(Ref* pSender) {
	if(GlobalManage::getInstance()->currentLevel >= GameDataManage::getInstance()->totalRow) {
		//跳转到主菜单界面
		Director::getInstance()->replaceScene(GameMenuScene::createScene());
	} else {
		GameDataManage::getInstance()->setCurrentMaxLevel(GlobalManage::getInstance()->currentLevel + 1);
		GlobalManage::getInstance()->currentLevel = GlobalManage::getInstance()->currentLevel + 1;
		//初始化下一关
		GameDataManage::getInstance()->loadGameData(GlobalManage::getInstance()->currentLevel);
		Director::getInstance()->replaceScene(GameScene::createScene());
	}
}

2、失败层
头文件GameFailedLayer.h

#pragma once
#include "cocos2d.h"

USING_NS_CC;

extern LanguageType type;

class GameFailedLayer :public cocos2d::Layer{
public:
	CREATE_FUNC(GameFailedLayer);
	virtual bool init();
public:
	//胜利对话框
	void initFailedLayer();
public:
	//返回开始菜单
	void onReturnToMenuSceneBtnPressed(Ref* pSender);
	//返回选关
	void onReturnToSelectSceneBtnPressed(Ref* pSender);
	//分享
	void onShareBtnPressed(Ref* pSender);
	//重新开始
	void onRestartBtnPressed(Ref* pSender);
};

类文件GameFailedLayer.cpp

#include "GameFailedLayer.h"
#include "GameLevelScene.h"
#include "Defines.h"
#include "GameMenuScene.h"
#include "GameScene.h"
#include "GlobalManage.h"

bool GameFailedLayer::init() {
	if(!Layer::init()) { 
		return false;
	}
	
	//失败对话框
	initFailedLayer();

	return true;
}

//胜利对话框
void GameFailedLayer::initFailedLayer() {
	//背景
	auto bg = Sprite::create("scene/bg.jpg");
	bg->setPosition(WINSIZE / 2);
	this->addChild(bg);

	//过关背景
	auto bg2 = Sprite::create("win_or_lose/failed.png");
	bg2->setPosition(Vec2(WINSIZE / 2));
	this->addChild(bg2, 1);

	//过关光效
	auto light = Sprite::create("win_or_lose/failed_light.png");
	light->setPosition(Vec2(WINSIZE.width / 2, WINSIZE.height / 2 + bg2->getContentSize().height / 2 + light->getContentSize().height / 2 - 130));
	this->addChild(light);

	//过关文字
	auto title = Sprite::create("win_or_lose/failed_title.png");
	title->setPosition(Vec2(WINSIZE.width / 2 - 30, WINSIZE.height / 2 + bg2->getContentSize().height / 2 + title->getContentSize().height / 2 - 30));
	this->addChild(title);

	//关卡
	auto level = Sprite::create("scene/level.png");
	level->setPosition(bg2->getContentSize().width / 2, 280);
	bg2->addChild(level);

	//关卡数
	auto levelTTF = Label::createWithCharMap("fonts/label/label_level_1.png", 31, 42, '0');
	levelTTF->setString(StringUtils::format("%d", GlobalManage::getInstance()->currentLevel));
	if (type == LanguageType::CHINESE) {
		levelTTF->setPosition(level->getContentSize() / 2);
	}
	else {
		levelTTF->setPosition(level->getContentSize().width, level->getContentSize().height / 2);
	}
	level->addChild(levelTTF);

	//按钮
	auto selectItem = MenuItemImage::create("win_or_lose/select.png", "win_or_lose/select.png");
	selectItem->initWithCallback(CC_CALLBACK_1(GameFailedLayer::onReturnToSelectSceneBtnPressed, this));
	selectItem->setPosition(Vec2(200, 146));

	auto replayItem = MenuItemImage::create("win_or_lose/replay.png", "win_or_lose/replay.png");
	replayItem->initWithCallback(CC_CALLBACK_1(GameFailedLayer::onRestartBtnPressed, this));
	replayItem->setPosition(Vec2(520, 146));

	auto menu = Menu::create(selectItem, replayItem, NULL);
	menu->setPosition(Vec2::ZERO);
	bg2->addChild(menu);

}

//返回开始菜单
void GameFailedLayer::onReturnToMenuSceneBtnPressed(Ref* pSender) {
	Director::getInstance()->replaceScene(GameMenuScene::createScene());
}

//返回选关
void GameFailedLayer::onReturnToSelectSceneBtnPressed(Ref* pSender) {
	Director::getInstance()->replaceScene(GameLevelScene::createScene());
}

//分享
void GameFailedLayer::onShareBtnPressed(Ref* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#endif
}

//重新开始
void GameFailedLayer::onRestartBtnPressed(Ref* pSender) {
	Director::getInstance()->replaceScene(GameScene::createScene());
}

胜利失败界面已经创建好了,那么我我们在GameScene中进行触发吧,触发方式如下,在GameScene中update下如下实现

//刷新游戏
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) {
		//播放音效
		GameMusic::playEffect("music/fail.wav");
		circle->stopAction(rotate);
		this->runAction(Sequence::create(
			DelayTime::create(0.8f),
			CallFunc::create(CC_CALLBACK_0(GameScene::createFailedLayer, this)),
			NULL));
		unscheduleUpdate();
	}

	if (!isBallCollision) {
		if (userBallNum == 0) {
			//播放音效
			GameMusic::playEffect("music/win.wav");
			this->runAction(Sequence::create(
				DelayTime::create(0.5f),
				CallFunc::create(CC_CALLBACK_0(GameScene::createSuccessLayer, this)),
				NULL));
			unscheduleUpdate();
		}
	}
}

有人会问Update是干甚的?下一节将会带领大家了解cocos2dx刷新和定时器

二、创建选关界面

上述胜利失败界面已经显示出来了,那么我们如何进入下一关呢?
首先我们需要一个关卡选择的界面,还记得前面第二个场景中关卡选择按钮么,就是跳转到这个界面哦
在这一段代码中涉及到触摸方法,后续会对相关内容进行单独的介绍
那么我们直接看一下实现

头文件GameLevelScene.h

#pragma once
#include "cocos2d.h"

USING_NS_CC;

class GameLevelScene : public cocos2d::Layer {
public:
	GameLevelScene();
	~GameLevelScene();
    static cocos2d::Scene* createScene();
    virtual bool init();   
    CREATE_FUNC(GameLevelScene);
	//触摸开始方法
    bool onTouchBegan(Touch* touch, Event* event);
    //触摸移动方法 
    void onTouchMoved(Touch* touch, Event* event);
    //触摸结束方法
    void onTouchEnded(Touch* touch, Event* event);
public:
	void onKeyReleased(EventKeyboard::KeyCode keycode, Event* event);
public:
	//点击关卡按钮
	void onLevelBtnPressed(Ref* pSender, int level);
	//返回按钮回调
	void onBackBtnPressed(cocos2d::Ref *pSender);
private:
	Layer *levelLayer;
private:
	Point pos1;
	Point pos2;
	//当前页编号
	int pageIndex;
};

类文件GameLevelScene.cpp

#include "GameLevelScene.h"
#include "GameScene.h"
#include "GameMenuScene.h"
#include "GameDataManage.h"
#include "GlobalManage.h"
#include "Defines.h"

#define PAGE_CONTIANER_MAX	40
#define LEVEL_PAGES  (int)(ceil((float)(GameDataManage::getInstance()->totalRow) / (float)(PAGE_CONTIANER_MAX)))

GameLevelScene::GameLevelScene() :pageIndex(1){
}

GameLevelScene::~GameLevelScene() {
}

Scene* GameLevelScene::createScene()
{
    auto scene = Scene::create();
    auto layer = GameLevelScene::create();
    scene->addChild(layer);
    return scene;
}

bool GameLevelScene::init() {
	if(!Layer::init()) {
		return false;
	}

	//绘制游戏背景
	auto bg = Sprite::create("level/bg_level.jpg");
	bg->setPosition(WINSIZE / 2);
	this->addChild(bg);

	//返回按钮
	auto back = MenuItemImage::create(
		"common/back.png",
		"common/back.png",
		CC_CALLBACK_1(GameLevelScene::onBackBtnPressed, this));
	back->setPosition(60, WINSIZE.height - 60);
	
	auto menu = Menu::create(back, NULL);
	menu->setPosition(Point::ZERO);
	this->addChild(menu, 1);
	
	levelLayer = Layer::create();
	this->addChild(levelLayer);
	//绘制关卡
	int index = 0;
	int maxLevel = GameDataManage::getInstance()->totalRow;
	for(int i = 1; i <= maxLevel; i++) {
		MenuItemImage *item = NULL;
		if(i <= GameDataManage::getInstance()->getCurrentMaxLevel()) {
			item = MenuItemImage::create(
				"level/has_pass.png",
				"level/has_pass.png",
				CC_CALLBACK_1(GameLevelScene::onLevelBtnPressed, this, i));
		} else {
			item = MenuItemImage::create(
				"level/has_pass.png",
				"level/has_pass.png",
				CC_CALLBACK_1(GameLevelScene::onLevelBtnPressed, this, i));
			//添加所锁
			auto lock = Sprite::create("level/lock.png");
			lock->setPosition(Vec2(item->getContentSize() / 2));
			item->addChild(lock, 10);
		}
		item->setPosition(WINSIZE.width * (int)(index / PAGE_CONTIANER_MAX) + 130 + index % 5 * (item->getContentSize().width + 5),
			1080-(index % PAGE_CONTIANER_MAX) / 5 * (item->getContentSize().width + 5));
	
		auto menu = Menu::create(item, NULL);
		menu->setPosition(Point::ZERO);
		levelLayer->addChild(menu);
		index++;
		//显示关卡数
		auto levelTTF = Label::createWithCharMap("fonts/label/label_level_2.png", 32, 44, '0');
		levelTTF->setPosition(item->getContentSize() / 2);
		levelTTF->setString(to_string(i));
		item->addChild(levelTTF);
	}

		//创建一个触摸监听 
	auto touchListener = EventListenerTouchOneByOne::create();   
	//向下传递触摸事件
	touchListener->setSwallowTouches(false);
	touchListener->onTouchBegan = CC_CALLBACK_2(GameLevelScene::onTouchBegan, this);
	touchListener->onTouchMoved = CC_CALLBACK_2(GameLevelScene::onTouchMoved, this);
	touchListener->onTouchEnded = CC_CALLBACK_2(GameLevelScene::onTouchEnded, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);

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

	return true;
}

//触摸开始方法
bool GameLevelScene::onTouchBegan(Touch* touch, Event* event) {
	pos1 = touch->getLocation();
	return true;
}
//触摸移动方法 
void GameLevelScene::onTouchMoved(Touch* touch, Event* event) {
	pos2 = touch->getLocation();
}
//触摸结束方法
void GameLevelScene::onTouchEnded(Touch* touch, Event* event) {
	if(pos1.x - pos2.x > 100) {
		//向后翻页
		if(pageIndex < LEVEL_PAGES) {
			if(levelLayer->getNumberOfRunningActions() == 0) {
				levelLayer->runAction(MoveTo::create(0.5f, Point(-WINSIZE.width * pageIndex, 0)));
				pageIndex++;	
			}
		} else {
			pageIndex = LEVEL_PAGES;
		}	
	}
	if(pos1.x - pos2.x < -100) {
		//向前翻页
		if(pageIndex > 1) {
			if(levelLayer->getNumberOfRunningActions() == 0) {
				levelLayer->runAction(MoveTo::create(0.5f, Point(-WINSIZE.width * (pageIndex - 2), 0)));	
				pageIndex--;
			}
		} else {
			pageIndex = 1;
		}
	}
}

void GameLevelScene::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 GameLevelScene::onLevelBtnPressed(Ref* pSender, int level) {
	GlobalManage::getInstance()->currentLevel = level;
	if(GlobalManage::getInstance()->currentLevel > GameDataManage::getInstance()->getCurrentMaxLevel()) {
	} else {
		//友盟统计关卡
		GameDataManage::getInstance()->loadGameData(GlobalManage::getInstance()->currentLevel);
		Director::getInstance()->replaceScene(GameScene::createScene());
	}
}

//返回按钮回调
void GameLevelScene::onBackBtnPressed(cocos2d::Ref *pSender) {
	Director::getInstance()->replaceScene(GameMenuScene::createScene());
}

三、游戏音效SimpleAudioEngine

SimpleAudioEngine是一个单例,使用方式为

CocosDenshion::SimpleAudioEngine::getInstance()

开启音效别忘了在AppDelegete中将如下打开哦,这个是设置游戏前台后台运行时需要做的操作哦

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
	Director::getInstance()->stopAnimation();
	// if you use SimpleAudioEngine, it must be pause
	CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
	Director::getInstance()->startAnimation();
	// if you use SimpleAudioEngine, it must resume here
	CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}

我们来看下对GameMusic的封装

头文件GameMusic.h

#pragma once
#include "cocos2d.h" 
#include "GlobalManage.h"
#include "SimpleAudioEngine.h"

class GameMusic
{
public:
    //播放音乐
    static void playMusic(const char *music, bool loop = false);
	//播放音效
    static void playEffect(const char *effect, bool loop = false);
	//停止音乐
    static void stopMusic();
	//停止音效
    static void stopAllEffect();
    //暂停音乐
    static void pauseMusic();
	//恢复音乐
    static void resumeMusic();
};

类文件GameMusic.cpp

#include "GameMusic.h"
#include "GlobalManage.h"

USING_NS_CC;

//播放音乐
void GameMusic::playMusic(const char *music, bool loop) {
	if(GlobalManage::getInstance()->isPlayMusic) {
		CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic(music, loop);
	}
}

//播放音效
void GameMusic::playEffect(const char *effect, bool loop) {
	if(GlobalManage::getInstance()->isPlayEffect) {
		CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(effect, loop);
	}
}

//停止音乐
void GameMusic::stopMusic() {
	 CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic();
}

//停止音效
void GameMusic::stopAllEffect() {
	CocosDenshion::SimpleAudioEngine::getInstance()->stopAllEffects();
}

//暂停音乐
void GameMusic::pauseMusic() {
	CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

//恢复音乐
void GameMusic::resumeMusic() {
	CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}

实现到这里其实整个游戏大部分已经完成啦,有兴趣的小伙伴们可以发散下自己的思维啊,设计一些更好玩的玩法哈

Cocos2d-x 3D渲染技术 (三) cocos2dx中的物理碰撞——AABB包围盒和OBB包围盒 阅读详情

相关推荐

浅谈cocos2dx渲染方式

实际上,localZOrderAndArrival在addChild的时候就会生成一个,在前面addChild的时候,生成的会小于后面addChild的。CustomCommand是所有命令中最简单的一个,也是最灵活的一个,绘制的内容和方式完全交由我们自己决定。我们一般globalZOrder都是设置为0,那么设置为0,这里就不会进行排序,那么节点渲染的顺序就是之前加入RenderCommon的顺序,也就是之前对子节点排序的顺序。后续,会判断下一条的指令的ID是否和上一个相同,如果相同,那么就继续放入。

canjiangmengyuan的专栏 1137

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

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

张无忌的博客 1368

使用cocoscreator开发的见缝插针小游戏

使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插针小游戏使用cocoscreator开发的见缝插

Cocos2d-x 基本操作+事件监听+调试技巧+常见问题

本节将分享一些 1. Cocos2dx开发中VS(通用)基本操作 2. 常见问题的Debug操作(非断点调试) Cocos2d-x 版本:3.17.2 目录 一. 基本操作 1. 快速查看对应的函数声明(Ctrl+点击) 2. 快速查找/替换(Ctrl+F) 3. 查看所有引用(Fn+Shift+F12) 4. 格式化输出 5. 监听事件 点击按钮触发 鼠标点击事件 键盘事件 二. 常见问题 1. Debug常规操作 编译时出错 运行时出错 控制变量+日志输出 ..

HYY的博客 8499

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

一名全栈小白的博客 1万+

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好,这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时,通过阅读大量他人的程序,发现TDM及TDMS文件十分适合波形数据的记录,TDMS文件比TDM文件在存储动态类型数据时读写速度更快,而且TDMS 文件没有容量限制,适合存储数据量庞大的测试数据。 前言少叙,书归正传 这一篇博客,说明一下如何使用基本的TDMS功能实现数据文件的存储。 所需要的控件如上图所示,在程序框图——编程——文件I\O——TDMS 中,写入TDMS

滑板小帅程序开发 2万+

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

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

小白的专栏 1383

数字设计实验:RISC-V指令单周期CPU

本文旨在介绍RISC-V指令单周期CPU的设计思路和仿真实现(含代码)

2401_83740084的博客 2710

cocos2dx 4.0入门之泡泡龙项目的分解(三)

目录导读一、cocos2dx概念1、cocos2dx加载图片资源的两种方式2、cocos2dx音效的概念3、cocos2dx粒子系统的概念二、认识道具师团队2.1 实现初始化2.2 显示加载百分比2.3 资源加载界面替换为进入主界面2.4 实现一个菜单项 导读 上一章,我们讲解了cocos的基本概念。我们做一个场景基本的步骤是: 创建一个场景---->交给层类布置---->将层加入场景 本章要讲的是: 1.cocos2dx加载图片资源的两种方式 2.cocos2dx音效的使用 3.cocos2d

qq_23345187的博客 1741

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸?

Crazydoubao的博客 4903

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 778

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

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

小白的专栏 886

板蓝根挥发油微胶囊化技术及其在抗菌织物整理中的应用研究

微胶囊技术是一种通过成膜材料将具有反应活性或挥发性的液体或固体包封成微小颗粒的技术。该技术因其优异的缓释保护和物态改变性能,已在医药、食品、化妆品等多个领域得到广泛应用。本研究采用复凝聚法制备板蓝根挥发油的微胶囊,利用明胶和阿拉伯胶作为壁材,旨在提升其稳定性和抗菌性能。

qq_62634009的博客 584

cocos2dx简介

作者简介 1973年,Ricardo Quesada出生于阿根廷。 在Ricardo 12岁时,他母亲为他购买了第一台电脑,一台Commodore 64。 刚开始,与其他孩子一样,Ricardo将自己的精力放在电子游戏上,但在几个月后,他购买了编程方面的书籍,开始学习用BASIC语言编写一些简单的游戏。两年后,Ricardo开始学习汇编语言。 在Commodore 64上,Ricardo制作了很多

944

月薪2万+的网络工程师,到底藏着哪些“绝活”?

在IT圈,网络工程师是个既神秘又硬核的职业。月薪2万+的网工,早已不是只会拉网线、改IP的“IT民工”,而是掌握了一身“绝技”的技术大牛。他们能让企业网络如丝般顺滑,面对宕机临危不乱,还能用自动化脚本批量搞定上百台设备。想知道这些高薪网工的秘密武器是什么?今天,我就以一个老网工的视角,结合自己和同行们的实战经验,扒一扒那些月薪2万+的网络工程师都身怀哪些绝技。如果你也想挤进高薪行列,不妨参考参考!

网络技术联盟站 359

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Cocos2d、Cocos2dx、Cocos Creator、Cocos Studio的区别

若是打算开发3D微信小游戏,建议选择Laya或Cocos Creator 3D,PC端3D游戏建议选择Unity。Cocos2dx是Cocos2d的C++写法,但是游戏架构是一样的,都包含了精灵、导演、场景、动作等概念,他们是一脉相承的东西。如果之前从事Unity开发,想业余时间开发微信小游戏上线,选择Cocos Creator几乎无缝衔接,因为Cocos Creator就是中国版的Unity。如果是IOS开发人员,且使用的语言是Object-C,想着手开发游戏Cocos 2d是不错的选择。

asi2007的专栏 2892

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

前面是节介绍了Cocos2dx的相关知识,也实现了相关场景,这一节设计的游戏的具体实现啦,我们看一下新增的类,主要有小球类ball,定义类define,全局方法类GlobalManage,主场景类GameScene 这一节完成后大家就可以初步进行游戏啦,前介绍过的相关功能在本章节中都有体现哦,这章节主要就上代码吧。 下面我们看下文件列表,可以看到红框中新增的文件,下面介绍文件的具体实现。 大家将第...

小白的专栏 747

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

小白的专栏 570

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

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

小白的专栏 744

【笔记】cocos2dx xxtea逆向获取lua脚本和资源文件

我们先来处理lua脚本。参考博客使用的是雷电模拟器,我使用的是夜神模拟器,博客连接安装的XposedInstaller并不能在夜神模拟器上正常运行,其实一般的模拟器都有XposedInstaller的下载地址,下载对应的版本即可。我们开始对结果进行分析,最开始的时候我发现了一个很奇怪的乱码一样的方法,就是cocos2d::LuaStack::hfhgjrhrhfxs,上图中有显示,于是我就双击了这个方法。因为cocos2dx作为一个开源的引擎,官方的命名是固定规则的,那么这个方法肯定是一个自定义的方法。

sirria1的专栏 3989

cocos2dx学习之路(一)———windows10下cocos2dx环境配置

cocos2dx学习之路

Jack的博客 5295

Cocos2d-x基础概念详情篇

Cocos2d-x基础概念详情篇 导演(Director) 控制电影制作流程,指导团队完成各项任何   Cocos2d-x使用导演的概念,这个导演和电影制作过程中的导演一样!导演控制电影的制作流程,指导团队完成各项任务。在使用Cocos2d-x开发游戏的过程中,你可以认为自己是执行制片人,告诉**导演(Director)**该怎么办!一个常见的Director任务是控制场景替换和转换。Director是一个共享的单例对象,可以在代码中的任何地方调用。   这是一个典型的游戏流程实例。当您的游戏设计好时,

田螺姑娘的博客 3565

Cocos开发

是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS也可以理解为我们常说的“刷新率(单位为Hz)”,例如我们常在游戏里说的“FPS值”。例如:75Hz的刷新率刷也就是指屏幕一秒内只扫描75次,即75帧/秒。有关动画播放速度的单位是fps,其中的f就是英文单词Frame(画面、帧),p就是Per(每),s就是Second(秒)。Cocos Creator是一个数据驱动的开发流程,其意思就是Cocos的游戏启动是通过读取场景中的资源和脚本,而不是通过一段入口的程序。

weixin_46430763的博客 1290

《入门级-Cocos2d 4.0塔防游戏开发》---实战

在这份教程中,我们将探索如何在 UOS 专业版本搭建 Cocos2d-x 4.0 的开发环境,并逐步开发一个简单的游戏欢迎界面。在第一课中,我们将学习场景的添加与管理,掌握 Cocos2d-x 4.0 的基础开发知识。在第二课,我们将重点介绍游戏加载界面的开发,详解场景添加的技巧与用法。在第三课,我们将实现欢迎界面的精灵添加和位置设置,以及实现加载页面到欢迎页面的转场效果。第四课将着重展示精灵的动画功能开发,包括移动、变大变小和帧动画的实现。最后,在第五课,我们将深入讲解精灵的鼠标响应事件,使你能够为你的游

啊渊的专栏 4723
上一篇: Cocos2dx游戏教程(十):“见缝插针”,动作篇Action
下一篇: Cocos2dx游戏教程(十三):“见缝插针”,更新函数Update
胖胖的战士
博客等级 码龄18年 104粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值