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

1

09.11.2006, 15:04

Problem beim blitten?

Hi

ich habe nochma ein kleines DDraw prob, was ich ganz gerne beheben würde^^.

ich habe hier meinen code:

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
    x=0;
    TestObject.Set_High_Width(200, 150);
    TestObject.set_Koordinaten(x, 0);
    TestObject.LoadBitmap("Test.bmp");
    
    running=true;
                 
    while(running)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        { 
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            Main.Clear_Scren();
            TestObject.Draw_Object();
        }
        Main.Render();
    } 
   Main.Release_All();

    return msg.wParam ;
}


x is als global definiert^^. das ist aber nur ein zwischenstandpunkt, da ich grade ers dabei bin, nach und nach alle sachen zu implementieren, da ich sonst mir wohl zuviele fehler auch in den verbindungen der klassen einbaune würde^^.

jetz erhöhe ich im messageloop wenn man shift drückt(ja, directinput kommt nach dem ddraw modul :D), x um 10 erhöhen

C-/C++-Quelltext

1
2
3
4
5
6
            case VK_SHIFT:
                 {
                 x = x + 10;
                 TestObject.set_Koordinaten(x, 0);
                 return 0;
                 }


so, aber wennich jetz shift drücke, blittet er alte und neue position. obwohl ich den back vorher gecleart hab. wenn ich allerdings nochma auf shift drücke, verschied sich das doppelgebilde :D

habt ihr da evlt ne idee?

hier noch die klassenfunktionen:

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
void Object::set_Koordinaten(int x, int y)
{
    Koordinaten[0] = x;
    Koordinaten[1] = y;

}

void Object::LoadBitmap(char* path)//LoadBitmap(char path, RECT BitmapRect)

{
     lpddsBitmap = DDLoadBitmap(lpDirectDraw, path, High, Width);
}

void Object::Draw_Object()
{
     DDraw_I = Main.getDirectDrawInstance();
     SetRect(&rectbitmap, Koordinaten[0],  Koordinaten[1], Koordinaten[0]+High ,  Koordinaten[1]+ Width);
     DDraw_I.BlitBitmap(rectbitmap, lpddsBitmap);
}

void Object::Set_High_Width(int New_High, int New_Width)
{
     High = New_High;
     Width = New_Width;
}


wenn ich das bild net bewege, läuft alels normal.

danke im vorraus

Mfg
Eldarion

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

2

09.11.2006, 16:40

Hallo!

Hast du schon mal veruscht das:
Main.Clear_Scren();
TestObject.Draw_Object();

auserhalb deiner if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) Bedingung zu schreiben?
Weil du sollst ja in jedem Frame dein Bild mal löschen und wieder neu zeichnen.


cya,
Stefan

3

09.11.2006, 19:06

öhm, ich bewege das bild ja. dann muss es doch neu gezeichnet werden und der backbuffer vorher gelöscht werden, oder? :?:

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

4

09.11.2006, 21:11

ja irgendwie schon oder?

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

5

10.11.2006, 00:18

Zitat von »"Eldarion72"«

öhm, ich bewege das bild ja. dann muss es doch neu gezeichnet werden und der backbuffer vorher gelöscht werden, oder? :?:


jup! Aber bei if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) war ich mir nicht sicher, ob die Bedingung in jedem Frame augerufen wird.(wird sie es?) Bei einem Spiel wird nämlich in jedem Frame der Backpuffer gelöscht und die Objekte wieder neu gerendert!


Außerdem is hier glaub noch ein kleiner Fehler:

C-/C++-Quelltext

1
 SetRect(&rectbitmap, Koordinaten[0],  Koordinaten[1], Koordinaten[0]+High ,  Koordinaten[1]+ Width); 


Width und height sind glaube ich vertauscht, so wäre es glaube ich richtig:

C-/C++-Quelltext

1
 SetRect(&rectbitmap, Koordinaten[0],  Koordinaten[1], Koordinaten[0]+Width ,  Koordinaten[1]+ Height); 

6

10.11.2006, 13:23

Hi

lol, daran lags :)
hätt ich net gedacht. ich zeichne jetz alles vor dem PeekMessage

aber widht und high sind richtig. zumindenstens wird das bild net abgeschnitten.

Mfg
Eldarion72

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

7

10.11.2006, 13:36

Zitat von »"Eldarion72"«


aber widht und high sind richtig. zumindenstens wird das bild net abgeschnitten.


Ja, dann wird es wahrscheinlich skaliert...Aber sobald du mal eine Kollisionsabfrage einbaust wirst du dann ziemlich sicher Probleme bekommen :roll:


cya,
Stefan

8

11.11.2006, 16:29

hmm, aber ich hab nochma nachgeguckt. bei dem tutorial war auch er dei breite und dann die höhe.

Zitat

lpddsBitmap = DDLoadBitmap(lpDirectDraw, "Test.bmp"200, 150);

Wir übergeben zuerst das DirectDraw-Objekt, dann den Dateinamen des zu ladenden Bitmaps und schließlich dessen Größe in Pixeln.
Wir laden also ein Bitmap "Test.bmp" mit den Außmaßen 200x150.
Um es auf den Back Buffer zu kopieren, müssen wir erst angeben, wohin es kopiert werden soll. Dazu brauchen wir noch eine RECT-Variable:

RECT rectbitmap;

Diese füllen wir jetzt mit den Zielkoordinaten:

SetRect(&rectbitmap, 220, 165, 420, 315);


also da is zumindens auch erst die breite. eigl is die x koordinate doch immer die breite oder?

Stefan

Alter Hase

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

9

11.11.2006, 18:18

Ja, das stimmt schon!

C-/C++-Quelltext

1
2
3
4
5
6
void Object::Draw_Object()
{
     DDraw_I = Main.getDirectDrawInstance();
     SetRect(&rectbitmap, Koordinaten[0],  Koordinaten[1], Koordinaten[0]+High ,  Koordinaten[1]+ Width);
     DDraw_I.BlitBitmap(rectbitmap, lpddsBitmap);
} 


Aber hier machst du den Fehler, du gibst als erstes die obere linke Ecke an.

C-/C++-Quelltext

1
Koordinaten[0],  Koordinaten[1],

Das stimmt noch, und dann für den zweiten Punkt addierst du bei dem x Wert die Höhe des Bildes hinzu. Dem Y Wert addierst du die Breite, statt es genau umgekehrt zu machen.

Also x,y,x+width,y+height

Und ich würd high in height umschreiben :) klingt besser!

cya,
Stefan

10

11.11.2006, 18:22

oO, so war das gemeint. sry, da hsate natürlich recht :)

Werbeanzeige