飞机打方块(三)特殊按钮制作

一、特殊按钮容器

1.新建PropController脚本,并绑定新建的特殊按钮容器节点

 GameController.ts

 @property({ type: cc.Node, displayName: "特殊按钮节点", tooltip: "特殊按钮节点,分别为全消无敌和菜单" })
    special_btn: cc.Node = null;

PropController.ts

const { ccclass, property } = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {


    @property({ type: cc.Button, displayName: "道具按钮", tooltip: "道具按钮" })
    btn: cc.Button[] = [];

    @property({ type: cc.Label, displayName: "显示道具按钮还可以用几次的文字", tooltip: "显示道具按钮还可以用几次的文字" })
    time_lb: cc.Label[] = [];

    @property({ type: cc.Float, displayName: "道具按钮还可以用几次", tooltip: "道具按钮还可以用几次" })
    time: number[] = []

    update() {
        //每帧更新文字显示内容
        this.time_lb[0].string = this.time[0].toString();
        this.time_lb[1].string = this.time[1].toString();

        //如果没有使用次数了,禁用按钮
        if (this.time[0] <= 0) {
            this.btn[0].interactable = false;
        } else {
            this.btn[0].interactable = true;
        }

        if (this.time[1] <= 0) {
            this.btn[1].interactable = false;
        } else {
            this.btn[1].interactable = true;
        }
    }

    //按钮按下减少一次使用次数
    onbtn0() {
        this.time[0] -= 1;
    }

    onbtn1() {
        this.time[1] -= 1;
    }
}

 2.绑定Canvas

二、全消按钮 

1.新建按钮节点,绑定Btn_scale脚本

 

 

 GameController.ts

//移除所有障碍物函数
    remove_all_barrier() {
        //获取当前所有障碍物父节点的名字
        let name = this.barrier_parent.name;
        //销毁所有障碍物的父节点
        this.barrier_parent.destroy();
        //new出一个新的节点代替被销毁的节点
        let node = new cc.Node;
        //名字不变
        node.name = name;
        //父节点时canvas
        node.parent = this.canvas;
        //坐标是0,0
        node.position = cc.v3(0, 0);
        //所有障碍物父节点变量赋值
        this.barrier_parent = node;
    }

 2.绑定按钮事件

 三、无敌按钮

 1.新建按钮节点,绑定Btn_scale脚本

 

 GameController.ts

@property({ type: cc.Prefab, displayName: "显示无敌剩余时间的文字", tooltip: "显示无敌剩余时间的文字" })
    invincible_lb_pre: cc.Prefab = null;


@property({ type: cc.Float, displayName: "无敌持续时间", tooltip: "无敌持续时间" })
    invincible_time: number = 8;



//无敌函数
    invincible() {
        let self = this;
        //将飞机分组设为无敌
        this.plane.group = "invicible";

        //显示粒子特效
        this.plane.children[0].active = true;
        this.plane.children[1].active = true;

        this.scheduleOnce(function () {
            self.plane.group = "default";
            self.plane.children[0].active = false;
            self.plane.children[1].active = false;
        }, this.invincible_time);

        let lb = cc.instantiate(this.invincible_lb_pre);
        lb.parent = this.label_parent;
        this.scheduleOnce(function () {
            lb.destroy();
        }, this.invincible_time)
    }

Barrier.ts

//碰撞回调
    //当碰撞产生的时候调用other产生碰撞的另一个组件 self产生碰撞的自身的碰撞组件
    onCollisionEnter(other, self) {
        if (other.node.group == "bullet") {

            //获取GameController脚本
            let gc = cc.find("/Canvas").getComponent("GameController") as GameController;
            //获取Bullet脚本
            let c = other.getComponent("Bullet");

            //从脚本获取攻击力较少自身生命值
            this.reduce_num(c.ATK);
            // 如果可以加双倍分数
            if (gc.is_double == true) {
                //加分
                gc.add_score((c.ATK) * 2)
            }
            //如果不可以加双倍分数
            if (gc.is_double == false) {
                gc.add_score(c.ATK);
            }
            //销毁子弹
            other.node.destroy();
        }

        //发生了碰撞,无敌
        if (other.node.group == "invincible") {
            //获取GameController脚本
            let gc = cc.find("/Canvas").getComponent("GameController") as GameController;
            //如果可以加双倍分数
            if (gc.is_double == true) {
                //加双倍分
                gc.add_score(this.num * 2);
            }
            //如果不可以加双倍分
            else if (gc.is_double == false) {
                gc.add_score(this.num);
            }
            //自身销毁
            this.node.destroy()
        }

        //如果自身生命值小于0
        if (this.num <= 0) {
            //自身销毁
            this.node.destroy();
        }
    }

2.绑定按钮事件

 

 四、菜单按钮

1.新建节点

 1.新建按钮节点,绑定Btn_scale脚本

 

2.新建Menu节点 

 3.新建Game_Menu脚本,绑定Canvas

2.打开菜单功能

1.新建Label 

Game_Menu.ts

const { ccclass, property } = cc._decorator;
import gc from "./GameController"

@ccclass
export default class NewClass extends cc.Component {

    @property({ type: gc, displayName: "GameController脚本所在节点", tooltip: "GameController脚本所在节点" })
    gc: gc = null

    @property(cc.Node)
    canvas: cc.Node = null;

    @property({ type: cc.Node, displayName: "菜单节点", tooltip: "菜单节点" })
    menu_UI: cc.Node = null;

    @property({ type: cc.Node, displayName: "菜单按钮", tooltip: "菜单按钮" })
    menu_btn: cc.Node = null;

    //菜单在屏幕最上方的位置
    pos: cc.Vec3 = null;


    onLoad() {
        //将菜单移到屏幕最上方
        let t = (this.canvas.height / 2);
        let y = t + this.menu_UI.height;
        this.menu_UI.position = cc.v3(0, y);
        //获取下菜单在屏幕上的位置
        this.pos = this.menu_UI.position;
        //显示菜单
        this.menu_UI.active = true;
    }


    //打开菜单函数
    open_menu() {
        //动作和缓动
        let move = cc.moveTo(1, 0, 0).easing(cc.easeBackInOut());
        //执行
        this.menu_UI.runAction(move);
        //暂停游戏
        this.pause();
        //禁用按钮
        this.menu_btn.getComponent(cc.Button).interactable = false;
    }

    //暂停函数
    pause() {
        this.gc.is_barrier_move = false;
        this.gc.is_plane_move = false;
        this.gc.is_fire = false;
        this.gc.is_barrier_create = false;
    }

}

2.绑定按钮 

 

 3.关闭菜单功能

1.新建按钮容器Btn

 2.新建Close Button并绑定按钮事件

 

Game_Menu.ts

 //关闭菜单函数
    close_menu() {
        let self = this;
        //动作和缓动
        let move = cc.moveTo(1, cc.v2(this.pos)).easing(cc.easeBackOut());
        //启用按钮
        let f = cc.callFunc(function () {
            self.menu_btn.getComponent(cc.Button).interactable = true;
        });
        //两个结合在一起
        let action = cc.sequence(move, f);
        //执行
        this.menu_UI.runAction(action);
        //恢复游戏
        this.resume()
    }

    //恢复游戏函数
    resume() {
        this.gc.is_barrier_move = true;
        this.gc.is_plane_move = true;
        this.gc.is_fire = true;
        this.gc.is_barrier_create = true;
    }

 

 4.返回开始场景按钮功能

1.新建Back Button按钮节点,并绑定按钮事件

 

 

 GameController.ts

//返回开始场景函数
    back(){
        cc.director.loadScene("Start");
    }

 

 

 

抱歉,我是一名AI语言模型,无法生成游戏。但我可以给你提供一个Python游戏框架Pygame的示例代码,供你参考: ``` import pygame import random # 初始化游戏 pygame.init() # 设置游戏窗口的大小和标题 screen_width = 500 screen_height = 750 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption('飞机方块') # 加载背景图片 background = pygame.image.load('background.png').convert() # 加载飞机图片 player_img = pygame.image.load('player.png').convert_alpha() player_width, player_height = player_img.get_size() # 加载方块图片 block_img = pygame.image.load('block.png').convert_alpha() block_width, block_height = block_img.get_size() # 定义游戏角色类 class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = player_img self.rect = self.image.get_rect() self.rect.centerx = screen_width / 2 self.rect.centery = screen_height - player_height / 2 self.speed = 8 # 控制角色移动 def update(self, key): if key == pygame.K_LEFT: self.rect.centerx -= self.speed elif key == pygame.K_RIGHT: self.rect.centerx += self.speed if self.rect.left < 0: self.rect.left = 0 if self.rect.right > screen_width: self.rect.right = screen_width # 定义方块类 class Block(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = block_img self.rect = self.image.get_rect() self.rect.centerx = random.randint(block_width / 2, screen_width - block_width / 2) self.rect.centery = -block_height / 2 self.speed = 5 # 控制方块移动 def update(self): self.rect.centery += self.speed if self.rect.top > screen_height: self.kill() # 创建游戏角色和方块的组 all_sprites = pygame.sprite.Group() blocks = pygame.sprite.Group() player = Player() all_sprites.add(player) # 游戏循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: player.update(event.key) # 添加方块 if random.randint(0, 20) == 0: block = Block() all_sprites.add(block) blocks.add(block) # 更新角色和方块 all_sprites.update(pygame.key.get_pressed()) blocks.update() # 绘制背景、角色和方块 screen.blit(background, (0, 0)) all_sprites.draw(screen) pygame.display.flip() # 退出游戏 pygame.quit() ``` 在这个示例代码中,我们使用Pygame框架创建了一个简单的飞机方块的小游戏。游戏主要包括以下几个部分: 1. 初始化游戏,并设置游戏窗口的大小和标题。 2. 加载游戏素材,包括背景图片、飞机图片和方块图片。 3. 定义游戏角色类和方块类,并在游戏循环中控制它们的移动和更新。 4. 创建游戏角色和方块的组,并在游戏循环中添加、更新和绘制它们。 5. 处理游戏事件,包括退出游戏和控制角色移动。 6. 绘制游戏背景、角色和方块。 你可以根据自己的需要修改代码,添加更多的游戏元素和玩法,让这个小游戏更加有趣。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值