qmlfrontend/GameScene.qml
author unC0Rr
Mon, 17 Feb 2025 16:37:59 +0100
branchqmlrenderer
changeset 16089 02304ad06381
permissions -rw-r--r--
Add TiledImageItem and a scene that represents hedgewars map

import QtQuick 2.15
import Hedgewars 1.0

Item {
  id: control

  property string dataPrefix: "share/hedgewars/Data/"
  property url themePath: "file://%1Themes/Stage/".arg(dataPrefix)

  Flickable {
    id: backgroundContainer

    anchors.fill: parent

    contentWidth: map.implicitWidth
    contentHeight: map.implicitHeight

    interactive: false
    contentX: mapContainer.contentX * 0.7 + (contentWidth - width) * 0.15
    contentY: mapContainer.contentY * 0.7 + (contentHeight - height) * 0.3

    Rectangle {
      anchors.fill: parent
      color: "black"
    }

    Item {
      width: parent.width
      height: parent.height
      anchors.horizontalCenter: parent.horizontalCenter
      anchors.bottom: parent.bottom

      Image {
        id: skyLeft
        anchors.left: parent.left
        anchors.right: skyCenter.left
        anchors.bottom: parent.bottom
        fillMode: Image.TileHorizontally
        horizontalAlignment: Image.AlignRight
        source: control.themePath + "SkyL.png"
      }

      Image {
        id: skyCenter
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.bottom
        fillMode: Image.Pad
        source: control.themePath + "Sky.png"
      }

      Image {
        id: skyRight
        anchors.left: skyCenter.right
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        fillMode: Image.TileHorizontally
        horizontalAlignment: Image.AlignLeft
        source: control.themePath + "SkyL.png"
      }
    }
  }

  Flickable {
    id: mapContainer

    anchors.fill: parent

    boundsMovement: Flickable.StopAtBounds

    contentWidth: map.implicitWidth
    contentHeight: map.implicitHeight

    onContentXChanged: map.update()
    onContentYChanged: map.update()
    onWidthChanged: map.update()
    onHeightChanged: map.update()

    pixelAligned: true

    TiledImageItem {
      id: map

    }
  }

  MouseArea {
    anchors.fill: mapContainer

    property double zoom: 1.0

    acceptedButtons: Qt.NoButton

    enabled: false

    onWheel: wheel => {
               zoom = zoom * Math.exp(wheel.angleDelta.y * 0.001)
               var zoomPoint = Qt.point(wheel.x + mapContainer.contentX,
                                    wheel.y + mapContainer.contentY);

               map.scale = zoom
               mapContainer.resizeContent(map.implicitWidth * zoom, map.implicitHeight * zoom, zoomPoint);
               mapContainer.returnToBounds();
               console.log(mapContainer.scale)
             }
  }


  Component.onCompleted: {
    map.test(dataPrefix + "Maps/Ropes/map.png")
    console.log(Screen.devicePixelRatio)
  }
}