मैं एक टेस्ट खेल बना रहा हूं जहां मैं चाहता हूं कि स्तर लगातार स्क्रॉल हो। इस आशय को बनाने के लिए मैंने एक कैमरा क्लास की स्थापना की है जो बस एक वेक्टर 2 स्थिति और एक एनम दिशा को संग्रहीत करता है। इसमें 'चाल' के लिए एक सार्वजनिक विधि भी शामिल है जो एक निश्चित दर पर स्थिति को बदल देती है। मैं तब इस स्थिति का उपयोग करता हूं जब ड्राइंग करते समय मेरी सरणी टाइलों के माध्यम से लूपिंग करता है। यह सब ठीक काम करता है।
हालांकि, मुझे बताया गया है कि मुझे कैमरे को स्थानांतरित करने के लिए एक ट्रांसफ़ॉर्म मैट्रिक्स का उपयोग किया जाना चाहिए, और जब मैं स्प्राइट शुरू करूं तो मुझे यह प्रदान करना चाहिए। मैं थोड़ा उलझन में हूँ।) यह कैसे काम करता है? जैसे कि मैं केवल इसे दे रहा हूं जब स्प्रिटबैच शुरू होता है, तो यह कैसे बदलती स्थिति को रखना जानता है? ख।) टाइल्स के माध्यम से लूप होने पर मुझे निश्चित रूप से कैमरे की स्थिति की आवश्यकता क्यों है?
इस क्षण मैं काम करने के लिए नहीं मिल सकता, लेकिन यह कोई आश्चर्य की बात नहीं है क्योंकि मैं पूरी तरह से नहीं समझता कि यह कैसे काम करने के लिए है। वर्तमान में मेरे प्रयास में (कोड का पालन करने के लिए) टाइलें खींची जा रही हैं, जिसका अर्थ है कि कैमरों की स्थिति बदल रही है, लेकिन व्यूपोर्ट की स्थिति अपरिवर्तित बनी हुई है (यानी कैमरा मूल पर)। मैं वास्तव में कुछ सलाह / मार्गदर्शन की सराहना करता हूं कि इसका उपयोग कैसे किया जाना चाहिए?
कैमरा:
class Camera {
// The position of the camera.
public Vector2 Position {
get { return mCameraPosition; }
set { mCameraPosition = value; }
}
Vector2 mCameraPosition;
public Vector2 Origin { get; set; }
public float Zoom { get; set; }
public float Rotation { get; set; }
public ScrollDirection Direction { get; set; }
private Vector2 mScrollSpeed = new Vector2(20, 18);
public Camera() {
Position = Vector2.Zero;
Origin = Vector2.Zero;
Zoom = 1;
Rotation = 0;
}
public Matrix GetTransform() {
return Matrix.CreateTranslation(new Vector3(mCameraPosition, 0.0f)) *
Matrix.CreateRotationZ(Rotation) *
Matrix.CreateScale(Zoom, Zoom, 1.0f) *
Matrix.CreateTranslation(new Vector3(Origin, 0.0f));
}
public void MoveCamera(Level level) {
if (Direction == ScrollDirection.Up)
{
mCameraPosition.Y = MathHelper.Clamp(mCameraPosition.Y - mScrollSpeed.Y, 0, (level.Height * Tile.Height - level.mViewport.Height));
}
}
स्तर:
public void Update(GameTime gameTime, TouchCollection touchState) {
Camera.MoveCamera(this);
}
public void Draw(SpriteBatch spriteBatch) {
//spriteBatch.Begin();
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, mCamera.GetTransform());
DrawTiles(spriteBatch);
spriteBatch.End();
}
खेल - बस स्तर के भीतर ड्रा कहते हैं:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== EDIT:
सबसे पहले, धन्यवाद आप craftworkgames आपकी मदद के लिए इस प्रकार अब तक।
मैंने सुझाव के साथ खेला। जब मैंने सभी टाइलें खींचीं, तो fr को लगभग 15 से 30 तक टंकी दी - शायद इसलिए कि स्तर बहुत बड़े हैं।
इसलिए मैंने जो किया है वह मैट्रिक्स लागू करें और अपडेट में स्थानांतरित करें (जैसा कि सुझाव दिया गया है) लेकिन ड्रा में मैं टाइल्स के माध्यम से लूपिंग के लिए कैमरों की स्थिति का उपयोग करता हूं (यानी बाईं ओर काउंटर शुरू करें और दाएं टाइल पर समाप्त करें)। यह सब अच्छी तरह से काम करता है और मैं इसके साथ खुश हूँ :-)
मेरा नया मुद्दा खिलाड़ी में है। जाहिर है कि मैं अब स्तर के बजाय कैमरे को आगे बढ़ा रहा हूं, खिलाड़ी को कैमर द्वारा पीछे छोड़ दिया जाता है क्योंकि इसकी स्थिति स्थिर रहती है। मैंने इस समस्या के दो समाधानों के बारे में सोचा है, पहला यह है कि खिलाड़ी को ड्रॉ करते समय केवल कैमरों की स्थिति पर विचार करें। ड्रॉ फंकी में Ie बस खिलाड़ी की स्थिति के लिए कैमरा स्थिति जोड़ें। दूसरा खिलाड़ी के लिए एक नया स्प्राइट बैच शुरू करना है जिसमें कोई परिवर्तन नहीं है। यानी टाइल खींचने के बाद स्प्राइटबैच को खत्म करें, फिर खिलाड़ी को खींचते समय एक नई शुरुआत करें। मुझे पता है कि दोनों काम करेंगे, लेकिन मैं उन पूंछों के प्रमुख नहीं बना सकता जिनमें से प्रदर्शन / अच्छा कोडिंग के मामले में बेहतर होगा? मुझे यकीन नहीं है कि दो बार बैच शुरू करने से प्रदर्शन के निहितार्थ क्या हैं?