আমি কীভাবে আয়তক্ষেত্রাকার ব্লকগুলির বাইরে বাঁকা পৃষ্ঠ তৈরি করব?


12

একটি জন্য Peggle -একটি খেলা, আমি ব্লক করে একটি বক্ররেখা অনুসরণ, ভালো করতে চাই:

একটি বাঁক বরাবর ব্লক

বলগুলি আঘাত করার সাথে সাথে ব্লকগুলি অদৃশ্য হয়ে যাবে।

আমি কিছু আনুভূমিকভাবে আঁকতে সক্ষম হয়েছি, তবে তাদের একটি পথ অনুসরণ করতে আমার সমস্যা হচ্ছে:

পথ অনুসরণকারী ব্লকগুলিতে আমার প্রচেষ্টা

আমি এটা কিভাবে করবো? আমার কি কাস্টম উল্লম্ব সহ বক্স 2 ডি অবজেক্ট তৈরি করা দরকার ?


আপনি কি বাক্সগুলি কেবল ওভারল্যাপ না করা চান বা আপনি চান যে কোথাও কোনও ফাঁক নেই? ("অবজেক্টের কোণ অনুসারে অবজেক্ট ওয়াই অক্ষটি অফসেট করে" আপনি কী বোঝাতে চেয়েছেন তা আমি ঠিক নিশ্চিত নই))।
রায় টি।

1
আপনি অ ওভারল্যাপিং সঙ্গে একটি বক্ররেখা পূরণ করতে পারবে না আয়তক্ষেত্র , তাই আপনি যাচ্ছেন আছে কিছু কাস্টম geomety তৈরী করতে যদি কোন ফাঁক চাই।
আনকো

@RoyT। ফাঁকগুলি গুরুত্বপূর্ণ নয়। আমার আসল সমস্যাটি হ'ল ব্লকের অবস্থানটি গণনা করা যা একে অন্যকে বিভিন্ন কোণ দিয়ে অনুসরণ করে।
মুরিন

আমি এটির কাছে যাবার উপায় হ'ল প্রতিটি বাক্সের মধ্যে একটি সাধারণ কোণ হিসাবে কাজ করে এমন একটি বিভাজনকে সংজ্ঞায়িত করা। এমনকি এগুলি সংজ্ঞায়িত করার জন্য কোনও পাথ ব্যবহার করেও আপনাকে শীর্ষ বাক্সের মধ্যবর্তী দূরত্ব এবং প্রতিটি বাক্স কত দীর্ঘ তা নির্ধারণ করতে অতিরিক্ত পরামিতিগুলির প্রয়োজন।

4
প্রথম চিত্রের "বাক্সগুলি" বাক্স নয়, তারা ত্রিভুজগুলির জোড়া: i.stack.imgur.com/Tzuql.png
egarcia

উত্তর:


14

একটি "রুট" বক্ররেখা দেওয়া হয়েছে, আপনি কীভাবে ব্লক শীর্ষকোষ তৈরি করতে পারেন তা এখানে।

ব্লক সহ বুজিয়ার

মূল বক্ররেখা মাঝখানে, কালো রঙের। এর কন্ট্রোল পয়েন্টগুলি লাল Xগুলি দিয়ে দেখানো হয়েছে।

সংক্ষেপে : আমি একটি বেজিয়ার তৈরি করেছি এবং এটি নমুনা করেছি (একটি কনফিগারযোগ্য হারে)। আমি তখন প্রতিটি নমুনা থেকে পরের অংশের জন্য ভেক্টরের লম্ব ভেক্টরটি খুঁজে পেয়েছি , এটি সাধারণকরণ করেছি এবং এটিকে প্রথমে বাম দিকে, পরে ডানদিকে বিপরীতভাবে একটি (কনফিগারযোগ্য) স্কেল করে। তারপরে এটি আঁকুন।

স্টাফ আপনি এতে যোগ করতে পারেন:


আমার কোড এখানে। এটা তোলে লেখা অ্যাপ্লিকেশন Lua (জন্য ভালবাসা খেলা ফ্রেমওয়ার্ক), কিন্তু আমার মনে হয় এটা যে কেউ জন্য পাঠযোগ্য নয়।

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

আপনি যদি এটির সাথে খেলতে চান: লভ করুন এবং উপরের কোডটি main.luaতার নিজস্ব ডিরেক্টরিতে রেখে দিন। একই ডিরেক্টরি লাইব্রেরি vector.luaথেকে রাখুন HUMPlove <that-directory>কমান্ড লাইন থেকে এটি চালান ।

মাউস ঘুরিয়ে! মাঝের নিয়ন্ত্রণ পয়েন্টটি মাউসের অবস্থানে সেট করা আছে:

মাউস দিয়ে নিয়ন্ত্রণ পয়েন্ট নির্ধারণ


আঙ্কো আপনি লিবিডেক্স চেষ্টা করেছেন? যদি তাই হয়, আপনি কি L preferve পছন্দ? আমি আমার বর্তমান গেমের পরে স্ট্যান্ডার্ড অ্যান্ড্রয়েড এপিআই ব্যবহার করা থেকে দূরে সরে যাচ্ছি এবং আমি লিবিডেক্স এবং লভের মধ্যে সিদ্ধান্ত নেওয়ার চেষ্টা করছি।
বিটিডব্লিউর

@ আনকো অনেক ধন্যবাদ, এটি আমার প্রত্যাশার চেয়েও বেশি আরও আমি মনে করি আমি আপনার কোডটি খুব সহজেই বুঝতে পারি যেহেতু আমি আমার গেমের জন্য মনিএক্স ব্যবহার করি যা এলইউএর মতো similar
মোয়ারিন

1
@ আইকিউ আমি লিবিগডিএক্স ব্যবহার করি নি, তবে আমি এটি সম্পর্কে প্রচুর পড়েছি এবং আমি জাভা ভালভাবে জানি। Libgdx বড় । (এতে অ্যাকসিলোমিটার সমর্থন রয়েছে, কার্ভ জেনারেটর এবং সমস্ত কিছুর মধ্যে নির্মিত), যদিও লাভ 2 ডি খুব ছোট (এটির কোনও নেই, সেখানে কোনও শেডার সমর্থন নেই)। যদিও এর সরলতার জন্য ধন্যবাদ, লাভ 2 ডি দ্রুত প্রোটোটাইপ এবং ছোট গেমগুলির জন্য দুর্দান্ত হয়েছে তবে কিছু প্রকল্পের জন্য এটি খুব সংক্ষিপ্ত হতে পারে। কে জানে. (আপনি করুন! দেখুন এবং দেখুন।: ডি)
আনকো

দুর্দান্ত উত্তর, এবং জিআইএফ সত্যিই একটি দুর্দান্ত বোনাস!
রায় টি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.