Simples 2D Spiel
-
Hallo,
Ich habe mal versucht unter .net mit C++ ein simples Spiel zu erstellen, leider bin ich sehr schnell gescheitert.Der Grund liegt wohl daran das C++/CLI für solche Aufgaben nicht geeignet ist.
Stimmt das soweit.Das Spiel ist eine Nachbildung von einem Casino Automaten(Hot Seven)
Ich habe Jetzt also fünf Panels genommen und wollte einfach die nötigen Bilder von oben nach unten laufen lassen und genau hier bin ich gescheitert, es hat zwar geklaptt die Bilder bewegten sich wie gewünscht aber die Geschwindigkeit war einfach zum kot.... es hat alles geruckelt und lief überhaupt nicht flüssig vllt. habe ich ja einen groben Fehler mit meiner Programmierung gemacht.Überfliegt mal bitte den Quellcode und sagt mir ob das so OK ist. Desweiteren währe ich Dankbar wenn Ihr mir sagen könntet ob es möglich ist unter c++/cli überhaupt 2D Spiele zu programmieren und wenn nicht währe ich über eine Alternative dankbar sprich 2d Spiele Engine oder einen anderen weg das mit Visual Studio 2008 und C++ umzusetzen.
Danke im Voraus
MFG#pragma once namespace hot7 { 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 { private: Graphics^ grafik1; Graphics^ grafik2; Graphics^ grafik3; Graphics^ grafik4; Graphics^ grafik5; static int i_traube = 0; static int i_zitrone = 150; static int i_kirsche = 300; static int i_orange = 450; static int i_scatter = 600; static int i_seven = 750; private: System::Windows::Forms::Panel^ panel2; private: System::Windows::Forms::Panel^ panel3; private: System::Windows::Forms::Button^ butto_stop; private: System::Windows::Forms::Panel^ panel4; private: System::Windows::Forms::Panel^ panel5; static int i_speed = 20; public: Form1(void) { InitializeComponent(); this->grafik1 = this->panel1->CreateGraphics(); this->grafik2 = this->panel2->CreateGraphics(); this->grafik3 = this->panel3->CreateGraphics(); this->grafik4 = this->panel4->CreateGraphics(); this->grafik5 = this->panel5->CreateGraphics(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Panel^ panel1; protected: private: System::Windows::Forms::Button^ button_start; private: System::Windows::Forms::Timer^ timer1; 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->panel1 = (gcnew System::Windows::Forms::Panel()); this->button_start = (gcnew System::Windows::Forms::Button()); this->timer1 = (gcnew System::Windows::Forms::Timer(this->components)); this->panel2 = (gcnew System::Windows::Forms::Panel()); this->panel3 = (gcnew System::Windows::Forms::Panel()); this->butto_stop = (gcnew System::Windows::Forms::Button()); this->panel4 = (gcnew System::Windows::Forms::Panel()); this->panel5 = (gcnew System::Windows::Forms::Panel()); this->SuspendLayout(); // // panel1 // this->panel1->Location = System::Drawing::Point(53, 117); this->panel1->Name = L"panel1"; this->panel1->Size = System::Drawing::Size(170, 450); this->panel1->TabIndex = 0; // // button_start // this->button_start->Location = System::Drawing::Point(858, 36); this->button_start->Name = L"button_start"; this->button_start->Size = System::Drawing::Size(75, 23); this->button_start->TabIndex = 1; this->button_start->Text = L"Start"; this->button_start->UseVisualStyleBackColor = true; this->button_start->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::button_start_Paint); this->button_start->Click += gcnew System::EventHandler(this, &Form1::button_start_Click); // // timer1 // this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick); // // panel2 // this->panel2->Location = System::Drawing::Point(239, 117); this->panel2->Name = L"panel2"; this->panel2->Size = System::Drawing::Size(170, 450); this->panel2->TabIndex = 2; // // panel3 // this->panel3->Location = System::Drawing::Point(426, 117); this->panel3->Name = L"panel3"; this->panel3->Size = System::Drawing::Size(170, 450); this->panel3->TabIndex = 0; // // butto_stop // this->butto_stop->Location = System::Drawing::Point(858, 65); this->butto_stop->Name = L"butto_stop"; this->butto_stop->Size = System::Drawing::Size(75, 23); this->butto_stop->TabIndex = 3; this->butto_stop->Text = L"Stop"; this->butto_stop->UseVisualStyleBackColor = true; // // panel4 // this->panel4->Location = System::Drawing::Point(612, 117); this->panel4->Name = L"panel4"; this->panel4->Size = System::Drawing::Size(170, 450); this->panel4->TabIndex = 4; // // panel5 // this->panel5->Location = System::Drawing::Point(800, 117); this->panel5->Name = L"panel5"; this->panel5->Size = System::Drawing::Size(170, 450); this->panel5->TabIndex = 5; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^ >(resources->GetObject(L"$this.BackgroundImage"))); this->ClientSize = System::Drawing::Size(1026, 766); this->Controls->Add(this->panel4); this->Controls->Add(this->panel5); this->Controls->Add(this->butto_stop); this->Controls->Add(this->panel3); this->Controls->Add(this->panel2); this->Controls->Add(this->button_start); this->Controls->Add(this->panel1); this->Name = L"Form1"; this->Text = L"Form1"; this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::Form1_Paint); this->ResumeLayout(false); } #pragma endregion private: System::Void button_start_Click(System::Object^ sender, System::EventArgs^ e) { timer1->Enabled = true; timer1->Interval = 1; } private: System::Void button_start_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { } private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { } private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { if(i_traube >= -150 && i_traube <= 450) {grafik1->DrawImage(Image::FromFile("traube.jpg"),0,i_traube,170,150); } if(i_zitrone >= -150 && i_zitrone <= 450){grafik1->DrawImage(Image::FromFile("zitrone.jpg"),0,i_zitrone,170,150);} if(i_kirsche >= -150 && i_kirsche <= 450){grafik1->DrawImage(Image::FromFile("kirsche.jpg"),0,i_kirsche,170,150);} if(i_orange >= -150 && i_orange <= 450) {grafik1->DrawImage(Image::FromFile("orange.jpg"),0,i_orange,170,150); } if(i_scatter >= -150 && i_scatter <= 450){grafik1->DrawImage(Image::FromFile("scatter.jpg"),0,i_scatter,170,150);} if(i_seven >= -150 && i_seven <= 450) {grafik1->DrawImage(Image::FromFile("seven.jpg"),0,i_seven,170,150); } if(i_traube >= -150 && i_traube <= 450) {grafik2->DrawImage(Image::FromFile("traube.jpg"),0,i_traube,170,150); } if(i_zitrone >= -150 && i_zitrone <= 450){grafik2->DrawImage(Image::FromFile("zitrone.jpg"),0,i_zitrone,170,150);} if(i_kirsche >= -150 && i_kirsche <= 450){grafik2->DrawImage(Image::FromFile("kirsche.jpg"),0,i_kirsche,170,150);} if(i_orange >= -150 && i_orange <= 450) {grafik2->DrawImage(Image::FromFile("orange.jpg"),0,i_orange,170,150); } if(i_scatter >= -150 && i_scatter <= 450){grafik2->DrawImage(Image::FromFile("scatter.jpg"),0,i_scatter,170,150);} if(i_seven >= -150 && i_seven <= 450) {grafik2->DrawImage(Image::FromFile("seven.jpg"),0,i_seven,170,150); } if(i_traube >= -150 && i_traube <= 450) {grafik3->DrawImage(Image::FromFile("traube.jpg"),0,i_traube,170,150); } if(i_zitrone >= -150 && i_zitrone <= 450){grafik3->DrawImage(Image::FromFile("zitrone.jpg"),0,i_zitrone,170,150);} if(i_kirsche >= -150 && i_kirsche <= 450){grafik3->DrawImage(Image::FromFile("kirsche.jpg"),0,i_kirsche,170,150);} if(i_orange >= -150 && i_orange <= 450) {grafik3->DrawImage(Image::FromFile("orange.jpg"),0,i_orange,170,150); } if(i_scatter >= -150 && i_scatter <= 450){grafik3->DrawImage(Image::FromFile("scatter.jpg"),0,i_scatter,170,150);} if(i_seven >= -150 && i_seven <= 450) {grafik3->DrawImage(Image::FromFile("seven.jpg"),0,i_seven,170,150); } if(i_traube >= -150 && i_traube <= 450) {grafik4->DrawImage(Image::FromFile("traube.jpg"),0,i_traube,170,150); } if(i_zitrone >= -150 && i_zitrone <= 450){grafik4->DrawImage(Image::FromFile("zitrone.jpg"),0,i_zitrone,170,150);} if(i_kirsche >= -150 && i_kirsche <= 450){grafik4->DrawImage(Image::FromFile("kirsche.jpg"),0,i_kirsche,170,150);} if(i_orange >= -150 && i_orange <= 450) {grafik4->DrawImage(Image::FromFile("orange.jpg"),0,i_orange,170,150); } if(i_scatter >= -150 && i_scatter <= 450){grafik4->DrawImage(Image::FromFile("scatter.jpg"),0,i_scatter,170,150);} if(i_seven >= -150 && i_seven <= 450) {grafik4->DrawImage(Image::FromFile("seven.jpg"),0,i_seven,170,150); } if(i_traube >= -150 && i_traube <= 450) {grafik5->DrawImage(Image::FromFile("traube.jpg"),0,i_traube,170,150); } if(i_zitrone >= -150 && i_zitrone <= 450){grafik5->DrawImage(Image::FromFile("zitrone.jpg"),0,i_zitrone,170,150);} if(i_kirsche >= -150 && i_kirsche <= 450){grafik5->DrawImage(Image::FromFile("kirsche.jpg"),0,i_kirsche,170,150);} if(i_orange >= -150 && i_orange <= 450) {grafik5->DrawImage(Image::FromFile("orange.jpg"),0,i_orange,170,150); } if(i_scatter >= -150 && i_scatter <= 450){grafik5->DrawImage(Image::FromFile("scatter.jpg"),0,i_scatter,170,150);} if(i_seven >= -150 && i_seven <= 450) {grafik5->DrawImage(Image::FromFile("seven.jpg"),0,i_seven,170,150); } if(i_traube >= 750){i_traube = -150;} else if(i_zitrone >= 750){i_zitrone = -150;} else if(i_kirsche >= 750){i_kirsche = -150;} else if(i_orange >= 750) {i_orange = -150;} else if(i_scatter >= 750){i_scatter = -150;} else if(i_seven >= 750) {i_seven = -150;} else if(i_scatter >= 750){i_scatter = -150;} i_traube += i_speed; i_zitrone += i_speed; i_kirsche += i_speed; i_orange += i_speed; i_scatter += i_speed; i_seven += i_speed; } }; }
-
Dass es so langsam läuft, kann man wohl der WinAPI zuschreiben, die ist nicht für flüssige, schnelle Animationen gemacht. C++/CLI ist an sich schon geeignet für 2D- und auch 3D-Spiele!
Ich weiß nicht, ob es passend ist, aber gibt's nicht sowas wie DirectX-Controls? Damit müsste es schnell genug gehenPS: Außerdem ist das doch kein Scheitern sondern nur eine kleine Hürde
-
Badestrand schrieb:
Dass es so langsam läuft, kann man wohl der WinAPI zuschreiben, die ist nicht für flüssige, schnelle Animationen gemacht. C++/CLI ist an sich schon geeignet für 2D- und auch 3D-Spiele!
Ich weiß nicht, ob es passend ist, aber gibt's nicht sowas wie DirectX-Controls? Damit müsste es schnell genug gehenPS: Außerdem ist das doch kein Scheitern sondern nur eine kleine Hürde
hmm dann währe ich dankbar wenn du mir zeigst wo genau der Fehler ist.
Oder mir zeigen könntest wie ich das mit c++/cli lösen kann Code Beispiel mit dem relevanten änderung vllt oder eine Einleitung für die Lösung dieses Problems achja hier noch ein link wie das Beispiel oben aussieht.
-
Es wird Dir jetzt sicherlich keiner aus Deinem Quellcode ein D3D Spiel bauen.
Ansonsten schau Dir mal an was Du machst. Ein Image::FromFile("traube.jpg") dürfte viel Zeit kosten. Vllt. macht es Sinn, das nur einmal zu laden und dann immer wieder zu verwenden.
Ein Profiler könnte auch im ersten Schritt helfen nach einem Flaschenhals zu suchen.