আমি বর্ধিত বুলেট নিদর্শনগুলির একটি ধারাবাহিক বানাতে চাই যা স্কোয়ারগুলি, ত্রিভুজগুলি ইত্যাদির মতো আকার তৈরি করে I'm বিস্তৃত তারা:
আমি বর্ধিত বুলেট নিদর্শনগুলির একটি ধারাবাহিক বানাতে চাই যা স্কোয়ারগুলি, ত্রিভুজগুলি ইত্যাদির মতো আকার তৈরি করে I'm বিস্তৃত তারা:
উত্তর:
এটি করার সবচেয়ে সহজ উপায় হ'ল প্রথমে আকারটি নকশা করা এবং তারপরে কণার গতিবিধি গণনা করা। এই উত্তরে আমি একটি বর্গ তৈরি করব, তবে এটি কোনও আকারের জন্য প্রযোজ্য।
কিছু উত্স পয়েন্টের আশেপাশে আপনার আকারটি আপেক্ষিক অবস্থান হিসাবে ডিজাইন করে শুরু করুন।
এখন আপনাকে কীভাবে আকারটি প্রসারিত হবে তা গণনা করতে হবে। এটি করার জন্য আমরা ভেক্টরটিকে আমাদের অবস্থান থেকে পজিশনটি বিয়োগ করে তারপরে ভেক্টরকে সাধারণীকরণorigin
করে প্রতিটি থেকে প্রতিটি দিকে নির্দেশ করে ভেক্টরটি গণনা করি । ।point
origin
point
vector = 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 ইউনিটের বাইরে চলে যাবে।
মন্তব্য
সুতরাং, বুলেটএমএল নামে এই প্রকল্পটি রয়েছে যা জটিল কণা / বুলেট নিদর্শন তৈরি করার জন্য একটি মার্কআপ ভাষা। আপনার নিজের কোডটি অবশ্যই নিজের ভাষায় পোর্ট করতে হবে তবে এটি কিছু আশ্চর্যজনক কাজ করতে পারে।
উদাহরণস্বরূপ, এই বসটি ইউনিটি 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 কিভাবে তাদের কোড।
চরনোর দ্বারা নির্দেশিত হিসাবে আপনি নিজের আকারটি সংজ্ঞায়িত করতে এবং তারপরে সময়ের সাথে সাথে তাদের অবস্থান আপডেট করতে পয়েন্টগুলির একটি অ্যারে ব্যবহার করতে পারেন। নীচে পয়েন্টগুলি ব্যবহার করে কোনও স্টার শেপ বা কাস্টম শেপ কীভাবে প্রয়োগ করতে হবে তার একটি কার্যকারী উদাহরণ রয়েছে:
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);
}
}
}
}