![]() |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
@3_of_8 : Also bei mir lädt der das Bild nur in einen Pointer oder so. Hab keine ahnung, in welchem Format der das in dem Pointer speichert.
Delphi-Quellcode:
Hier mal der relevante Code der laden-funktion.
var
FileHeader: TBITMAPFILEHEADER; // was FileHeader: BITMAPFILEHEADER; undeclared identifier InfoHeader: TBITMAPINFOHEADER; // was InfoHeader: BITMAPINFOHEADER; undeclared identifier Palette: array [byte] of TRGBQUAD; // Palette: array of RGBQUAD; declaration of array not supported by D2 and undeclared identifier RGBQUAD BitmapFile: THandle; BitmapLength: Integer; // changed from variant PaletteLength: Integer; // '' '' '' ReadBytes: Integer; // changed for incompatibility whith declaration of Win function Readfile Front: ^Byte; Back: ^Byte; Temp: Byte; I : Integer; Width, Height : Integer; pData : Pointer; // used for loading from resource ResStream : TResourceStream; begin [.....................] BitmapFile := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if (BitmapFile = INVALID_HANDLE_VALUE) then begin MessageBox(0, PChar('Error opening ' + Filename), PChar('BMP Unit'), MB_OK); Exit; end; // Get header information ReadFile(BitmapFile, FileHeader, SizeOf(FileHeader), ReadBytes, nil); ReadFile(BitmapFile, InfoHeader, SizeOf(InfoHeader), ReadBytes, nil); // Get palette PaletteLength := InfoHeader.biClrUsed; //SetLength(Palette, PaletteLength); commented by fabrizio ( i don't know how to solve !!) ReadFile(BitmapFile, Palette, PaletteLength, ReadBytes, nil); if (ReadBytes <> PaletteLength) then begin MessageBox(0, PChar('Error reading palette'), PChar('BMP Unit'), MB_OK); Exit; end; Width := InfoHeader.biWidth; Height := InfoHeader.biHeight; BitmapLength := InfoHeader.biSizeImage; if BitmapLength = 0 then BitmapLength := Width * Height * InfoHeader.biBitCount Div 8; // Get the actual pixel data GetMem(pData, BitmapLength); ReadFile(BitmapFile, pData^, BitmapLength, ReadBytes, nil); if (ReadBytes <> BitmapLength) then begin MessageBox(0, PChar('Error reading bitmap data'), PChar('BMP Unit'), MB_OK); Exit; end; CloseHandle(BitmapFile); end; // Bitmaps are stored BGR and not RGB, so swap the R and B bytes. for I :=0 to Width * Height - 1 do begin Front := Pointer(Integer(pData) + I*3); Back := Pointer(Integer(pData) + I*3 + 2); Temp := Front^; Front^ := Back^; Back^ := Temp; end; |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
Da stehts doch eh: Die Daten sind im RGB-Format, jeder Kanal ein Byte, an der Stelle deines Pointers.
Der Code dafür ist ungefähr so:
Delphi-Quellcode:
(Das hättest du aber mit etwas Eigeninitiative auch hinbekommen sollen, es sei denn, was ich nicht hoffe, du hast dein Spiel bisher nur per Copy & Paste geschrieben)
for I:=0 to Width-1 do
for J:=0 to Height-1 do for K:=0 to 2 do PByte(Cardinal(Buffer)+(J*Width+I)*3+K):= PByte(Cardinal(pData)+((Height-J-1)*Width+I)*3+K); |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
Erst mal danke für die schnelle Antwort.
An so was wie du geschrieben hatst hab ich auch schon gedacht kam aber nit weiter. --> Was ist denn dan Buffer in deinem Code? --> Ich kenne mich in diesem Gebiet leider nicht si aus. Könntest du mir vllt. da eine kleine Hilfestellung geben? |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
Buffer ist ein Pointer, den du mit GetMem intialisierst. GetMem übergibst du die Menge Speicher, die du haben willst, also Breite*Höhe*3 (Weil 3 Bytes pro Pixel)
Wenn du dich auf dem Gebiet nicht auskennst, solltest du das schnell ändern - Pointer sind nämlich ein wichtiger Bestandteil der Sprache Delphi, und auch das Speichermanagement sollte man zumindest bedienen können. OpenGL ohne Kentnisse über Pointer zu benutzen ist außerdem so gut wie unmöglich. Wenn du ein Vertex-Array übergeben willst, wenn du eine Matrix in den Grafikspeicher laden willst, sogar, wenn du nur eine Textur laden willst, brauchst du Pointer. Und wenn du damit nicht umgehen kannst, dann kannst du tatsächlich nur durch Copy & Paste soweit gekommen sein, wie du jetzt bist. |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
EDIT: Erledigt
|
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
So ich habe die Lösung gefunden.
Für alle die auch so ein Problem haben sollten hier der Code, um ein Bild in einem Pointer mit Type Byte zu spiegeln.
Delphi-Quellcode:
Var
I,J,p : Integer; InvData : Array [0..256,0..1,0..2] of ^Byte; TMP : Array [0..256,0..2] of Byte; pData : Pointer; [...........] for I := 0 to (Width div 2) do begin for J := 0 to Height-1 do begin InvData[j,0,0] := (Pointer(Integer(pData) + I*Width*3 + J*3 + 0)); InvData[j,0,1] := (Pointer(Integer(pData) + I*Width*3 + J*3 + 1)); InvData[j,0,2] := (Pointer(Integer(pData) + I*Width*3 + J*3 + 2)); InvData[j,1,0] := (Pointer((Integer(pData) + (Width-i)*Width*3 + j*3 + 0))); InvData[j,1,1] := (Pointer((Integer(pData) + (Width-i)*Width*3 + j*3 + 1))); InvData[j,1,2] := (Pointer((Integer(pData) + (Width-i)*Width*3 + j*3 + 2))); TMP[j,0] := InvData[j,0,0]^; TMP[j,1] := InvData[j,0,1]^; TMP[j,2] := InvData[j,0,2]^; InvData[j,0,0]^ := InvData[j,1,0]^; InvData[j,0,1]^ := InvData[j,1,1]^; InvData[j,0,2]^ := InvData[j,1,2]^; InvData[j,1,0]^ := TMP[j,0]; InvData[j,1,1]^ := TMP[j,1]; InvData[j,1,2]^ := TMP[j,2]; end; end; |
Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
Liste der Anhänge anzeigen (Anzahl: 2)
So jetzt hole ich endlich wieder eine neue Version aus meiner Programmierstube.
Es haben sich nochmal einige kleinigkeiten verändert. Der Multiplayer-Modus ist zwar noch nicht fertig, aber schon im Spiel integriert. Wer also den mal testen will, kann das mal versuchen. MFG Björn |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz