मैं आयताकार ब्लॉकों से बाहर एक घुमावदार सतह कैसे बनाऊं?


12

एक खूंटी की तरह खेल के लिए, मैं इस तरह से एक वक्र का पालन करने वाले ब्लॉक बनाना चाहता हूं:

एक वक्र के साथ ब्लॉक

गेंद के हिट होते ही ब्लॉक फिर गायब हो जाते थे।

मैं कुछ क्षैतिज रूप से आकर्षित करने में कामयाब रहा, लेकिन मुझे उन्हें एक पथ का अनुसरण करने में परेशानी हो रही है:

पथ निम्नलिखित ब्लॉकों में मेरा प्रयास

मैं यह कैसे करु? क्या मुझे कस्टम कोने के साथ Box2D ऑब्जेक्ट बनाने की आवश्यकता है ?


क्या आप चाहते हैं कि बक्से केवल ओवरलैप न हों या आप चाहते हैं कि कहीं कोई अंतराल न हो? (मुझे बिल्कुल यकीन नहीं है कि आप "ऑब्जेक्ट कोण के अनुसार ऑब्जेक्ट वाई अक्ष को ऑफसेट करने" से क्या मतलब है)।
रॉय टी।

1
आप गैर-अतिव्यापी के साथ एक वक्र नहीं भर सकते आयतों है, तो आप करने जा रहे हैं करने के लिए है कुछ कस्टम geomety बनाने यदि आप कोई अंतराल चाहते हैं।
एको

@RoyT। अंतराल महत्वपूर्ण नहीं हैं। मेरी वास्तविक समस्या ब्लॉक की स्थिति की गणना करना है जो विभिन्न कोणों के साथ एक दूसरे का अनुसरण करते हैं।
Moerin

जिस तरह से मैं दृष्टिकोण करूंगा वह वर्टिकल की एक श्रृंखला को परिभाषित करना है जो प्रत्येक बॉक्स के बीच आम कोनों के रूप में कार्य करता है। यहां तक ​​कि उन्हें परिभाषित करने के लिए एक पथ का उपयोग करते हुए, आपको अभी भी अतिरिक्त मापदंडों की आवश्यकता है ताकि कोने के बीच की दूरी और प्रत्येक बॉक्स कितने समय तक हो।

4
पहली छवि पर "बक्से" बक्से नहीं हैं, वे त्रिकोण के जोड़े हैं: i.stack.imgur.com/Tzuql.png
egarcia

जवाबों:


14

"रूट" वक्र को देखते हुए, यहां बताया गया है कि आप ब्लॉक वर्टिकल कैसे उत्पन्न कर सकते हैं।

ब्लॉक के साथ बेज़ियर

जड़ वक्र मध्य में है, काले रंग में। इसके नियंत्रण बिंदुओं को लाल Xएस के साथ दिखाया गया है ।

संक्षेप में : मैंने एक बेज़ियर बनाया और इसे (एक विन्यास दर पर) नमूना लिया। मैंने फिर प्रत्येक नमूने से अगले तक वेक्टर के लंबवत वेक्टर को पाया , इसे सामान्य किया, और इसे पहली (बाईं ओर) चौड़ी चौड़ाई में, फिर दाईं ओर उलटा करके स्केल किया। फिर खींचा।

सामान आप इसमें जोड़ सकते हैं:


यहाँ मेरा कोड है। यह Lua ( L gameVE गेम ढांचे के लिए) में लिखा गया है , लेकिन मुझे लगता है कि यह किसी के लिए भी पठनीय है।

local v = require "vector"

-- A function that makes bezier functions
-- Beziers have start point     p0
--              control point   p1
--              end point       p2
local function makeBezierFunction(p0,p1,p2)
    return function (t)
        local pow = math.pow
        return pow( (1-t),2 ) * p0
               + 2 * (1-t) * t * p1
               + pow(t,2) * p2
    end
end

love.graphics.setBackgroundColor(255, 255, 255)
function love.draw()
    local line = love.graphics.line
    local colour = love.graphics.setColor

    -- Bezier sampling parameters
    local nSegments = 10
    local segIncr = 1/nSegments

    -- Bezier definition: Start (`p0`), control (`p1`) and end `p2`) point
    local p0 = v(100,100)
    local p1 = v( love.mouse.getX(), love.mouse.getY() )
    local p2 = v(500,100)
    local controlPoints = {p0,p1,p2}
    local bez = makeBezierFunction(p0,p1,p2)

    -- Sample the bezier
    for i=0,1-segIncr,segIncr do
        colour(0, 0, 0)
        local x1,y1 = bez(i        ):unpack()
        local x2,y2 = bez(i+segIncr):unpack()
        line(x1,y1,x2,y2)

        -- Find left and right points.
        local center = v(x1, y1)
        local forward = v(x2, y2) - center
        local left = center + forward:perpendicular():normalize_inplace() * 10
        local right = center - forward:perpendicular():normalize_inplace() * 10

        -- Draw a line between them.
        line(left.x, left.y, right.x, right.y)

        -- Find *next* left and right points, if we're not beyond the end of
        -- the curve.
        if i + segIncr <= 1 then
            local x3, y3 = bez(i+segIncr*2):unpack()
            local center2 = v(x2, y2)
            local forward2 = v(x3, y3) - center2
            local left2 = center2 + forward2:perpendicular():normalize_inplace() * 10
            local right2 = center2 - forward2:perpendicular():normalize_inplace() * 10

            -- Connect the left and right of the current to the next point,
            -- forming the top and bottom surface of the blocks.
            colour(0, 0xff, 0)
            line(left.x, left.y, left2.x, left2.y)
            colour(0, 0, 0xff)
            line(right.x, right.y, right2.x, right2.y)
        end
    end

    -- Draw an X at the control points
    for _,p in ipairs(controlPoints) do
        local x,y = p:unpack()
        colour(0xff,0x00,0x00)
        line(x-5,y-5, x+5,y+5)
        line(x-5,y+5, x+5,y-5)
    end
    -- Draw lines between control points
    for i=1,#controlPoints do
        colour(0xff,0x00,0x00, 100)
        local cp1 = controlPoints[i]
        local cp2 = controlPoints[i+1]
        if cp1 and cp2 then
            line(cp1.x, cp1.y
                ,cp2.x, cp2.y)
        end
    end
end

यदि आप इसके साथ खेलना चाहते हैं: L likeVE प्राप्त करें और उपरोक्त कोड को main.luaअपनी निर्देशिका में डालें । रखो vector.luaसे HUMPएक ही निर्देशिका में पुस्तकालय। love <that-directory>कमांड लाइन से इसे चलाएं ।

चारों ओर माउस ले जाएँ! मध्य नियंत्रण बिंदु माउस स्थान पर सेट है:

माउस के साथ नियंत्रण बिंदु सेट करना


Anko ने LibGdx की कोशिश की है? यदि हां, तो क्या आप Löve पसंद करते हैं? मैं अपने वर्तमान गेम और Im के बाद LibGdx और Löve के बीच निर्णय लेने की कोशिश कर रहा हूँ, मानक android API का उपयोग करने से दूर जा रहा हूँ। ऊपर दिए गए दिलचस्प जवाब हमेशा की तरह btw
ग्रीन_का

@ अको बहुत बहुत धन्यवाद, यह मेरी अपेक्षा से अधिक है। मुझे लगता है कि मैं आसानी से अपने कोड को समझ सकता हूं क्योंकि मैं अपने खेल के लिए मंकीएक्स का उपयोग करता हूं जो एलयूए के समान है।
मूरिन

1
@ आईक्यू मैंने लिबीडीएक्स का उपयोग नहीं किया है, लेकिन मैंने इसके बारे में बहुत पढ़ा है और मुझे जावा अच्छी तरह से पता है। Libgdx बड़ा है । (इसमें एक्सेलेरोमीटर सपोर्ट है, जो कर्व जनरेटर्स और हर चीज में बनाया गया है), जबकि लव 2 डी बहुत छोटा है (इसमें उन में से कोई भी नहीं है, इसमें 'कोई शेडर सपोर्ट वगैरह नहीं है')। हालांकि इसकी सरलता के लिए धन्यवाद, लव 2 डी त्वरित प्रोटोटाइप और छोटे खेलों के लिए बहुत अच्छा रहा है, लेकिन यह कुछ परियोजनाओं के लिए बहुत कम हो सकता है। कौन जाने। (आप इसे आजमाएँ और देखें।: D)
Anko

शानदार जवाब, और वह GIF वास्तव में एक अच्छा बोनस है!
रॉय टी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.