JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2117633492341b20eaf2eba73e342bbaMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Sprite doppelt so groß

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nahar
Senior JLI'ler


Alter: 36
Anmeldedatum: 16.07.2003
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 16:41    Titel: Sprite doppelt so groß Antworten mit Zitat

Mal ne echt dumme Frage: immer wenn ich ein Sprite in die Oberfläche kopier´ (so wies auch das Beispiel macht) wird die Größe verdoppelt (also im gegensatz zur Source-Datei). Auserdem muss ich bei der Höhe des Bildes das doppelte angeben, weil es sonst nur abgeschnitten oder gar nicht angezeigt wird. Ist das normal? Wenn ja, kann man das irgendwie blocken? Wenn nein, an was liegt das? Bitte antwortet mir, danke.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 17:08    Titel: Antworten mit Zitat

Grundsätzlich gilt, dass wir mit Quellcode mehr anfangen können.
Poste doch einfach mal den relevanten Teil des Quellcodes. So können wir auch leichter den Fehler finden Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Nahar
Senior JLI'ler


Alter: 36
Anmeldedatum: 16.07.2003
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 17:43    Titel: Antworten mit Zitat

#include "Sprite.h"
#include <stdio.h>

// Konstruktor - Initialisierung der Werte
Sprite::Sprite()
{
lpDDSpriteSurface = NULL;

FrameWidth = 0;
FrameHeight = 0;

FramesX = 0;
FramesY = 0;

FrameDelay = 0;
delay = 0;


x = 0;
y = 0;

CurrentFrameX = 0;
CurrentFrameY = 0;

delay = 0;
}



// Oberfläche und Breite und Höhe des Sprites speichern
void Sprite::Create(LPDIRECTDRAWSURFACE7 lpDDSurface,int frmWidth,int frmHeight,int frmDelay)
{
// Breite und Höhe der Oberfläche bestimmen
lpDDSpriteSurface = lpDDSurface;

// Höhe und Breite der einzelnen Frames speichern
FrameWidth = 349;
FrameHeight = 166;

FrameDelay = 10;

DDSURFACEDESC2 SurfaceDesc;
ZeroMemory(&SurfaceDesc,sizeof(SurfaceDesc));
SurfaceDesc.dwSize = sizeof(SurfaceDesc);

lpDDSpriteSurface->GetSurfaceDesc(&SurfaceDesc);

// Anzahl der Sprites in einer Zeile/Spalte bestimmen
FramesX = 2;
FramesY = 1;

// schwarze Bereiche sollen nicht kopiert werden
DDCOLORKEY ColorKey;
ColorKey.dwColorSpaceLowValue = 0;
ColorKey.dwColorSpaceHighValue = 0;

lpDDSpriteSurface->SetColorKey(DDCKEY_SRCBLT,&ColorKey);
}

// Sprite auf eine Oberfläche Blitten (meistens auf in den Hintergrundpuffer)
void Sprite::Draw(LPDIRECTDRAWSURFACE7 lpDDSurface)
{
RECT SpriteRect;

// dieses Rechteck speichert die Position
// des Frames in der Oberfläche
SpriteRect.left = CurrentFrameX * FrameWidth;
SpriteRect.right = SpriteRect.left + FrameWidth;
SpriteRect.top = CurrentFrameY * FrameHeight;
SpriteRect.bottom = SpriteRect.top + FrameHeight;

// Sprite blitten auf die Oberfläche kopieren
lpDDSurface->BltFast(x,y,lpDDSpriteSurface,&SpriteRect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

// delay erhöhen und testen, ob der nächste
// Animationsschritt dargestellt werden soll
delay++;
if(delay >= FrameDelay)
{
// nächstes Frame
CurrentFrameX++;
//x = x + 10;
//Wenn es sich immer mit neuem Frame bewegen soll
// Wenn wir über die Spaltenbegrenzung überschritten haben
if(CurrentFrameX == FramesX)
{
// müssen wir in die nächste Zeile in die 1. Spalte springen
CurrentFrameX = 0;
CurrentFrameY++;


// Wenn wir auch die Zeilenbegrenzung überschitten haben
if(CurrentFrameY == FramesY)
{
// müssen wir wieder beim ersten Frame anfangen
CurrentFrameY = 0;
}
}
// delay auf 0 setzen, damit wieder verzögert werden kann
delay = 0;
}
}

// x und y Koordinate setzen
void Sprite::Set(int SpriteX,int SpriteY)
{
x = SpriteX;
y = SpriteY;
}

// Sprite in x- und y-Richtung verschieben
void Sprite::Move(int SpriteDX,int SpriteDY)
{
x += SpriteDX;
y += SpriteDY;
}

// die Spriteoberfläche wieder freigeben
void Sprite::Release(void)
{
if(NULL != lpDDSpriteSurface)
{
lpDDSpriteSurface->Release();
lpDDSpriteSurface = NULL;
}
}

Reicht das? Welche Funktion braucht ihr noch? ICh hab mir ursprünglich gedacht das es am Rect lag, aber irgendwie hat das nicht viel gebracht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 19:31    Titel: Antworten mit Zitat

sollte da nicht

FrameWidth = frmWidth;
FrameHeight = frmHeight;
FrameDelay = frmDelay;

stehn oder hast du das für dieses Beispiel geändert ? Confused
_________________
"Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."

"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."

"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Nahar
Senior JLI'ler


Alter: 36
Anmeldedatum: 16.07.2003
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 19:49    Titel: Antworten mit Zitat

ja, hängt mit nem versuch zusammen für jedes Sprite ne art Klasse mit Health, Geschwindigkeit etc. zu machen. War das ein Fehler? Oder brauchts du noch was?

PS: Danke nochmal das ihr mir helft Embarassed Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 19:59    Titel: Antworten mit Zitat

Du solltest deinen code mit dem code tag ( [-code-] für begin und [-/code-] (-weglassen) ) formatieren damit die leerzeichen am anfang der Zeile angezeigt werden, und man den code besser lesen kann.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 16.07.2003, 20:05    Titel: Antworten mit Zitat

Versuchs mal mit den folgenden Zeilen:
Code:
SurfDesc.dwFlags =   DDSD_CAPS   | DDSD_HEIGHT | DDSD_WIDTH;
SurfDesc.dwWidth  = frmWidth;
SurfDesc.dwHeight = frmHeight;


Hinter das:
Zitat:
DDSURFACEDESC2 SurfaceDesc;
ZeroMemory(&SurfaceDesc,sizeof(SurfaceDesc));
SurfaceDesc.dwSize = sizeof(SurfaceDesc);

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 17.07.2003, 06:32    Titel: Re: Sprite doppelt so groß Antworten mit Zitat

Nahar hat Folgendes geschrieben:
...wenn ich ein Sprite in die Oberfläche kopier´...wird die Größe verdoppelt...
...Auserdem muss ich bei der Höhe des Bildes das doppelte angeben, weil es sonst nur abgeschnitten angezeigt wird...

Damit verätst Du Dich selber!
Poste doch mal bitte die Funktion, in welcher Du Deine Datei in die "lpDDSurface"-Oberfläche lädst! Also die "LoadSurfaceFromFile" oder wie auch immer die bei Dir heisst. (innerhalb von Code-Tags plz)
Soweit kann ich bei dem oben geposteten keinen Fehler feststellen, der damit in Zusammenhang stehen würde.



Jedoch noch was anderes:
In Deiner "Sprite::Create"-Funktion holst Du Dir Informationen über Deine Oberfläche:
Code:
DDSURFACEDESC2 SurfaceDesc;
ZeroMemory(&SurfaceDesc,sizeof(SurfaceDesc));
SurfaceDesc.dwSize = sizeof(SurfaceDesc);
lpDDSpriteSurface->GetSurfaceDesc(&SurfaceDesc);

Du verwendest danach diese Infos aber in keinster Weise innerhalb der Funktion, also kannst Du diesen kompletten Teil auch rauslöschen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nahar
Senior JLI'ler


Alter: 36
Anmeldedatum: 16.07.2003
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 17.07.2003, 13:57    Titel: Re: Sprite doppelt so groß Antworten mit Zitat

Mr.X hat Folgendes geschrieben:
Damit verätst Du Dich selber!

Wiso? es tut nicht wenn ichs nicht doppelt so hoch angeb´.

Poste doch mal bitte die Funktion, in welcher Du Deine Datei in die "lpDDSurface"-Oberfläche lädst! Also die "LoadSurfaceFromFile" oder wie auch immer die bei Dir heisst. (innerhalb von Code-Tags plz)
Soweit kann ich bei dem oben geposteten keinen Fehler feststellen, der damit in Zusammenhang stehen würde.


Mr.X hat Folgendes geschrieben:

Jedoch noch was anderes:
In Deiner "Sprite::Create"-Funktion holst Du Dir Informationen über Deine Oberfläche:
Code:
DDSURFACEDESC2 SurfaceDesc;
ZeroMemory(&SurfaceDesc,sizeof(SurfaceDesc));
SurfaceDesc.dwSize = sizeof(SurfaceDesc);
lpDDSpriteSurface->GetSurfaceDesc(&SurfaceDesc);


Du verwendest danach diese Infos aber in keinster Weise innerhalb der Funktion, also kannst Du diesen kompletten Teil auch rauslöschen


Ich weiß, war aber zu faul um das rauszumachen (ich hab extra das Beispiel benutzt weil ich dachte das ich mich bei mir vieleicht vertippt habe.


Code:

LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight)
{
   // Device Context für das Bild und die DirectDraw-Oberfläche anlegen
    HDC hBmDC,hSurfDC;

    // Handle der zu ladenden Bitmap
    HBITMAP hBM;                   
   
    // Oberflächenbeschreibung
    DDSURFACEDESC2 SurfDesc; 
   
    // Zeiger auf die Oberfläche
   LPDIRECTDRAWSURFACE7 lpDDSurface;   
   
   // Bild laden
    hBM = (HBITMAP)LoadImage(NULL,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);

    // testen ob ein Fehler während des Ladens aufgetreten ist
    if(NULL == hBM)
    {
        Error("Fehler beim laden des Bildes");
        return 0;
    }

   // Oberflächenbeschreibung initialisieren
    ZeroMemory(&SurfDesc, sizeof(SurfDesc));
   SurfDesc.dwSize = sizeof(SurfDesc);
   
    // Caps, Höhe und Breite sollen berücksichtigt werden
    SurfDesc.dwFlags =   DDSD_CAPS   | DDSD_HEIGHT | DDSD_WIDTH;

    SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
   SurfDesc.dwWidth  = dWidth;
   SurfDesc.dwHeight = dHeight;
   
    // Oberfläche anlegen
    if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
    {
        Error("Fehler beim anlegen der Oberfläche");
        return 0;
    }

   // Device Context der Oberfläche holen
    lpDDSurface->GetDC(&hSurfDC);

    // Compatiblen Device Context für das Bild anlegen
    hBmDC = CreateCompatibleDC(hSurfDC);

    // Bild in den Device Context holen
    SelectObject(hBmDC,hBM);

    // Bild in die Oberfläche kopieren
    BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);

   // Device Context freigeben
    lpDDSurface->ReleaseDC(hSurfDC);
   
    // Device Context und Bild löschen
    DeleteDC(hBmDC);
   DeleteObject(hBM);

    // Zeiger auf die Oberfläche zurückgeben
    return lpDDSurface;
}

// Objekte/Speicher freigeben
void CleanUpDirectDraw(void)
{
    Sprite.Release();

    if(NULL != lpDDSPrimary)
    {
        lpDDSPrimary->Release();
        lpDDSPrimary = NULL;
    }

    if(NULL != lpDD7)
    {
        lpDD7->Release();
        lpDD7 = NULL;
    }
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 17.07.2003, 14:19    Titel: Antworten mit Zitat

Ist Dein DD7-Objekt mit 32-Bit-Farbtiefe initialisiert und Du lädst 16-Bit-Grafik-Dateien?

Ist Deine Grafik 698x83 groß? Ist dabei innerhalb der Grafik ein Sprite 349x83 groß? Sind die Höhen-Werte daher in "Sprite::Create" bereits verdoppelt (wie Du sagtest) oder die Richtigen? Also bei "FrameWidth = 349; FrameHeight = 166;".

Mit welchen Parametern rufst du "CreateSurfaceFromBitmap()" und "Sprite::Create()" auf?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nahar
Senior JLI'ler


Alter: 36
Anmeldedatum: 16.07.2003
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 17.07.2003, 15:44    Titel: Antworten mit Zitat

Also das DD7 Objekt ist wie die Grafik auf 24 und die Angaben sind verdoppelt. Die PArameter sind die gleichen wie im Beispiel.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum