Qml制作的赛龙舟小游戏

使用QtQuick框架编写的简单的龙舟小游戏, 总共100多行代码即可实现, 非常适合初学者。

1. 引入了QtQuick和QtQuick.Controls模块,用于创建用户界面和控件。

2. 创建了一个ApplicationWindow作为游戏的主窗口,设置了窗口的宽度、高度、可见性和标题。

3. 在主窗口中创建了一个名为gameArea的矩形,用于显示游戏区域。设置了矩形的宽度、高度和颜色。

4. 在gameArea矩形中定义了一些属性,包括carX、carY、carSpeed、enemySpeed和score,用于控制游戏中的车辆和敌人的位置、速度和得分。

5. 在gameArea矩形中创建了一个名为car的矩形,表示游戏中的车辆。设置了矩形的宽度、高度、颜色、位置和焦点。同时,在car矩形中嵌套了一个名为boat的Image,用于显示车辆的图像。

6. 使用Keys.onPressed事件处理器监听按键事件,根据按下的键盘按键来控制车辆的移动。如果按下的是左、右、上、下箭头键,则根据车辆的当前位置和速度来更新车辆的位置。

7. 在gameArea矩形中创建了一个名为enemy的矩形,表示游戏中的敌人。设置了矩形的宽度、高度、颜色。同时,在enemy矩形中嵌套了一个名为stone的Image,用于显示敌人的图像。

8. 使用Math.random()函数生成一个随机的x坐标,并将敌人的初始位置设置在游戏区域的顶部以外。

9. 定义了一个resetEnemy()函数,用于重置敌人的位置。

10. 在gameArea矩形中创建了一个名为scoreText的Text控件,用于显示游戏得分。设置了文本内容、字体大小、颜色和位置。

11. 创建了一个名为gameTimer的Timer控件,用于定时更新游戏状态。设置了定时器的间隔、重复次数和触发函数。

12. 在gameTimer的触发函数中,更新了敌人的位置,检测车辆与敌人之间的碰撞,并根据游戏规则进行相应的处理。如果发生碰撞,停止游戏定时器并显示游戏结束的提示信息。如果敌人超出底部边界,增加游戏得分并重置敌人的位置。

 具体代码如下: (图片资源可以自行下载后放入工程的资源文件)

import QtQuick 2.2
import QtQuick.Controls 2.2

ApplicationWindow {
    id: mainWindow
    width: 400
    height: 600
    visible: true
    title: "龙舟小游戏"

    Rectangle {
        id: gameArea
        width: parent.width
        height: parent.height
        color:"steelblue"

        property int carX: gameArea.width / 2 - car.width / 2
        property int carY: gameArea.height - car.height - 20
        property int carSpeed: 5
        property int enemySpeed: 3
        property int score: 0

        Rectangle {
            id: car
            width: 50
            height: 50
            color: parent.color
            x: gameArea.carX
            y: gameArea.carY
            focus: true
            Image {
                id: boat
                source: "qrc:/images/boat.png"
                fillMode: Image.PreserveAspectFit
                anchors.fill: parent
            }

            Keys.onPressed: {
                if (event.key === Qt.Key_Left) {
                    if (car.x - gameArea.carSpeed >= 0) {
                        car.x -= gameArea.carSpeed
                    }
                } else if (event.key === Qt.Key_Right) {
                    if (car.x + car.width + gameArea.carSpeed <= gameArea.width) {
                        car.x += gameArea.carSpeed
                    }
                } else if (event.key === Qt.Key_Down) {
                    if (car.y + car.height + gameArea.carSpeed <= gameArea.height) {
                        car.y += gameArea.carSpeed
                    }
                } else if (event.key === Qt.Key_Up) {
                    if (car.y - gameArea.carSpeed >= 0) {
                        car.y -= gameArea.carSpeed
                    }
                }
            }
        }

        Rectangle {
            id: enemy
            width: 50
            height: 50
            color: parent.color
            Image {
                id: stone
                source: "qrc:/images/stone.png"
                fillMode: Image.PreserveAspectFit
                anchors.fill: parent
            }
            x: Math.random() * (gameArea.width - enemy.width)
            y: -enemy.height

            function resetEnemy() {
                enemy.x = Math.random() * (gameArea.width - enemy.width)
                enemy.y = -enemy.height
            }
        }

        Text {
            id: scoreText
            text: "Score: " + gameArea.score
            font.pixelSize: 20
            color: "white"
            anchors.top: parent.top
            anchors.horizontalCenter: parent.horizontalCenter
        }

        Timer {
            id: gameTimer
            interval: 16
            running: true
            repeat: true
            function updateGame() {

                // 更新敌人位置
                enemy.y += gameArea.enemySpeed

                // 检测碰撞
                if (car.x < enemy.x + enemy.width &&
                        car.x + car.width > enemy.x &&
                        car.y < enemy.y + enemy.height &&
                        car.y + car.height > enemy.y) {
                    gameTimer.stop()
                    scoreText.text = "Game Over! Score: " + gameArea.score
                }

                // 检测敌人是否超出底部边界
                if (enemy.y > gameArea.height) {
                    gameArea.score += 1
                    scoreText.text = "Score: " + gameArea.score
                    enemy.resetEnemy()
                }
            }
            onTriggered: {
                updateGame()
            }
        }
    }
}

总体来说,利用Qml实现了一个简单的龙舟小游戏,可以通过键盘控制车辆的移动,避免与敌人发生碰撞,并尽可能地获得高分。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值