[C/C++] Visual Studio 08 - Super Mario?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von ~SnAkE~, 21. Juni 2009 .

Schlagworte:
  1. 21. Juni 2009
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Visual Studio 08 - Super Mario?

    hallo leute
    ich bräuchte mal dringend eure hilfe
    ich muss für die schule ein projekt programmieren und ich komm grade nich wirklich weiter und ich brauche euch anbei ein bild für bessere vorstellung


    Bild

    so nun folgendes
    die spielfigur mit dem mario bild wird per WASD bewegt welches per timern läuftjetzt mein erstes problem:
    die buttons mit dme kleinen b drin, sollen gold münzen werden und eine textbox/listbox sollte immer den punktestand aktuell anzeigen, pro münze ein punkt....ich krieg das mit der kollisionsabfrage einfach nich hin

    zweites problem:
    gibt es eine möglichkeit in der rechten oberen ecke mario so zu programmieren, dass er nicht durch wände laufen kann, sondern die böden etc feste hindernisse sind?

    das wärs erstmal
    ich wär echt dankbar wenn mir jemand helfen könnte
     
  2. 21. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    also zu problem 2:
    duch die Bewegung von Mario kannst du einen Bewegungsvektor aufstellen und dann fragst du vor jederBewegung ob die Pixel in Bewegungsrichtung die die Farbe von Wand/Boden etc. haben und wenn ja, dann kann er die Bewegung nicht ausführen bzw nur bis zur Wand/Boden etc. Oder du speicherst die Wände, Boden in einem Feld und überprüfst vor jeder Bewegung halt wieder in Bewegungsrichtung, ob du einen der gespeicherten Punkte betrittst. ( ich würde Variante 1 nehmen! )

    zu problem 1:
    hier würde sich ein Feld mit den Mittelpunkten der "Münzen" anbieten. Dann arbeitest du wieder mit dem Bewegungsvektor und ermittelst ob der Mario in der Boundingsphere/-box einer Münze ist, wenn ja, dann Münze weg und Punkt++

    Also das sind alles nur grobe Ideen. Für genauere Problemlösungen bräuchte ich mehr Informationen

    Und solche Kollisionsabfragen werden eben immer mit Bewegungsvektoren berechnet. Das ist am einfachsten und am Schnellsten bei großen welten kannst du dann noch mit Bereichen arbeiten um das ganze zu optimieren, aber ich denke in dem Fall wird das noch nicht notwendig sein

    greeze
     
  3. 21. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Wo genau scheiterst du mit der Kollisionserkennung? Etwas Code wäre hilfreich.

    Zu Problem Nr. 1:
    Rechteck-Rechteck-Kollisionen sind eigentlich äußerst einfach zu erkennen...

    Code:
    bool boxCollide(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
     if (x1 > x4) return false;
     if (y1 > y4) return false;
     if (x2 < x3) return false;
     if (y2 < y3) return false;
    
     return true;
    }
    x1, y1 -> linke, obere Ecke von Rechteck 1
    x2, y2 -> rechte, untere Ecke von Rechteck 1
    x3, y3 -> linke, obere Ecke von Rechteck 2
    x4, y4 -> rechte, untere Ecke von Rechteck 2

    Problem Nr. 2:
    Dafür ist es schon wichtig zu wissen, wie dein Spiel aufgebaut ist. Das Zauberwort zu diesem Problem heißt übrigens "collision response".

    Im Grunde baust du ja eine stark vereinfachte Physik-Engine. Du sagst, dein Spiel läuft über Timer? Das bedeutet, dass du bei jedem Zeitschritt die Positionen deiner Figuren neu berechnest. Dass deine ganze Welt aus Rechtecken besteht, macht die Sache schon mal simpler. Dafür reicht die einfache Kollisionserkung von oben aber nicht mehr aus, da du jetzt auch wissen musst, inwieweit sich die Rechtecke penetrieren, um sie wieder richtig auseinander zu bewegen.

    Box1 ist Mario und Box2 ist irgendein unbewegliches(!) Element der Welt.

    Code:
    #include <cmath>
    
    struct Collision
    {
     bool isCol;
     float p_x;
     float p_y;
    };
    
    ...
    
    
    Collision boxCollide(rect Box1, rect Box2)
    {
     Collsion ret;
    
     ret.isCol = true;
    
     //Prüfen, ob es überhaupt zur Kollision kommt...
     if (Box1.x1 > Box2.x2) ret.isCol = false;
     if (Box1.y1 > Box2.y2) ret.isCol = false;
     if (Box1.x2 < Box2.x1) ret.isCol = false;
     if (Box1.y2 < Box2.y1) ret.isCol = false;
    
     if (!ret.isCol)
     return ret;
    
     //Kollision, aber wo!?
     float w_b1 = Box1.x2 - Box1.x1; //Breite von Mario
     float h_b1 = Box1.y2 - Box1.y1; //Höhe von Mario
     float cx_b1 = 0.5f * w_b1 + Box1.x1; //Mittelpunkt von Mario auf X-Achse
     float cy_b1 = 0.5f * h_b1 + Box1.y1; //Mittelpunkt von Mario auf Y-Achse
    
     float w_b2 = Box2.x2 - Box2.x1; //Breite von Wand/etc.
     float h_b2 = Box2.y2 - Box2.y1; //Höhe von Wand/etc.
     float cx_b2 = 0.5f * w_b2 + Box2.x1; //Mittelpunkt von Wand auf X-Achse
     float cy_b2 = 0.5f * h_b2 + Box2.y1; //Mittelpunkt von Wand auf Y-Achse
    
     float dx = cx_b2 - cx_b1; //Entfernung von Mario zu Wand auf X-Achse
     float dy = cy_b2 - cy_b1; // -> Y-Achse
    
     //Hilfsvariablen...
     float sx = (dx < 0) ? -1 : 1;
     float sy = (dy < 0) ? -1 : 1;
    
     dx = abs(dx);
     dy = abs(dy);
    
     float px, py; //Penetrationsweite
    
     if (dx < (w_b1 * 0.5f + w_b2 * 0.5f))
     {
     //Penetration in X-Richtung
     px = sx * (w_b1 * 0.5f + w_b2 * 0.5 - dx);
     }
     else
     {
     px = 0;
     }
    
     if (dy < (h_b1 * 0.5f + h_b2 * 0.5f))
     {
     //Penetration in Y-Richtung
     py = sy * (h_b1 * 0.5f + h_b2 * 0.5 - dy);
     }
     else
     {
     py = 0;
     }
    
     ret.p_x = px;
     ret.p_y = py;
    
     return ret;
    }
    Mario muss jetzt nurnoch um -p_x nach Rechts und -p_y nach Unten bewegt werden, damit er nicht durch die Wand fällt...

    Achja, den Code hab ich jetzt auf die Schnelle geschrieben und NICHT getestet... Wer Fehler findet darf sie behalten^^

    mfg r90
     
  4. 23. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    sry jungs aber irgendwie versteh ich nur bahnhof....ich poste euch mal den kompletten code
    Code:
    #pragma once
    
    
    namespace MarioC {
    
     using namespace System;
     using namespace System::ComponentModel;
     using namespace System::Collections;
     using namespace System::Windows::Forms;
     using namespace System::Data;
     using namespace System::Drawing;
    
     /// <summary>
     /// Zusammenfassung für Form1
     ///
     /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
     /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
     /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
     /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
     /// arbeiten, die diesem Formular zugewiesen sind.
     /// </summary>
     public ref class Form1 : public System::Windows::Forms::Form
     {
     public:
     Form1(void)
     {
     InitializeComponent();
     //
     //TODO: Konstruktorcode hier hinzufügen.
     //
     zae_punkte = 0;
     x1 = 0;
     x2 = 0;
     x3 = 0;
     x4 = 0;
     x5 = 0;
     x6 = 0;
     x7 = 0;
     x8 = 0;
     x9 = 0;
     }
    
     protected:
     /// <summary>
     /// Verwendete Ressourcen bereinigen.
     /// </summary>
     ~Form1()
     {
     if (components)
     {
     delete components;
     }
     }
     private: System::Windows::Forms::Button^ button1;
     protected: 
     private: System::Windows::Forms::Button^ button2;
     private: System::Windows::Forms::Button^ btnleiter3;
     private: int zae_punkte;
     private: int x1, x2, x3, x4, x5, x6, x7, x8, x9;
    
     private: System::Windows::Forms::Button^ button4;
     private: System::Windows::Forms::Button^ button5;
    
    
     private: System::Windows::Forms::Button^ button6;
     private: System::Windows::Forms::Button^ btnleiter2;
    
     private: System::Windows::Forms::Button^ button8;
     private: System::Windows::Forms::Button^ button9;
     private: System::Windows::Forms::Button^ button10;
     private: System::Windows::Forms::Button^ button11;
     private: System::Windows::Forms::Button^ button12;
     private: System::Windows::Forms::Button^ button13;
     private: System::Windows::Forms::Button^ button14;
     private: System::Windows::Forms::Button^ btnleiter1;
    
     private: System::Windows::Forms::Button^ button16;
     private: System::Windows::Forms::Button^ button17;
     private: System::Windows::Forms::Button^ button18;
     private: System::Windows::Forms::Button^ button19;
     private: System::Windows::Forms::Button^ button20;
     private: System::Windows::Forms::Button^ button21;
     private: System::Windows::Forms::Button^ button22;
     private: System::Windows::Forms::Button^ button23;
     private: System::Windows::Forms::Button^ button24;
     private: System::Windows::Forms::Button^ button25;
     private: System::Windows::Forms::Button^ btnm2;
    
     private: System::Windows::Forms::Button^ btnm3;
     private: System::Windows::Forms::Button^ btnm4;
     private: System::Windows::Forms::Button^ btnm5;
     private: System::Windows::Forms::Button^ btnm6;
    
    
    
    
     private: System::Windows::Forms::Button^ btnm1;
     private: System::Windows::Forms::Button^ btnspieler;
    
    
    
     private: System::Windows::Forms::Timer^ timer1;
     private: System::Windows::Forms::Timer^ tim_bewegung_links;
     private: System::Windows::Forms::Timer^ tim_bewegung_rechts;
     private: System::Windows::Forms::Timer^ tim_bewegung_oben;
     private: System::Windows::Forms::Timer^ tim_bewegung_unten;
     private: System::Windows::Forms::ListBox^ lbx_punkte;
    
     private: System::Windows::Forms::Button^ btn_punkte;
    
     private: System::ComponentModel::IContainer^ components;
    
    
     private:
     /// <summary>
     /// Erforderliche Designervariable.
     /// </summary>
    
    
    #pragma region Windows Form Designer generated code
     /// <summary>
     /// Erforderliche Methode für die Designerunterstützung.
     /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
     /// </summary>
     void InitializeComponent(void)
     {
     this->components = (gcnew System::ComponentModel::Container());
     System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
     this->button1 = (gcnew System::Windows::Forms::Button());
     this->button2 = (gcnew System::Windows::Forms::Button());
     this->btnleiter3 = (gcnew System::Windows::Forms::Button());
     this->button4 = (gcnew System::Windows::Forms::Button());
     this->button5 = (gcnew System::Windows::Forms::Button());
     this->button6 = (gcnew System::Windows::Forms::Button());
     this->btnleiter2 = (gcnew System::Windows::Forms::Button());
     this->button8 = (gcnew System::Windows::Forms::Button());
     this->button9 = (gcnew System::Windows::Forms::Button());
     this->button10 = (gcnew System::Windows::Forms::Button());
     this->button11 = (gcnew System::Windows::Forms::Button());
     this->button12 = (gcnew System::Windows::Forms::Button());
     this->button13 = (gcnew System::Windows::Forms::Button());
     this->button14 = (gcnew System::Windows::Forms::Button());
     this->btnleiter1 = (gcnew System::Windows::Forms::Button());
     this->button16 = (gcnew System::Windows::Forms::Button());
     this->button17 = (gcnew System::Windows::Forms::Button());
     this->button18 = (gcnew System::Windows::Forms::Button());
     this->button19 = (gcnew System::Windows::Forms::Button());
     this->button20 = (gcnew System::Windows::Forms::Button());
     this->button21 = (gcnew System::Windows::Forms::Button());
     this->button22 = (gcnew System::Windows::Forms::Button());
     this->button23 = (gcnew System::Windows::Forms::Button());
     this->button24 = (gcnew System::Windows::Forms::Button());
     this->button25 = (gcnew System::Windows::Forms::Button());
     this->btnm2 = (gcnew System::Windows::Forms::Button());
     this->btnm3 = (gcnew System::Windows::Forms::Button());
     this->btnm4 = (gcnew System::Windows::Forms::Button());
     this->btnm5 = (gcnew System::Windows::Forms::Button());
     this->btnm6 = (gcnew System::Windows::Forms::Button());
     this->btnm1 = (gcnew System::Windows::Forms::Button());
     this->btnspieler = (gcnew System::Windows::Forms::Button());
     this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
     this->tim_bewegung_links = (gcnew System::Windows::Forms::Timer(this->components));
     this->tim_bewegung_rechts = (gcnew System::Windows::Forms::Timer(this->components));
     this->tim_bewegung_oben = (gcnew System::Windows::Forms::Timer(this->components));
     this->tim_bewegung_unten = (gcnew System::Windows::Forms::Timer(this->components));
     this->lbx_punkte = (gcnew System::Windows::Forms::ListBox());
     this->btn_punkte = (gcnew System::Windows::Forms::Button());
     this->SuspendLayout();
     // 
     // button1
     // 
     this->button1->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button1.BackgroundImage")));
     this->button1->Location = System::Drawing::Point(-4, 477);
     this->button1->Name = L"button1";
     this->button1->Size = System::Drawing::Size(839, 44);
     this->button1->TabIndex = 0;
     this->button1->UseVisualStyleBackColor = true;
     // 
     // button2
     // 
     this->button2->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button2.BackgroundImage")));
     this->button2->Location = System::Drawing::Point(534, 403);
     this->button2->Name = L"button2";
     this->button2->Size = System::Drawing::Size(301, 35);
     this->button2->TabIndex = 1;
     this->button2->UseVisualStyleBackColor = true;
     // 
     // btnleiter3
     // 
     this->btnleiter3->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnleiter3.BackgroundImage")));
     this->btnleiter3->Location = System::Drawing::Point(502, 361);
     this->btnleiter3->Name = L"btnleiter3";
     this->btnleiter3->Size = System::Drawing::Size(35, 119);
     this->btnleiter3->TabIndex = 2;
     this->btnleiter3->UseVisualStyleBackColor = true;
     // 
     // button4
     // 
     this->button4->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button4.BackgroundImage")));
     this->button4->Location = System::Drawing::Point(458, 361);
     this->button4->Name = L"button4";
     this->button4->Size = System::Drawing::Size(47, 35);
     this->button4->TabIndex = 3;
     this->button4->UseVisualStyleBackColor = true;
     // 
     // button5
     // 
     this->button5->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button5.BackgroundImage")));
     this->button5->Location = System::Drawing::Point(-4, 361);
     this->button5->Name = L"button5";
     this->button5->Size = System::Drawing::Size(414, 35);
     this->button5->TabIndex = 4;
     this->button5->UseVisualStyleBackColor = true;
     // 
     // button6
     // 
     this->button6->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button6.BackgroundImage")));
     this->button6->Location = System::Drawing::Point(-4, 245);
     this->button6->Name = L"button6";
     this->button6->Size = System::Drawing::Size(373, 35);
     this->button6->TabIndex = 5;
     this->button6->UseVisualStyleBackColor = true;
     // 
     // btnleiter2
     // 
     this->btnleiter2->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnleiter2.BackgroundImage")));
     this->btnleiter2->Location = System::Drawing::Point(12, 245);
     this->btnleiter2->Name = L"btnleiter2";
     this->btnleiter2->Size = System::Drawing::Size(35, 119);
     this->btnleiter2->TabIndex = 6;
     this->btnleiter2->UseVisualStyleBackColor = true;
     // 
     // button8
     // 
     this->button8->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button8.BackgroundImage")));
     this->button8->Location = System::Drawing::Point(412, 245);
     this->button8->Name = L"button8";
     this->button8->Size = System::Drawing::Size(93, 35);
     this->button8->TabIndex = 7;
     this->button8->UseVisualStyleBackColor = true;
     // 
     // button9
     // 
     this->button9->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button9.BackgroundImage")));
     this->button9->Location = System::Drawing::Point(502, 212);
     this->button9->Name = L"button9";
     this->button9->Size = System::Drawing::Size(333, 101);
     this->button9->TabIndex = 8;
     this->button9->UseVisualStyleBackColor = true;
     // 
     // button10
     // 
     this->button10->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button10.BackgroundImage")));
     this->button10->Location = System::Drawing::Point(590, 180);
     this->button10->Name = L"button10";
     this->button10->Size = System::Drawing::Size(245, 35);
     this->button10->TabIndex = 9;
     this->button10->UseVisualStyleBackColor = true;
     // 
     // button11
     // 
     this->button11->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button11.BackgroundImage")));
     this->button11->Location = System::Drawing::Point(760, 148);
     this->button11->Name = L"button11";
     this->button11->Size = System::Drawing::Size(75, 35);
     this->button11->TabIndex = 10;
     this->button11->UseVisualStyleBackColor = true;
     // 
     // button12
     // 
     this->button12->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button12.BackgroundImage")));
     this->button12->Location = System::Drawing::Point(760, 58);
     this->button12->Name = L"button12";
     this->button12->Size = System::Drawing::Size(75, 35);
     this->button12->TabIndex = 11;
     this->button12->UseVisualStyleBackColor = true;
     // 
     // button13
     // 
     this->button13->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button13.BackgroundImage")));
     this->button13->Location = System::Drawing::Point(-4, 58);
     this->button13->Name = L"button13";
     this->button13->Size = System::Drawing::Size(555, 35);
     this->button13->TabIndex = 12;
     this->button13->UseVisualStyleBackColor = true;
     // 
     // button14
     // 
     this->button14->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button14.BackgroundImage")));
     this->button14->Location = System::Drawing::Point(-4, 129);
     this->button14->Name = L"button14";
     this->button14->Size = System::Drawing::Size(314, 35);
     this->button14->TabIndex = 13;
     this->button14->UseVisualStyleBackColor = true;
     // 
     // btnleiter1
     // 
     this->btnleiter1->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnleiter1.BackgroundImage")));
     this->btnleiter1->Location = System::Drawing::Point(53, 129);
     this->btnleiter1->Name = L"btnleiter1";
     this->btnleiter1->Size = System::Drawing::Size(35, 119);
     this->btnleiter1->TabIndex = 14;
     this->btnleiter1->UseVisualStyleBackColor = true;
     this->btnleiter1->Click += gcnew System::EventHandler(this, &Form1::button15_Click);
     // 
     // button16
     // 
     this->button16->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"button16.BackgroundImage")));
     this->button16->Location = System::Drawing::Point(534, 17);
     this->button16->Name = L"button16";
     this->button16->Size = System::Drawing::Size(237, 10);
     this->button16->TabIndex = 15;
     this->button16->Text = L"button16";
     this->button16->UseVisualStyleBackColor = true;
     // 
     // button17
     // 
     this->button17->Location = System::Drawing::Point(809, 384);
     this->button17->Name = L"button17";
     this->button17->Size = System::Drawing::Size(26, 23);
     this->button17->TabIndex = 16;
     this->button17->Text = L"button17";
     this->button17->UseVisualStyleBackColor = true;
     // 
     // button18
     // 
     this->button18->Location = System::Drawing::Point(62, 341);
     this->button18->Name = L"button18";
     this->button18->Size = System::Drawing::Size(26, 23);
     this->button18->TabIndex = 17;
     this->button18->Text = L"button18";
     this->button18->UseVisualStyleBackColor = true;
     // 
     // button19
     // 
     this->button19->Location = System::Drawing::Point(103, 38);
     this->button19->Name = L"button19";
     this->button19->Size = System::Drawing::Size(26, 23);
     this->button19->TabIndex = 18;
     this->button19->Text = L"button19";
     this->button19->UseVisualStyleBackColor = true;
     // 
     // button20
     // 
     this->button20->Location = System::Drawing::Point(226, 110);
     this->button20->Name = L"button20";
     this->button20->Size = System::Drawing::Size(26, 23);
     this->button20->TabIndex = 19;
     this->button20->Text = L"button20";
     this->button20->UseVisualStyleBackColor = true;
     // 
     // button21
     // 
     this->button21->Location = System::Drawing::Point(669, 160);
     this->button21->Name = L"button21";
     this->button21->Size = System::Drawing::Size(26, 23);
     this->button21->TabIndex = 20;
     this->button21->Text = L"button21";
     this->button21->UseVisualStyleBackColor = true;
     // 
     // button22
     // 
     this->button22->Location = System::Drawing::Point(799, 129);
     this->button22->Name = L"button22";
     this->button22->Size = System::Drawing::Size(26, 23);
     this->button22->TabIndex = 21;
     this->button22->Text = L"button22";
     this->button22->UseVisualStyleBackColor = true;
     // 
     // button23
     // 
     this->button23->Location = System::Drawing::Point(270, 225);
     this->button23->Name = L"button23";
     this->button23->Size = System::Drawing::Size(26, 23);
     this->button23->TabIndex = 22;
     this->button23->Text = L"button23";
     this->button23->UseVisualStyleBackColor = true;
     // 
     // button24
     // 
     this->button24->Location = System::Drawing::Point(12, 110);
     this->button24->Name = L"button24";
     this->button24->Size = System::Drawing::Size(26, 23);
     this->button24->TabIndex = 23;
     this->button24->Text = L"button24";
     this->button24->UseVisualStyleBackColor = true;
     // 
     // button25
     // 
     this->button25->Location = System::Drawing::Point(353, 38);
     this->button25->Name = L"button25";
     this->button25->Size = System::Drawing::Size(26, 23);
     this->button25->TabIndex = 24;
     this->button25->Text = L"button25";
     this->button25->UseVisualStyleBackColor = true;
     this->button25->Click += gcnew System::EventHandler(this, &Form1::button25_Click);
     // 
     // btnm2
     // 
     this->btnm2->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm2.BackgroundImage")));
     this->btnm2->Location = System::Drawing::Point(123, 97);
     this->btnm2->Name = L"btnm2";
     this->btnm2->Size = System::Drawing::Size(36, 36);
     this->btnm2->TabIndex = 25;
     this->btnm2->Text = L"m";
     this->btnm2->UseVisualStyleBackColor = true;
     this->btnm2->Click += gcnew System::EventHandler(this, &Form1::button26_Click);
     // 
     // btnm3
     // 
     this->btnm3->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm3.BackgroundImage")));
     this->btnm3->Location = System::Drawing::Point(625, 147);
     this->btnm3->Name = L"btnm3";
     this->btnm3->Size = System::Drawing::Size(36, 36);
     this->btnm3->TabIndex = 26;
     this->btnm3->Text = L"m";
     this->btnm3->UseVisualStyleBackColor = true;
     // 
     // btnm4
     // 
     this->btnm4->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm4.BackgroundImage")));
     this->btnm4->Location = System::Drawing::Point(177, 212);
     this->btnm4->Name = L"btnm4";
     this->btnm4->Size = System::Drawing::Size(36, 36);
     this->btnm4->TabIndex = 27;
     this->btnm4->Text = L"m";
     this->btnm4->UseVisualStyleBackColor = true;
     // 
     // btnm5
     // 
     this->btnm5->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm5.BackgroundImage")));
     this->btnm5->Location = System::Drawing::Point(177, 328);
     this->btnm5->Name = L"btnm5";
     this->btnm5->Size = System::Drawing::Size(36, 36);
     this->btnm5->TabIndex = 28;
     this->btnm5->Text = L"m";
     this->btnm5->UseVisualStyleBackColor = true;
     // 
     // btnm6
     // 
     this->btnm6->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm6.BackgroundImage")));
     this->btnm6->Location = System::Drawing::Point(691, 371);
     this->btnm6->Name = L"btnm6";
     this->btnm6->Size = System::Drawing::Size(36, 36);
     this->btnm6->TabIndex = 29;
     this->btnm6->Text = L"m";
     this->btnm6->UseVisualStyleBackColor = true;
     // 
     // btnm1
     // 
     this->btnm1->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnm1.BackgroundImage")));
     this->btnm1->Location = System::Drawing::Point(245, 25);
     this->btnm1->Name = L"btnm1";
     this->btnm1->Size = System::Drawing::Size(36, 36);
     this->btnm1->TabIndex = 30;
     this->btnm1->UseVisualStyleBackColor = true;
     // 
     // btnspieler
     // 
     this->btnspieler->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"btnspieler.BackgroundImage")));
     this->btnspieler->Location = System::Drawing::Point(799, 25);
     this->btnspieler->Name = L"btnspieler";
     this->btnspieler->Size = System::Drawing::Size(36, 36);
     this->btnspieler->TabIndex = 31;
     this->btnspieler->UseVisualStyleBackColor = true;
     this->btnspieler->Click += gcnew System::EventHandler(this, &Form1::btnspieler_Click);
     // 
     // timer1
     // 
     this->timer1->Interval = 1;
     this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
     // 
     // tim_bewegung_links
     // 
     this->tim_bewegung_links->Interval = 10;
     this->tim_bewegung_links->Tick += gcnew System::EventHandler(this, &Form1::tim_bewegung_links_Tick);
     // 
     // tim_bewegung_rechts
     // 
     this->tim_bewegung_rechts->Interval = 10;
     this->tim_bewegung_rechts->Tick += gcnew System::EventHandler(this, &Form1::tim_bewegung_rechts_Tick);
     // 
     // tim_bewegung_oben
     // 
     this->tim_bewegung_oben->Interval = 10;
     this->tim_bewegung_oben->Tick += gcnew System::EventHandler(this, &Form1::tim_bewegung_oben_Tick);
     // 
     // tim_bewegung_unten
     // 
     this->tim_bewegung_unten->Interval = 10;
     this->tim_bewegung_unten->Tick += gcnew System::EventHandler(this, &Form1::tim_bewegung_unten_Tick);
     // 
     // lbx_punkte
     // 
     this->lbx_punkte->ForeColor = System::Drawing::SystemColors::InactiveCaption;
     this->lbx_punkte->FormattingEnabled = true;
     this->lbx_punkte->Location = System::Drawing::Point(9, 1);
     this->lbx_punkte->Name = L"lbx_punkte";
     this->lbx_punkte->Size = System::Drawing::Size(79, 17);
     this->lbx_punkte->TabIndex = 32;
     this->lbx_punkte->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox1_SelectedIndexChanged);
     // 
     // btn_punkte
     // 
     this->btn_punkte->Location = System::Drawing::Point(66, 437);
     this->btn_punkte->Name = L"btn_punkte";
     this->btn_punkte->Size = System::Drawing::Size(93, 22);
     this->btn_punkte->TabIndex = 34;
     this->btn_punkte->Text = L"Punkte";
     this->btn_punkte->UseVisualStyleBackColor = true;
     this->btn_punkte->Click += gcnew System::EventHandler(this, &Form1::btn_punkte_Click);
     // 
     // Form1
     // 
     this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
     this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
     this->BackColor = System::Drawing::SystemColors::ControlText;
     this->ClientSize = System::Drawing::Size(832, 523);
     this->Controls->Add(this->btn_punkte);
     this->Controls->Add(this->lbx_punkte);
     this->Controls->Add(this->btnspieler);
     this->Controls->Add(this->btnm1);
     this->Controls->Add(this->btnm6);
     this->Controls->Add(this->btnm5);
     this->Controls->Add(this->btnm4);
     this->Controls->Add(this->btnm3);
     this->Controls->Add(this->btnm2);
     this->Controls->Add(this->button25);
     this->Controls->Add(this->button24);
     this->Controls->Add(this->button23);
     this->Controls->Add(this->button22);
     this->Controls->Add(this->button21);
     this->Controls->Add(this->button20);
     this->Controls->Add(this->button19);
     this->Controls->Add(this->button18);
     this->Controls->Add(this->button17);
     this->Controls->Add(this->button16);
     this->Controls->Add(this->btnleiter1);
     this->Controls->Add(this->button14);
     this->Controls->Add(this->button13);
     this->Controls->Add(this->button12);
     this->Controls->Add(this->button11);
     this->Controls->Add(this->button10);
     this->Controls->Add(this->button9);
     this->Controls->Add(this->button8);
     this->Controls->Add(this->btnleiter2);
     this->Controls->Add(this->button6);
     this->Controls->Add(this->button5);
     this->Controls->Add(this->button4);
     this->Controls->Add(this->btnleiter3);
     this->Controls->Add(this->button2);
     this->Controls->Add(this->button1);
     this->KeyPreview = true;
     this->Name = L"Form1";
     this->Text = L"Form1";
     this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
     this->KeyUp += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::Form1_KeyUp);
     this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::Form1_KeyDown);
     this->ResumeLayout(false);
    
     }
    #pragma endregion
     private: System::Void button26_Click(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void button15_Click(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void Form1_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
     if(e -> KeyCode == Keys::W)
     {tim_bewegung_oben -> Enabled = 1;} 
     if(e -> KeyCode == Keys::A)
     {tim_bewegung_links -> Enabled = 1;}
     if(e -> KeyCode == Keys::S)
     {tim_bewegung_unten -> Enabled = 1;}
     if(e -> KeyCode == Keys::D)
     {tim_bewegung_rechts -> Enabled = 1;}
     }
    private: System::Void tim_bewegung_links_Tick(System::Object^ sender, System::EventArgs^ e) {
     btnspieler -> Left--;
     if(btnspieler->Left >= button21->Right
     && btnspieler->Bottom == button21->Bottom)
     {
     x1++;
     } 
     
     }
    private: System::Void tim_bewegung_rechts_Tick(System::Object^ sender, System::EventArgs^ e) {
     btnspieler -> Left++;
     if(btnspieler->Left >= button21->Right
     && btnspieler->Bottom == button21->Bottom)
     {
     x1++;
     } 
     
     }
    private: System::Void tim_bewegung_oben_Tick(System::Object^ sender, System::EventArgs^ e) {
     btnspieler -> Top--;
     if(btnspieler->Left >= button21->Right
     && btnspieler->Bottom == button21->Bottom)
     {
     x1++;
     } 
     
     }
    private: System::Void tim_bewegung_unten_Tick(System::Object^ sender, System::EventArgs^ e) {
     btnspieler -> Top++;
     if(btnspieler->Left >= button21->Right
     && btnspieler->Bottom == button21->Bottom)
     {
     x1++;
     } 
     
     }
    private: System::Void Form1_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
     if(e -> KeyCode == Keys::W)
     tim_bewegung_oben -> Enabled = 0;
    
     if(e -> KeyCode == Keys::A)
     tim_bewegung_links -> Enabled = 0;
    
     if(e -> KeyCode == Keys::S)
     tim_bewegung_unten -> Enabled = 0;
    
     if(e -> KeyCode == Keys::D)
     tim_bewegung_rechts -> Enabled = 0;
     
    }
    private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void btnstart_Click(System::Object^ sender, System::EventArgs^ e) {
     
     
     
     }
    private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
     if (x1 = 1)
     zae_punkte++;
     }
    private: System::Void btnspieler_Click(System::Object^ sender, System::EventArgs^ e) {
     /*if(btnspieler->Left >= button21->Right
     && btnspieler->Bottom == button21->Bottom)
     {
     zae_punkte++;
    
     } 
     
     if(btnspieler->Left >= button22->Right
     && btnspieler->Top == button22->Top)
     {
     zae_punkte++;
     }*/
     
     }
    private: System::Void button25_Click(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void tbx_punkte_TextChanged(System::Object^ sender, System::EventArgs^ e) {
     }
    private: System::Void btn_punkte_Click(System::Object^ sender, System::EventArgs^ e) {
     lbx_punkte->Items->Add(Convert::ToString(zae_punkte));
     }
    };
    }
    so hier habt ihr mal den kompletten code
    zur bisherigen vorgehensweise:
    mein lehrer den ich gefragt habe hat mir letzte woche empfohlen die killsionsabfrage so zu regeln, dass bei kollision eine varibale (x1,x2,x3 etc) um 1 erhöht werden...und sobald diese variable = 1 sind, wird der punkte stand um 1 punkt addiert, und der button der als goldmünze fungiert, unsichtbar gemacht....aber die kollision funktioniert nich
    joa und wegen dem zweiten punkt habe ich noch garnix...da bin ich vollkommen planlos, und aus dem code aus dem letzten beitrag werd ich nich unbedingt schlau, vilt kann mir das ja einer nochmal anhand meines programms zeigen

    bws raus
     
  5. 23. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Dann liegt dein Problem wohl im rechnerischem Teil.

    Ich erklärs dir mal in Worten:

    Sobal die Rechte, Linke und Obere (untere ist unmöglich, es sei denn dein Objekt befindet sich in der 'Luft') Seite (Gerade) sich mit den Koordinaten der Figur treffen handelt es sich um eine Kollision.
     
  6. 23. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Kannst du nicht bitte das komplette Projekt hochladen? Der meckert bei mir wegen den fehlenden Resourcen rum...
     
  7. 26. Juni 2009
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Visual Studio 08 - Super Mario?

    klar
    Download: DSCN5814.JPG | xup.in
     
  8. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Hiho, tut mir leid das ich jetzt erst wieder schreibe! Ich war mit meiner Klasse auf Studiefahrt.
    Also nochmal zu der Kollision mit den "Münzen" würde ich es wie razor90 beschrieben hat mit einer SuqareSuqareInterection machen. also einfach gucken, ob die rechte Ecke von Mario rechts von der linken Ecke einer münze ist bzw ob die linke Ecke von Mario links von der rechten Ecke der Münze ist. wenn du die so in den Raum stellst, das man danach springen muss, dann musst du noch die Höhe überprüfen.

    Zu den Wänden würde ich dir rein aus Perfomence-Gründen eine Pixel-Farbe abfrage machen. Du gibts den Wänden einfach eine bestimmte Farbe und untersuchst vor jedem Schritt einfach ob der Ziel-Pixel diese spezielle Farbe hat.
    Ich weis nur leider nicht genau ob sowas mit C++-Frames möglich ist. Ich selber realisiere solche Problemem mit OpenGL+C++ und da mach ich es anders. Ich weis aber aus der Schule, das es in Delphi eine Funktion gibt die die Farbe von Pixeln ausgeben kann.
    TForm1.Paintbox1.Canvas.Pixel[u,v] () gibt dort die Farbe des Pixels an der stelle u,v wieder.

    greeze
    C4rc4ss
     
  9. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Sry, aber bei dem Spieldesign ist es schwer dir zu helfen...
    Alles ist so schön "dezentral" und es ist äußerst schwer da noch irgendwie den Überblick zu behalten. Dem Spiel fehlt quasi die ganze Struktur! Und das wird sich auch nicht ändern, solange du WinForms benutzt.
     
  10. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    xDD Nja über Design wollte ich jetzt ne meckern, aber wo du recht hast, hast du recht
    Ich denke auch das man das ganze Spiel wesentlich schöner gestallten könnte, aber das ändert ja eigentlich nix an der Tatsache wie man die Interektionsberechnung gestalltet oder?!
    Der Grundgedanke ist ja an sich der gleiche!
    Und bei den Münzen macht es ein bisschen Sinn, weil man die nach dem einsammeln einfach Visible = false setzt und sie sind weg. Bei dem anderen musst du dir selber was einfallen! ( was ähnlich einfach ist, aber für einen Anfänger vllt nicht gleich verständlich )

    greeze
     
  11. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Naja, es macht die Sache äußerst umständlich. Wenn es um Obfuscation ginge, wäre das Teil perfekt, aber für ein Spiel ist das Design die Hölle. Alles schön durchnummeriert, von button1 bis button25: Das macht die Kollisionserkennung wirklich beschissen, weil man nicht mit ner Schleife durchlaufen kann, sondern alles einzeln hardcoden muss! Außerdem weiß man nicht was was ist...
     
  12. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Ok gut das stimmt. Die Beschriftung ist schwul, aber dafür ist ja acuh .NET verantwortlich. Einfacher wäre da eigentlich wenn man es so macht ein Butttonfeld ( ich nutz kein .NET aber ich denk mal das geht ) und dann würde das auch mit einer schleife gehen.
    Aber naja es ist schon umständlich das so zu machen! das stimmt schon.
    Und ordentliche Syntax bzw Beschriftung ist leider nicht jedermanns Sache -.-'

    greeze
     
  13. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    schwachsinn, .NET hat mit der beschriftung überhaupt nix zu tun. solche beschriftungen entstehen wenn man sich alles zusammenklickt via IDE (visual studio etc)
     
  14. 26. Juni 2009
    AW: Visual Studio 08 - Super Mario?

    Ups sorry ich meinte VS -.-' Aber das macht ja hier eigentlich nix zur Sache, den es geht ja um die Kollisionserkennung.
    Darum würde ich vielleicht nochmal den Threadstarter bitten zu den obigen Posts Stellung zu nehmen um zu erfahren, ob wir ihm weiterhelfen konnten!

    greeze

    ----

    Also ich hab mir deinen Code von Oben nochmal durchgelesen und eigentlich sind ca. 80% davon uninteressant für uns aber das sei mal dahingestellt. Ich hab mir jetzt gedacht, das ich das ganze mal selber probiere bzw meine herangehensweise poste.
    Code:
    [FONT="Courier New"]struct Muenze {
     int x,y;
     bool visible;
    };
    
    struct Wall {
     int middle_x, middle_y, length, height;
    };
    
    class Spielfigur {
    private: int x,y; //Aktuelle Position
     float dir_x, dir_y; //Bewegungsrichtung
    
    public: Spielfigur(const int _x,_y); //Konstruktor
     ~Spielfigur(); //Destruktor
     //Return Attributes
     int X () { return x; } 
     int Y () { return y; }
     float DirX () { return dir_x; }
     float DirY () { return dir_y; }
     //Set Attributes
     void SetX ( const int _x ) { x = _x; }
     void SetY ( const int _y ) { y = _y; }
     void AddDirX ( const float _dir_x ) { dir_x += _dir_x; }
     void AddDirY ( const float _dir_y ) { dir_y += _dir_y; }
     void SetDirX ( const float _dir_x ) { dir_x = _dir_x; }
     void SetDirY ( const float _dir_y ) { dir_y = _dir_y; }
    };
    
    Spielfigur::Spielfigur (const int _x,_y) {
     x = _x;
     y = _y;
    }
    
    boolean Key[256], done;
    class Spielfigur Mario(0,0);
    
    void KeyCallbacks () {
     if ( Key['W'] ) { Mario.AddDirY ( 5 ); }
     if ( Key['S'] ) { Mario.AddDirY ( -5 ); }
     if ( Key['A'] ) { Mario.AddDirX ( 5 ); }
     if ( Key['D'] ) { Mario.AddDirX ( -5 ); }
     if ( Key[VK_ESCAPE] ) { Done = true; }
    }
    
    void main () {
     done = false;
     int BreiteMuenze = 10, BreiteMario = 20;
     struct Muenze Muenzen[50];
     struct Wall Waende[10];
     /* ... 
     Münzen unde Wänden Daten zuweisen ( kann man zb aus einer Datei auslesen) 
     ...
     */
     while ( !done ) {
     //Münzen rendern
     for ( int i = 0; i < 50; i++ ) {
     if ( Muenzen[i].visible ) {
     /* ...
     Münze zeichnen
     ... */
     }
     } 
     for ( int i = 0; i < 10; i++ ) {
     /* ...
     Wände zeichnen
     ... */
     }
     //KeyCallbacks
     KeyCallbacks();
     //Gravitation
     Mario.AddDirY ( -2.3 );
     //Intersektion
     for ( int i = 0; i < 50; i++ ) {
     if ( Muenzen[i].visible ) {
     /*
     Intersektion Square - Square ( wie von razor90 beschrieben )
     Wenn intersektion mit einer Muenze --> punkte erhöhen und Muenzen[i].visible = false
     setzen!!
     */ }
     }
     for ( int i = 0; i < 10; i++ ) {
     /* 
     Intersektion Square - Square ( wie von razor90 beschrieben )
     Wenn intersektion mit Wand, dann Mario nur bis kurz vor die Wand setzen und nicht weiter 
     bewegen
     */
     }
     /* ...
     Mario zeichnen
     ... */
     Mario.SetDirX (0);
     Mario.SetDirY (0);
    }
    [/FONT]
    
    Also der Code ist nicht getestet und auch bestimmt nicht perfekt.
    Ich denke aber das es dir wenigstens ein bisschen hilft.
    Falls noch Fragen oder Verbesserungen zu dem Code vorhanden sind, dann immer her damit

    greeze
     
  15. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.