Delphi-PRAXiS
Seite 7 von 7   « Erste     567   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.) (https://www.delphipraxis.net/109239-%5Bgame%5D-bloggy-%5Balpha-version-0-6%5D-multiplayer.html)

olee 4. Mär 2008 22:15

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:
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;
Hier mal der relevante Code der laden-funktion.

3_of_8 4. Mär 2008 22:38

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:
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);
(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)

olee 4. Mär 2008 22:44

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?

3_of_8 4. Mär 2008 22:53

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.

olee 4. Mär 2008 22:56

Re: [GAME] Bloggy [ALPHA Version 0.6] (Multiplayer.?.)
 
EDIT: Erledigt

olee 5. Mär 2008 00:42

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;

olee 5. Mär 2008 01:38

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 00:01 Uhr.
Seite 7 von 7   « Erste     567   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz