【问题标题】:Snap grid, drag and drop with react-konva捕捉网格,使用 react-konva 拖放
【发布时间】:2020-12-20 13:33:03
【问题描述】:

我正在使用 React-Konva 创建一个 RPG 桌面游戏。我通过拖放做了一个无限网格和一些图像标记。

所以,它工作正常。但是,在寻找另一个功能时,我使用 Canvas 找到了这个,它几乎和我一样,但是使用 spap,形状被 Rect 吸引为磁性!

这里是一个例子: Snap with Canvas
Snap with Konva.js

for (var i = 0; i < (600 / grid); i++) {
  canvas.add(new fabric.Line([ i * grid, 0, i * grid, 600], { stroke: '#ccc', selectable: false }));
  canvas.add(new fabric.Line([ 0, i * grid, 600, i * grid], { stroke: '#ccc', selectable: false }))
} 

有办法用 React-Konva 做同样的事情吗?我发现与 Konva.js 类似的东西

已编辑:

我快到了!!!

const [x, setX] = useState(50)
const [y, setY] = useState(50)

const grid = 70
const gridWidth = 1100

const linesA = []
const linesB = []

  for (let i = 0; i < gridWidth / grid; i++) {
    linesA.push(
      <Line
        strokeWidth={2}
        stroke={'black'}
        points={[i * grid, 0, i * grid, gridWidth]}
      />
    )

    linesB.push(
      <Line
        strokeWidth={2}
        stroke={'black'}
        points={[0, i * grid, gridWidth, i * grid]}
      />
    )
  }

  <Layer>
    {linesA}
    {linesB}        
  </Layer>

我用线条制作了网格,现在我对 dragEnd 事件 X、Y 有点困惑。

我的矩形

  <Rect
        onDragEnd={e => {
          e.target.to({
            x: Math.round(x / grid) * grid,
            y: Math.round(y / grid) * grid,
          })
        }}
        x={x}
        y={y}
        draggable
        width={60}
        height={60}
        fill="rgba(0, 0, 0, 1)"
      />

真的快到了。

【问题讨论】:

    标签: javascript reactjs canvas react-konva


    【解决方案1】:

    完成了!我会发布我自己的答案来帮助别人。

    const grid = 70
    const gridWidth = 1000
    
    const linesA = []
    const linesB = []
    
      for (let i = 0; i < gridWidth / grid; i++) {
        linesA.push(
          <Line
            strokeWidth={2}
            stroke={'black'}
            points={[i * grid, 0, i * grid, gridWidth]}
          />
        )
    
        linesB.push(
          <Line
            strokeWidth={2}
            stroke={'black'}
            points={[0, i * grid, gridWidth, i * grid]}
          />
        )
      }
    
      <Stage
            x={stagePos.x}
            y={stagePos.y}
            width={window.innerWidth}
            height={window.innerHeight}
            draggable
            onDragEnd={e => {
              setStagePos(e.currentTarget.position())
            }}
            onMouseDown={handleMouseDown}
            onMouseUp={handleMouseUp}
            onMouseMove={handleMouseMove}
            onContextMenu={e => {
              e.evt.preventDefault()
            }}
          >
            {/* <Layer>
              <Image image={map} opacity={1} />
            </Layer> */}
    
            <Layer>
              {linesA}
              {linesB}
            </Layer>
    
           <Rect
                onDragEnd={e => {
                  e.target.to({
                    x: Math.round(e.target.x() / grid) * grid,
                    y: Math.round(e.target.y() / grid) * grid,
                  })
                }}
                x={x}
                y={y}
                draggable
                width={65}
                height={65}
                fill="rgba(0, 0, 0, 1)"
              />
    
     </Stage>
    

    这里我做了一个活生生的例子! Snap Grid React-Konva

    【讨论】:

    • 嘿!这很棒!我有一个不同的问题:无限滚动你做了什么?
    • 在我的应用程序中,我不使用无限网格。但我认为这个例子使用 rect 代替 line 可以实现:stackoverflow.com/questions/58445131/…
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多