愤怒的小鸟

news/2025/3/15 21:37:51/文章来源:https://www.cnblogs.com/hellocj/p/18774223

Day 2025/2/20

愤怒的小鸟

剪切精灵图-改sprite mode为mutiple

在sprite editor中slice

设置弹弓与鸟的层级关系layer-player

鸟加springjoint组件-distance-0.3-autodistance关闭

弹弓组件的一些基本属性:

Distance:两点之间的固定距离(设定完有剩余的距离就是可拉伸的长度)

Frequency:弹力值,这里设置为2

先将鸟的物理特性默认设置为dynamic!!

鸟添加circle colider,调整碰撞体积

弹弓加box组件-rigidbody-static(静止不动)

鼠标按下

transformposition = camera.main.screentoworldpoint(input.mouseposition)

(将鼠标坐标系转为世界坐标系)

Bug:鸟会消失不见

解决:鸟transformpos = (0,0,10)

或者transformpos = new vector3(0,0,camera.main.transform.position.z)

鼠标按下方法onmousedown()

控制isclick变量

Day 2025/2/21

设定弹弓可拉的最大距离

Vector3.Distance(pointA, pointB);

获取A和B之间的距离

            if (Vector3.Distance(transform.position,rightPos.position)>maxDis)

            {

                Vector3 pos = (transform.position - rightPos.position).normalized;

                Debug.Log(pos);

                pos = maxDis * pos;

                transform.position = pos+rightPos.position;

            }

关于这一段的说明:很明显maxdis就是最大可移动距离,就是与弹弓的偏移量

逻辑就是当鸟-弹弓的距离大于maxdis

maxdis还要转换成向量

最后就是vector3(maxdis)+vector3(弹弓)

小鸟的飞出

直接引入spring joint秋千组件,鼠标弹起时禁用就行

Sp.enable = false

Bug:小鸟飞出力度过大

解决:在拖拽时取消物理特性

引入rigid组件,在鼠标按下时

Rg.iskinematic = true

抬起时为false

Bug:鸟弹出时没有力度

解决:鼠标抬起时,再延时取消秋千组件

Invoke(“fly”,0.1f)

猪的受伤

场景-精灵图-裁剪

给地面碰撞体积-碰撞体积比原图小一点-草地没有碰撞

地面做长一点-小鸟会飞很远

小鸟的阻力angular drag调为2

新建猪-调整猪的圆形碰撞体积-阻力一样为2

猪的受伤判定:被碰撞物体速度大于maxspeed时直接死亡,在minspeed和maxspeed中受伤

If(collision.relativevelocity.magnitude > maxspeed){ die }

皮筋的绘制

使用linerenderer

脚本中的运用

Right.setposition(0,rightpos.position)

Right.setposition(1,transform.position)

物体、死亡、加分的特效

精灵图裁剪

在动画特效中ctrl+6

Animation编辑器中绑定事件完成动画后执行destroy事件

猪死亡后生成die组件

加分:猪死后在头上方生成分数,1.5s后消失

Day 2025/2/22

多只小鸟的轮换

添加gamemanager组件,引入3只小鸟

Public list<bird> birds

Public list<pig>

禁用所有小鸟的运动组件

遍历选中第一个小鸟启用组件

小鸟的脚本中

[HideInInspector]

Private rigibody2d rd

就可以在其他脚本中访问该变量

然后将gamemanager设为单例模式,飞出的小鸟在数组中删掉

等待飞出的小鸟5s后再删除

死亡的小鸟也要生成boom特效

游戏逻辑nextbird(){

If猪大于0,并且小鸟>0切换小鸟

没鸟了,输了

}else{ 赢 }

在飞出5s后调用next bird

猪的脚本与木头公用,猪死亡时判断是否是猪

Day 2025/2/23

解决皮筋残留,小鸟弹出力度过大问题

弹弓放鸟位置是固定的,在游戏开始时就将第一只小鸟的位置保存

然后每次鸟死亡切换鸟时将位置给鸟数组的第一个

皮筋残留:鼠标抬起禁用,要划线时启用

小鸟拖尾效果

小鸟添加一个空组物体

物体包含weapontrail和meshrenderer

Meshrenderer材质为weapontrail

在bird下新建trail脚本

飞行是开始拖尾,碰到物体结束拖尾

加入木头,场景层级问题

Day 2025/2/24

游戏失败和胜利的UI界面

屏幕自适应:canvasScaler-scale with screen

游戏失败动画-添加颜色渐变

失败胜利场景-取消looptime重复播放

胜利画面播放完成后显示星星

放入星星,火花特效

Canvasrenderer改成camera

新建UIcamera-clear flags-depth only

Projection-orthog

Audiolistener -删除

让星星一颗一颗显示

首先写显示星星的函数

For inti = 0 i<birds.cout+1;i++

Star[i].setactive true

这边cout+1是因为星星最少是要显示1颗的

星星延时显示

用协程

IEnumerator show(){}

    public void showStars(){

        StartCoroutine("show");

    }

    IEnumerator show(){

        for (int i = 0; i < birds.Count+1; i++)

        {

            yield return new WaitForSeconds(0.2f);

            stars[i].SetActive(true);

        }

    }

固定写法

Day 2025/2/25

Bug:鸟飞后还可以控制鸟

解决:鼠标抬起时canmove = false,死亡后canmove = true

暂停动画

渐入动画:anchiored position

镜头跟随

使用vector3.lerp插值

三个参数:位置1,位置2,平滑值

Vector3.lerp(1,2,3)

使用平滑值可以使第一个小鸟死亡时切换回第二个小鸟有平滑移动,不然直接镜头转回来回很突兀

数值越大,镜头移动越快

        posX= transform.position.x;

        Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,new Vector3(Mathf.Clamp(posX,0,15),Camera.main.transform.position.y,Camera.main.transform.position.z),smooth*Time.deltaTime );

播放音频

添加黄色小鸟

删除新建yellowBird脚本

public class yellowBird : bird

{

    public override void showSkill(){

                // base.showSkill();

        rd.velocity *=2;

    }

}

重写方法

Bird:

    public virtual void showSkill(){

Flying = false

    }

Protected rigid2D rg;

保护属性

跟public和private不同的是,外部无法调用,子类可以调用

绿色小鸟(翻转)

    public override void showSkill()

    {

        Vector3 speed = rd.velocity;

        speed.x *= -1;

        rd.velocity = speed;

    }

黑色小鸟(爆炸)

添加碰撞盒circlecollider2D trigger =true 调大半径

当碰撞盒接触到物体添加到数组内,点击爆炸后调用数组内物体的死亡函数

爆炸后速度为0,爆炸特效,小鸟消失

Vector3.zero renderer.sprite = false rigidbody2d = false

Day 2025/2/26

星星数组越界问题

    IEnumerator show(){

        for (int i = 0; i < birds.Count+1; i++)

        {

            if (i>=stars.Length)

            {

                break;

            }

            yield return new WaitForSeconds(0.2f);

            stars[i].SetActive(true);

        }

    }

地图选择UI

地图选择的逻辑编写

每个地图三个变量

需要星星数量public

已获得星星gameobject

关卡选择

关卡选择和地图选择是一个场景

每一关都有一个levelSelect脚本,默认第一关是可选的

Transform.parent.getchild

地图选择和关卡选择

每个地图对应不同的关卡组

点击后所有地图map隐藏,对应关卡组显示

存储星星数据

点击关卡时 新建nowlevel+关卡数字 键值对

关卡通关时 获取nowlevel 关卡+星星数 键值对

关卡选择,场景转跳

将game场景放入resources文件夹

相机camera新建脚本load,进入到game场景中就

Resources.load(playprefabs.nowlevel)

关卡界面显示星星

选择的时候原本有3个星星隐藏了

进入关卡选择时脚本会遍历此关卡有多少星星

关卡通关时 获取nowlevel 关卡+星星数 键值对

Level1 3

星星显示个数bug:在通关保存星星时做判断,小于之前的数量就不做存储

--

星星总数

每次通关时执行

做一个总关数的遍历,把所有关的星星相加

然后保存

关卡之间的显示

每一个关卡判断前一关卡的星星数是否大于1,大于1则显示可选择

Day 2025/2/28

关于关卡-地图二关卡的命名是接着地图一的

比如地图一到10关地图二就要从11关算起

Snap setting

在edit中,是一个比较方便的复制物体无缝对齐的工具

地图星星显示

每个地图有起始关卡和结束关卡

Public int startNum

Public int endNum

比如地图二的起始关卡是10关-20关

然后遍历这几关的星星数量

异步加载场景(loading)

Scene.loadAsync

修复bug

未上弹弓的鸟可以点击

将未上弓的小鸟flying设置为true

游戏暂停依旧可以操作鸟

引入isPause属性

鸟飞的时候点暂停会触发技能:

If(evensystem.current.ispointerovergameobject) //如果点击了UI界面不会触发

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

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

相关文章

通过振动传感器,触发水的运动并将其转换为声音

“微挑战”是在巴塞罗那IAAC的“紧急未来设计硕士”课程中为期一周的工作坊。在这一周,我们有时间、空间和专业人士的支持来创建一个功能原型,它也可以是一个投机性的人工制品,有助于我们的个人研究和实践。这个原型应该基于迭代和使用:数字制造工具、生物制造、人工智能、…

单链表练习与重下AS

1.练习题:我的代码答案: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {struct ListNode dummpy;struct ListNode* tmp;dummpy.next=NULL;//引入临时…

pycharm连接autodl服务器

昨天听舍友说,他们第一个实验都跑完了,瞬间焦虑起来,原来落后这么多,完事昨天晚上7点开始看教程,配环境,看了好几个教程,每个教程都不一样竟然!然后问舍友,舍友说:你先知道你要跑什么项目,我说:我知道啊,我要做什么项目,想要什么结果,我都知道,项目和代码都有,…

shell脚本报错:test.sh: line 2: $\r: command not found

问题 在win上写好shell脚本,传到linux服务器运行调试的时候报错:test.sh: line 2: $\r: command not found 原因 这个错误是由于脚本文件的换行符问题引起的。Windows和Linux系统的换行符不同:Windows使用\r\n(回车+换行)。 Linux使用\n(换行)。脚本是在Windows上编辑的…

Power Apps 技术分享:制作响应式布局

前言Power Apps的一大优势就是可以不用多长时间,就能够配置出响应式布局。正文1.我们先新建一个屏幕,用来演示,如下图:2.添加一个横向容器,修改一下宽和高,根据屏幕尺寸自适应,如下图:逻辑应该蛮好理解的,就是用app的宽,减去当前控件距离顶部的距离的两倍,也就是上下…

day:22 python函数(5)——常用函数

一.len函数 print(len(列表名)) 定义:返回一个内容长度 案例: list=[1,2,3,4,5,6] print(len(list))二.abs 绝对值 print(abs(数值))输出绝对值 案例: a=-9 print(abs(a))三.id() print(id(表名)) 返回一个对象地址,返回对象唯一地址,标示一个整数 list=[1,2,3…

day:22 python函数(4)——文档

一.打开文档 open函数 open() 函数用于打开一个文件,创建一个 file 对象 语法:open(file, mode),模式有r(只读),w(写入覆盖), a(写入追加) (1)查看open所有功能 按住ctrl键,鼠标点击open关键字,查看用法(2)读取python中复制的路径 a.复制py文件的路径 path1=r"C:\U…

day:22 python函数(3)——内置函数和压缩

一.python的内置函数二.内置函数使用 1.format()函数 定义:是一格式化字符串,可以将变量或值插入到字符串的特点位置,使字符串的建构更加的灵活和易读,增强了字符串格式的功能. 2.基本语法 通过{}来代替以前的% 3.案例 a.不设置指定位置,默认顺序 hz="{}{}".format…

Android开发--Lesson01--页面布局

一.View视图 在Android开发中所有的UI元素都是由View和ViewGroup构建而成的。ViewGroup作为一个容器既可以装载View视图空间,同时也可装载ViewGroup。即一种布局可以嵌套另一种布局。二.ViewGroup RelativeLayout RelativeLayout是Android中一种非常灵活的布局方式,它允许子…

第十八届全国大学生信息安全竞赛暨第二届“长城杯”铁人三项赛web方向部分wp

第十八届全国大学生信息安全竞赛暨第二届“长城杯”铁人三项赛web方向部分wp hello_web查看源代码发现有两个文件,访问一下Tips是phpinfo 里面可以看到disable_functions hackme.php中$lapUCm=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%…

使用WLAN接口将温度和相对湿度发送到家庭网络web服务器

在本文中,我想利用WLAN接口,为家庭网络中的web服务器提供温度和相对湿度。但是,我将使用物有所值的DHT20传感器和带有SH1106驱动IC的1.3英寸OLED,以尽量减少重复。 但首先是树莓派Pico W的引脚图,以及树莓派Pico和Pico W的区别:虽然外形尺寸和引脚(很大程度上)保持不变,…

【水】洛谷 P3913 (待续)

今天NaN在刷水题时碰到这么一道题:洛谷P3913 https://www.luogu.com.cn/problem/P3913 代码的思路特别简单:用全部格子数 - 没被車侵占的行数 \(\times\) 列数即可. code void solve() {cin >> n >> k;g = h = n;for (ll i = 1; i <= k; i++){cin >> x …