এটি পতাকাটি ক্যাপচার করার একটি খেলা, প্রচন্ডভাবে অনুপ্রাণিত এবং রেড বনাম ব্লু - পিক্সেল টিম ব্যাটলবটসের ভিত্তিতে । এটি একটি দুর্দান্ত প্রশ্ন ছিল (আপনাকে অনেক ধন্যবাদ ক্যালভিনের শখগুলি; আমি আশা করি আপনি যে নির্লজ্জভাবে আপনার কাছ থেকে প্রচুর কোড চুরি করেছেন তাতে আপনি আপত্তি করবেন না) - এখানে পাহাড়ের কিংড-ভিত্তিক আরেকটি দল রয়েছে। আশা করি, পতাকাটি ক্যাপচারের জন্য আরও টিমের সহযোগিতার পাশাপাশি আরও কৌশল প্রয়োজন।
এটি মিশ্রিত করতে, আপনার আইডির শেষ সংখ্যাটি যদি অন্তর্ভুক্ত করে 0
এবং 4
অন্তর্ভুক্ত করে তবে আপনাকে লাল দলে বিবেচনা করা হবে। যদি একই লোকেরা উত্তর দেওয়ার সিদ্ধান্ত নেয় তবে এটিকে আবার একই লড়াই করতে বাধা দেওয়া উচিত। বোর্ড 350px
দ্বারা 350px
। নীল দলটি বোর্ডের উপরের অর্ধেক থেকে শুরু হয় এবং লাল দলটি নিম্নার্ধে শুরু হয়।
আপনি পতাকাটি ক্যাপচার করার উপায়টি নিম্নরূপ: গেমের উদ্দেশ্য হ'ল প্রতিপক্ষ দলের পতাকা নেওয়া এবং এটি আপনার নিজের দিকে ফিরিয়ে আনা। আপনি যদি তাদের পক্ষে থাকেন তবে আপনাকে ট্যাগ করে কারাগারে পাঠানো যেতে পারে। আপনি যদি কারাগারে থাকেন তবে আপনি স্থানান্তর করতে পারবেন না। আপনি যদি আপনার পক্ষে থাকেন তবে আপনার কাজ হ'ল বিরোধী দলের সদস্যদের তাদের কারাগারে প্রেরণের জন্য ট্যাগ করা। জেল থেকে বেরিয়ে আসার একমাত্র উপায় হ'ল আপনার দলের যে কেউ কারাগারে প্রত্যেককে ট্যাগ করতে মুক্ত free (দ্রষ্টব্য যে জেলটি বিরোধী দলের পক্ষে অবস্থিত)।
বিশেষ করে:
- একটি ধ্রুবক রয়েছে -
FIELD_PADDING
20 এ সেট করুন This এটি ক্ষেত্রের জন্য প্যাডিং। যদি এটি শূন্য হয়, তবে পতাকা এবং জেলটি ঠিক ক্যানভাসের কোণে থাকবে। যেহেতু এটি না, পতাকা এবং জেল কোণ থেকে 20 পিক্সেল দূরে। - নীল পতাকা (মনে রাখবেন: নীল দলটি উপরের অর্ধেকের উপরে রয়েছে)
(WIDTH - FIELD_PADDING, FIELD_PADDING) = (330, 20)
অর্থাৎ উপরের অংশে ডানদিকে অবস্থিত। - লাল পতাকা আছে
(FIELD_PADDING, HEIGHT - FIELD_PADDING) = (20, 330)
- নীল কারাগার (যেখানে লাল সদস্য রাখা হয়)
(20, 20)
অর্থাত্ নীলের দিকে, উপরের বামে। - লাল কারাগার, যেখানে নীল সদস্যদের রাখা হয়েছে, রয়েছে
(330, 330)
প্রতিটি দলের সদস্য এলোমেলোভাবে একটি পজিশনে 45 < x < 305
এবং 45 < y < 175
নীল এবং 175 < y < 305
লাল জন্য শুরু করে। কোনও দলের সদস্য DEFENSE_RADIUS = 25
তাদের নিজস্ব পতাকা বা তাদের নিজস্ব কারাগারের পিক্সেলগুলির মধ্যে যেতে পারবেন না (যদি না অবশ্যই আপনার নিজের পতাকা কোনও বিরোধী বট হাতে নেয়, তবে আপনাকে সেই বটটি ট্যাগ করতে হবে)। এটি বটের মতো কুকুরছানা-রক্ষা রোধ করতে। আপনি যদি এই সীমার মধ্যে যান তবে আপনাকে পিছনে "ধাক্কা" দেওয়া হবে। একইভাবে, কোনও দলের সদস্য সীমানার বাইরে যেতে পারবেন না (শূন্যের চেয়ে কম বা 350 টিরও বেশি) - আপনি যদি এটি করেন তবে আপনাকে আপনার কাছের সবচেয়ে কাছের আইনি জায়গায় ফিরিয়ে দেওয়া হবে।
প্রতিবার আপনি সরানো, আপনি আপ ব্যবহার strength
। আপনার strength
শুরু হয় 20
এবং 2
প্রতিটি পালা দিয়ে পুনরায় পূরণ করা হয় । আপনি যে পরিমাণ শক্তি ব্যবহার করেন তা আপনার ভ্রমণের দূরত্বের সমান। আপনার শক্তি যদি কোনও নির্দিষ্ট জায়গায় চলে যাওয়ার কারণে নেতিবাচক হয়ে ওঠে তবে আপনাকে সেই পদক্ষেপ নেওয়া থেকে বিরত রাখা হবে। 2
সাধারণ তাড়া করার জন্য কেবল গতিতে যাওয়া সম্ভবত এটি একটি ভাল ধারণা । আপনি কেবলমাত্র জয়ের কাছাকাছি থাকলে এবং অতিরিক্ত গতি (আমার মতে) প্রয়োজন হলে আপনার কেবল উচ্চ গতি ব্যবহার করা উচিত।
স্পেস :
চিত্রটি পিক্সেল টিম ব্যাটলবটসের প্রশ্নের সাথে বেশ মিল। জাভাস্ক্রিপ্টে আপনার একটি কোড ব্লক (মনে রাখবেন, কোনও বৈশ্বিক ভেরিয়েবল) লিখতে হবে। এটি একটি সঙ্গে একটি বস্তু ফেরত পাঠাবেন x
-value এবং y
-value আপনার Y মানের মধ্যে x এর মধ্যে পরিবর্তন এবং পরিবর্তন উপস্থাপন করছেন। নিম্নলিখিত উত্তর:
return {
x: 0,
y: -2
};
সর্বদা উপরে চলে যায়, যতক্ষণ না এটি কোনও দেয়াল না। আপনি পোস্ট করার পরে 8 ঘন্টা সম্পাদনা করতে পারবেন না (লেজিমনম্যামাল 98 বাদে যারা ভেবেছিলেন যে নিয়ামক তার কোডটি লোড করছে না এবং পরীক্ষা করেছে না) । আপনার কোডে আপনার নিম্নলিখিত ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছে:
this
- নিজে, একজন খেলোয়াড় হিসাবে (খেলোয়াড় কী তা নীচে দেখুন)move
- গোল সংখ্যা, 0 থেকে শুরু করেtJailed
- আপনার দলের কারাগারে থাকা সমস্ত খেলোয়াড়ের একটি অ্যারেeJailed
- জেল হয় এমন বিরোধী দলের সমস্ত খেলোয়াড়ের একটি অ্যারেteam
- আপনার দলের সমস্ত খেলোয়াড়ের একটি অ্যারে, কেবল আপনার কাছের মানুষগুলি নয়enemies
- অন্য দলের সমস্ত খেলোয়াড়ের একটি অ্যারে, কেবল আপনার নিকটবর্তী ব্যক্তিদের নয়tFlag
- আপনার পতাকা (আপনি এটি রক্ষার চেষ্টা করছেন)eFlag
- অন্যান্য পতাকা (আপনি এটি চুরি করার চেষ্টা করছেন)messages
- নীচে ব্যাখ্যা- ধ্রুবক একটি তালিকা:
WIDTH = 350
,HEIGHT = 350
,FIELD_PADDING = 20
,DEFENSE_RADIUS = 25
।
প্রতিটি "প্লেয়ার" নিম্নলিখিত বৈশিষ্ট্যযুক্ত একটি বস্তু:
x
এবংy
strength
id
isJailed
- খেলোয়াড় কারাগারে থাকলে সত্য
প্রতিটি পতাকাটিতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
x
এবংy
pickedUpBy
- বর্তমানে যে প্লেয়ারের পতাকা রয়েছে, বা যদি কোনও খেলোয়াড়ের পতাকা না থাকে তবে তা বাতিল করে দিন।
এখন, messages
এমন একটি জিনিস যা আপনার সতীর্থদের মধ্যে ভাগ করা হয়। আপনি এটি দিয়ে কী করেন তা আমি যত্নশীল নই। একই জিনিসটি ভাগ করে নেওয়া এবং আপনার দলের সদস্যদের প্রত্যেককে দেওয়া হয়েছে। আপনি যোগাযোগ করতে পারেন এই একমাত্র উপায়। আপনি এটিতে বৈশিষ্ট্যগুলি সংযুক্ত করতে পারেন, বস্তুগুলি ভাগ করতে পারেন ইত্যাদি want এটি আপনার পছন্দ মতো বড় হতে পারে - কোনও আকারের সীমা নেই।
প্রতিটি ঘুরিয়ে নিম্নলিখিতটি ঘটে:
- প্লেয়ারদের তালিকা (লাল এবং নীল উভয়) এলোমেলোভাবে টার্ন অর্ডারটির জন্য পরিবর্তিত হয়েছে।
- প্রতিটি খেলোয়াড় একটি পদক্ষেপ করে।
- কোনও লাল দলের সদস্য যদি লাল রঙের কোনও নীল দলের সদস্যদের (10 পিক্সেলের মধ্যে) স্পর্শ করে থাকেন, তবে নীল দলের সদস্যদের কারাগারে প্রেরণ করুন, এবং তদ্বিপরীত। একজন জেল খেলোয়াড় তার পতাকাটি ফেলে দেয় এবং তার শক্তি শূন্যে নেমে আসে। মনে রাখবেন যে পদক্ষেপ ফাংশন (আপনার প্রদত্ত কোড) এখনও কল করা হয়েছে - যাতে আপনি বার্তা পেতে / সেট করতে পারেন তবে জেলে থাকাকালীন আপনি স্থানান্তর করতে পারবেন না।
- যদি কোনও খেলোয়াড় অন্য পতাকাটির (10 পিক্সেলের মধ্যে) স্পর্শ করে থাকে তবে অন্য পতাকাটি সেই প্লেয়ারটিকে "বাছাই করা" হিসাবে চিহ্নিত করা হয়। খেলোয়াড় যখন সরে যায়, পতাকাটি সরে যায় - যতক্ষণ না প্লেয়ারকে ট্যাগ করা হয় এবং কারাগারে না যায়, ততক্ষণ।
- যদি কোনও খেলোয়াড় অন্য পক্ষের কারাগার স্পর্শ করে তবে সেই কারাগারের সবাইকে মুক্তি দিন। যখন কোনও খেলোয়াড় কারাগার থেকে মুক্তি পান, তখন তাকে তার পক্ষ থেকে একটি এলোমেলো স্থানে টেলিফোর্ড করা হয়।
সংকেতগুলি:
- কমপক্ষে নিয়মিত পতাকাটি ক্যাপচার করার সময়, অনেক খেলোয়াড় একসাথে গেলে আক্রমণগুলি আরও ভাল কাজ করে, কারণ এটি ডিফেন্ডারদের বিভ্রান্ত করে যে তাদের কোন খেলোয়াড়কে তাড়া করা উচিত।
- একইভাবে, ডিফেন্ডাররা আক্রমণগুলি যাতে না ঘটে সেজন্য তারা কারা তাড়া করছে তা সমন্বয় করতে চাইতে পারে
স্ট্যাক স্নিপেট:
window.onload=function(){(function(){function p(a,b,c,e){return Math.sqrt((a-c)*(a-c)+(b-e)*(b-e))}function l(a,b){this.x=this.y=0;this.id=a.id;this.title=a.title+" ["+this.id+"]";this.link=a.link||"javascript:;";this.team=b;this.isJailed=!1;this.flag=null;this.moveFn=new Function("move","tJailed","eJailed","team","enemies","tFlag","eFlag","messages","WIDTH","HEIGHT","FIELD_PADDING","DEFENSE_RADIUS",a.code);this.init()}function x(a,b){return Math.floor(Math.random()*(b-a))+a}function q(a,b){this.startX=this.x=a;this.startY=
this.y=b;this.following=null}function t(a,b){return a===e&&b||a===h&&!b?{x:20,y:20}:{x:g.width-20,y:g.height-20}}function y(){var a,b=$("#redTeam"),c=$("#blueTeam");for(a=0;a<e.length;++a)e[a].addToDiv(b);for(a=0;a<h.length;++a)h[a].addToDiv(c)}function z(){d.clearRect(0,0,g.width,g.height);d.beginPath();d.moveTo(0,g.height/2);d.lineTo(g.width,g.height/2);d.stroke();var a=e.concat(h),b,c;for(b=a.length-1;0<b;b--){c=Math.floor(Math.random()*(b+1));var f=a[b];a[b]=a[c];a[c]=f}for(b=0;b<a.length;++b)a[b].step(u);
for(b=0;b<e.length;++b)for(c=0;c<h.length;++c)10>p(e[b].x,e[b].y,h[c].x,h[c].y)&&(e[b].y<g.height/2&&e[b].goToJail(),h[c].y>g.height/2&&h[c].goToJail());for(b=0;b<a.length;++b)c=a[b].team===e!==!0?m:n,!c.following&&10>p(a[b].x,a[b].y,c.x,c.y)&&(c.following=a[b]);for(b=0;b<a.length;++b)if(c=t(a[b].team,!0),!a[b].isJailed&&10>p(a[b].x,a[b].y,c.x,c.y))for(c=a[b].team,f=0;f<c.length;++f)c[f].isJailed&&(c[f].isJailed=!1,c[f].init());m.follow();n.follow();b=m.y<g.height/2;c=n.y>g.height/2;b&&c&&alert("EXACT TIE!!!! This is very unlikely to happen.");
b&&!c&&(alert("Blue wins!"),$("#playpause").click().hide());c&&!b&&(alert("Red wins!"),$("#playpause").click().hide());for(b=0;b<a.length;++b)a[b].draw(d);m.draw("red");n.draw("blue");u++}$.ajaxSetup({cache:!1});var e=[],h=[],g=$("canvas")[0],d=g.getContext("2d"),v,u=0,m={},n={},r=!0,A={},B={},w;l.prototype.init=function(){this.x=x(45,g.width-45);this.y=x(45,g.height/2);this.team===e&&(this.y+=g.height/2);this.strength=20};l.prototype.makeShallowCopy=function(){return{x:this.x,y:this.y,strength:this.strength,
id:this.id,isJailed:this.isJailed}};l.prototype.goToJail=function(){this.isJailed=!0;var a=this.team===e!==!0?m:n;(this.team===e!==!0?m:n).following===this&&(a.following=null);a=t(this.team,!0);this.x=a.x;this.y=a.y;this.strength=0};l.prototype.step=function(a){function b(a,b,c){var e,d,f;for(e=0;e<a.length;++e)d=a[e],d!==C&&(f=d.makeShallowCopy(),d.isJailed?b.push(f):c.push(f))}var c=[],f=[],d=[],k=[],l=this.team===e?h:e,C=this,q=this.team===e?m:n,r=this.team===e?n:m;b(this.team,c,d);b(l,f,k);f=
this.moveFn.call(this.makeShallowCopy(),a,c,f,d,k,q.copy(),r.copy(),this.team===e?A:B,g.width,g.height,20,25);"object"===typeof f&&"number"===typeof f.x&&"number"===typeof f.y&&(d=p(0,0,f.x,f.y),a=t(this.team,!1),c=this.team===e!==!1?m:n,d<=this.strength&&(this.strength-=d,this.x+=f.x,this.y+=f.y,0>this.x&&(this.x=0),0>this.y&&(this.y=0),this.x>g.width&&(this.x=g.width),this.y>g.height&&(this.y=g.height),f=p(this.x,this.y,c.x,c.y),d=p(this.x,this.y,a.x,a.y),25>f&&null===c.following&&(this.x=25*(this.x-
c.x)/f*1.3+c.x,this.y=25*(this.y-c.y)/f*1.3+c.y),25>d&&(this.x=25*(this.x-a.x)/d*1.3+a.x,this.y=25*(this.y-a.y)/d*1.3+a.y)),this.isJailed||(this.strength+=2),20<this.strength&&(this.strength=20))};l.prototype.addToDiv=function(a){var b=$("<option>").text(this.title).val(this.id);a.find(".playersContainer").append(b)};l.prototype.draw=function(a){a.fillStyle=this.team===e?"red":"blue";a.beginPath();a.arc(this.x,this.y,5,0,2*Math.PI,!0);a.fill();!this.isJailed&&$("#labels").is(":checked")&&a.fillText(this.title,
this.x+5,this.y+10)};q.prototype.draw=function(a){d.strokeStyle=a;d.beginPath();d.arc(this.x,this.y,5,0,2*Math.PI,!0);d.stroke();d.fillStyle=a;d.strokeRect(this.x-2,this.y-2,4,2);d.beginPath();d.moveTo(this.x-2,this.y);d.lineTo(this.x-2,this.y+3);d.stroke()};q.prototype.copy=function(){return{x:this.x,y:this.y,pickedUpBy:this.following&&this.following.makeShallowCopy()}};q.prototype.follow=function(){null!==this.following&&(this.x=this.following.x,this.y=this.following.y)};$("#newgame").click(function(){function a(a,
b){w?b(w):$.get("https://api.stackexchange.com/2.2/questions/"+(49028).toString()+"/answers",{page:a.toString(),pagesize:100,order:"asc",sort:"creation",site:"codegolf",filter:"!JDuPcYJfXobC6I9Y-*EgYWAe3jP_HxmEee"},b,"json")}function b(g){w=g;g.items.forEach(function(a){function b(a){return $("<textarea>").html(a).text()}var d=4>=a.owner.user_id%10?e:h;a.owner.display_name=b(a.owner.display_name);if(!(a.hasOwnProperty("last_edit_date")&&28800<a.last_edit_date-a.creation_date&&33208!==a.owner.user_id||
-1<p.indexOf(a.owner.user_id))){p.push(a.owner.user_id);var g=c.exec(a.body);if(!(null===g||1>=g.length)){var f={};f.id=a.owner.user_id;f.title=a.owner.display_name;f.code=b(g[1]);f.link=a.link;d.push(new l(f,d))}}});g.has_more?a(++d,b):(console.log("Red team",e),console.log("Blue team",h),y(),clearInterval(v),r=!0,$("#playpause").show().click())}var c=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/,d=1,p=[];e=[];h=[];u=0;m=new q(20,g.height-20);n=new q(g.width-20,20);$(".teamColumn select").empty();var k=
$("#testbotCode").val();0<k.length&&(console.log("Using test entry"),k={title:"TEST ENTRY",link:"javascript:;",code:k},$("#testbotIsRed").is(":checked")&&(k.id=-1,e.push(new l(k,e)),k.id=-3,e.push(new l(k,e))),$("#testbotIsBlue").is(":checked")&&(k.id=-2,h.push(new l(k,h)),k.id=-4,h.push(new l(k,h))));a(1,b)});$("#playpause").hide().click(function(){r?(v=setInterval(z,25),$(this).text("Pause")):(clearInterval(v),$(this).text("Play"));r=!r})})();}
#main{padding:10px;text-align:center}#testbot{padding:10px;clear:both}.teamColumn{width:25%;padding:0 10px;border:3px solid;border-color:#000;text-align:center;height:500px;overflow:scroll;white-space:nowrap}.playersContainer p{padding:0;margin:0}#redTeam{float:left;border-color:red;color:red;background-color:#fee}#blueTeam{float:right;border-color:#00f;color:#00f;background-color:#fee}#arena{display:inline-block;width:40%;text-align:center}canvas{border:1px solid #000}select{width:100%}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><div id=main><div class=teamColumn id=redTeam><h1>Red Team</h1><select size=20 class=playersContainer></select></div><div id=arena><h1>Battlefield</h1><canvas width=350 height=350></canvas></div><div class=teamColumn id=blueTeam><h1>Blue Team</h1><select size=20 class=playersContainer></select></div><div id=loadingInfo><button id=newgame>New Game</button> <button id=playpause>Play</button><br><input type=checkbox id="labels"> Show labels</div></div><div id=testbot><textarea id=testbotCode placeholder="testbot code"></textarea><br><input type=checkbox id="testbotIsRed">Red Team<br><input type=checkbox id="testbotIsBlue">Blue Team<br></div>
নিয়ন্ত্রক: http://jsfiddle.net/prankol57/4L7fdmkk/
পূর্ণ স্ক্রীন নিয়ামক: http://jsfiddle.net/prankol57/4L7fdmkk/ এম্বেডড / রিসাল্ট/
কন্ট্রোলারে কোনও বাগ আছে কিনা তা আমাকে জানান।
দ্রষ্টব্য: আপনি যদি নিয়ামকের কাছে যান এবং মনে করেন যে এটি কোনও কিছুই লোড করছে না, "নতুন গেম" টিপুন। এটি "নতুন গেম" টিপানোর পরে কেবলমাত্র সমস্ত কিছু বোঝায় যাতে এটি একবারে সমস্ত বট এবং সম্ভাব্য পরীক্ষার বটগুলি লোড করতে পারে।
শুভকামনা।
যদি কেউ উদাহরণস্বরূপ খেলাটি দেখতে চান, আমি একটি উদাহরণ বট তৈরি করেছিলাম যা আপনি "টেস্টবোট" টেক্সারিয়াতে কপি এবং পেস্ট করতে পারেন (টেস্টবোটটি প্রতিটি দলে দুটি নকল তৈরি করে; লাল দল এবং নীল দল দুটি পরীক্ষা করুন):
var r2 = Math.sqrt(2);
if (this.id === -1) {
// red team 1
// go after flag regardless of what is going on
if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
return {
x: 0,
y: 2
};
}
return {
x: this.x < eFlag.x ? r2 : -r2,
y: this.y < eFlag.y ? r2 : -r2
};
}
if (this.id === -2) {
// blue team 1
// a) go after opposing team members on your side b) get the other flag if no enemies on your side
var closestEnemy = null;
for (var i = 0; i < enemies.length; ++i) {
if (enemies[i].y < HEIGHT/2 && (closestEnemy === null || enemies[i].y < closestEnemy.y)) {
closestEnemy = enemies[i];
}
}
if (closestEnemy !== null) {
return {
x: this.x < closestEnemy.x ? r2 : -r2,
y: this.y < closestEnemy.y ? r2 : -r2
};
}
if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
return {
x: 0,
y: -2
};
}
return {
x: this.x < eFlag.x ? r2 : -r2,
y: this.y < eFlag.y ? r2 : -r2
};
}
if (this.id === -3) {
// red team 2
// a) defend the flag b) if at least half of enemies in jail and no enemies on this side, free jailed reds and quickly return
var closestEnemy = null;
for (var i = 0; i < enemies.length; ++i) {
if (enemies[i].y > HEIGHT/2 && (closestEnemy === null || enemies[i].y > closestEnemy.y)) {
closestEnemy = enemies[i];
}
}
if (closestEnemy !== null) {
return {
x: this.x < closestEnemy.x ? r2 : -r2,
y: this.y < closestEnemy.y ? r2 : -r2
};
}
if (enemies.length / eJailed.length <= 1 && tJailed.length > 0) {
return {
x: this.x < FIELD_PADDING ? r2 : -r2,
y: this.y < FIELD_PADDING ? r2 : -r2
};
}
if (this.y < 350/2) return {x: 0, y: 2};
return {
x: this.x < tFlag.x ? r2 : -r2,
y: this.y < tFlag.y ? r2 : -r2
};
}
if (this.id === -4) {
// blue team 2
// a) try freeing jail if there are jailed team members b) capture the flag
if (tJailed.length > 0) {
return {
x: this.x < WIDTH - FIELD_PADDING ? r2 : -r2,
y: this.y < HEIGHT - FIELD_PADDING ? r2 : -r2
};
}
if (eFlag.pickedUpBy !== null && eFlag.pickedUpBy.id === this.id) {
return {
x: 0,
y: -2
};
}
return {
x: this.x < eFlag.x ? r2 : -r2,
y: this.y < eFlag.y ? r2 : -r2
};
}