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

31.01.2011, 19:15

[C#][SFML] Einstieg. Sprite bewegen

Hey Leute.

Ich schaue mir gerade SFML.net an, und stoße da schon an ein Hindernis: Wie ändere ich die Position des Bildes?

Also jetzt ganz leicht ohne Tastatureingabe:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

using SFML.Audio;
using SFML.Window;
using SFML.Graphics;


namespace SFML
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create the main window
            RenderWindow app = new RenderWindow(new VideoMode(800, 600), "SFML window");
            app.Closed += new EventHandler(OnClose);

            // Load a sprite to display
            Image image = new Image("maxi.jpg");
            Sprite sprite = new Sprite(image);
                       
           
            // Start the game loop
            while (app.IsOpened())
            {
                // Process events
                app.DispatchEvents();

                // Clear screen
                app.Clear(Color.Blue);

                // Draw the sprite
                app.Draw(sprite);
                
                // Update the window
                app.Display();
            }
        }

        static void OnClose(object sender, EventArgs e)
        {
            // Close the window when OnClose event is received
            RenderWindow window = (RenderWindow)sender;
            window.Close();
        }
    }
}


Im Debug Ordner sind die Externen Libs.

Starten geht, doch er zeichnet das Bild an Position (0,0), was ja klar ist, da nichts anderes angegeben.

In C++ würde ich das jetzt so machen:

C-/C++-Quelltext

1
sprite.SetPosition(200.f, 100.f);


Doch das ".SetPosition" gibt es bei mir nicht? Mache ich iergendwas falsch?

2

31.01.2011, 19:45

Wenn Du sprite.SetPosition(200.0f, 100.f) aufrufst, befindet sich das Sprite dann immer noch an der Position (0, 0)? Normalerweise sollte das nicht so sein, allerdings habe ich auch noch nicht mit SFML.net gearbeitet. Ansonsten solltest Du für das bewegen

C-/C++-Quelltext

1
sprite.Move(5.0f, 3.0f);

verwenden. Da geht das Sprite dann von der letzten Position aus eben 5.0f weiter, während Du mit SetPosition die Position ja nur an einen bestimmten Punkt setzt.

3

31.01.2011, 19:50

Das Problem ist, .move oder .setposition gibt es nicht.

BLU3 L30PARD

Treue Seele

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

4

31.01.2011, 20:05

C#-Quelltext

1
2
3
4
5
6
7
8
public class MySprite : Sprite
{
    // [...]
    public void Move(float OffsetX, float OffsetY) 
    {
        this.Position = new Vector2(this.Position.X + OffsetX, this.Position.Y + OffsetY);
    }
}

C#-Quelltext

1
2
3
MySprite sprite = new MySprite();
// [...]
sprite.Move(100 * App.GetFrameTime(), 0);


;)

5

31.01.2011, 20:19

Die Lösung ist viel simpler als viele denken, denn das hier wird höchst wahrscheinlich klappen:

C-/C++-Quelltext

1
2
mySprite.Position.x = 100.0f; //y-Wert ändern
mySprite.Position.y = 100.0f; //x-Wert ändern


Viele C++ler werden jetzt aufschrecken, wegen public Member,
aber in C# sind Setter und Getter nicht wie in Java, C++ etc.
Sie werden mit den Schlüsselwörtern get und set definiert.
Wie genau weiß ich leider nicht, da ich C# nur mal kurz angeschaut habe ;)
Aber so ist das ändern und holen der Member wie bei public Membern, außer man definiert keine Getter oder Setter.

6

31.01.2011, 22:09

Zitat

Fehler 1 Der Rückgabewert "SFML.Graphics.Drawable.Position" kann nicht geändert werden, da er keine Variable ist. C:\Users\Patrick\documents\visual studio 2010\Projects\SFML\SFML\Program.cs 24 13 SFML

C#-Quelltext

1
 sprite.Position.X = 5;


Das ist es also auch nicht. Die Fehlermeldung verstehe ich.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

31.01.2011, 22:16

Position ist eine Property und keine Variable. Daher kannst du ihr nur als Ganzes einen Wert zuweisen. Also z.B. so in der Art

C#-Quelltext

1
sprite.Position = new Vector(0, 5);

BLU3 L30PARD

Treue Seele

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

8

01.02.2011, 14:48

Meine Version ist einfach dasselbe wie in C++. Und es funktioniert ;)
Allerdings musst du halt ne eigene Sprite - Klasse erstellen oder den
SFML.NET Quellcode ändern und die Funktion dort einfügen ;)

// Edit: C++ Version:

C-/C++-Quelltext

1
2
3
4
5
void Drawable::Move(float OffsetX, float OffsetY)
{
    SetX(myPosition.x + OffsetX);
    SetY(myPosition.y + OffsetY);
}


@dot: SFML braucht soweit ich weiss Vector2 ;)
Nur, um das mal zu erwähnen (bitte interpretier das nicht als angriff :D)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

01.02.2011, 14:56

@dot: SFML braucht soweit ich weiss Vector2 ;)
Nur, um das mal zu erwähnen (bitte interpretier das nicht als angriff :D)

Ah ok, keine Angst ich schrieb das "so i der Art" weil ich nicht genau wusste wie die Klasse in SFML heißt, deine Ergänzung ist also sehr willkommen ;)

BLU3 L30PARD

Treue Seele

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

10

01.02.2011, 15:06

Naja, aber so manch anderer wird bei solchen ergänzungen immer leicht patzig :D

@cinema:
Wie oben schon erwähnt ist Position eine Property und hat den Typ Vector2.
Willst du also deine Sprite "Bla" auf den Punkt (10, 150) setzten, machst du entweder:

C#-Quelltext

1
Bla.Position = new Vector2(10, 150);

oder:

C#-Quelltext

1
2
Bla.Position.X = 10;
Bla.Position.Y = 150;

Ich dachte bis eben noch, dass du die Move() Funktion haben wolltest :D

Werbeanzeige