|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 16.07.2003, 16:41 Titel: Sprite doppelt so groß |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.07.2003, 17:08 Titel: |
|
|
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 _________________ 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 |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 16.07.2003, 17:43 Titel: |
|
|
#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 |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 16.07.2003, 19:31 Titel: |
|
|
sollte da nicht
FrameWidth = frmWidth;
FrameHeight = frmHeight;
FrameDelay = frmDelay;
stehn oder hast du das für dieses Beispiel geändert ? _________________ "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 |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 16.07.2003, 19:49 Titel: |
|
|
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 |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 16.07.2003, 19:59 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.07.2003, 20:05 Titel: |
|
|
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 |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 17.07.2003, 06:32 Titel: Re: Sprite doppelt so groß |
|
|
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 |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 17.07.2003, 13:57 Titel: Re: Sprite doppelt so groß |
|
|
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 |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 17.07.2003, 14:19 Titel: |
|
|
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 |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 17.07.2003, 15:44 Titel: |
|
|
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 |
|
|
|
|
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
|