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

30.05.2013, 18:14

C# Mehrere Fortbewegungsmöglichkeiten für die Spielfigur?

Ich möchte in mein Spiel ein Donkey Kong ähnliches Fortbewegungsmittel einbauen. In Donkey Kong kann man sich ja von Fass zu Fass schiessen, um Abgründe zu überqueren oder um Gegenstände einzusammeln. So wie in dem Video ab Minute 21:25: http://www.youtube.com/watch?v=gqto2JzX47I
Das gleiche möchte ich tun, jedoch bekomme ich das "Von Fass zu Fass schiessen" nicht eingebaut. Bei mir bleibt die Spielfigur nicht im Fass, da ich die Position der Spielfigur nicht anhalten kann wenn sie ein Fass berührt. Ich weiss nicht wie ich es machen soll damit die Spielfigur an der gleichen Position bleibt wie das Fass das sie berührt hat. Erst wenn man dann die Taste A drückt soll die Spielfigur von dieser Position aus in eine Richtung geschossen werden, so wie im Video.

Im Moment sieht meine Klassenstruktur wie folgt aus:
Oberklasse(Level.cs)
In dieser Klasse werden die Klassen Hintergrund, Player, Gegner, Tiles und Faesser geupdatet. Die beiden Klassen Tiles und Faesser sind Listen.
Das Problem dabei ist, ich kann die Position der Spielfigur nicht in der Klasse Faesser ändern und ich weiss auch nicht wie ich der Klasse Player sagen soll dass die Spielfigur sich jetzt nicht mehr bewegen kann da sie in einem Fass steckt. Wenn die Spielfigur ein Fass berührt, soll sie ja in dem Fass bleiben und sich nicht mehr bewegen können. Um aus dem Fass zu kommen kann die Spielfigur die Taste A drücken, dann wird sie in eine Richtung geschossen.
Wie soll ich die Fässer am besten einbauen?
Ich benutze Farseer um zu testen ob die Spielfigur ein Fass berührt. Die Fässer sind Sensoren damit die Spielfigur nicht daran abprallen kann. Die Gegner können durch die Fässer gehen, da sie sie nicht benutzen können.

Wie sollte meine Klassenstruktur am besten aussehen?

Oberklasse(Level.cs):
In der Load-Methode wird die Faesser-Klasse gefüllt:

C#-Quelltext

1
 FaesserListe.Add(new Faesser(world, BodyFactory.CreateRectangle(world, 0.64f, 0.64f, 1.0f), true, new Vector2(5.60f, 2.16f), 0, false, playerrect));

in der Update-Methode werden die Klassen geupdatet, wie z.B. die Player-Klasse. In der Faesser-Klasse habe ich keine Update Methode:

C#-Quelltext

1
2
3
4
5
  float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
        world.Step(Math.Min(elapsed, (1f / 60f)));
Player.Update(gameTime);
Gegner.Update(gameTime);
...

so werden die Fässer in der Oberklasse gezeichnet:

C#-Quelltext

1
2
3
4
  for (int i = 0; i <= FaesserListe.Count - 1; i++)
            {
                FaesserListe[i].Draw(spriteBatch, Kanone);
            }

Faesser-Klasse:

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
public class Faesser
    {
        public Body Fass;
        public bool Remove;
        World world1;
        Body playerrect;

        public Faesser(World world, Body fass, bool fasssensor, Vector2 fassposition, float fassrotation, bool remove, Body playerr)
        {
            playerrect = playerr;
            world1 = world;
            this.Fass = fass;
            this.Fass.BodyType = BodyType.Static;
            this.Fass.Position = fassposition;
            this.Fass.Rotation = fassrotation;
            this.Fass.IsSensor = fasssensor;
            this.Fass.CollisionCategories = Category.Cat25;
            this.Remove = remove;
            Fass.OnCollision += Fass_OnCollision;
        }

        public bool Fass_OnCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
        {
//die Spielfigur(playerrect) hat Cat15
            if (fixtureB.CollisionCategories == Category.Cat15)
            {
              //  playerrect.Position = Fassposition??? Was soll ich tun damit die playerrect.Position der des Fasses entspricht?
            }

            return true;
        }

        public void Draw(SpriteBatch batch, Texture2D fassSprite)
        {
            if (Remove == false)
            {
                batch.Draw(fassSprite, ConvertUnits.ToDisplayUnits(this.Fass.Position),
                                                     null,
                                                     Color.White, this.Fass.Rotation, new Vector2(fassSprite.Width / 2.0f, fassSprite.Height / 2.0f), 1f,
                                                     SpriteEffects.None, 0f);

            }
        }
    }

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

2

30.05.2013, 18:28

Sag doch einfach, wenn es eine Kollision zwischen Fass und Spieler gibt, wird der Spieler nicht mehr gerendert, sobald aber A gedrückt wird, renderst du ihn über/neben dem Fass und machst halt die Animation (Spieler fliegt von Fass zu Fass).

Ich hoffe ich konnte helfen :D

3

30.05.2013, 23:58

Ich habe das Problem mit der Position jetzt gelöst, jedoch bin ich mir nicht sicher ob meine Vorgehensweise gut ist. Was haltet ihr davon die Position der Spielfigur in der Faesser-Klasse in Fass_OnCollision zu ändern, nachdem es zu einer Kollision zwischen Spielfigur und einem Fass gekommen ist?
Macht man das normalerweise so, oder muss man die Position der Spielfigur in der Player-Klasse auf "fixtureA.Body.Position" setzen?
Ich weiss nämlich nicht ob es egal ist in welcher Klasse man die Position der Spielfigur ändert ?(

Faesser-Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public bool Fass_OnCollision(Fixture fixtureA, Fixture fixtureB, FarseerPhysics.Dynamics.Contacts.Contact contact)
        {
            if (checkCollision == true)
            {
              if (fixtureB.CollisionCategories == Category.Cat15)
              {
                playerrect.Position = fixtureA.Body.Position;
                playerrect.IgnoreGravity = true;
                playerrect.ResetDynamics();
                checkCollision = false;
              }
            }
       return true;        
       }
void Fass_OnSeparation(Fixture fixtureA, Fixture fixtureB)
        {
            if (fixtureB.CollisionCategories == Category.Cat15)
            {
                checkCollision = true;
            }
        }

Werbeanzeige