制作飞镖忍者(2) Cocos2d-x 3.0alpha0

2023-10-15 11:50

本文主要是介绍制作飞镖忍者(2) Cocos2d-x 3.0alpha0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在第一篇《制作飞镖忍者(1)》基础上,增加旋转炮塔功能,原文《How To Make A Simple iPhone Game with Cocos2D 2.X Part 2》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。

步骤如下:
1.使用上一篇的工程;
2.下载本游戏所需的资源,将资源放置"Resources"目录下:

删除旧的资源player.pngprojectile.png
3.在HelloWorldScene.cpp文件,init函数,修改创建玩家精灵:

        _player = Sprite::create("player2.png");
onTouchesEnded 函数,修改创建子弹精灵:

    Sprite* projectile = Sprite::create("projectile2.png");
4.编译运行,可以看到炮塔发射出了子弹,但是有一点奇怪,射击的时候,炮塔并没有朝向那个方向,如下图所示:


5.计算炮塔旋转的角度。看下面图:

数学的知识就是,tan(angle) = 对边 / 邻边,利用反正切angle = arctan(对边 / 邻边),这时计算出的是弧度,用CC_RADIANS_TO_DEGREES宏转换成角度。另外在数学中,逆时针为正,在Cocos2D-x中,顺时针为正,就如下图所示:

需要将最后计算出的角度乘以-1。在
onTouchesEnded函数里,添加如下代码在projectile精灵runAction之前:

    float angleRadians = atanf((float)offRealY / (float)offRealX);float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);float cocosAngle = -1 * angleDegrees;_player->setRotation(cocosAngle);
7.编译运行,这时就可以看到炮塔旋转射击了。如下图所示:



8.旋转再射击。炮塔的旋转是瞬间完成的,这不符合现实,需要让它有个动作移动炮塔的方向。在HelloWorldScene.h文件中,添加如下声明:

    Sprite* _nextProjectile;
在构造函数里面,添加如下:

    _player = NULL;_nextProjectile = NULL;
修改 onTouchesEnded 函数,并且添加finishShoot方法,代码如下:

void HelloWorld::onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *event)
{if (_nextProjectile != NULL) {return;}Touch* touch = touches.front();Point location = this->convertTouchToNodeSpace(touch);Size winSize = Director::getInstance()->getWinSize();_nextProjectile = Sprite::create("projectile2.png");_nextProjectile->retain();_nextProjectile->setScale(2);_nextProjectile->setPosition(Point(20, winSize.height / 2));Point offset = ccpSub(location, _nextProjectile->getPosition());if (offset.x <= 0) {return;}int realX = winSize.width + _nextProjectile->getContentSize().width / 2;float ratio = (float)offset.y / (float)offset.x;int realY = realX * ratio + _nextProjectile->getPosition().y;Point realDest = Point(realX, realY);int offRealX = realX - _nextProjectile->getPosition().x;int offRealY = realY - _nextProjectile->getPosition().y;float length = sqrtf(offRealX * offRealX + offRealY * offRealY);float velocity = 480 / 1;float realMoveDuration = length / velocity;float angleRadians = atanf((float)offRealY / (float)offRealX);float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);float cocosAngle = -1 * angleDegrees;float rotateDegreesPerSecond = 180 / 0.5;float degreesDiff = _player->getRotation() - cocosAngle;float rotateDuration = fabs(degreesDiff / rotateDegreesPerSecond);RotateTo* rotate = RotateTo::create(rotateDuration, cocosAngle);CallFunc* callFc = CallFunc::create(std::bind(&HelloWorld::finishShoot, this));_player->runAction(Sequence::create(rotate,callFc, NULL));_nextProjectile->runAction(Sequence::create(MoveTo::create(realMoveDuration, realDest),CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this,_nextProjectile)), NULL));_nextProjectile->setTag(2);}void HelloWorld::finishShoot()
{this->addChild(_nextProjectile);_projectiles->addObject(_nextProjectile);_nextProjectile->release();_nextProjectile = NULL;
}
在函数开头检验_nextProjectile变量,如果非空表示炮塔正在旋转中。不把_nextProjectile立即加到场景中,等待旋转完毕再加入场景。炮塔旋转的速度,为半秒钟旋转半个圆,计算所旋转角度所需的时间。
9.编译运行,可以看到炮塔可以在旋转后进行射击了,如下图所示:


参考资料:
1.How To Make A Simple iPhone Game with Cocos2D 2.X Part 2 http://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-2
2.(译)如何使用cocos2d开发一个简单的iphone游戏:旋转炮塔。(第二部分) http://www.cnblogs.com/zilongshanren/archive/2011/03/28/1997820.html
非常感谢以上资料,本例子源代码附加资源 下载地址 http://pan.baidu.com/s/16Bp7h
如文章存在错误之处,欢迎指出,以便改正。欢迎大家留言讨论技术!

这篇关于制作飞镖忍者(2) Cocos2d-x 3.0alpha0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217532

相关文章

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

OpenStack离线Train版安装系列—0制作yum源

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack镜像制作系列5—Linux镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

OpenStack镜像制作系列4—Windows Server2019镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录  CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系

OpenStack镜像制作系列2—Windows7镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系列

OpenStack镜像制作系列1—环境准备

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

CSDN:OpenStack镜像制作教程指导(全)

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录,涉及基本环境准备、常见类型操作系统的镜像制作。 让你可以从零开始安装一个操作系统,并支持个性化制作OpenStack镜像。 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧