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

10.01.2006, 11:03

von bmp animation erstellen ! aber wie ?

Hallöchen liebe C++ Gemeinde,

ich bin neu hier und habe sogleich eine Frage:

ich programmiere derzeit an einem Tetris-Clone
und würde gerne mein Hintergrund, was ich Blitte Animieren lassen.
Ich weiß, das ich dazu ein Bild brauche,
welches die Animation enthält sprich z.B.:

Bildgröße 100x100 Pixel
Pro 20*50 Pixel ein Bild
das wären dann insgesammt 10 Frames in einem Bild

nun meine konkrete Frage:
wie animiere ich nun dieses Bild ?


so blitte ich derzeit mein hintergrundbild

Programmiersprache MFC (Visual C++)
//-----------Ausschnit aus display.h

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "ddutil.h"

class display
{
private:
    CDisplay dsply;     // Das Display
    CSurface *hgrnd;    // Hintergrund
        ...

public:

    display(void);
    void free_all();
    HRESULT init( HWND wnd);
    void hintergrund(){dsply.Blt(0, 0, hgrnd);}


//-----------------Ausschnit aus Display.cpp

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void display::free_all()
{

    if( hgrnd)
        delete hgrnd;
        ...
}

HRESULT display::init(HWND wnd)
{
    HRESULT hr;

    hr = dsply.CreateWindowedDisplay(wnd, 360, 520);

    if (hr < 0)
        return hr;
    hr = dsply.CreateSurfaceFromBitmap( &hgrnd, "ul_hgrnd.bmp", 360, 520);
        ....
}

HRESULT display::restore()
{
    HRESULT hr;

    hr = dsply.GetDirectDraw()->RestoreAllSurfaces();
    
    if (hr < 0)
        return hr;
    hr = dsply.CreateSurfaceFromBitmap( &hgrnd, "ul_hgrnd.bmp", 360, 520);
}

HRESULT display::present()
{
    HRESULT hr;

    hr = dsply.Present();
    if (hr == DDERR_SURFACELOST)
        return restore();
    return hr;
}

display::~display(void)
{
    free_all();
}


Wüßte jetzt jemand, wie ich das erweitern könnte ?
würde mich über eine Antwort sehr freuen.


Mit freundlichen Grüßen

M3n70r

2

10.01.2006, 14:15

hmm, eigentlich hätte ich eine antwort erwartet, naja...
hat sich jetzt auch geklärt, hab folgendes versucht:

versucht:

http://www.codeproject.com/directx/basicdd.asp

bloß stellt sich für mich nun die frage, wie ich
ein 2tes oder mehrere bilder auf einmal Animiert bekomme ?
mit dem beispiel mit dem auto gehts ja, auch mit meinen bildern,
die ich erstellt habe, aber was muss ich machen, damit ich 2 oder mehr animationnen nebeneinander bekomme ??[/url]

3

10.01.2006, 15:50

Hmm... willst du eigentlich 2D oder 3D haben? Das was du da von codeproject.com hast ist 2D... wenn dein Tetris 3D ist, würde ich jetzt in so ner einfachen app einfach in den hintergrund ne plane setzten und darauf die gewünschten Bitmaps als Texturen darstellen... aber das ist eine sehr unsaubere methode :)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

10.01.2006, 16:00

nee nee, das soll alles 2D sein, bzw. ist schon 2D.

Anonymous

unregistriert

5

10.01.2006, 16:23

www.germangamedev.de << Tutorials << FunnyBreak.

6

12.01.2006, 10:35

vielen dank @nix da

klappt wunderbar...jedoch habe ich da ein kleines problem:
Wenn ich die animation (240*192) mit einer Auflösung von (640*480)
auf die Position (400 oder größer) bewege,
so zeichnet er nicht mehr die eigentlich Animation, sondern
komischerweiße das komplette bild, oder auch fragmente des bildes :(
besser gesagt: wenn die breite des bildes den rand der anwendung erreicht oder überschreitet, so zeichnet er die animation nicht mehr richtig hin.

sprich wenn meine animation so aussieht:

http://m3n70r.de/vaalgrid.bmp

dann sieht es auf meinem bildschirm so aus

http://m3n70r.de/fehler.bmp

wie kann man das in dem Tutorial-Code verhindern ?

Anonymous

unregistriert

7

12.01.2006, 10:55

Joah das ist ein Kleiner Fehler im Tutorial ;) Der ist aber beabsichtigt, damit Neulinge nicht alles runterschreiben, sondern versuchen den Fehler selbst zu finden :-)

Der Fehler ist sehr einfach zu finden, versuchs mal :-)

8

12.01.2006, 12:36

entweder bin ich zu blöd oder einfach nur blind, aber ich find den fehler net :(

edit: ok, hab ihn doch gefunden ^^
weiß zwar nicht, obs daran liegt, aber laut meinen berechnungen schon.

meine frage: lag es an sw und sh in der clippingberechnung ?
wenn nicht, dann sag mal bitte bescheid, damit ich mich nochmal auf die suche mache ^^

9

13.01.2006, 10:15

so.... funktioniert alles...aber mal wieder eine frage:

ich möchte bilder anzeigen lassen, die von oben nach unten runterkommen...
sprich:

Ein bild wird nur zum teil geblittet und solange stück für stück, solange es nicht komplett angezeigt wird.
Wie bei manchen spielen, wo man ganz unten ein raumschiff hat und von oben gegner kommen, die man abknallen kann, ich hoffe ihr wisst was ich meine ?! ^^

nun meine frage: wie stelle ich die gegner nun zum teil dar ?

ich habe es folgendermaßen gelöst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int         test_width          = 100;
int         test_height         = 100;
static int  test_posx              = 200;
static int  test_posy              = 0;
static long test_ix         = 0;
static long test_iy         = 100;
static int  test_iwidth     = 100;
static long test_iheight          = 1;
static int  test_start          = 0;
static int  test_counter          = 0;

// nur am anfang anzeigen, wenn z.B. leertaste gedrückt
if(test_start)
    {
                // wenn nicht alles sichtbar
        if(test_iy > 0)
        {
            test_iy--;
        }
        else
        {
        test_start = 0;
        }

        test_counter = (test_height-1) - test_iy;

        for(int i = (test_height-1); i >= test_iy; i--)
        {
            test_.drawEx(test_posx, test_counter, test_ix, i, test_iwidth, test_iheight);
            test_counter--;
        }
    }
    else
    {
        test_iy = (test_height-1);
    }


mein problem ist nun, das wenn ich die leertaste drücke das gesamte spiel
langsamer wird, ist ja klar, da die for-schleife zeit braucht.
wie könnte man das eleganter lösen, das sozusagen ein gegner am oberen Rand auftaucht und stück für stück gezeichnet wird ?

hoffe auf eine gute antwort ^^

mfg m3n70r

Anonymous

unregistriert

10

13.01.2006, 10:27

m3n70r
Zum Fehler: Genau das war er ;)

Zu Deiner Frage: Wie meinst Du das "nur zum Teil"? Also das Du so was wie ein Raptor/Tyrian coden willst ist mir jetzt klar, aber was mit "Zum Teil"?

Werbeanzeige