আমি কীভাবে বুলেট প্যাটার্ন আকারগুলি প্রসারিত করতে পারি?


12

আমি বর্ধিত বুলেট নিদর্শনগুলির একটি ধারাবাহিক বানাতে চাই যা স্কোয়ারগুলি, ত্রিভুজগুলি ইত্যাদির মতো আকার তৈরি করে I'm বিস্তৃত তারা:

https://youtu.be/7JGcuTWYdvU?t=2m41s


2
ওহ, এটি একটি ভাল প্রশ্ন। আমার কোনও নির্দিষ্ট উত্তর নেই তবে আমি কল্পনা করতে পারি যে আপনি একটি 2 ডি অবজেক্ট, কোনও স্প্রাইট বা সাধারণ আকার ব্যবহার করতে পারেন এবং বুলেটগুলি প্রান্তটি দিয়ে ছড়িয়ে দিতে পারবেন। অবশ্যই, কৌশলটি তাদের যথাযথ গতিবেগ দেবে, উভয়ই তাদের আকারের বাহ্যিক এবং যদি আপনি এই জাতীয় কোনও স্ক্রোলার তৈরি করে থাকেন, যাতে তাদের পর্দার সাথে এগিয়ে যেতে move এখানে কোন উত্তর দেখতে খুব আগ্রহী।
জেসি উইলিয়ামস

1
এই ধরনের প্রভাবের জন্য একটি জনপ্রিয় নাম "কণা প্রভাব" effects সেই অনুসন্ধান শব্দটি আপনাকে সাহায্য করতে পারে!
কর্ন

1
ধন্যবাদ, আমি বেশ কিছুদিন ধরে এক্সএনএ এবং লিবিজিডিএক্সে কণা প্রভাবগুলি ব্যবহার করে আসছি তবে এই নির্দিষ্ট শৈলীর প্রভাব কীভাবে পরিচালনা করব তা নিশ্চিত ছিলাম না।
লেপটন

1
এর আরও একটি উত্তর রয়েছে যা অবিশ্বাস্যভাবে শক্তিশালী, তবে প্রোগ্রামের পক্ষে খুব জটিল। এবং টাইপ করতে একটি বাস্তব কীবোর্ড প্রয়োজন। পরবর্তী ব্যাখ্যার জন্য এটি বুকমার্কিং।
ড্রাকো

আকর্ষণীয় - আমি এই জাতীয় কিছু জন্য কণা প্রভাব সঙ্গে যেতে না। অথবা হতে পারে এটি কেবল ityক্যের একটি বর্ণনাকরণ। কণা প্রভাবগুলির মধ্যে সংঘর্ষক থাকতে পারে (এটি কোনও জিনিসের ক্ষতি করে) তবে মনে হয় এটি কেবল অবজেক্ট অনুলিপিগুলি ইনস্ট্যান্টিয়েট করার চেয়ে অনেক বেশি ওভারহেড তৈরি করবে।
জেসি উইলিয়ামস

উত্তর:


11

এটি করার সবচেয়ে সহজ উপায় হ'ল প্রথমে আকারটি নকশা করা এবং তারপরে কণার গতিবিধি গণনা করা। এই উত্তরে আমি একটি বর্গ তৈরি করব, তবে এটি কোনও আকারের জন্য প্রযোজ্য।

কিছু উত্স পয়েন্টের আশেপাশে আপনার আকারটি আপেক্ষিক অবস্থান হিসাবে ডিজাইন করে শুরু করুন।

বর্গক্ষেত্র

এখন আপনাকে কীভাবে আকারটি প্রসারিত হবে তা গণনা করতে হবে। এটি করার জন্য আমরা ভেক্টরটিকে আমাদের অবস্থান থেকে পজিশনটি বিয়োগ করে তারপরে ভেক্টরকে সাধারণীকরণorigin করে প্রতিটি থেকে প্রতিটি দিকে নির্দেশ করে ভেক্টরটি গণনা করি । ।pointoriginpointvector = normalize(point.x - origin.x, point.y - origin.y)

ভেক্টর

আমরা এখন এই ভেক্টরটি ব্যবহার করে যেকোন সময় পয়েন্টের অবস্থান নির্ণয় করতে পারি। আপনি পয়েন্টগুলির পরবর্তী অবস্থান গণনা করুন point.position += point.vector * point.velocity। সিউডোকোড উদাহরণটি আমাদের পূর্ববর্তী পয়েন্টটি ব্যবহার করে:

// When you start your program you set these values.
point.position = (-3, 3); // Start position. Can be anything.
point.vector = normalize(-3, 3); // Normalized vector.
point.velocity = 3; // Can be anything.

// You do this calculation every frame.
point.position += point.vector * point.velocity;
// point.vector * point.velocity = (-3, 3)
// point.position is now (-6, 6) since (-3, 3) + (-3, 3) = (-6, 6)

এটি করার ফলে প্রতিটি ফ্রেমে সমস্ত পয়েন্ট 3 ইউনিটের বাইরে চলে যাবে।


মন্তব্য

  • আপনি এখানে কিছু সাধারণ ভেক্টর গণিত পড়তে পারেন ।
  • যতক্ষণ না সমস্ত অবস্থান কিছু মূল উত্সের সাথে সম্পর্কিত হয় পজিশনটি যে কোনও কিছু হতে পারে।
  • অভিন্ন চলন নিশ্চিত করতে সমস্ত পয়েন্টের বেগ একই হওয়া উচিত, তবে বিভিন্ন বেগ থাকা আপনাকে আকর্ষণীয় ফলাফল দিতে পারে।
  • যদি চলাচল বন্ধ মনে হয় আপনার মূল পয়েন্টটি পরীক্ষা করা উচিত। যদি আকারের ঠিক মাঝখানে না হয় তবে আকৃতিটি একটি অদ্ভুত উপায়ে প্রসারিত হতে পারে।

9
আমি কেবল উল্লেখ করতে চাই, প্রতিটি কণার বেগ প্রথম ফ্রেমের উত্স থেকে দূরত্বের সমানুপাতিক হওয়া উচিত (যার অর্থ প্রতি ফ্রেমে একবার নয় কেবল গণনা করা)। বিকল্পভাবে, আপনি কেবল দিক ভেক্টরকে স্বাভাবিক করতে পারেন না। আপনি যদি এটি না করেন তবে আকৃতিটি রৈখিকভাবে স্কেল হবে না, বরং বৃত্তে পরিণত হওয়ার দিকে এগিয়ে যাবে (যদি সমস্ত বেগ একই হয়।)
হারুন

@ চারণর এই ব্যাখ্যার জন্য অনেক ধন্যবাদ। আমি আসলে বিশ্ববিদ্যালয়ে স্বতন্ত্র গণিত অধ্যয়ন করেছি তবে এটি এখন বেশ কিছুটা আগে ছিল। আমি আজ কিছু চেষ্টা এবং বাস্তবায়ন করতে যাচ্ছি।
লেপটন

2

সুতরাং, বুলেটএমএল নামে এই প্রকল্পটি রয়েছে যা জটিল কণা / বুলেট নিদর্শন তৈরি করার জন্য একটি মার্কআপ ভাষা। আপনার নিজের কোডটি অবশ্যই নিজের ভাষায় পোর্ট করতে হবে তবে এটি কিছু আশ্চর্যজনক কাজ করতে পারে।

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

বা আমি এই উদাহরণটি প্রদর্শন করতে পারি, যা সর্বশেষ ফেডারেশনের জন্য একটি প্রসারণে কাজ করার সময় আমি লিখেছিলাম এমন একটি প্যাটার্ন যা কম মোড-বন্ধুত্বপূর্ণ এবং কেবলমাত্র একক অক্ষর AZ ভেরিয়েবল ব্যবহার করে সিস্টেমটির একটি পুরানো সংশোধন ব্যবহার করে:

বুলেট প্যাটার্ন উদাহরণ

সেখানে এই রিংগুলি তৈরি করা সবুজ বুলেটগুলি একটি প্যারেন্ট বুলেট থেকে উত্পন্ন হয় যা উচ্চ গতিতে ঘুরছে, তবে তাদের কোনও গতি নেই। তারা খেলোয়াড়কে দীর্ঘতর পরিসরে রাখে, ক্ষতির অস্ত্র কমিয়ে দেয় এবং মোবাইল ডিফেন্ডারদের খেলোয়াড়কে হয়রানি করতে দেয় (প্লেয়ারটি যদি মাঝখানে উদ্রেককারী কাঠামোটি ধ্বংস হয়ে যায় তবে জয়ী হয়েছিল) ব্যাপক ক্ষতি করে।

এক্সএমএল সিনট্যাক্সের এমন একটি অংশ যা এই বুদবুদগুলি তৈরি করে:

<bullet_pattern name="Barrier">
    $WallShotAngle B=.3 A=90
    $WallShotAngle B=.3 A=-90
    $WallShotAngle B=.3 A=0
    $WallShotAngle B=.375 A=180
</bullet_pattern>

<var name="WallShotAngle">
    <bullet angle="[A]" speed="4000" interval_mult=".01" dumbfire="1" shot_type="GravityWavePurple">
        <wait time="[B]" />
        <change angle="0" speed="1000" time=".0001" />
        <spawn>
            <bullet_pattern>
                <bullet angle="[A]" speed="0" shot_type="CurveBarGreen" damage_mult="8">
                <wait time="12" />
                <die />
                </bullet>
            </bullet_pattern>
        </spawn>
        <die />
    </bullet>
</var>

আপনি স্ক্রিনশটে কিছু বেগুনি "মাধ্যাকর্ষণ তরঙ্গ" শট দেখতে পাচ্ছেন, যা উত্স থেকে প্রায় তাত্ক্ষণিকভাবে ভ্রমণ করে (যা ঘুরছে) বুদ্বুদ এর প্রান্তে, যার পরে এটি সবুজ "বাঁকা বার" শট তৈরি করে, যা সেখানে 12 সেকেন্ড আগে বসেছিল despawning। নীল এবং হলুদ শটগুলি আমি বাদ দিয়েছি কারণ সেগুলি আরও জটিল।

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

বুলেটএমএল সাধারণভাবে কাজ করা সহজ এবং আশ্চর্যজনক কিছু করতে পারে। বুলেটগুলি দিক পরিবর্তন করতে পারে, গতি পরিবর্তন করতে পারে, অন্যান্য নিদর্শনগুলিকে স্প্যান করতে পারে, তাড়াতাড়ি মারা যায়, লুপে কমান্ড সংগ্রহের পুনরাবৃত্তি করতে, বিলম্ব ব্যবহার করতে পারে, বুলেট স্প্রাইটের চিত্র পরিবর্তন করতে পারে, তাদের পিতামাতার অনুসরণ করতে পারে (বা না) ... এবং এটি আপনাকে সমর্থন করতে পারে না এমন কিছু এটি লিখুন।

আপনি যদি সিরিয়াস শ্যুট আপ গেমটি করেন তবে আমি অবশ্যই এটি প্রস্তাব করব। চ্যানোর তার উত্তরের বিষয়ে যেমন কথা বলেছে তেমনি আপনার পছন্দসই আকারগুলি পেতে সমন্বিত গণিতের কাজ করা দরকার, কিন্তু বুলেটএমএলের মতো একটি বুলেট ইঞ্জিন আপনাকে এত বেশি নমনীয়তা দেবে যে আপনি নতুন ধরণের নকশাগুলি তৈরির চেয়ে বেশি সময় ব্যয় করবেন out কিভাবে তাদের কোড।

  1. দুর্ভোগ কতটা ভাল তা বোঝানোর জন্য, সেই ভিডিওগুলি শুরু করার সরঞ্জাম সহ মেঝে কর্তাদের বিরুদ্ধে : কোনও মডিউল নেই, গ্রাহ্যযোগ্য নয় এবং বেসিক মটর শ্যুটার। এবং এক্সের লড়াইয়ের দীর্ঘায়িত প্রকৃতি থাকা সত্ত্বেও কেবল একটি হিট লাগে। ঠিক আছে, সেন্ট্রিফিউজের বিপক্ষে 9 টি হিট (প্লেয়ারের পরে তৃতীয় তল অবধি যে প্রদর্শিত হবে না তার তুলনায় তুলনামূলকভাবে কমপক্ষে দ্বিগুণ ক্ষতি হবে)

ধন্যবাদ, আমি বুলেটএমএল সম্পর্কে অস্পষ্টভাবে অবগত ছিলাম, কারণ এটি প্রায় সময় হয়ে গেছে, তবে এটি অবশ্যই আমার সহজ গেমটির জন্য অতিমাত্রায় ছড়িয়ে পড়ে, যা মাঝে মধ্যে কেবল বুলেট-নরকে ছুঁড়ে মারে, এবং প্রতি সেলে বুলেট-হেলিক শ্যুটার নয়।
লেপটন

@ লেপটন সম্পূর্ণরূপে বোধগম্য। এটি আপনার সিদ্ধান্ত নেওয়ার সিদ্ধান্ত, তবে উত্তর অন্য কারও পক্ষে "সেরা" হতে পারে। আমি জানি যে টিএলএফ-এ কাজ করার পরে এবং নিজের শ্যুটার তৈরির কাজ শুরু করতে গিয়ে আমি কাজটি করতে কতটা শক্তিশালী এবং সহজ ছিল সে কারণে আমি এটি ব্যবহার করতে চেয়েছিলাম। :)
ড্রাকো

1

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

package com.mygdx.gtest;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;

public class Test extends ApplicationAdapter{

    public SpriteBatch sb;
    private StarShape ss, ssBig;

    @Override
    public void create() {
        sb = new SpriteBatch();
        Pixmap pmap = new Pixmap(2, 2,Format.RGBA8888);
        pmap.setColor(Color.WHITE);
        pmap.fill();
        ss = new StarShape(50,50,new Texture(pmap), 10, true);
        ssBig = new StarShape(250,250,new Texture(pmap), 50, false);
        pmap.dispose();

    }


    @Override
    public void render() {
        super.render();

        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        ss.update(Gdx.graphics.getDeltaTime());
        ssBig.update(Gdx.graphics.getDeltaTime());

        sb.begin();
            ss.draw(sb);
            ssBig.draw(sb);
        sb.end();

    }


    @Override
    public void dispose() {
        super.dispose();
    }

    private class StarShape{
        public float progress = 1f;
        public Texture bulletTex;
        public Array<Vector2> points = new Array<Vector2>();
        public Vector2 center;

        public StarShape(float x, float y, Texture tex, float initialSize, boolean mathWay){
            center = new Vector2(x,y);
            bulletTex = tex;

            if(mathWay){
                // define star shape with maths
                float alpha = (float)(2 * Math.PI) / 10; 
                float radius = initialSize;

                for(int i = 11; i != 0; i--){
                    float r = radius*(i % 2 + 1)/2;
                    float omega = alpha * i;
                    points.add(
                            new Vector2(
                                    (float)(r * Math.sin(omega)), 
                                    (float)(r * Math.cos(omega)) 
                                )
                            );
                }
            }else{
            // or define star shape manually (better for non geometric shapes etc

                //define circle
                points.add(new Vector2(-3f,0f));
                points.add(new Vector2(-2.8f,1f));
                points.add(new Vector2(-2.2f,2.2f));
                points.add(new Vector2(-1f,2.8f));
                points.add(new Vector2(0f,3f));
                points.add(new Vector2(1f,2.8f));
                points.add(new Vector2(2.2f,2.2f));
                points.add(new Vector2(2.8f,1f));
                points.add(new Vector2(3f,0f));
                points.add(new Vector2(2.8f,-1f));
                points.add(new Vector2(2.2f,-2.2f));
                points.add(new Vector2(1f,-2.8f));
                points.add(new Vector2(0f,-3f));
                points.add(new Vector2(-1f,-2.8f));
                points.add(new Vector2(-2.2f,-2.2f));
                points.add(new Vector2(-2.8f,-1f));

                // mouth
                points.add(new Vector2(-2,-1));
                points.add(new Vector2(-1,-1));
                points.add(new Vector2(0,-1));
                points.add(new Vector2(1,-1));
                points.add(new Vector2(2,-1));
                points.add(new Vector2(-1.5f,-1.1f));
                points.add(new Vector2(-1,-2));
                points.add(new Vector2(0,-2.2f));
                points.add(new Vector2(1,-2));
                points.add(new Vector2(1.5f,-1.1f));

                points.add(new Vector2(-1.5f,1.5f));
                points.add(new Vector2(1.5f,1.5f));

            }

        }

        public void update(float deltaTime){
            this.progress+= deltaTime;
        }

        public void draw(SpriteBatch sb){
            Vector2 temp = new Vector2(0,0);
            for(Vector2 point: points){
                temp.x = (point.x);
                temp.y = (point.y);
                temp.scl(progress);
                sb.draw(bulletTex,temp.x + center.x,temp.y +center.y);
            }
        }
    }
}

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