【100个Cocos实例】还记得这个指哪打哪的游戏吗?

指哪打哪

引言

Cocos中简易实现炉石目标选择箭头效果

23年1月24日0时,由网易代理的暴雪系列游戏在国内正式终止运营

炉石传说,一个陪伴了笔者4年的游戏,传说、竞技场12胜历历在目。

转眼停服已经快1年,有小道消息称炉石即将回归国服,勾起满满的回忆。

咱们搞技术的,不会表达,做个类似的简易的目标选择效果看看!

本文将介绍一下Cocos中简易实现炉石目标选择箭头效果

本文源工程可在文末阅读原文获取,小伙伴们自行前往。

1.目标选择效果

在这里插入图片描述

通常在游戏开发中,战斗或者其他场景,需要玩家去操作选择需要攻击的目标、需要移动到的点

为了表现更明显的效果,会采用箭头指示的形式。

箭头一般从起点出发指向终点,期间还可以做一些动画,使得效果生动一点。

这里面有哪些知识点?

2.需求分析

原版附带箭头的形变,通过模型实现,我们暂时做个简易版本的,后续有时间再实现个3d版本。

要在Cocos中简易实现炉石目标选择箭头效果,可能需要以下知识点

  • 获取鼠标点击位置、实时获取鼠标位置。
  • 箭头的跟随和指向。
  • 箭头长度的控制。
  • 箭头身体部位做一些简易的动画。

下面一起来简易实现炉石目标选择箭头效果。

3.简易实现炉石目标选择箭头效果

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

从网络上找来熟悉的资源。简单拼接一下,由于箭头可以控制长短,我们分成2部分

  • 箭头部分
  • 身体部分

结构清晰

为了让身体的每一格排列整齐,我们添加一个垂直布局

垂直一点

关于箭头长短的控制,我们使用Mask组件和UITransform组件实现。

通过height修改长度

下面一起来写代码。

3.编写代码

首先我们创建一个HeartStoneArrow组件并且添加到节点上。

import { _decorator, Component, EventMouse, find, misc, Node, NodeEventType, UI, UITransform, v2, v3, Vec2, Vec3 } from 'cc';
const { ccclass, property } = _decorator;@ccclass('HeartStoneArrow')
export class HeartStoneArrow extends Component {arrow: Node;body: Node;bodyTrans: UITransform;criticalValue: number;
}

然后start()方法中进行初始化。

start() {const canvas = find("Canvas");this.arrow = canvas.getChildByPath("HeartStoneArrow/arrow");this.arrow.active = false;this.body = canvas.getChildByPath("HeartStoneArrow/body");this.bodyTrans = this.body.getComponent(UITransform);const len = this.body.children[0].children.length;const lastChildren = this.body.children[0].children[len - 1];this.criticalValue = lastChildren.position.y + lastChildren.getComponent(UITransform).height;let startPos = null;
}

鼠标的点击位置通过NodeEventType.MOUSE_DOWN事件的getUILocation()获取。

canvas.on(NodeEventType.MOUSE_DOWN, (event: EventMouse) => {const pos = event.getUILocation();startPos = v3(pos.x, pos.y, 0);this.body.worldPosition = startPos;this.arrow.worldPosition = startPos;
}, this);

效果如下:

点哪去哪

然后在NodeEventType.MOUSE_DOWN事件中更新箭头的位置和朝向、更新身体的长度和朝向

canvas.on(NodeEventType.MOUSE_MOVE, (event: EventMouse) => {if (startPos != null) {if (!this.arrow.active) {this.arrow.active = true;}const pos = event.getUILocation();this.arrow.worldPosition = v3(pos.x, pos.y, 0);this.body.angle = this.calculateAngle(v2(0, 1), v2(pos.x - startPos.x, pos.y - startPos.y))this.arrow.angle = this.body.angle;this.bodyTrans.height = (Vec3.distance(this.arrow.worldPosition, startPos) - 50) / this.node.scale.y;}
}, this);

其中朝向的计算运用到了求2个向量的夹角

calculateAngle(vectorA: Vec2, vectorB: Vec2) {// 使用 Math.atan2 获取带方向的角度(弧度)const angleRad = Math.atan2(vectorB.y, vectorB.x) - Math.atan2(vectorA.y, vectorA.x);// 将弧度转换为角度const degrees = misc.radiansToDegrees(angleRad);// 确保角度在 [0, 360) 范围内return (degrees + 360) % 360;
}

箭头的长度通过修改Mask组件所在的节点的UITransform组件的高度,长度的计算用Vec3.distance计算。

this.bodyTrans.height = (Vec3.distance(this.arrow.worldPosition, startPos) - 50) / this.node.scale.y;

效果如下:

旋转、伸缩

最后箭头的简易动画效果我们在update中实现,不断更新y坐标,并且循环

protected update(dt: number): void {for (let i = 0; i < this.body.children[0].children.length; i++) {this.body.children[0].children[i].position = this.body.children[0].children[i].position.add3f(0, 10, 0);if (this.body.children[0].children[i].position.y >= this.criticalValue) {this.body.children[0].children[i].position = v3();}}
}

效果如下:

循环指向

就这样我们的代码编写完毕,下面看看效果。

5.效果演示

胜利的喜悦

结语

向好游戏和青春致敬!

本文源工程可通过私信HeartStoneArrow获取。

在哪里可以看到如此清晰的思路,快跟上我的节奏!关注我,和我一起了解游戏行业最新动态,学习游戏开发技巧。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319346.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECMAScript和JavaScript的区别

ECMAScript和JavaScript是相关但不同的概念。下面详细介绍它们的区别和差异。 1.背景&#xff1a; JavaScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff09;通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛&#xff0c;它往往被称…

python爬虫实现获取招聘信息

使用的python版本&#xff1a; 3.12.1 selenium版本&#xff1a;4.8.0 urllib版本&#xff1a;1.26.18 from selenium import webdriver from selenium.webdriver import ActionChains import timeimport re import xlwt import urllib.parsedef get_html(url):chrome_drive…

CMake入门教程【核心篇】添加库(add_library)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 基本用法2.STATIC…

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果

原创作者&#xff1a;恋猫de小郭 相信大家都已经听说过&#xff0c;明年的 Harmony Next 版本将正式剥离 AOSP 支持 &#xff0c;基于这个话题我已经做过一期问题汇总 &#xff0c;当时在 现有 App 如何兼容 Harmony Next 问题上提到过&#xff1a; 华为内部也主导适配目前的主…

力扣题:高精度运算-1.2

力扣题-1.2 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;415. 字符串相加 解题思想&#xff1a;从后往前遍历两个字符串,然后进行相加即可 class Solution(object):def addStrings(self, num1, num2):""":type num1: str:type …

uni-app 前后端调用实例 基于Springboot 详情页实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

计算机基础面试题 |08.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Linux——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

PNG图片导入Abaqus建模:Abaqus Image To Part 2D插件

插件介绍 Abaqus Image To Part 2D - AbyssFish 插件可将图像导入Abaqus内并通过对网格单元集进行材料指定&#xff0c;实现基于图像的模型部件生成。 插件支持JPEG、JPG、PNG、GIF、TIFF、BMP、PCX、ICO等多种图像格式&#xff0c;兼容彩图、灰度图、二值图像等类型&#x…

2_并发编程同步锁(synchronized)

并发编程带来的安全性同步锁(synchronized) 1.他的背景 当多个线程同时访问&#xff0c;公共共享资源的时候&#xff0c;这时候就会出现线程安全&#xff0c;代码如&#xff1a; public class AtomicDemo {int i0;//排他锁、互斥锁public void incr(){ //synchronizedi; …

基于SSM的滁艺咖啡在线销售系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…