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

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

21

30.08.2010, 22:45

@Architekt:
OK, ich begründe es mal ^^

Also C++ ist - das stimmt auf jeden Fall - eine komplexe und schwer erlernbare Programmiersprache. Es gibt Programmiersprachen, die viel einfacher zu verstehen und zu lernen sind, doch wenn man es sich zum Ziel gesetzt hat C++ zu lernen möchte man (das war bei mir zumindest so) es ohne große Umwege machen, um es schneller zu können. Du vergleichst es mit Mathe. Natürlich fängt man nicht mit dem schwersten an, aber das geht in C++ auch. Kleine Konsolenprogramme zu schreiben, die am Anfang nur "Hallo Welt" ausgeben ist nicht schwer, das könnte man als Einmaleins betrachten. Wenn man so weit ist, macht man einfach weiter, dann kommen Variablen, Bedingungen und Schleifen und irgendwann danach Zeiger und Funktionen. Bis man das alles verstanden hat dauert es natürlich seine Zeit, aber da alles aufeinander aufbaut, hat man nicht das Gefühl, etwas umsonst zu lernen, was man evtl hat, wenn man zuerst PHP lernt und eigentlich nie PHP programmieren möchte, sondern C++.
Wenn du jemandem, der generell erst mal in die Programmierung einsteigen will und nicht weiß, wie er anfangen soll, hast, dann ist es für denjenigen auch empfehlenswert erst mal mit was Leichterem anzufangen. Am Schluss kann derjenige sich dann entscheiden, was ihm besser gefällt, aber wenn man fest entschlossen ist C++ zu lernen, ist das der falsche Weg. Mit genug Fleiß und Ausdauer geht (fast) alles.

@Topic, ach wenn du schon mit der SFML so weit bist, kannst du das Snake auch gleich damit machen. Benutzereingaben mit der Konsole sind ein Grauß.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

22

31.08.2010, 13:10

jop ich versuch mich mal daran! Falls ich gegen eine Mauer laufe und ne Tür brauche melde ich mich nochmal :)

Wegen der C++ oder nicht C++ Diskussion:
Alles schon tausend mal gehört und auch alles sicher nur gut von euch gemeint... ich breche jetzt jedoch sicherlich kein C++ ab (nachdem ich schon ~500 Seiten gelesen habe) und lerne eine andere Sprache. Das wäre mehr Rück- als Fortschritt und nicht in meinem Sinne.

so long
danke für eure super freundliche Hilfe :thumbsup:
Sc4v

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

23

31.08.2010, 14:05

Ich brauch ne Tür! xD

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
// Hauptfunktion des Programmes JSnake

//#include "CJSnake.hpp"
#include <SFML\Graphics.hpp>
#include <SFML\System.hpp>
#include <SFML\Window.hpp>

int main()
{
    //Fenster erstellen
    sf::RenderWindow Window(sf::VideoMode(800,600,32), "Test Test");

    //Spielschleife
    while (Window.IsOpened())
    {
        //Events behandeln
        sf::Event Event;
        while(Window.GetEvent(Event))
        {
            //Fenster schließen falls Event ist Exit
            if(Event.Type == sf::Event::Closed)
                Window.Close();
        }

        // Fenster weiß füllen
        Window.Clear(sf::Color(0,0,0));

        //Fenster zeigen
        Window.Display();
    }

    return 0;
}


Hab jetzt einfach mal die Main so umgeschrieben... eigentl sollte sich jetzt ein Fenster öffnen ... tuts aber nicht?
Lässt sich alles wunderbar kompilieren... habe auch die Verzeichnisse angegeben und die dem Linker alles gesagt (Debug: sfml-graphics-d.lib etc; Release: sfml-graphics.lib etc)
Starte ich das Programm geht die Konsole auf und es kommt "JSnake.exe funktioniert nicht mehr"

System: Win7 64bit
IDE: vs2010 xpress

Habe sogar die neu kompilierten dlls etc von Insanes HP genommen...
Seht ihr meinen Fehler? Ich seh wahrscheinlich vor lauter Bäumen den Wald nicht mehr

lg

//Edit
Problem behoben!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sc4v« (01.09.2010, 14:04)


Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

24

03.09.2010, 02:39

Hi Leutz,

Ich finde mein Projekt hat dank eurer Hilfe große Fortschritte gemacht!

Habe das Spielfeld jetzt mit verschiedenen Rects gezeichnet und ein paar Sprites eingefügt. Ich finde es sieht für den Anfang schon ok aus.
Anbei ein Screen.

Dieses Grün Schwarze etwas (Platzhalter) ist derzeit meine Schlange, die nichts anderes kann als sich bewegen. Sie läuft alleine und reagiert auf Pfeiltastenkommandos, wobei sie nicht von links nach rechts sofort wechseln kann (wie im echtem Snake).
Problem ist jetzt, dass ich sie nicht direkt ins RectFeld integriert habe (genau wie dieser Platzhalter Apfel) sonder einfach als Sprite mit Pixelangabe auf den Bildschirm gezeichnet habe. Ich hatte es zuerst mit nem grünem Rect im RectFeld probiert, allerdings wollte das gar nicht funktionieren wie ich es wollte :-O.

Jetzt soll sich meine Schlange (Sprites und Rects alle 20x20 Pixel) auch nur alle 20 Pixel in eine andere Richtung bewegen dürfen, damit nicht sowas passiert wie auf dem Screen zu sehen: Die "Schlange" kann sich ungewollt frei bewegen... ich denke wer Snake kennt weiß was ich meine. Die Schlange soll sich immer in dieses 20*20 FeldSystem eingliedern...
Ich hab schon viel versucht doch keinen Erfolg gehabt.

Habt ihr ne Idee?

Lg
Sc4v
»Sc4v« hat folgendes Bild angehängt:
  • screenshot.jpg

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

25

03.09.2010, 11:47

Du meinst also, das sie am Rande deines Rechtecks abprallt bzw. in eine andere Richtung lenkt?

Zitat

[...]auch nur alle 20 Pixel in eine andere Richtung bewegen dürfen[...]

Das deute ich jedenfalls mal so.

Da du ja die Koordinaten des Rechtecks (linke obere Ecke) und die Größe (w, h) kennst, und dazu die Koordinaten deiner "Schlange", ist das ziemlich leicht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
// width und height stehen für die Größe deines Rechtecks
// x und y für die Schlangenkoordinaten
// und rx und ry für die linke obere Ecke deines Rechtecks.
if (x <= rx || x >= (rx + width)) {
    // Schlange stößt x-seitig gegen das Rechteck, Geschwindigkeit in die x-Richtung negieren
} else if (y <= ry || y >= (ry + height)) {
    // Schlange stößt y-seitig gegen das Rechteck, Geschwindigkeit in die y-Richtung negieren
}


Andernfalls hab ich dich wohl missverstanden :o
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (03.09.2010, 11:53)


denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

26

03.09.2010, 14:20

Jetzt soll sich meine Schlange (Sprites und Rects alle 20x20 Pixel) auch nur alle 20 Pixel in eine andere Richtung bewegen dürfen, damit nicht sowas passiert wie auf dem Screen zu sehen: Die "Schlange" kann sich ungewollt frei bewegen... ich denke wer Snake kennt weiß was ich meine. Die Schlange soll sich immer in dieses 20*20 FeldSystem eingliedern...
Wenn sich deine Schlange immer kästchenweiße fortbewegen soll, dann rechne nicht +/-1, je nach Richtungsänderung auf die aktuelle Position, sondern eben 20 Pixel. Zum Start der Schlange solltest du dann eine Position berechnen (linke obere Ecke des Rects) welche sich in dem Raster befindet.
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

27

03.09.2010, 15:43

@Architekt
du hast mir eher eine Kollisionserkennung geliefert die ich auch noch benötige. Sowas in der Art habe ich auch schon gecoded, allerdings aus zeitgründen noch unvollständig (daher auskommentiert) und das dass Spiel verloren ist, wenn man den Rand berührt
- danke dafür!

@Denjo
Ich glaube du hast schon eher verstanden was mein aktuelles Problem ist.
Ich berechne die Bewegung derzeit so (am vereinfachtem Beispiel)

C-/C++-Quelltext

1
XPos += mSpeed * m_fTime;  //m_fTime: Zeit seit dem letztem Frame


Wenn ich die Schlange jetzt immer nur 20 Pixel nach vorne bewege dann "ruckelt" die Schlange ja so vor sich hin...dann springt die immer 20 Pixel vor
Ich hatte was gecoded, dass wenn ich zB nach oben drücke, die Schlange erst nach oben geht wenn

C-/C++-Quelltext

1
2
if(YPos%20 == 0)
//Bewege die Schlange nach oben


Das klappt allerdings nicht so wie es soll, weil ich selten bis nie einen Wert in YPos habe der glatt durch 20 teilbar ist.
Hier kann man es sich mal runterladen


Lg
Sc4v

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

28

03.09.2010, 15:45

ist dein rand schwarz?
zeichne ihn mal in einer anderen farbe. wenn du mauern hast die du auch in die mitte des spielfelds setzen willst funktioniert architekts lösung nicht.(das wäre eher einen ansatz um die schlange auf die andere seite zu bringen)
du solltest die koordinaten der schlange in feldkoordinaten speichern(grobe auflösung). so kannst du direkt auf das entsprechende element im array zugreifen(z.b. feld[position.x][position.y] == MAUER) dann musst du nach jeder bewegung die position auf dem bildschirm neu berechnen. es ist auch möglich die schlange direkt in das spielfeld einzutragen und in einem ruck zu zeichnen(die schlangenklasse brauch so keine render-methode und auch kein sprite und bildschirmkoordinaten und die kollision mit dem eigenen schlangenkörper ist einfacher. dafür kann das austragen des letzten schlangenteils kompliziert werden.)

edit: du solltest eine ZEIT bestimmen nach der du die schlange bewegst.

C-/C++-Quelltext

1
2
3
4
5
6
MoveTime += Frametime; //frametime in sekunden
if(MoveTime > 0.5f) // bewegt die schlange alle 0.5f sek
{
MoveTime -= 0.5f;
move();
}

das ist ein bisschen logischer als deine variante.
"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?

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

29

03.09.2010, 16:16

hey

ich hatte die Schlange zunächst im Feld integriert und als Rect gezeichnet.. hatte damit jedoch probleme und finde die Lösung mit dem Sprite besser (und einfacher händelbar)
Was spricht gegen einen schwarzen Rand?

Da kommt mir gerade der Gedanke... ich könnte die X und Y Position der Schlange in Pixel durch 20 teilen und erhalte somit die FeldPositionen
Mein Feld wird so initialisiert

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
        //Feld initialisieren
        for(int y=0; y<20; y++)
        {
            for(int x=0; x<40; x++)                                             // 0 ist Leer, 1 ist Mauer, 2 ist Schlange
            {
                if((y == 0 || y == (20-1) || x == 0 || x == (40 - 1)))
                    mField[x][y] = 1;
                else
                    mField[x][y] = 0;   
            }
        }


Das mit der "2 ist Schlange" ist noch prototyp, versuche ich aber mal umzusetzen.

Wegen der Bewegung... ich finde meine Lösung logischer... erkenne leider keine Vorteile in deiner Variante oder hab ichn Brett vorm Kopf?
Die Anweisung aus meinem vorherigem Post war wie geschrieben stark vereinfacht und sollte nur das Prinzip meiner Schlangenbewegung verdeutlichen.

Lg Sc4v :thumbsup:


//EDIT
trotzdem habe ich immernoch das Problem mit den 20 Pixeln...verflucht sei das :lol:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

30

03.09.2010, 17:00

Nachoman hat eine konstante Zeitangabe pro Frame, bei deiner ist die Geschwindigkeit nicht statisch, da du jedesmal neu die Zeit pro Frame errechnest mit der du die Geschwindigkeit multiplizierst. Das kann dazu führen, das deine Schlange sich unterschiedlich schnell fortbewegt.

Du willst also eine Möglichkeit, das deine Schlange sich pro Zug um 20 Px weiter bewegt, aber so, das es nicht aussieht, als würde sie springen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige