myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

C#&XNA - Scrolling Background

Willkommen

myGully

Links

Forum

 
Antwort
 
Themen-Optionen Ansicht
Ungelesen 15.06.12, 13:44   #1
ipulf2
Anfänger
 
Benutzerbild von ipulf2
 
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
ipulf2 ist noch neu hier! | 0 Respekt Punkte
Standard C#&XNA - Scrolling Background

Hallo Leute^^

Ich Programmiere momentan ein kleines Jump&Run-Spiel und komme nicht weiter^^

Ich habe einen ScrollingBackground eingebaut, der allerdings durchgehend scrollt^^

Jetzt möchte ich wissen wie ich denn machen kann das ich nur scrolle wenn ich eine bestimmte entfernung zum Bildschirmrand habe^^

Hier mein Quellcode:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace WindowsGame1
{
    class Backgrounds
    {

        public Texture2D texture;
        public Rectangle rectangle;

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, rectangle, Color.White);
        }

        
    }
    class Scrolling : Backgrounds
    {
        public Scrolling(Texture2D newTexture, Rectangle newRectangle)
        {
            texture = newTexture;
            rectangle = newRectangle;
        }
        public void Update()
        public void Update()
        {
                rectangle.X -= 3;
        }
    }
}
Wäre cool wenn ihr mir helfen könntet, ich habe nicht viel Ahnung von dem Zeug^^

MfG ipulf2
ipulf2 ist offline   Mit Zitat antworten
Ungelesen 15.06.12, 16:41   #2
ProgMaster
Banned
 
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
ProgMaster ist noch neu hier! | 0 Respekt Punkte
Standard

Was hast du denn bisher versucht?
ProgMaster ist offline   Mit Zitat antworten
Ungelesen 15.06.12, 19:55   #3
ipulf2
Anfänger
 
Benutzerbild von ipulf2
 
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
ipulf2 ist noch neu hier! | 0 Respekt Punkte
Standard

habe das problem eigenständig lösen können^^
Allerdings in den anderen Dateien^^
hatte nur eine Denkblockade.

Hier meine Lösung(Die Änderungen sind Rot markiert.):

Animation.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace WindowsGame1
{
    class Animation
    {

        Texture2D texture;
        Rectangle rectangle;
        public Vector2 position;
        Vector2 origin;
        Vector2 velocity;

        int currentFrame;
        int frameHeight;
        int frameWidth;

        float timer;
        float interval=5;
        bool hasJumped;

        public Animation( Texture2D newTexture, Vector2 newPosition, int newFrameHeight, int newFrameWidth)
        {
            texture=newTexture;
            position=newPosition;
            frameHeight=newFrameHeight;
            frameWidth=newFrameWidth;
            hasJumped = true;
        }

        public void Update(GameTime gameTime)
        {
            rectangle = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
            origin = new Vector2(rectangle.Width / 2, rectangle.Height / 2);

            position += velocity;

            if (Keyboard.GetState().IsKeyDown(Keys.Right) && position.X<=650)
            {
                AnimateRight(gameTime);
                velocity.X = 3;
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Left) && position.X>20)
            {
                AnimateLeft(gameTime);
                velocity.X = -3;
            }
            else
            {
                velocity.X = 0f;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Space) && hasJumped == false)
            {
                position.Y -= 15f; //sprunggeschwindigkeit
                velocity.Y = -10f; //sprunghöhe
                hasJumped = true;


            }

            if (hasJumped == true)
            {
                float i = 1;
                velocity.Y += 0.5f * i; //fallgeschwindigkeit

            }

            if (position.Y + texture.Height >= 450)
                hasJumped = false;

            if (hasJumped == false) velocity.Y = 0f;

        }

        public void AnimateRight(GameTime gameTime)
        {
            timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
            if (timer>interval)
            {
                currentFrame++;
                timer = 0;
                if (currentFrame>3)
                {
                    currentFrame = 0;
                }
            }
        }

        public void AnimateLeft(GameTime gameTime)
        {
            timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
            if (timer > interval)
            {
                currentFrame++;
                timer = 0;
                if (currentFrame > 7 || currentFrame < 4)
                {
                    currentFrame = 4;
                }
            }
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, position, rectangle, Color.White, 0f, origin, 1.0f, SpriteEffects.None,0);
        }
    }
}
Game1.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Scrolling scrolling1; //Background
        Scrolling scrolling2; //Background
        Animation player; //Character+Animation

        

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
            player = new Animation(Content.Load<Texture2D>("Frank"), new Vector2(100, 100), 47, 44);
            
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
           // player = new Animation(Content.Load<Texture2D>("Frank"), new Vector2(50, 50));
            scrolling1 = new Scrolling(Content.Load<Texture2D>("Backgrounds/Background1"), new Rectangle(0, 0, 800, 500));
            scrolling2 = new Scrolling(Content.Load<Texture2D>("Backgrounds/Background2"), new Rectangle(800, 0, 800, 500));
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            if (player.position.X > 650 && Keyboard.GetState().IsKeyDown(Keys.Right))
            {


                if (scrolling2.rectangle.X + scrolling2.texture.Width <= 0)
                    scrolling2.rectangle.X = scrolling1.rectangle.X + scrolling1.texture.Width;
                if (scrolling1.rectangle.X + scrolling1.texture.Width <= 0)
                    scrolling1.rectangle.X = scrolling2.rectangle.X + scrolling2.texture.Width;

                scrolling1.Update();
                scrolling2.Update();
            }

            player.Update(gameTime);

            base.Update(gameTime);
        }


        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            scrolling1.Draw(spriteBatch);
            scrolling2.Draw(spriteBatch);
            player.Draw(spriteBatch);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}
Die Änderungen sind Rot markiert.

Mein nächstes Problem wird die Map sein^^

Ich habe Überhaupt keine Ahnung wie ich das machen soll^^

Ich habe Irgendwas gelesen von Arrays in Arrays O.o

Kann mir da evt. jmd weiterhelfen=?
MfG ipulf2
ipulf2 ist offline   Mit Zitat antworten
Ungelesen 16.06.12, 08:47   #4
waldfee0071
Ist öfter hier
 
Benutzerbild von waldfee0071
 
Registriert seit: Nov 2009
Beiträge: 219
Bedankt: 189
waldfee0071 ist noch neu hier! | 0 Respekt Punkte
Standard

Ich habe zwar keine Ahnung von XNA, aber an sich müsste das ja überall gleich funktionieren.
Für feste Mapgrößen kannst du Arrays nehmen.

Beispielcode:
Code:
int tiles[50][50];
      // array mit Daten füttern

    for(int i=0;i<50;++i)
    {
        for(int t=0;t<50;++t)
        {
            if(tiles[t][i]== x)
              // bestimmtes bild zeichnen
        }
     }
So kann mans z.B. machen, wenn die map aus tiles bestehen soll, wie z.B. bei terraria.
waldfee0071 ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.


Sitemap

().