Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.06.2012, 21:17

C#/XNA Jump&Run Map Building

Hey Leute!

Ich bin momentan an einem kleinen Jump&Run-Spiel zu gange.

Nun möchte ich eine Map bauen, allerdings habe ich keine Ahnung wie ich das machen soll. Ich habe nach langem Googlen ein paar tutorials angesehen und immer wieder mal etwas mit verschachtelten Arrays gelesen, konnte allerdings nichts damit anfangen^^

Deswegen bin ich hier und würde mich über Hilfe freuen.

Hier mein momentaner Quellcode:

Game1.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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);
        }
    }
}


Animation.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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);
        }
    }
}


Backgrounds.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()
        {
                rectangle.X -= 3; //scrollgeschwindigkeit
        }
    }
}


MfG darkFluppi

RmbRT

Treue Seele

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

2

16.06.2012, 15:11

also, so wie ich das verstanden habe, willst du eine Tile-Map (also wie z.B. bei Supermario & Co.) machen, und die auch editieren können.
Das mit den Arrays hat schon seinen Sinn, wenn es überall erwähnt wird. Selbst ich benutze sie, um die Map in meinem Spiel zu repräsentieren.
Als erstes brauchst du eine Datenstruktur, um die map repräsentieren. Dafür brauchst du (am besten 2-Dimensionale) Arrays.
Wenn du dir das durchgelesen und getestet hast, weißt du wahrscheinlich schon, worauf ich hinaus will.
MfG, RmbRT
"Dumm ist, wer dummes tut."

3

18.06.2012, 13:09

Ich denke ich habe es verstanden^^

Allerdings besitze ich noch nicht die Kenntnisse es durch diese Information zu schreiben :S





Ich habe hier ein Tutorial gefunden, welches ich ziemlich gut finde.

Problem dabei ist ich weis nicht genau wo ich das so reinschreiben muss.



Ich habe es in einer eigenen Map.cs versucht, bin allerdings gescheitert.. Bekomme andauernd irgendwelche Errors das irgendetwas nicht Funktioniert :(



Könnte mir da evt. jemand bei helfen?^^



Ich würde das wirklich gerne Lernen :)


/edit: Ich verstehe das denke ich soweit, allerdings schaffe ich es nicht dies in eine eigenständige Datei zu packen^^
könnte mir da jemand helfen?



MfG darkFluppi

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »darkFluppi« (18.06.2012, 13:42)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

18.06.2012, 14:02

Na wenn du damit überfordert bist das in eine Klasse zu Kapseln bist du noch nicht weit genug. Außerdem gäbe es viele verschiedene Möglichkeiten das zu machen. Sinnvoll ist es jedoch nicht sich im Internet Code zusammen zu suchen. Mehr hast du davon wenn du es selbst verstehst und dann umsetzen kannst. Wenn du eine Klasse für deine Maps bauen willst, dann fang doch einfach mal simpel an. Erstelle deine Klasse. Überlege dir wie du darin dein 2D-Array speichern kannst. Dann überlegst du welche Methoden du so benötigst. Als erstes vermutlich mal den Konstruktor. Damit fängst du an. Dabei musst du dir überlegen was deine Map so "wissen" muss um hinterher gezeichnet werden zu können. Dabei kannst du dir ruhig etwas Zeit nehmen. Wenn du dann soweit bist dass deine Karte erstellt und geladen werden kann(mit laden meine ich nicht unbedingt Mapdaten aus einer Datei zu laden, wobei du dir hinterher überlegen kannst wie du das umsetzen kannst. Für den Anfang überfordert das aber vermutlich nur) hast du schon ne Menge geschafft. Als nächstes muss deine Map angezeigt werden. Überleg dir wie du das am besten umsetzen kannst. Wenn du dann deine Map erstellen und rendern kannst, musst du dir nur noch überlegen wie man sich darauf bewegen kann. Du brauchst also irgendeine Art von Kollision. Also überleg dir wie Spielfigur und Karte interagieren können. Dabei wird bestimmt nicht alles perfekt laufen. Du lernst dazu und jedes mal bekommst du bessere Ideen. Das ist normal.
Dir sei aber gesagt, dass das alles nicht ganz einfach ist. Vor allem im Kontext von einem Jump n run. Da kann man sich schnell die Zähne dran ausbeißen. Wenns nichts wird und du nach Stunden und Tagen versuchen nichts hinkriegst dann ist es auch mal gut einzusehen dass man nicht so weit ist. Die Größe muss man dann nur erst mal haben.
Viel Erfolg.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige