| | أهلاً بك ضيف

 

 

[ المشاركات الجديدة · المشاركين · قواعد المنتدى · بحث · RSS ]

    • صفحة 1 من%
    • 1
    لعبه ماريو
    karika  التاريخ: الجمعة, 2020-12-11, 6:51 PM | رسالة # 1
    عضو فعال
    مجموعة: المدراء
    عدد المشاركات: 44
    التقييم: 427
    حالة: Offline
     
    كود
    {
      PROGRAMANDO JOGOS - AGNALDO BRODIS
      OPEN SOURCE - DISTRIBUA LIVREMENTE. MANTENHA OS CRÉDITOS
      DO AUTOR.
      AUTOR: ANTONIO SÉRGIO DE SOUSA VIEIRA 2002
      AGRADECIMENTOS: FABRÍCIO CATAE
      BRASIL - FORTALEZA - CE
      http://www15.brinkster.com/djddelphi
    }

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, StdCtrls;

    type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Iniciar1: TMenuItem;
        sergiosvieiraigcombr1: TMenuItem;
        procedure Iniciar1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    type
      TSentidoX = (Esquerda,Direita,Parado);
      TSentidoY = (Cima,Baixo);
      TBloco = Record
        BRect: TRect;
        Index: Integer;
        Solido: Boolean;
      end;
      TAgnaldo = Record
        PosX,PosY: Integer;
        ImgMascara: TBitmap;
        Frame: Integer;
        FXX: Integer;
        Visivel: Boolean;
        SentidoX: TSentidoX;
        SentidoY: TSentidoY;
        Pulo: Boolean;
        Veloc: Integer;
        Acele: Integer;
      end;
      TCoordenada = Record
        x,y: Integer;
      end;
      TCamera = Record
        PosX: Integer;
        PosY: Integer;
        Sentido: TSentidoX;
        Travada: Boolean;
      end;

    const
      COL = 200;
      LIN = 8;
      TAM = 16;
      POT = 4;
      LAR = 320;
      ALT = 240;

    var
      Form1: TForm1;
      cnjBlocos: array[0..COL,0..LIN] of TBloco;
      Blocos: array[0..5] of TBitmap;
      OFFScr: TBitmap;
      Imagem, Mascara: TBitmap;
      Mario: TAgnaldo;
      Res: TBitmap;
      Camera: TBitmap;
      Cam: TCamera;
      A,B,C,D: TCoordenada;
    implementation

    {$R *.dfm}

    procedure TForm1.Iniciar1Click(Sender: TObject);
    { CAMERA }
    procedure Desenhar_Camera;
    begin
      BitBlt(Camera.Canvas.Handle,0,0,LAR,ALT,
             OFFScr.Canvas.Handle, Cam.PosX, Cam.PosY,SrcCopy);
    end;
    procedure Mover_Camera;
    begin
      Cam.PosX:= Mario.PosX - LAR div 4;

      if Cam.PosX <= 0 then
         Cam.PosX:= 0
      else
         if Cam.PosX + LAR >= OFFScr.Width then
            Cam.PosX:= OFFScr.Width - LAR;
    end;

    procedure Carregar_Imagens(Nome: String);
    var i: Integer;
        Bmp: TBitmap;
    begin
      Bmp:= TBitmap.Create;
      Bmp.LoadFromFile(Nome);
      for i:= 0 to 5 do
          begin
            Blocos [i]:= TBitmap.Create;
            Blocos[i].Width:= TAM;
            Blocos[i].Height:= TAM;
            BitBlt(Blocos[i].Canvas.Handle,0,0,TAM,TAM,
                   Bmp.Canvas.Handle,(i * TAM) + 1,1,SrcCopy);
          end;
      Bmp.Free;
    end;
    procedure Carregar_Mapa(Nome: String);
    var Arquivo: TextFile;
        x,y,i: Integer;
        Temp: Char;
    begin
      x:=0;y:=0;
      i:=0;
      AssignFile(Arquivo,Nome);
      Reset(Arquivo);
      while not EOF(Arquivo) do
            begin
              Read(Arquivo,Temp);

              Case Temp of
                #13: Temp:= #48;
                #10: Temp:= #48;
                else
                  begin
                    i:= strtoint(Temp);
                    cnjBlocos[x,y].BRect := Rect(x shl POT,y shl POT,
                        (x shl POT) + TAM,
                        (y shl POT) + TAM);
                    cnjBlocos[x,y].Index := i;
                    if (i>0) and (i<10) then
                       cnjBlocos[x,y].Solido:= True;
                    if i = 0 then
                       cnjBlocos[x,y].Solido:= False;
                    if x = COL - 1 then
                       begin
                         x:=0;
                         inc(y);
                       end
                    else
                       Inc(x);
                  end;
              end;
            end;
      CloseFile(Arquivo);
    end;
    procedure Desenhar_Blocos(IX,FX: Integer);
    var x,y,i: Integer;
    begin
      for x:= IX to FX  do
          for y:= 0 to LIN  do
              with cnjBlocos[x,y] do
              begin
                OFFScr.Canvas.Draw(BRect.Left - 1,BRect.Top - 1,Blocos[cnjBlocos[x,y].Index]);
              end;
    end;
    { AGNALDO }
    procedure Criar_Imagem(Nome: String);
    begin
      Imagem:= TBitmap.Create;
      Imagem.LoadFromFile(Nome);

      Mascara:= TBitmap.Create;
      Mascara.Assign(Imagem);
      Mascara.Mask(RGB(255,0,255));

      Mario.ImgMascara:= TBitmap.Create;
      Mario.ImgMascara.Width := Imagem.Width;
      Mario.ImgMascara.Height:= Imagem.Height;

      BitBlt(Mario.ImgMascara.Canvas.Handle, 0, 0, Imagem.Width, Imagem.Height,
             Mascara.Canvas.Handle, 0, 0, SrcCopy);
      BitBlt(Mario.ImgMascara.Canvas.Handle, 0, 0, Imagem.Width, Imagem.Height,
             Imagem.Canvas.Handle, 0, 0, SrcErase);

      Canvas.Draw(0,200,Mario.ImgMascara);
    end;
    procedure Desenhar_Mario(x,y,NFRAME,Repete: Integer);
    begin
    with Mario do
    begin
    if Visivel then
        begin
          if Frame > NFRAME then
             Frame := 0;

          if Mario.SentidoX = Parado then
             Frame:= 0;

          if Mario.SentidoY = Cima then
             Frame:= 5
          else
             if Mario.Veloc < 0 then
                Frame:= 5;

             BitBlt(OFFScr.Canvas.Handle,x,y,17,17,Mascara.Canvas.Handle,
                    Frame * 17,0,SrcAnd);
             BitBlt(OFFScr.Canvas.Handle,x,y,17,17,ImgMascara.Canvas.Handle,
                    Frame * 17,0,SrcInvert);

          if FXX = Repete then
             begin
               if (Mario.SentidoX<>Parado) then
               Inc(Frame);
               FXX := 0;
             end
          else
             if (Mario.SentidoX<>Parado) then
             Inc(FXX);
        end;

    {  if Frame > NFRAME then
         Frame := 0;

      BitBlt(OFFScr.Canvas.Handle,x,y,16,16,Mascara.Canvas.Handle,
             (Frame * 16) + 1,0,SrcAnd);
      BitBlt(OFFScr.Canvas.Handle,x,y,16,16,ImgMascara.Canvas.Handle,
             (Frame * 16) + 1,0,SrcInvert);
      if Mario.SentidoX <> Parado then
         inc(Frame);
      }
    end;
    end;
    { FUNçÔES}
    procedure Detectar_Bloco(x,y: Integer);
    begin
      // PONTOS DA COLISÃO PELA DIREITA
      B.x:= (x + 1 shl POT) div (1 shl POT);
      B.y:= y div (1 shl POT);

      D.x:= (x + 1 shl POT) div (1 shl POT);
      D.y:= (y + 1 shl POT) div (1 shl POT);

      // PONTOS DA COLISÃO PELA ESQUERDA
      A.x:= x div (1 shl POT);
      A.y:= y div (1 shl POT);

      C.x:= x div (1 shl POT);
      C.y:= (y + 1 shl POT) div (1 shl POT);
    end;

    { TECLADO }
    procedure Ler_Teclado;
    begin
      if GetKeyState(vk_left)<0 then
         Mario.SentidoX:= Esquerda
      else
         if GetKeyState(vk_right)<0 then
            Mario.SentidoX:= Direita
         else
            Mario.SentidoX:= Parado;

    end;
    procedure Mover_Mario(x,y,Velocidade: Integer);
    var NovoXX,NovoXY: Integer;
        NovoYX,NovoYY: Integer;
    begin
      if Mario.SentidoX = Esquerda then
         begin
           NovoXX:= Mario.PosX - Velocidade;
           NovoXY:= Mario.PosY;
           Detectar_Bloco(NovoXX,NovoXY);
           if cnjBlocos[A.x,A.y].Solido then
              begin
                NovoXX:= cnjBlocos[A.x,A.y].BRect.Right + 1;
              end
           else
              if cnjBlocos[c.x,c.y].Solido then
                 begin
                   NovoXX:= cnjBlocos[c.x,c.y].BRect.Right + 1;
                 end;
           if NovoXX<0 then
              NovoXX:=0;

           Mario.PosX:= NovoXX;
           Mario.PosY:= NovoXY;
         end
      else
         if Mario.SentidoX = Direita then
            begin
              NovoXX:= Mario.PosX + Velocidade;
              NovoXY:= Mario.PosY;
              Detectar_Bloco(NovoXX,NovoXY);
              if cnjBlocos[B.x,B.y].Solido then
                 begin
                   NovoXX:= cnjBlocos[B.x,B.y].BRect.Left - TAM - 1;
                 end
              else
                 if cnjBlocos[D.x,D.y].Solido then
                    begin
                      NovoXX:= cnjBlocos[D.x,D.y].BRect.Left - TAM - 1;
                    end;

              if NovoXX+TAM>OFFScr.Width then
                 NovoXX:= OFFScr.Width - TAM;

              Mario.PosX:= NovoXX;
              Mario.PosY:= NovoXY;
            end
         else
            Mario.SentidoX:= Parado;
    end;
    procedure Checar_Pulo;
    begin
      if GetKeyState(vk_control)<0 then
         begin
           Mario.Pulo:= True;
           Mario.Veloc:= 13;
         end;
    end;
    procedure Pular(Repete: Integer);
    var NovoYX,NovoYY: Integer;
    begin
      if Mario.Pulo then
         begin

           Dec(Mario.Veloc,Mario.Acele);
           Dec(Mario.PosY,Mario.Veloc);

           if Mario.Veloc < -6 then
              Mario.Veloc:= -6;
           //OFFScr.Canvas.TextOut(Cam.PosX,0,'TRUE');
         end;
    //  else
    //     OFFScr.Canvas.TextOut(Cam.PosX,0,'FALSE');

      if Mario.Veloc > 0 then
         Mario.SentidoY := Cima
      else
         if Mario.Veloc < 0 then
            Mario.SentidoY := Baixo;

      if Mario.PosY>OFFScr.Height then
         begin
           Mario.Pulo:= True;
           ShowMessage('GAME OVER');
           Mario.PosX:= 0;
           Mario.PosY:= 0;
         end;

            if Mario.SentidoY = Cima then
               begin
                 //OFFScr.Canvas.TextOut(Cam.PosX,30,'Cima');
                 NovoYX:= Mario.PosX;
                 NovoYY:= Mario.PosY;
                 Detectar_Bloco(NovoYX,NovoYY);

                 if cnjBlocos[A.x,A.y].Solido then
                    begin
                      NovoYY:= cnjBlocos[A.x,A.y].BRect.Top + TAM + 1;
                    end
                 else
                    if cnjBlocos[B.x,B.y].Solido then
                       begin
                         NovoYY:= cnjBlocos[B.x,B.y].BRect.Top + TAM + 1;
                       end;

                 if NovoYY<0 then
                    NovoYY:= 0;

                      Mario.PosX:= NovoYX;
                      Mario.PosY:= NovoYY;
               end
            else
               if Mario.SentidoY = Baixo then
                  begin
                    //OFFScreen.Canvas.TextOut(Cam.PosX,30,'Baixo');

                    NovoYY:= Mario.PosY;
                    NovoYX:= Mario.PosX;
                    Detectar_Bloco(NovoYX,NovoYY);

                    if cnjBlocos[C.x,C.y].Solido then
                       begin
                         NovoYY:= cnjBlocos[C.x,C.y].BRect.Top - TAM - 1;
                         Mario.Veloc:= 0;
                         Mario.Pulo:= False;
                       end
                    else
                       if cnjBlocos[D.x,D.y].Solido then
                          begin
                            NovoYY:= cnjBlocos[D.x,D.y].BRect.Top - TAM - 1;
                            Mario.Veloc:= 0;
                            Mario.Pulo:= False;
                          end
                       else
                          if Mario.SentidoX <> Parado then Mario.Pulo:= True;

                    Mario.PosX:= NovoYX;
                    Mario.PosY:= NovoYY;
                  end;

      Sleep(15);
    end;
    procedure ChangeMode;
    const
      ENUM_CURRENT_SETTINGS = Cardinal(-1);
      ENUM_REGISTRY_SETTINGS = Cardinal(-2);
    var
      D: TDevMode;
      FLastMode : TDevMOde;
    begin
      if not EnumDisplaySettings(nil, ENUM_REGISTRY_SETTINGS, FLastMode) then begin
        ShowMessage('Não consegui pegar as configurações atuais do vídeo. Não vou mudar de modo');
      end else begin
        FillChar(D, SizeOf(TDevMode), 0);
        D.dmSize := SizeOf(TDevMode);
        D.dmPelsWidth := 320;
        D.dmPelsHeight := 240;
        D.dmBitsPerPel := 16;
        D.dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
        if ChangeDisplaySettings(D, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL then begin
          ShowMessage('Não consegui mudar o modo de vídeo...');
        end;
      end;
    end;
    var i: Integer;
    begin
      //BorderStyle:= bsNone;
      Color := ClBlack;
      Canvas.Font.Color := clWhite;
      //WindowState := wsMaximized;
      //MainMenu1.AutoMerge := True;
      //ChangeMode;
      Carregar_Imagens('001.bmp');
      Carregar_Mapa('Fase1.txt');
      Criar_Imagem('Agnaldo.bmp');
      while not Application.Terminated do
      begin
        Desenhar_Blocos(Cam.PosX div TAM,(Cam.PosX div TAM) + 10);
        Ler_Teclado;
        if not Mario.Pulo then
           Checar_Pulo;
        Pular(5);
        Mover_Mario(Mario.PosX, Mario.PosY, 3);
        Desenhar_Mario(Mario.PosX,Mario.PosY,4,3);
        Desenhar_Camera;
        Mover_Camera;

        //Canvas.Draw(0,0,OFFScr);
        StretchBlt(Res.Canvas.Handle,0,0,320,240,
           Camera.Canvas.Handle,0,0,160,120,SrcCopy);
        Canvas.Draw(0,0,Res);
        Application.ProcessMessages;
      end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin

      OFFScr:= TBitmap.Create;
      OFFScr.Width:= COL * TAM;
      OFFScr.Height:= LIN * TAM;

      Res:= TBitmap.Create;
      Res.Width:= 320;
      Res.Height:= 240;

      Camera:= TBitmap.Create;
      Camera.Width:= LAR;
      Camera.Height:= ALT;

    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      OFFScr.Free;
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ChangeMode2;
    const
      ENUM_CURRENT_SETTINGS = Cardinal(-1);
      ENUM_REGISTRY_SETTINGS = Cardinal(-2);
    var
      D: TDevMode;
      FLastMode : TDevMOde;
    begin
    {  if not EnumDisplaySettings(nil, ENUM_REGISTRY_SETTINGS, FLastMode) then begin
        ShowMessage('Não consegui pegar as configurações atuais do vídeo. Não vou mudar de modo');
      end else begin
        FillChar(D, SizeOf(TDevMode), 0);
        D.dmSize := SizeOf(TDevMode);
        D.dmPelsWidth := 800;
        D.dmPelsHeight := 600;
        D.dmBitsPerPel := 16;
        D.dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
        if ChangeDisplaySettings(D, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL then begin
          ShowMessage('Não consegui mudar o modo de vídeo...');
        end;
      end;}
    end;

    begin
      ShowMessage('EathSun Games');
      ChangeMode2;
    end;

    initialization
      Cam.PosX:= 0;
      Cam.PosY:= 0;
      Cam.Travada:= False;

      Mario.Frame:=0;
      Mario.PosX:= 1;
      Mario.PosY:= 40;
      Mario.Acele:= 1;
      Mario.Pulo:= True;
      Mario.SentidoY:= Baixo;
      Mario.Pulo:= True;
      Mario.Visivel:= True;
      Mario.FXX:= 0;

    end.
    

     
    توقيع  karika

       
    • صفحة 1 من%
    • 1
    بحث:

    welcom in eiss