Spiel Programmieren mit BCB 6



  • Ag3nt schrieb:

    Ich dachte BCB macht das von alleine

    Klar. Der schreibt dir auch dein Programm von ganz alleine. Du musst ihm nur deine Wünsche leise und zärtlich zuflüstern.



  • 😃 😃 😃 schön wäre es 😃 😃 😃



  • Ag3nt schrieb:

    Ahso 🙂

    Ich dachte BCB macht das von alleine naja auch gut man lernt immer dazu 🙂

    Ich habe schon mal erwähnt das der BCB eine Entwicklungsumgebung ist und
    nichts macht, dein Programm muß dafür sorgen das alles gut läuft.

    Schaue dir diesen Thread mal an, da habe ich es mal ironisch beschrieben
    wie es mit Messages ist:
    http://www.c-plusplus.net/forum/viewtopic.php?t=67718

    Spielgrafiken: Die habe ich mit Bordmitteln von Photo-Impact erstellt.

    Die Aufgabe: du sollst die Millisekunden messen, die von der CopyRect
    Routine verbraucht wird:
    puffer->Canvas->CopyRect(Rect(0,0,640,480),backpic->Canvas,Rect(0,960-backpos,640,1440-backpos));

    wie man Millisekunden messen kann, erkennt man an der Schleife, bissel
    Logic mit rein und du bekommst es hin!

    gruß Micha



  • Schaue dir diesen Thread mal an, da habe ich es mal ironisch beschrieben
    wie es mit Messages ist:
    http://www.c-plusplus.net/forum/viewtopic.php?t=67718

    Ich denke ich habs nun durch den Schnullertest kapiert 🙂

    Ich glaube ich habs:

    while (!GameOver) {
                    //Zeit setzten
                    idleTime = GetTickCount() + 50;
                    //Programm Messages abarbeiten
                    Application->ProcessMessages();
                    //Hintergrund in Puffer zeichnen
                    puffer->Canvas->CopyRect(Rect(0,0,640,480),backpic->Canvas,Rect(0,960-backpos,640,1440-backpos));
                    backpos++;
                    puffer->Canvas->Brush->Style = bsClear;
                    puffer->Canvas->Font->Color = clYellow;
                    puffer->Canvas->Font->Name = "Arial";
                    puffer->Canvas->Font->Size = 16;
                    puffer->Canvas->Font->Style << fsBold;
                    puffer->Canvas->TextOutA(20,420,"Idle Time: "+IntToStr(idleTime));
    
                    .....
    

    Oder soll es ohne +50 geschehen ???

    Mal ne andere Frage: Wo ist die Kolisionsabfrage ???



  • Ich gieb es auf 🙄

    Die Änderung ist in so fern schon richtig, aber damit erhälst du den Wert
    von "int idleTime" dieser Wert ist für die Schleife, der sagt dir aber nicht
    die Zeit die diese Funktion benötigt, man macht also:

    int ZeitMessung; // Neue Variable
    
    while (!GameOver) {
                    //Zeit setzten
                    idleTime = GetTickCount() + 50;
                    //Programm Messages abarbeiten
                    Application->ProcessMessages();
                    //Hintergrund in Puffer zeichnen
    
                    ZeitMessung = GetTickCount(); //Aktuelle Millisek. Zeit
    
                    puffer->Canvas->CopyRect(Rect(0,0,640,480),backpic->Canvas,Rect(0,960-backpos,640,1440-backpos));
    
                    ZeitMessung = GetTickCount() - ZeitMessung; // Hier Mathe
                    backpos++;
                    ....etc.
                    .....->textOutA(420,10,IntToStr(ZeitMessung)); // Hier schreiben
    

    Und schon hast du den Wert, probiere das mal für den ganzen Schleifenblock.
    Und überlege dann was für eine CPU du hast, und wie es wohl auf einen kleineren
    hinkommt mit dem Timing!

    gruß Micha



  • Achso meinst du das 🙂

    Ich muß dir echt danken. Durch dein Tutorial erstell ich mir grad einen Shooter.

    Kannst du mir vielleicht erklären wie man eine simple Kolisionsabfrage macht, wie in deinem Beispielcode ???

    Denn das versteh ich immer noch nicht.

    Die Bewegung ist klar die Variablen auch sowie die Schleife und die Punkte nur jedoch die Kollisionsabfrage beschäftigt mich 😞



  • Was mach ich hier falsch ???

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "jpeg.hpp"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    // Public Variablen
    int backpos=0,shipX=300,shipY=400;
    bool GameOver=false,Fire=false;
    long Punkte=0;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if (char(Key) == 'Q')
                    GameOver = true;        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            Button1->Visible=False;
            // erstelle Puffer Bilder
            Graphics::TBitmap *puffer       = new Graphics::TBitmap();
            Graphics::TBitmap *backpic      = new Graphics::TBitmap();
            Graphics::TBitmap *ship         = new Graphics::TBitmap();
    
            // erstellt Hintergrund
            backpic->Width=640;
            backpic->Height=480;
    
            TJPEGImage *jtemp = new TJPEGImage();
            jtemp->LoadFromFile(ExtractFilePath(ParamStr(0))+"bg.jpg");
            backpic->Assign(jtemp);
            delete jtemp;
    
            // erstellt das Shiff
            ship->LoadFromFile(ExtractFilePath(ParamStr(0))+"ship1.bmp");
            DWORD idleTime;
            // Schleife für das Spiel
            while (!GameOver)
            {
    
                    //Zeit setzten
                    idleTime = GetTickCount() + 50;
                    //Programm Messages abarbeiten 
                    Application->ProcessMessages();
                    // Zeichnet Hintergrund
                    puffer->Canvas->CopyRect(Rect(0,0,640,480),backpic->Canvas,Rect(0,960-backpos,640,1440-backpos));
                    backpos++;
    
            }
    
    }
    //---------------------------------------------------------------------------
    

    [C++ Warnung] Unit1.cpp(78): W8004 'idleTime' wurde ein Wert zugewiesen, der nie verwendet wird



  • Du erstellst das backpic (Hintergrund-Welt) mit 640x480, so groß wie das Fenster.
    Aber das Fenster (puffer) soll diese Werte erhalten, deine Hintergrundwelt
    muß größer sein sonst kann man sie nicht scrollen.
    Ich habe ein Bild erstellt mit 640x(2x480) also 640x960 (960 erkennst du den wert)
    damit ein flüssiger übergang kommt am ende des bildes, habe ich den unteren Teil
    des Bildes nochmals oben dranngesetzt im Grafikprogramm, somit ist das
    Ausgangsbild 640x1440 groß.

    Schaue dir mal in der Hilfe die Funktion Canvas->CopyRect() genauer an, und
    auch TRect, welche mit Rect(x1,y1,x2,y2) benutzt werden kann.

    Kollisionsabfrage:
    Schreibe dazu eine eigene Routine, die überprüft ob sich eine X,Y Koordinate
    innerhalb eines TRect befindet / und eine die Überprüft ob sich 2 TRect´s
    überschneiden. Ist eigentlich sau einfach.

    Ich habe dazu keine Routinen geschrieben, da ich wie ich sagte das mal so
    ebend gecoded habe und für diese Einfachheit es ausreichte.

    Bevor aber die ganzen Anfänger Fragen wieder kommen:

    Aufruf IstTrefferInRect(TRect* quadrat,int X, int Y);
    Rückgabe: bool true/false;

    bool IstTrefferInRect(TRect* quadrat, int X, int Y)
    {
        bool treffer = false;
        if (X >= quadrat.Left && X <= quadrat.Right) {
            if (Y >= quadrat.Top && Y <= quadrat.Bottom) {
                treffer = true;
            }
        }
        return treffer;
    }
    

    Nun versuche diese Funktion zum Vergleichen zweier TRects selbst zu schreiben!

    gruß Micha



  • Ahso so geht das also.

    Besten dank 🙂



  • Also ich hab nun 4 Stunden programmiert und foldendes ist Dabei rausgekommen:

    http://ag3nt.funpic.de/myProjects/ StarShooter.rar

    Bitte wählt manuell StarSooter.rar aus.

    Aus Platzgründen konnte ich nicht alle Dateien mit anhängen. Ich hoffe es läuft jedoch auch so bei euch.

    Danke nochmals an deinen Coolen Quellcode @promicha schau dir mal meinen an. Ich hoffe ich hab alles richtig gemacht 🙂 Das meiste stammt eh von dir 🙂

    Nur der blöde Background will nicht scrolen 😞

    Spielanleitung:

    Scheißt mit eurem Shiff die Gegner ab 🙂 Dafür bekommt ihr 10 Punkte 🙂 Mit der Maus lenkt ihr euer Shiff und schießen könnt ihr über die erste Maustaste 🙂

    Puh war das heute ein C++ Kurs 🙂 Ich geh mal pennen und werd dann naher weiter progen sonst erschießt mich noch meine Freundin *g*

    Aber sagt mal was ihr davon haltet 🙂


Anmelden zum Antworten