CocosCreator的敌人视野扇形因遮掩物体任意变形的实现(画线、填充)

首先定义一个cocosCreator的cc.Graphics组件,作为敌人视野的渲染画线和填充组件:

//画线组件
g:cc.Graphics;
 //敌人视野半径的角度大小
 emenyAngle:number=45;
 //巡逻半径的大小
  distance:number=450;
然后在update或者其它定时器每帧频率里边写下渲染画线的方法:
//每帧调用
update(){
 if(this.g= =null){
            this.g=this.node.addComponent(cc.Graphics);
        }
        this.g.clear();
        this.g.moveTo(0,0);
        let suess=false;
        //获取点集合   
        for(let i=this.emenyAngle;i>(0-this.emenyAngle);i--){
            i=i-3;
            let v1= new cc.Vec2(Math.sin(Math.PI * i / 180)*this.distance,-Math.cos(Math.PI * i / 180)*this.distance);
            //当前目标点的场景坐标
            let v2=this.node.convertToWorldSpaceAR(v1);
            let results=cc.director.getPhysicsManager().rayCast(new cc.Vec2(this.node.position.x,this.node.position.y),v2,cc.RayCastType.All);
            for(let j=0;j<results.length;j++){
                if(results[j].collider.node.group=="map"&&results[j].collider.tag= =0){             
                    let v3=this.node.convertToNodeSpaceAR(results[j].point); 
                    if(Math.sqrt(Math.pow(0 - v3.x , 2 )+ Math.pow(-30- v3.y , 2 ))<Math.sqrt(Math.pow(0 - v1.x , 2 )+ Math.pow(-30 - v1.y , 2 ))){                        
                        v1= this.node.convertToNodeSpaceAR(results[j].point); 
                    }
                }
                //当视野出现英雄 调用射线检测
                if(results[j].collider.node.group=="hero"){
                    this.ray();
                    suess=true;
                } 
                //当视野内出现敌人,判断是否死亡
                if(results[j].collider.node.group=="emeny"){
                    if(this.xunluomove&& results[j].collider.node.parent.getComponent(emenyLevel).death==true){
                        this.rayToFriendsDeath(results[j].collider.node.parent.position);
                        suess=true;
                    }
                } 
            }
            this.g.lineTo(v1.x,v1.y);
        }
        if(suess){
             if(Math.sqrt(Math.pow(this.node.x - this.socker.position.x , 2 )+ Math.pow( this.node.y - this.socker.position.y , 2 ))<60){    
                 //敌人追击到主角
                this.gameOver=true;
                this.xunluomove=false;
                this.findOut=false;
                //游戏暂停
                Allcontrol.instance.suspend=true;  
                //调用界面
                this.GameOver();  
             }
            //this.onViewAll=true;
        }
        else{
            //敌人不在这里插入代码片在视野内
            this.onView=false;
            //this.onViewAll=false;
        }
        this.g.lineTo(0,0);
        this.g.fillColor = cc.color(0,172,242,100);
        this.g.fill();
}

//具体原理就是:在敌人身上限定的角度和视野的距离,然后在每帧遍历敌人身上的指定角度,然后发出从敌人点到指定角度距离点的一个射线,然后返回射线检测的值,找到最近的点,保存,一轮遍历下来,一个角度或者多个角度返回一个点,把点连起来是个多边形,然后填充,就实现了敌人的扇形可随障碍物改变的一个视野。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,可以使用Graphics类来绘制扇形,具体步骤如下: 1. 创建一个Panel控件,用于显示绘制的扇形。 2. 在Panel的Paint事件中,使用Graphics对象的DrawPie方法来绘制扇形。DrawPie方法的参数依次为:Pen对象(用于指定扇形边框的颜色和粗细)、矩形(用于指定扇形所在的矩形)、起始角度、扫描角度。 例如,以下代码可以绘制一个半径为100的扇形: ``` private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawPie(Pens.Black, new Rectangle(50, 50, 200, 200), 0, 90); } ``` 3. 添加一个滚动条控件,用于控制扇形的角度。 4. 在滚动条的Scroll事件中,修改起始角度和扫描角度,然后调用Panel的Invalidate方法触发Paint事件重新绘制扇形。 以下是完整的代码示例: ``` private int startAngle = 0; // 起始角度 private int sweepAngle = 90; // 扫描角度 private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawPie(Pens.Black, new Rectangle(50, 50, 200, 200), startAngle, sweepAngle); } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { startAngle = hScrollBar1.Value; sweepAngle = 90 - hScrollBar1.Value; // 扫描角度等于90减去起始角度 panel1.Invalidate(); // 触发Paint事件重新绘制扇形 } ``` 在上述代码中,我们使用了一个水平滚动条控件(hScrollBar1)来控制扇形的起始角度,滚动条的取值范围为0到90。在滚动条的Scroll事件中,我们根据滚动条的值修改起始角度和扫描角度,并调用Panel的Invalidate方法触发Paint事件重新绘制扇形

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值