2016-07-25 7 views
0

Я новичок в Lua и кодирующ в общем поэтому я решил написать программу шахмат для того чтобы выучить. Я создал класс и создал из него объекты для представления частей. Теперь я хочу начать перемещать кусочки с помощью мыши. Я посмотрел учебник, но он обрабатывал только один прямоугольник. Моим первым было использование цикла «for» в функции love.mousePressed(), чтобы идти через каждый из объектов, пока не найдет объект с соответствующей координатой x, y. Это явно не срабатывало так, как я это делал. Вместо этого он переходит только к следующему объекту каждый раз, когда нажимается мышь или, по крайней мере, будет, если программа сразу не сработает после того, как кнопка была выпущена. Итак, мой вопрос: каков правильный способ этого?Как перетащить определенные объекты в Love2d?

local blackPawn = love.graphics.newImage("Textures/Blackpawn.png") 
local blackRook = love.graphics.newImage("Textures/Blackrook.png") 
local blackKnight = love.graphics.newImage("Textures/Blackknight.png") 
local blackBishop = love.graphics.newImage("Textures/Blackbishop.png") 
local blackQueen = love.graphics.newImage("Textures/Blackqueen.png") 
local blackKing = love.graphics.newImage("Textures/BlackKing.png") 
local whitePawn = love.graphics.newImage("Textures/Whitepawn.png") 
local whiteRook = love.graphics.newImage("Textures/Whiterook.png") 
local whiteKnight = love.graphics.newImage("Textures/Whiteknight.png") 
local whiteBishop = love.graphics.newImage("Textures/Whitebishop.png") 
local whiteQueen = love.graphics.newImage("Textures/Whitequeen.png") 
local whiteKing = love.graphics.newImage("Textures/WhiteKing.png") 
local chessboard = love.graphics.newImage("Textures/ChessBoard.png") 

local register = {} 

local id = 0 

piece = { 
    xSquare = 0, ySquare = 0, 
    x = 0, y = 0, 
    height = 64, width = 64, 

    pawn = false, 
    Rook = false, 
    Knight = false, 
    Bishop = false, 
    Queen = false, 
    King = false, 
    color = "", 
    texture = whitePawn, 

    dragging = {active = false, diffx = 0, diffy = 0} 
} 

function piece.new() 
    newPiece = {} 
    for k, v in pairs(piece) do 
     newPiece[k] = v 
    end 
    return newPiece 
end 

function piece:draw() 

end 

function getMouse() 
    local x, y = love.mouse.getPosition() 
    local isDown = love.mouse.isDown(1,2) 
     return x, y, isDown 
end 

function createBoard(id) 
    for x = 1, 8 do 
     for y = 1, 8 do 
      if y ~= 3 and y ~= 4 and y ~=5 and y ~= 6 then 
       id = id + 1 
        register[id] = piece.new() 
        register[id].x = x * 64 - 48 
        register[id].y = (y - 1) * 64 
       if y == 2 then 
        register[id].pawn = true 
        register[id].color = "white" 
        register[id].texture = whitePawn 
        print("item " .. id .. " is here x = " .. register[id].x .. " y = " .. register[id].y .. " Is pawn = " .. tostring(register[id].pawn) .. 
        " Color is " .. register[id].color) 
       elseif y == 7 then 
        register[id].pawn = true 
        register[id].color = "black" 
        register[id].texture = blackPawn 
        print("item " .. id .. " is here x = " .. register[id].x .. " y = " .. register[id].y .. " Is pawn = " .. tostring(register[id].pawn) .. 
        " Color is " .. register[id].color) 
       elseif y == 1 then 
        register[id].color = "white" 
        if x == 1 or x == 8 then 
         register[id].Rook = true 
         register[id].texture = whiteRook 
        elseif x == 2 or x == 7 then 
         register[id].Knight = true 
         register[id].texture = whiteKnight 
         print("knight is here") 
        elseif x == 3 or x == 6 then 
         register[id].Bishop = true 
         register[id].texture = whiteBishop 
        elseif x == 5 then 
         register[id].King = true 
         register[id].texture = whiteKing 
        elseif x == 4 then 
         register[id].Queen = true 
         register[id].texture = whiteQueen 
        end 
       elseif y == 8 then 
        register[id].color = "black" 
        if x == 1 or x == 8 then 
         register[id].Rook = true 
         register[id].texture = blackRook 
        elseif x == 2 or x == 7 then 
         register[id].Knight = true 
         register[id].texture = blackKnight 
        elseif x == 3 or x == 6 then 
         register[id].Bishop = true 
         register[id].texture = blackBishop 
        elseif x == 5 then 
         register[id].King = true 
         register[id].texture = blackKing 
        elseif x == 4 then 
         register[id].Queen = true 
         register[id].texture = blackQueen 
        end 
       end 
      end 
     end 
    end 
end 

function drawBoard(id, register) 
    love.graphics.draw(chessboard, 0, 0) 
    for id = 1, 32 do 
     love.graphics.draw(register[id].texture, register[id].x, register[id].y) 
    end 
end 

function love.load() 
    createBoard(id) 
end 

function love.update(dt) 
    for id = 1, 32 do 
     if register[id].dragging.active == true then 
      register[id].x = love.mouse.getX() - register[id].dragging.diffx 
      register[id].y = love.mouse.getY() - register[id].dragging.diffy 
     end 
    end 
end 

function love.draw() 
    drawBoard(id, register) 
end 

function love.mousepressed(x, y, button) 
    for id = 1, 32 do 
     if (button == 1 or button == 2) 
     and x > register[id].x and x < register[id].x + register[id].width 
     and y > register[id].y and y < register[id].y + register[id].height 
     then 
      register[id].dragging.active = true 
      register[id].dragging.diffx = x - register[id].x 
      register[id].dragging.diffy = y - register[id].y 
     end 
    end 
end 

function love.mousereleased(x, y, button) 
    for id = 1, 32 do 
     if button == 1 or button == 2 then register[id].dragging.active = false end 
    end 
end 

function love.keypressed(key, unicode) 
end 

function love.keyreleased(key) 

end 

function love.focus(bool) 

end 

function love.quit() 
end 

Update: Я установил сбои, но я до сих пор странный баг, когда он меняет перетаскиваемую часть в другую часть

Update 2: После того, как немного больше отладки я понял, что Основная проблема заключается в том, что по какой-то причине неправильно проверяет, активно ли перетаскивание. Поскольку код стоит прямо сейчас, мне нужно установить else dragging.active = false, чтобы правильно его установить, но теперь, когда он правильно установлен, он вообще ничего не перетащит, несмотря на то, что правильный объект перетащил в активную (если я не попытаюсь перетащить объект со значением 32, где он затягивает все сразу). Я очень смущен, что случилось. Почему Lua не может проверить значение, подобное этому?

+0

Нам понадобится дополнительная информация, чтобы действительно сделать что-либо, кроме того, что снимать в темноте. Каково сообщение об ошибке после выпуска? Как выглядит ваш код? – DavisDude

+0

Проблема, которую я сейчас вижу, заключается в том, что вы используете 'love.mousepressed()', который предназначен только тогда, когда кнопка изначально нажата и не вызывается до следующего нажатия. Измените свой код, чтобы использовать 'love.mouse.isDown()' вместо этого, и он должен иметь желаемый эффект. –

ответ

0

Во-первых, я бы создать глобальное логическое значение для если часть была выбрана, а затем переменная держать кусок выбран

local selected = false 
local selectedPiece = {} 

Затем создайте игровую доску и разделить его на сетку, с каждым квадрат равного размера. Что-то вроде этого

board = { 
    size = { 8, 8 }, -- 8x8 grid 
    squareSize = 40, -- 40 pixels long sides 
    pieces = { 
     { -- First row contains which pieces? 
      Piece:Rook(), 
      Piece:Bishop(), 
      ... 
     }, 

     { -- Second row 
      Piece:Pawn(), 
      ... 
     }, 

     { -- etc. 
      Piece:Empty(), 
      ... 
     } 
    } 
} 

Я советую не используя ноль в вашей таблице для пустых квадратов из-за странное поведение таблиц с нулевыми показателями.

В вашем методе love.mousepressed(), вы проверяете, где щелчок был основан на его позиции (это если плата занимает все окно)

function love.mousepressed(x, y, btn) 
    -- If a piece hasn't been clicked on. 
    if (not selected) then 
     -- This line is assuming that since all board squares are equal size, then the mouse click has to be in at least one square. 
     -- Therefore, if we take the floor of the position/board.squareSize, we will always get a value from 0 - 7 (8 values) on the board. 
     local piece = board.pieces[math.floor(x/board.squareSize)][math.floor(y/board.squareSize)] 

     -- If there is a piece here. 
     if (piece:isNotAnEmpty()) then 
      selectedPiece = piece -- Select the piece. 
      selected = not selected -- Notify program that a piece is selected to handle such things accordingly in other methods. 
     end 
    else 
     -- Assuming you wrote a method that determines if a piece can be moved to a certain spot on the board. 
     if (board:CanMovePieceHere(selectedPiece, x/board.size, y/board.size)) then 
      -- Do your stuff here. 
      ... 

      -- Eventually, reset your variables. 
      selected = not selected 
      selectedPiece = {} 
     end 
    end 
end 

Это, как я бы подойти к нему, но ваш вопрос очень открыт для интерпретации.

+0

Хорошо спасибо, это помогает. Я не думал, чтобы квадраты были пустыми. Вместо этого я собирался просто сгенерировать 32 части и поместить их в нужное место на сетке. Кроме того, нужно было бы использовать оператор if для каждой части, или вы могли бы использовать оператор for для циклического прохождения части или в моем случае идентификатор куска? Я отправлю код, чтобы показать вам, что я имею в виду. Извините грязный код. – Jacques

+0

Кроме того, я не получил настройки сетки. Я собирался создать сетку, после того как понял это – Jacques

+0

Извините за то, что вы так долго отвечали, но если бы вы могли опубликовать код, о котором говорите (не уверен, что вы уже это поняли или нет), это конечно помощь. –

 Смежные вопросы

  • Нет связанных вопросов^_^