qml实现贪吃蛇--缩水版

贪吃蛇作为一款经典的手机游戏,曾经风靡全世界,这里简单说一说玩法。

用游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。

这里我将使用qml来实现一个简单的贪吃蛇游戏

这个游戏现阶段没有通关,蛇的身子不会越吃越长。

我们简单分析一下贪吃蛇这个游戏的主要的实体有哪些吧~

一个是游戏视窗,一个是蛇,一个是糖果。

蛇不能越出游戏视窗,不然视为游戏结束,糖果出现的地方只能在游戏视窗内。

好,先看看蛇这个实体怎么用qml来构造吧(现阶段的蛇其实只是个矩形,不能变长也不能弯曲)。

====================================

Snake.qml

import QtQuick 2.4

Rectangle {
    id:snake;
    width: 20;
    height: 20;
    color:"red";
    x: 0.5 * areaX;
    y: 0.5 * areaY;

    property real areaX:500;
    property real areaY:500;
    readonly property int step: 10;
    readonly property int timeStep: 50;

    signal out;
    property int moveDirection:3; // 0,1,2,3,4 ; left ,right, up, down, death

    focus:true;
    Keys.onPressed: {
        if(event.key == Qt.Key_Left) {
            snake.moveDirection = 0;
            snake.start();
        }
        if(event.key == Qt.Key_Right) {
            snake.moveDirection = 1;
            snake.start();
        }
        if(event.key == Qt.Key_Up) {
            snake.moveDirection = 2;
            snake.start();
        }
        if(event.key == Qt.Key_Down) {
            snake.moveDirection = 3;
            snake.start();
        }
        event.accepted = true;
    }

    NumberAnimation on x { duration: snake.timeStep; }
    NumberAnimation on y { duration: snake.timeStep; }

    function start(){
        if(!time.running) {
            time.running = true;
            snake.x = 0.5 * areaX;
            snake.y = 0.5 * areaY;
            snake.color = "red";
        }
    }

    function stop() { time.running = false; }

    function move(){
        switch(moveDirection)
        {
        case 0:         /*left */
            snake.x -= snake.step;
            break;
        case 1:         /*right*/
            snake.x += snake.step;
            break;
        case 2:         /*up*/
            snake.y -= snake.step;
            break;
        case 3:         /*down*/
            snake.y += snake.step;
            break;
        case 4:         /*death*/
            snake.y = 0;
            snake.x = 0;
            break;
        default:        /*death*/
            snake.y = 0;
            snake.x = 0;
            break;
        }
        checkOut();
    }

    function checkOut(){
        if(snake.x < 0 || snake.y < 0 || (snake.x+snake.width) > areaX  || (snake.y+snake.height) > areaY ) {
            out();
            return true;
        } else {
            return false;
        }
    }

    Timer{
        id:time;
        interval:snake.timeStep;
        repeat:true;
        onTriggered : move();
    }

    onOut: {
        snake.stop();
        snake.moveDirection = 4;
        snake.color = "black";
    }
}

Snake通过定时调用move()来进行移动,move()函数内判断moveDirection的数值来确定Snake的移动方向,每移动一次,使用checkOut()函数判断Snake是否移动出了游戏视窗(也就是撞墙)。当Snake撞墙后,发射out信号,使用out的信号处理函数来让snake颜色变黑,并且停止计时器。

我们再来看看Candy这个实体

======================

Candy.qml

import QtQuick 2.0

Rectangle {
    id:candy;
    width: 20;
    height: 20;
    signal ate; // 被吃时发信号

    x:Math.random() * 500;
    y : Math.random() * 500;
    color:Qt.rgba(Math.random(),Math.random(),Math.random(),1);

    function newCandy(){
        candy.x = Math.random() * 500;
        candy.y = Math.random() * 500;
        candy.color = Qt.rgba(Math.random(),Math.random(),Math.random(),1);
        candy.opacity = 1;
    }

    NumberAnimation on x { duration: 50; }
    NumberAnimation on y { duration: 50; }

    onAte:candy.opacity = 0;
}

当Candy被吃时(也就是和Snake发生碰撞)发出ate这个信号,然后将自己变成透明的。还有一个函数时newCandy(),他的作用是让Candy这个实体,以随机的颜色和位置出现在游戏视窗里,达到Candy被Snake吃之后,又产生新的糖果。

现在看看游戏主视窗吧

=============================

main.qml

import QtQuick 2.4

Rectangle {
    id:gameView;
    width: 500;
    height: 500;
    property int score:0;

    Text{
        anchors.centerIn: parent;
        text:"score: "+ gameView.score;
    }

    Snake{
        id:snake;
        areaX : 500;
        areaY : 500;
        onOut:{
            gameView.score = 0;
        }
    }

    Candy { id:candy; }

    Timer{
        id:time;
        interval:10;
        repeat:true;
        running:true;
        onTriggered: {
            if(collide(snake,candy)) {
                candy.ate(); // signal;
                ++gameView.score;
                candy.newCandy();
            }
        }
    }

    // to check two rectangles collided 碰撞
    function collide(item1,item2) {
        if( ((item1.y+item1.height) >= item2.y)
                && (item1.y <=( item2.y+item2.height)) ) {
            if( ((item1.x+item1.width) >= item2.x)
                    && (item1.x <=( item2.x+item2.width)) ) {
                return true;
            }
            return false;
        }
        return false;
    }
}

游戏主视窗里有个比较重要的碰撞检测函数(矩形碰撞检测,定时被调用),当snake和candy发生了碰撞,也就是snake吃了candy时就会让candy发送ate信号,同时计分加一,candy调用newCandy函数。

看看效果


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: QML-QianWindow-V1本界面是一款用户界面设计程序,它为开发人员提供了大量可自定义的UI组件,使得开发者可以轻松地创建美观、直观且易于使用的界面。QML-QianWindow-V1本界面具有界面美观,易用性强以及可扩展性强的特点。该程序提供了多种UI组件如窗口、按钮、文本框、下拉框、进度条等等。每个组件都可以基于开发需求进行个性化设计,提高了程序的可读性和可维护性。 QML-QianWindow-V1本界面的窗口设计功能令人称赞。用户可以定制窗口的样式、位置和大小等属性,使其符合自己的需求。同时,该程序支持类似IOS与Android风格的Tab、Panel、Dialog等视图控件,让应用的界面更具丰富性和交互性,提升用户体验。 此外,QML-QianWindow-V1本界面可让用户通过实用的数据模型,快速地创建和管理表格和列表,包括多行、多列的表格和单选或多选列表,使得用户可以方便地处理大量数据。 总之,QML-QianWindow-V1本界面通过提供易用性和可扩展性强的UI组件来简化界面设计过程,使得开发人员可以迅速开发出优秀的桌面应用程序界面,以满足用户高品质的界面需求。 ### 回答2: QML-Qianwindow-v1本是一款基于QML语言开发的桌面应用程序,其主要特点是界面设计美观、简单易用,适用于多种应用场景。 该软件的主界面包含五个主要区域:侧边栏、消息中心、主视图、小部件和设置菜单。 侧边栏主要用于导航,其中包含主要的应用程序和功能,使用户可以轻松地进入不同的模块。 消息中心用于显示来自其他应用程序的通知,例如电子邮件或要完成的任务。 主视图是QML-Qianwindow-v1的核心区域,其中包含常见的功能和工具,例如打开的文件、书签和搜索栏。 小部件区域用于显示用户选择的小部件,例如天气预报和日历。 设置菜单区域包含应用程序的设置菜单,用户可以在此处更改应用程序的选项、主题和常规设置。 总体来说,QML-Qianwindow-v1本的界面设计非常简洁,用户友好,易于使用。它增强了用户的生产力和效率,为用户提供了一种令人愉悦的使用体验。 ### 回答3: QML-QianWindow-v1是一种基于Qt QML开发的简单易用的窗口界面库。其设计风格简洁明了,适用于各种桌面应用开发。 该库主要由三个部分组成:Title Bar、Main Body和Sidebar。其中,Title Bar是窗口的标题栏,可以自定义标题、图标、按钮、菜单等。Main Body是页面的主体内容,可以显示各种控件、窗口和布局。Sidebar是侧边栏,可以显示常用的菜单、工具、快捷方式等。 在QML-QianWindow-v1中,可以使用QianWindow来创建窗口。QianWindow提供了常用的窗口操作方法,例如最小化、最大化、关闭等。同时,该库还提供了很多常用的QML组件,例如按钮、文本框、下拉框、列表框等,这些组件可以方便快捷地进行页面设计。此外,在QML-QianWindow-v1中还支持自定义样式,可以根据需要修改组件的颜色、形状、大小等。 QML-QianWindow-v1的界面设计风格简洁明了,同时具有一定的美观度。尤其是Title Bar部分的设计非常灵活,可以根据需要自由定制。Main Body部分支持多种布局方式,可以满足不同页面设计的需求。Sidebar部分则提供了丰富的快捷操作方式,提高了用户的使用效率。 总的来说,QML-QianWindow-v1是一款非常实用的界面库,可以方便快捷地进行桌面应用开发。无论是初学者还是有经验的开发者,都可以轻松使用该库进行界面设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值