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

11

03.08.2011, 10:09

Hat sich übrigens jetzt erledigt.
Ich habe jetzt eine Gegner/Enemy Klasse geschrieben.
Ich hätte nur eine Frage: Meine Klasse ist sehr einfach gestrickt. Doch wie soll ich die Gegner konkret auseinanderhalten?
Weil momentan wird die Bewegung ja gesetzt und die Gegner somit immer nacheinander, muss mich doch nochmal um die Zufallsposition kümmern. (neue Rechnung war: float needed = static_cast<float>(100*rand()%6); ) Also zählt der eine Vektor immer noch für alle Gegner.... :S
Ich würde das mit new und delete lösen, oder würde es sich da eher anbieten das Ganze in eine Memberfunktion zu packen und die dann mit einer Instanz einfach so aufzurufen?

EDIT: Noch eine Frage: Will vielleicht doch mal wer auf meinen aktuellen Code drüber schauen? ^^

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MisterX« (03.08.2011, 11:17)


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

12

03.08.2011, 11:35

Ganz ehrlich: Fang mit Grundlagen an.
Du scheinst keine Ahnung zu haben, wofür dein Vektor oder deine List gut sind. Denn mit mehreren Listen zu arbeiten für mehrere Gegner ist Quatsch. Deswegen hast du doch die Liste, um alle in eine Liste zu packen.
Wenn du alle Gegner in eine Liste packst, dann ist jeder einzelne Gegner in der Liste recht einfach auseinander zu halten. Er ist ja als eigene Instanz in der Liste drin.

Ich verstehe nur immer noch nicht so ganz, was dein Ziel ist. Du willst, dass sich die Gegner bewegen. Das sollte ja nicht sonderlich schwer sein(einfach immer die Positionen ändern). Wenn sie sich unterschiedlich bewegen sollen, dann musst du die Bewegung halt von irgendwas abhängig machen, sodass sie nicht alle gleich schnell sind oder so. Aber was ist denn dein egtl. Ziel. Ich habe so das Gefühl, dass du gerne ein Spiel hättest, aber keine Ahnung hast, wie das letztlich zu programmieren ist. Die Gegner sollen sich halt irgendwie bewegen - nur das irgendwie muss eben näher spezifiziert und anschließend programmiert werden.

13

03.08.2011, 11:50

Naja, mein Problem ist hauptsächlich, dass das wovon ich denke es sei richtig, es halt nicht wirklich funktioniert.
Mein Problem ist, ich weiß wie ich Listen verwende, aber im Spiel habe ich dann meistens irgendwelche Probleme, bei Nebenprojekt zum Üben klappt alles super. :pinch:

Naja, ich will gerade echt nur das die Gegner sich bewegen und zufällig auf die oberen Positionen gehen.
Ich muss mir noch überlegen wie ich das Bewegen anstellen soll, da es da schon wieder Fehler gibt, aber im Grunde.... Hmm....

Nachträglich durch Edit geändert:
Verdammt. Was soll ich denn tun? Ich hab zuvor zig kleine Projekte gehabt, und jetzt ist das Projekt immer noch klein und keiner will mir helfen, nur weil im letzten Thema die Übersicht so geschädigt war, das ich total verwirrt war. Könnte mir nicht jemand die Lösung sagen, damit ich sie in dem Schema üben kann?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »MisterX« (03.08.2011, 12:39)


marfi

Treue Seele

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

14

03.08.2011, 12:42

Versuch doch erstmal nur einen Gegner laufen zu lassen. Und wenn das dann klappt, kannst mehrere in einer Liste speichern.

Was soll denn in etwa in needed drin stehen? Und was steht drin. mach mal ein + vor das = dann sollte der enemy zumindest verschwinden ;)

15

03.08.2011, 12:45

Also ich hatte vorher +=, damit gab es aber irgendwie ein durcheinander.

Und in needed ist die Spawnposition. 600/6=100. Der Gegner soll irgendwo zwischen 100 und 600 gespawnt werden, also 100*rand()%6, aber die bleiben als auf 0... o.o
Und vorher hatte ich nur einen, der ist auch runter gelaufen. Danach bin ich zur Liste gewechselt.

marfi

Treue Seele

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

16

03.08.2011, 12:50

Setz dein rand%6 mal in Klammern

EDIT: Die Werte sind sonst zu klein!

C-/C++-Quelltext

1
int needed = 100 * (rand()%6)


Und guck mal hier, dort wird rand() schön erklärt. Neben anderen C++ gedöns. Solltest du unter Favoriten speichern ;)

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »marfi« (03.08.2011, 13:17) aus folgendem Grund: EDIT: URL


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

17

03.08.2011, 14:34

und jetzt ist das Projekt immer noch klein und keiner will mir helfen

Wir helfen gerne, aber wenn du deinen Code selbst nicht verstehst haben andere entsprechend wenig Lust sich rein zu arbeiten und zu schauen, wo das Problem liegt. Vor allem, wenn einfach mal alles kopiert wird und die einzige Frage ist: "Warum geht es nicht so, wie ich will!". Die Antwort lautet eben kurz und knapp: "Weil du es nicht so programmiert hast."

Dir fehlt offensichtlich Grundwissen über Listen bzw. deren Anwendung. Denn du machst in deinem Konstruktor von Enemy irgendwelche Komischen Sachen, um da bereits Gegner zu erstellen. Das ist Quatsch. Wenn du eine Klasse hast, die dir ein Objekt erstellt. Dann nimmst du einfach eine Liste und packst mehrere solcher Objekte rein und dann hast du mehrere Objekte auf einmal. Das ist im Grunde keine Schwierigkeit.

Ich habe dir mal eben ein minimales Beispielprogramm gebastelt, das das tun sollte, was du willst. Gegner anzeigen und Gegner bewegen.
Ich habe es nicht programmiert, damit du jetzt mit copy-and-paste deinen alten Code ausradierst und einfach meinen verwendest. Ich will nur, dass du das grundlegende Prinzip verstehst, wie man mehrere Objekte in einer Liste verwaltet. Die Enemy-Klasse ist hierbei da, um genau einen Gegner darzustellen und zu bewegen. Mehrere Gegner kommen dann einfach in die Liste und werden dann eben alle nacheinander bewegt und gezeichnet.

C-/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
class Enemy
{
public:
    Enemy( const sf::Image& image, sf::Vector2f position )
    {
        sprite.SetImage( image );
        sprite.SetPosition( position );
    }

    void draw( sf::RenderWindow& App )
    {
        App.Draw( sprite );
    }

    void update( int speed )
    {
        sprite.SetPosition( sprite.GetPosition() + sf::Vector2f( 0, 0.0001 * speed ) );
    }

private:
    sf::Sprite sprite;
};

int main()
{
    // Create the main rendering window
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics");

    sf::Image enemyImg;
    enemyImg.LoadFromFile( "enemy.png" );

    // Create all the enemies
    std::vector<Enemy> enemy_list;
    for( int i = 0; i < 5; ++i )
    {
        Enemy enemy(enemyImg, sf::Vector2f( 130.0f * i, 0 ) );
        enemy_list.push_back( enemy );
    }

    // Game Loop
    while( App.IsOpened() )
    {
        // Event Loop
        sf::Event Event;
        while (App.PollEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }

        // Move the enemies
        for( std::vector<Enemy>::iterator it = enemy_list.begin();
             it != enemy_list.end();
             ++it )
        {
            (*it).update( rand() % 1000  );
        }

        App.Clear();
        
        // Draw all the enemies
        for( std::vector<Enemy>::iterator it = enemy_list.begin();
             it != enemy_list.end();
             ++it )
        {
            (*it).draw( App );
        }
        
        App.Display();


    }
}


BTW: Es ist SFML 2 Code. Wenn du SFML 1.6 verwendest, musst du evtl. ein paar Kleinigkeiten ändern(GetEvent statt PollEvent etc.). Aber wie gesagt: Schau, dass du verstehst, was mein Code macht und nicht dass du ihn nur kopierst. Das hat sonst gar keinen Sinn.

18

03.08.2011, 15:01

Verstehen tu ich meinen Code. Ich bin mir nur verdammt unsicher weil dann so Zeug kommt wie, ich darf zitieren: "Schöne Geschichte" :(
Da verliere ich das Vertrauen zum Forum sowie zu meinem eigenem Code, wodurch ich dann nur noch Mist mache, was ich auch tue, wenn es extrem unübersichtlich ist ( :D ), und ich hör bei so was dann auf mein Problem zu beschreiben, weil ich dann denke es ist sinnlos weil so oder so dann so etwas wie solche Beiträge auftauchen.

Danke das du ein Beispielcode hier hingelegt hast, Fred! Der hat mir echt geholfen, klappt jetzt sogar mit meinem! *freu*

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

03.08.2011, 15:57

Verstehen tu ich meinen Code. Ich bin mir nur verdammt unsicher weil dann so Zeug kommt wie, ich darf zitieren: "Schöne Geschichte" :(

Ich glaub du hast das einfach falsch verstanden. Auch wenn man sie sich denken kann solltest du eine Frage stellen. Das wirkt sonst so als würdest du uns nicht um hilfe bitten sondern es für selbstverständlich halten, dass wir dir ohne Gegenleistung helfen.
Du wirfst uns also die Arbeit vor die Füße und sagst "Ihr könnt euch ja denken was zutun ist, dann fangt mal an!"
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

20

03.08.2011, 16:34

Stimme ich zu!
Der Eindruck ist leider entstanden.
Versuche das mal irgendwie mehr zu würdigen. ^^

MfG
Check

Werbeanzeige