Trabnsparente Bilder, Grenzen/Bereiche und Kolosionsabfragen



  • 🙄 DX is leider auch etwas kurzsichtig gesehen 😉



  • Wir dürfen nur BCB benutzen.

    Der Lehrer hat Ahnung.
    In der 12. Klasse bietet er eine AG "Grafik Engine" an.
    Der Typ hat das Studiert und hat echt was drauf.



  • -1. Alles transparent .....

    hmm also ich hab dir da nen Tip schau ma unter Form eigenschaften ?
    --> alpha blend !

    -2. bilder transparent ...
    Ausserdem transparent kriegst du was wenn du also ma ganz langsam 🙂

    1.)Du hast in der Form ... ne Transparent Color
    setzt du auf Dunkelblau z.B.
    2.) Dann hast du nen Transparent bool Method ding setzt du auf true !
    3.) Jetzt ist alles das diese Dunkelblaue Farbe hat durchsichtig !
    4.) Wähl ne Farbe die nicht gängig ist!
    5.) Du editierst deine Bilder so das du das was transparent sein soll mit der Transparent angegebenen Farbe ... in der Form füllst

    🙄

    [edit] Wenn du willst das es net flimmert wenn du nen Bild über das andre Bild .. bewegst musst du dich mit dem Thema Double Buffering ... beschäftigen !

    Wenn du nen gescheites Spiel machen willst nimmst du am Besten DX das is einfach ! Zwar Winzigweich scheiss aber wurscht für nen Schul Projekt tut es es alle mal ! 🙄 🙄

    [ Dieser Beitrag wurde am 31.01.2003 um 13:57 Uhr von 1ntrud0r editiert. ]



  • Danke für den Tipp. Werden es heute mal probieren.

    Wir dürfen NUR BCB benutzen nichts anderes.



  • Da der Link auf dem ich den Programmcode hochgeladen habe nicht funzt hier ml den Quelltext.

    Der Hintergrund(die Karte) ist ein .jpg. Die Gegenstände und alles andere Ebenfalls.
    Diese .jpg werden in Images geladen und die Images dann bewegt. (über Image1->Left=Image1->Left+5 u.ä)

    Probleme: Wie vehindern wir, das man z.b. in einen Gegner oder Baum oder so reinlaufen kann(also hinter desem Image verschwindet) aber dieses Problem steht kurz vor der Lösung.

    hier mal der Quellcode von "KI" und steuerung. (astl = abstand Left, astt= Abstand Top)

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int x,y,a,b; // Koords fürs laufen
    int energie=100; // Gegner
    int c,d,e,f,astt,astl; // Koordinaten, Abstand
    int lp,lm,tp,tm; // Zustandvariablen
    int bleiben; // stehenbleiben oder nicht
    int energie1=100;   // Ich
    int bild, bildki; // Varriable für das Bild
    int rant; // Treffen oder nicht treffen, das ist hier die Frage
    int gibtsgegner=0;  // Nur wenn =0 kann gelaufen werden.
    int laufen[4];
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
    {
    // STEUERUNG
    
    if(gibtsgegner==0) // Noch Gegner da, also kann gesteurert werden
    {
    switch(Key){  // Hier werden Tastendrücke abgefangen und das Image bewegt
                case 'w': if(laufen[0]==0)
                          {
                          Image1->Top = Image1->Top - 5;
                          ProgressBar2->Top=ProgressBar2->Top-5; //Die Energieanzeige muss mitbewegt werden
                          Image1->Picture = Image3->Picture; // Das Bild für NACHOBEN LAUFEN wird geladen
                          bild=1; // Hier wird gemerkt, welches Bild geladen ist
                          }
                break;
                case 'a': if(laufen[2]==0)
                          {
                          Image1->Left = Image1->Left - 5;
                          ProgressBar2->Left=ProgressBar2->Left-5;
                          Image1->Picture = Image4->Picture;
                          bild=3;
                          }
                break;
                case 's': if(laufen[1]==0)
                           {
                          Image1->Top = Image1->Top + 5;
                          ProgressBar2->Top=ProgressBar2->Top+5;
                          Image1->Picture = Image2->Picture;
                          bild=2;
                          }
                break;
                case 'd': if(laufen[3]==0)
                          {
                          Image1->Left = Image1->Left + 5;
                          ProgressBar2->Left=ProgressBar2->Left+5;
                          Image1->Picture = Image5->Picture;
                          bild=4;
                          }
                break;
               /* case 'z': {
                          Image1->Left = Image1->Left + 5;
                          Image1->Top = Image1->Top - 5;
                          }
                break;
                case 't': {
                          Image1->Left = Image1->Left - 5;
                          Image1->Top = Image1->Top - 5;
                          }
                break;
                case 'g': {
                          Image1->Left = Image1->Left - 5;
                          Image1->Top = Image1->Top + 5;
                          }
                break;
                case 'h': {
                          Image1->Left = Image1->Left + 5;
                          Image1->Top = Image1->Top + 5;
                          }
                break;*/
    }
    
    x=Image1->Left;  //Die Position wird eingelesen (vom Spieler)
    y=Image1->Top;
    
    a=Image6->Left;  //Position des Gegners
    b=Image6->Top;
    
    if(x-a<=150 || y-b<=150)//Wenn der Abstand klein genug ist, wird der Timer
    {                       //und damit die "KI" aktiviert.
    Timer1->Enabled=1;
    }
    
    if(x-a>=150 || y-b>=150)//Wenn der Abstand wieder zu groß ist, bleibt der Gegner stehen
    {
    Timer1->Enabled=0;
    }
    
    if(x || y == a || b) //Wenn der Gegner genau vor dem Spieler steht,
    {
       if(x==a || y==b)
       {
       if(gibtsgegner==0)
       {
       switch(Key){
    
       case 'q': switch (bild){  //kann gekämpft werden,
    
                 case 1: if(bildki==2 && astt==-50) // aber nur wenn sich beide anschauen
                         {  // so kann nicht gekämpft werden, wnen sie Rücken an Rücken stehen, wie es anfangs möglich war.
                         Image6->Top=Image6->Top-20;
                         ProgressBar1->Top=ProgressBar1->Top-20;//Bei Treffer zuckt der Gegner zurück
                         energie=energie-10 ;   //bekommt 10 Energie abgezogen
                         ProgressBar1->Position=ProgressBar1->Position-10;//was man auch an seiner Energieleiste sieht
                         }
                 break;
                 case 2: if(bildki==1 && astt==50)
                         {
                         Image6->Top=Image6->Top+20;
                         ProgressBar1->Top=ProgressBar1->Top+20;
                         energie=energie-10 ;
                         ProgressBar1->Position=ProgressBar1->Position-10;
                         }
                 break;
                 case 3: if(bildki==4 && astl==-35)
                         {
                         Image6->Left=Image6->Left-20;
                         ProgressBar1->Left=ProgressBar1->Left-20;
                         energie=energie-10 ;
                         ProgressBar1->Position=ProgressBar1->Position-10;
                         }
                 break;
                 case 4: if(bildki==3 && astl==35)
                         {
                         Image6->Left=Image6->Left+20;
                         ProgressBar1->Left=ProgressBar1->Left+20;
                         energie=energie-10 ;
                         ProgressBar1->Position=ProgressBar1->Position-10;
                         }
                 break;
                 }
    
                 Label14->Caption=energie;// Energie wird angezeigt.
                 if(energie<=0) //Falls der Gegner keine Energie mehr hat
                   {
                   Image6->Visible=0 ; //wird er unsichtbar
                   ProgressBar1->Visible=0;
                   gibtsgegner=1;   //und durch diese EInstellung kann nicht mehr gesteuert werden
                   Timer1->Enabled=0;
                   }
                 }
    }
    }
    }
    }
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    randomize();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    // "KI"
    if(gibtsgegner==0)  // Auch sie läuft nur wenn Gegner da sind
    {
    c=Image1->Left;//Die Position des Gegners und des Spielers werden eingelesen
    d=Image1->Top;
    e=Image6->Left;
    f=Image6->Top;
    bleiben=0; // Variable zum sthen beliebn des Gegners, wenn er direkt vor dem Spieler steht
    
    laufen[0]=0; //Versuchtes verhindern des "in den Gegner"laufens. Funktioniert nicht richtig
    laufen[1]=0;
    laufen[2]=0;
    laufen[3]=0;
    
    astl=e-c; // Die Abstände werden berechnet
    astt=f-d;
    
    Label1->Caption=astl;  //und angezeigt
    Label2->Caption=astt;
    
    lm=0;
    lp=0;
    tm=0;
    tp=0;
    
    if(astl<=0)  // Es wird untersucht ob die Abstände im + oder im - Bereich liegen
    {            // um gebau festzustellen wie er laufen muss
    lm=1;
    }
    if(astl>=0)
    {
    lp=1;
    }
    
    if(astt<=0)
    {
    tm=1;
    }
    if(astt>=0)
    {
    tp=1;
    }
    
    Label3->Caption=lp; // die Werte werden angezeigt
    Label7->Caption=lm;
    Label8->Caption=tp;
    Label9->Caption=tm;
    
    if(astt==-50 || astt==50 || astl==35 || astl==-35)//Trifft zu wenn Gegner genau vor Spieler steht.
    {
    Image6->Left=Image6->Left; //Gegner tritt auf der Stelle
    Image6->Top=Image6->Top;
    bleiben=1; // so wird der restliche Teil nicht mehr ausgeführt.
    
    rant=random(2); // Triift er oder trifft er nicht?
    
    if(rant==1) // Falls sein Schlag getroffen hat.
    {
    if(bild==1 && bildki==2) // Er kann aber nur trweffen wenn er den Spieler anschaut
    {
    energie1=energie1-5;    // Energie wird abgezogen
    ProgressBar2->Position=ProgressBar2->Position-5;
    //ProgressBar2->Top=ProgressBar2->Top+20;
    //Image1->Top=Image1->Top+20;
    laufen[0]=1; //Nur ein versuch, klappt nicht
    }
    if(bild==2 && bildki==1)
    {
    energie1=energie1-5;
    ProgressBar2->Position=ProgressBar2->Position-5;
    //ProgressBar2->Top=ProgressBar2->Top-20;
    //Image1->Top=Image1->Top-20;
    laufen[1]=1;
    }
    if(bild==3 && bildki==4)
    {
    energie1=energie1-5;
    ProgressBar2->Position=ProgressBar2->Position-5;
    //ProgressBar2->Top=ProgressBar2->Left+20;
    //Image1->Top=Image1->Left+20;
    laufen[2]=1;
    }
    if(bild==4 && bildki==3)
    {
    energie1=energie1-5;
    ProgressBar2->Position=ProgressBar2->Position-5;
    //ProgressBar2->Top=ProgressBar2->Left-20;
    //Image1->Top=Image1->Left-20;
    laufen[3]=1;
    }
    
    }
    
    Label17->Caption=energie1;  // Energie wird angezeigt
    
    if(energie1<=0)      //falls der Spieler keine Energie mehr hat
    {
    Label15->Visible=1;  //wird "Kaputt" sichtbar
    Image1->Visible=0;   // der Spieler unsichtbar
    gibtsgegner=1;       // und nichts geht mehr
    Timer1->Enabled=0;
    ProgressBar2->Visible=0;
    }
    }
    
    if(bleiben==0)// das macht er nur, wenn der Gegner nicht direkt vor dem Spieler steht
    {
    if(lp==1 && tp==1 && lm==0 && tm==0)//Die Positionsabfragen
    {
    Image6->Left=Image6->Left-5;  //Diagonal auf den Spieler zubewegen.
    Image6->Top=Image6->Top-5;
    ProgressBar1->Left=ProgressBar1->Left-5;
    ProgressBar1->Top=ProgressBar1->Top-5;
    }
    
    if(lp==1 && tm==1 && lm==0 && tp==0)
    {
    Image6->Left=Image6->Left-5;
    Image6->Top=Image6->Top+5;
    ProgressBar1->Left=ProgressBar1->Left-5;
    ProgressBar1->Top=ProgressBar1->Top+5;
    }
    
    if(lm==1 && tp==1 && lp==0 && tm==0)
    {
    Image6->Left=Image6->Left+5;
    Image6->Top=Image6->Top-5;
    ProgressBar1->Left=ProgressBar1->Left+5;
    ProgressBar1->Top=ProgressBar1->Top-5;
    }
    
    if(lm==1 && tm==1 && lp==0 && tp==0)
    {
    Image6->Left=Image6->Left+5;
    Image6->Top=Image6->Top+5;
    ProgressBar1->Left=ProgressBar1->Left+5;
    ProgressBar1->Top=ProgressBar1->Top+5;
    }
    
    if(lp==1 && lm==1 && tp==0 && tm==1)  // Wenn der Gegner getrade auf den Spieler zulaufen kann.
    {
    Image6->Top=Image6->Top+5;       //Nur gerade Bewegungen auf ihm zu.
    Image6->Picture=Image2->Picture;
    ProgressBar1->Top=ProgressBar1->Top+5;
    bildki=2;
    }
    
    if(lp==1 && lm==1 && tp==1 && tm==0)
    {
    Image6->Top=Image6->Top-5;
    Image6->Picture=Image3->Picture;
    ProgressBar1->Top=ProgressBar1->Top-5;
    bildki=1;
    }
    
    if(lp==0 && lm==1 && tp==1 && tp==1)
    {
    Image6->Left=Image6->Left+5;
    Image6->Picture=Image5->Picture;
    ProgressBar1->Left=ProgressBar1->Left+5;
    bildki=4;
    }
    
    if(lp==1 && lm==0 && tp==1 && tp==1)
    {
    Image6->Left=Image6->Left-5;
    Image6->Picture=Image4->Picture;
    ProgressBar1->Left=ProgressBar1->Left-5;
    bildki=3;
    }
    }
    
    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Timer1->Enabled=0;
    }
    //---------------------------------------------------------------------------
    

    Jetzt mit Komentare. Ich weiß, ich kann nciht richtig kommentieren. Ich hoffe es irgendjemand kapiert es *g*



  • Hi, euer Programmierstil is freundlich ausgedrückt ziemlich trollig 🙂

    lest euch mal ein tutorial oder buch über c(++) grundlagen durch, besonders des Thema "structs" , "class" oder "dynamisches Erzeugen" dürfte euch ganz neue Einsichten bescheren...

    außerdem ist es keine Sünde Variablen Namen zu geben nach denen man ihren Sinn erkenn kann...

    int energie=100; //Gegner
    int energie1=100; //Ich

    sehr aussagekräftig wirklich, 2 Wochen später weiß man sicher noch absolut sicher daß die 1 für den player steht und des energie ohne zusatz is der gegner-logo-wie sollte es auch anders sein 😃

    abgesehen daß man sowas niemals als einzelstehende variablen definieren würde, sondern in structs oder classes einbauen würde



  • Frei nach dem Motto:

    Jugend forscht!

    🙂



  • Das ist ein Testprogi.

    Im Tatsächlichen Spiel werden die Variablen anderst genannt.
    Und ich weiß das mit energie und energie1 auch noch in 2 Jahren.

    Aber ich less mir mal die FAQ durch.



  • Ausserdem wäre das Formatieren vom Code auch keine Sünde.... Einrücken und so. Funktional ähnliche Blöcke trenne. Programmieren ist wie ein aufsatzschreiben. Returns und Leerzeichen kosten dich nix wirken sich aber extrem auf die Übersicht aus.

    Und ich weiß das mit energie und energie1 auch noch in 2 Jahren.

    Aus eigener Erfahrung aknn ich sagen, dass das NICHT stimmt.

    Ich hab mal ne Liste wie du deinen Programmierstil verbessern kannst zusammengestellt:

    • Variablennamen Gib sinnvolle Variablennamen. Egal ob es sich um ein Testprogramm handelt oder nicht. Wieso sollte man zwei verschiedene Programmierstile führen? Es kostet dich nichts 2 sekunden innezuhalten und einen sinnvollen Variablennamen zu geben. Es sorgt nur für mehr übersicht. Es ist auch nicht verboten Variablennamen mit mehrt als 3 Zeichen länge (...) zu erzeugen. - Bei dir erkennt man irgendwie ne Schreibfaulheit... versuch das abzulegen.
    • Typen Du hast für alles Int-Werte eingesetzt. C/C++ bietet eine Fülle von Datentypen die spezielle Eigenschaften besitzen. Wieso zum Beispiel für den wert "bleiben" nicht einen bool verwenden? der kann typischerweise nur true oder false annehmen und braucht absolut sicher weniger Speicher als ein int (32-Bit = 4 byte) Ist ausserdem rein doku-technisch auch viel besser da dann jeder weiss... aha bewegen == true dann wird abgefragt ob man sich bewegen darf. Damit kann man sich - als schreibfauler wie du - wieder den Kommentar sparen (: (tschuldige ich unterstell dir jetzt einfahc mal schreibfaulheit (: )
    • Sich an Typerisierungen halten Ich seh da eine Zeile "Image6->Visible=0" (auch hier übrigens sei erwähnt, dass die Kompo Image6 einen besseren Namen verdient hätte!). Visible ist laut Hilfe aber ein bool. Also wieso nicht false? Und schon wär die Kommentarzeile gar nicht mehr nötig (schonwieder Zeichen gespart.)
    • Übersicht durch Leerschläge I Versuche zwischen Operatoren und Operanden leerschläge zu machen, das fördert die Lesbarkeit extrem.
    • Übersicht durch Leerschläge II Rücke deinen Code sinnvoll ein. Vor Allem mach es Konsistent. Der Grosse (Quasi-)Standard liegt darin, dass man Blöcke (einen Abschnitt zwischen {}) um 4 Leerzeichen einrückt. Achte etwas auf die Formatierung. Man kann Code "schön" gestalten. Schau dir mal zum Beispiel den Code an, nachdem du die Einrückung vorgenommen hast. Oder nachdem du zwischen dem case-Statement und dem if einen Return eingefügt hast. (Ich mache üblicherweise sowas:
    case 'a':
    {
        //--Code
        break;
    }
    

    Ist natürlich nicht gesetz. Auch den block bräuchte es hier nicht. Aber es macht den Code - in meinen Augen - viel "schöner".

    • Klammern schaffen klarheit Auch wenn die Prioritäten klar sind, kann bei einem derartigen Statement: "if(x || y == a || b)" wird die Übersicht durch Klammern ( "if((x || y) == (a || b))" plötzlich höher. Man kann sich dann auch Leerzeichen zwischen den Operatoren erlauben. Aber wenn cih die Zeile so ansehe, glaube ich du hast hier sowieso nen Denkfehler gemacht. - ach detail

    So, das Waren mal die Dinge die mir grad ns Aug stachen.

    -junix



  • Jo.

    Variablen sind jetzt eindeutig.

    Zu Image6: Was kann ich dafür das Borland das so will???

    Das mit den einschieben von Sachen in Schleifen mach ich eigentlich immer.

    zu Visible=0 0 is kürzer als true *g*

    Zum Thema:

    Transparent ist geschaft zund Sperrbeereiche auch.



  • Original erstellt von Thargor:
    Zu Image6: Was kann ich dafür das Borland das so will???

    Borland will gar nix so. Schonmal gemekrt, dass du die Namen von Komponenten ändern kannst?

    Original erstellt von Thargor:
    Das mit den einschieben von Sachen in Schleifen mach ich eigentlich immer.

    ... wieso zweigleisig fahren? Es ist nicht nur in Schleifen wichtig die Übersicht zu behalten. Auch hier ist es unnötig zwei verschiedene Stile zu pflegen.

    Original erstellt von Thargor:
    zu Visible=0 0 is kürzer als true *g*

    ... schwache ausrede ...

    Original erstellt von Thargor:
    Zum Thema:

    Was ich hier kritisiert habe ist ein allgegenwärtiges Thema und deshlabn keinesfalls offtopic.

    -junix



  • Jo. Aber mir is schon viel mist passiert als ich solche Namen geändert hab.

    Ist doch meine Sache ob ich Visible=0 oder false schreibe,oder?

    Ich bin/war ja nicht der eintzigste der an der Saxhe programiert.
    Solange wir den Überblick behalten.



  • Original erstellt von Thargor:
    Ist doch meine Sache ob ich Visible=0 oder false schreibe,oder?

    ja und nein. Streng genommen hast du hier eine Typenverletzung. Du weist einen integer einem boolean zu. Typen sind zum einhalten da. Leider lässt C eine derartige Schludrigkeit zu. Aber nur weils die Sprache zulässt muss man sowas ja nicht ausnutzen (siehe auch Public-Variablen. Katastrophal. Die sollte man eigentlich verbieten).

    -junix



  • [nurmalso]@junix hehe, du hasst public-variablen ja geradezu, hab des auch in der Faq mal gelesen, stimm dir soweit zu, nur eines: als ich mal getestet hab ob eine typische Set-Funktion mit einer einfachen Variablen-Zuweisung speedmäßig mitkommt, hab ich festgestellt daß das nicht so is:

    sprite->x=5;

    mehr als doppelt so schnell wie

    sprite->SetX(5);

    auch als ich 2teres inline gemacht hab, kann aber sein, daß mein Compiler ned richtig optimiert hat[/nurmalso]



  • Crossposting, geschlossen.


Anmelden zum Antworten