Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.05.2014, 13:05
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию Непонятная ошибка

EXE запускается ,но по нажатию на кнопку запустить в проекте пишет эту ошибку:



вот собственно код:
Код:
unit tools;

interface

uses Windows, Classes, Controls, DXDraws, DXClass, DXInput, DirectX, sysutils,
     people, global_var;

function ImageCollisionTest(suf1, suf2: TDirectDrawSurface; const rect1, rect2: TRect; x1,y1,x2,y2: Integer; DoPixelCheck: Boolean): Boolean;
function getfeld(mx,my: integer): TPoint;
function makecoord(x: TPoint): TPoint;
procedure drawmap;
procedure drawfeld(x,y: integer);
procedure calcscene;

implementation

uses main, control;


function getfeld(mx,my: integer): TPoint;
var x,y: integer;
    mouserect: TRect;
    picX, bildy: integer;
begin
  x := (mx+posx) div feldbreite;
  y := (my+posy) div feldhoehe;

  result.x := x;
  result.y := y*2;

  picX := mx + posx - x * feldbreite;
  bildy := my + posy - y * feldhoehe;
  mouserect := rect(mx, my, mx+1, my+1);
  //Oben links
  if rectinrect(mouserect, rect(x*feldbreite-posx,  y*feldhoehe-posy,  x*feldbreite+feldbreite div 2-posx,  y*feldhoehe+feldhoehe div 2-posy)) then
    if surf1.Pixels[picX, bildy] = 0 then
    begin result.x:=x-1; result.y:=y*2-1; end;
  //Oben rechts
  if rectinrect(mouserect, rect(x*feldbreite+feldbreite div 2-posx,  y*feldhoehe-posy,  x*feldbreite+feldbreite-posx,  y*feldhoehe+feldhoehe div 2-posy)) then
    if surf1.Pixels[picX, bildy] = 0 then
    begin result.x:=x; result.y:=y*2-1; end;
  //Unten links
  if rectinrect(mouserect, rect(x*feldbreite-posx,  y*feldhoehe+feldhoehe div 2-posy,  x*feldbreite+feldbreite div 2-posx,  y*feldhoehe+feldhoehe-posy)) then
    if surf1.Pixels[picX, bildy] = 0 then
    begin result.x:=x-1; result.y:=y*2+1; end;
  //Unten rechts
  if rectinrect(mouserect, rect(x*feldbreite+feldbreite div 2-posx,  y*feldhoehe+feldhoehe div 2-posy,  x*feldbreite+feldbreite-posx,  y*feldhoehe+feldhoehe-posy)) then
    if surf1.Pixels[picX, bildy] = 0 then
    begin result.x:=x;   result.y:=y*2+1; end;
end;


function makecoord(x: TPoint): TPoint;
begin
  result.x := x.x * feldbreite + (x.y mod 2) * feldhoehe - posx;
  result.y := x.y * feldhoehe div 2 - posy;
end;

procedure drawmap;
var x,y: integer;
begin
  with form1 do
  begin
    drawcount := 0;
    fillchar(drawlist, sizeof(drawlist), 0);

    posx := round(mensch[1].cx) - 320;
    posy := round(mensch[1].cy) - 240;

    if posx < feldbreite then posx := feldbreite;
    if posx + dxdraw1.width > mapwidth*feldbreite then posx := mapwidth*feldbreite - dxdraw1.width;
    if posy < feldhoehe then posy := feldhoehe;
    if posy + dxdraw1.height > mapheight*feldhoehe div 2 then posy := mapheight*feldhoehe div 2 - dxdraw1.height;

    //Untergrund zeichnen
    for y := posy div feldhoehe*2-1 to posy div feldhoehe*2+35 do
      for x := posx div feldbreite-1 to posx div feldbreite+12 do
        dxdraw1.surface.draw(makecoord(point(x,y)).x, makecoord(point(x,y)).y, terrainbilder[karte[x,y].image].ClientRect, terrainbilder[karte[x,y].image],true);

    for y := posy div feldhoehe*2-1 to posy div feldhoehe*2+42 do
      for x := posx div feldbreite-1 to posx div feldbreite+12 do
        if y <= mapheight then
        begin
          drawfeld(x,y);
          if (karte[x-1,y].menschen_kennung > 0) and (x > 0) then drawfeld(x-1,y);
        end;
  end;
end;


procedure drawfeld(x,y: integer);
var h, index: integer;
    p, p2: TPoint;
begin
  with form1 do
  begin
    if karte[x,y].haus_kennung > 0 then
    begin
      h := hausbilder[karte[x,y].haus_kennung].height;
      p := makecoord(point(x, y));
      p2 := point(makecoord(karte[x,y].haus_teil).x + posx, makecoord(karte[x,y].haus_teil).y + posy);
      dxdraw1.surface.Draw(p.x, p.y - h, rect(p2.x, p2.y - h, p2.x + 56, p2.y + 28), hausbilder[karte[x,y].haus_kennung], true);
    end;

    //Mensch
    if karte[x,y].menschen_kennung > 0 then
    begin
      if not (karte[x,y].menschen_kennung in [drawlist[1], drawlist[high(drawlist)]]) then
      begin
        inc(drawcount);
        drawlist[drawcount] := karte[x,y].menschen_kennung;
      end;  

      index := karte[x,y].menschen_kennung;
      dxdraw1.surface.Draw(mensch[index].pos.x, mensch[index].pos.y, menschenbilder[mensch[index].image].ClientRect,menschenbilder[mensch[index].image], true);
      if mensch[index].showanzeigen then
      begin
        case mensch[index].fade of
          300..550: dxdraw1.surface.drawalpha(rect(mensch[index].pos.x, mensch[index].pos.y - 4, mensch[index].pos.x + mensch[index].life, mensch[index].pos.y), rect(0,0,mensch[index].life,4), lebensanzeige, false, mensch[index].fade - 300);
          551..800: dxdraw1.surface.draw(mensch[index].pos.x, mensch[index].pos.y - 4, rect(0, 0, mensch[index].life, 4), lebensanzeige, false);
          801..1050: dxdraw1.surface.drawalpha(rect(mensch[index].pos.x, mensch[index].pos.y - 4, mensch[index].pos.x + mensch[index].life, mensch[index].pos.y), rect(0,0,mensch[index].life,4), lebensanzeige, false, 250 - (mensch[index].fade - 801));
        end;
      end;
    end;
  end;
end;


procedure calcscene;
var i: integer;
begin
  //Eigene Player und KI steuern
  for i := 1 to high(mensch) do
    mensch[i].calc;
end;


function ImageCollisionTest(suf1, suf2: TDirectDrawSurface; const rect1, rect2: TRect;
  x1,y1,x2,y2: Integer; DoPixelCheck: Boolean): Boolean;
  function ClipRect(var DestRect: TRect; const DestRect2: TRect): Boolean;
  begin
    with DestRect do
    begin
      Left := Max(Left, DestRect2.Left);
      Right := Min(Right, DestRect2.Right);
      Top := Max(Top, DestRect2.Top);
      Bottom := Min(Bottom, DestRect2.Bottom);

      Result := (Left < Right) and (Top < Bottom);
    end;
  end;
type
  PRGB = ^TRGB;
  TRGB = packed record
    R, G, B: Byte;
  end;
var
  ddsd1, ddsd2: DDSURFACEDESC;
  r1, r2: TRect;
  tc1, tc2: DWORD;
  x, y, w, h: Integer;
  P1, P2: Pointer;
begin
  r1 := rect1;
  with rect2 do r2 := Bounds(x2-x1, y2-y1, Right-Left, Bottom-Top);

  Result := OverlapRect(r1, r2);

  if (suf1=nil) or (suf2=nil) then Exit;

  if DoPixelCheck and Result then
  begin
    with r1 do r1 := Bounds(Max(x2-x1, 0), Max(y2-y1, 0), Right-Left, Bottom-Top);
    with r2 do r2 := Bounds(Max(x1-x2, 0), Max(y1-y2, 0), Right-Left, Bottom-Top);

    ClipRect(r1, rect1);
    ClipRect(r2, rect2);

    w := Min(r1.Right-r1.Left, r2.Right-r2.Left);
    h := Min(r1.Bottom-r1.Top, r2.Bottom-r2.Top);

    ClipRect(r1, bounds(r1.Left, r1.Top, w, h));
    ClipRect(r2, bounds(r2.Left, r2.Top, w, h));
                               
    ddsd1.dwSize := SizeOf(ddsd1);
    if suf1.Lock(r1, ddsd1) then
    begin
      try
        ddsd2.dwSize := SizeOf(ddsd2);
        if (suf1=suf2) or suf2.Lock(r2, ddsd2) then
        begin
          try
            if suf1=suf2 then ddsd2 := ddsd1;
            if ddsd1.ddpfPixelFormat.dwRGBBitCount<>ddsd2.ddpfPixelFormat.dwRGBBitCount then Exit;

            tc1 := ddsd1.ddckCKSrcBlt.dwColorSpaceLowValue;
            tc2 := ddsd2.ddckCKSrcBlt.dwColorSpaceLowValue;

            case ddsd1.ddpfPixelFormat.dwRGBBitCount of
              8 : begin
                    for y:=0 to h-1 do
                    begin
                      P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
                      P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
                      for x:=0 to w-1 do
                      begin
                        if (PByte(P1)^<>tc1) and (PByte(P2)^<>tc2) then Exit;
                        Inc(PByte(P1));
                        Inc(PByte(P2));
                      end;
                    end;
                  end;
              16: begin
                    for y:=0 to h-1 do
                    begin
                      P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
                      P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
                      for x:=0 to w-1 do
                      begin
                        if (PWord(P1)^<>tc1) and (PWord(P2)^<>tc2) then Exit;
                        Inc(PWord(P1));
                        Inc(PWord(P2));
                      end;
                    end;
                  end;
              24: begin
                    for y:=0 to h-1 do
                    begin
                      P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
                      P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
                      for x:=0 to w-1 do
                      begin        
                        with PRGB(P1)^ do if (R shl 16) or (G shl 8) or B<>tc1 then Exit;
                        with PRGB(P2)^ do if (R shl 16) or (G shl 8) or B<>tc2 then Exit;
                        Inc(PRGB(P1));
                        Inc(PRGB(P2));
                      end;
                    end;
                  end;
              32: begin
                    for y:=0 to h-1 do
                    begin
                      P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
                      P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
                      for x:=0 to w-1 do
                      begin
                        if (PDWORD(P1)^<>tc1) and (PDWORD(P2)^<>tc2) then Exit;
                        Inc(PDWORD(P1));
                        Inc(PDWORD(P2));
                      end;
                    end;
                  end;
            end;
          finally
            if suf1<>suf2 then suf2.UnLock;
          end;
        end;
      finally
        suf1.UnLock;
      end;
    end;

    Result := False;
  end;
end;

end.
Ответить с цитированием
  #2  
Старый 07.05.2014, 13:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Ошибка "Types of actual and formal var parameters must be identical" означает, что не совпадают типы параметров вызываемой функции с типами переменных передаваемых в эту функцию.
Ответить с цитированием
  #3  
Старый 07.05.2014, 21:05
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

почему тогда exeшник запускается?
Ответить с цитированием
  #4  
Старый 07.05.2014, 21:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Очевидно, запускается старая версия, скомпилированная Н-ное время назад. Это ошибка этапа компиляции, новый EXE не может быть создан с такой ошибкой.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 07.05.2014, 22:19
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

так а что именно мне заменить?а то я перебрал пару вариантов но не вышло ничего! (
Ответить с цитированием
  #6  
Старый 07.05.2014, 22:23
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Надо не перебирать варианты, а подробно изучить работу с DirectDraw и понять, что там должны быть за параметры. Я с DirectDraw не работал, но примеров в инете хватает.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 07.05.2014, 22:39
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

как думаешь углубиться в direct или же изучать opengl?
Ответить с цитированием
  #8  
Старый 07.05.2014, 22:41
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

и ещё: стоит ли вообще изучать директ,мб лучше стандартными игры делать?(типа рпг,стратегии)
Ответить с цитированием
  #9  
Старый 08.05.2014, 00:27
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
мб лучше стандартными игры делать?(типа рпг,стратегии)
... шта?
рпг/стратегии - это жанры игр, которые могут делаться на чем угодно, хоть на бумажке.
DirectDraw и OpenGL - технологии 3д графики, которые могут использоваться и для игр, и для чего угодно другого. 99% трехмерных игр, независимо от их жанра или "стандартности", сделаны на них.
О чем вообще вопрос?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 08.05.2014 в 00:35.
Ответить с цитированием
  #10  
Старый 08.05.2014, 10:22
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

так то DirectX библиотека создана в основном для работы с 2D.вот я и спрашиваю:во что лучше углубиться в ДИкс или ОГЛ?а рпг, стратегии-это единственные игры которые интересно писать.
Ответить с цитированием
  #11  
Старый 08.05.2014, 21:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
так то DirectX библиотека создана в основном для работы с 2D
еще раз... ШТА?
Неужели ни разу при установке мощных трехмерных игр не выскакивано "установите последний DirectX"?
Цитата:
Сообщение от Википедия
Ключевые особенности версий
DirectX 6.0 — мультитекстурирование
DirectX 7.0 — аппаратная поддержка преобразований, обрезания и освещения
DirectX 8.0 — шейдерная модель 1.1
DirectX 8.1 — пиксельные шейдеры 1.4 и вершинные шейдеры 1.1
DirectX 9.0 — шейдерная модель 2.0
DirectX 9.0b — пиксельные шейдеры 2.0b и вершинные шейдеры 2.0
DirectX 9.0c — шейдерная модель 3.0
DirectX 9.0L — версия DirectX 9.0 для Windows Vista
DirectX 10 — шейдерная модель 4.0 (только Windows Vista, Windows 7, Windows 8)
DirectX 10.1 — шейдерная модель 4.1 (только Windows Vista, Windows 7, Windows 8)
DirectX 11 — шейдерная модель 5.0 (только Windows Vista, Windows 7, Windows 8)
DirectX 11.1 — шейдерная модель 5.0 (только Windows 7 SP1, Windows 8)
DirectX 11.2 — шейдерная модель 5.0 (только Windows 8.1)
Каким образом всё это может быть "создано в основном для работы с 2D"?
Рекомендация - сначала изучить детально, ЧТО такое директX, ЧТО такое OpenGL, потом определиться, ЧТО конкретно хочется написать и ГДЕ это должно работать, и только после этого выбирать directx/opengl. Тогда все подобные вопросы отпадут за неимением в них смысла.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #12  
Старый 09.05.2014, 22:40
phomm phomm вне форума
Новичок
 
Регистрация: 07.10.2013
Адрес: Тюмень
Сообщения: 50
Версия Delphi: 7/2007/XE+/FPC
Репутация: 22
По умолчанию

Сперва стоит написать _самостоятельно_ какую-нибудь змейку или пакмана, а не пытаться ковырять нагугленные исходники (те что в ОП - какого-то немца) и возиться с древними технологиями.
Про дельфиХ (не директикс) я так понимаю вы сказали, что они в основном для 2д - в целом да, доля правды.
Я уже отвечал какие движки лучше рассмотреть для работы с 2д
Неплохим опытом может быть и просто работа с GDI (канвас и графические винапи).
Чистый опенгл и директикс для Вас сейчас будет чрезвычайно сложным делом изучать.
И да - "игры делать - не игрушки", в том смысле, что Вы даже платформер не потянете, не говоря уж о чём-то более сложном, мой Вам совет - не замахивайтесь на стратегии пока что, освойте необходимый минимум, и потом уже садитесь разрабатывать игру, не писать, а именно разрабатывать, хоть просто на листочке - концепцию, архитектуру, подсистемы.
Ответить с цитированием
  #13  
Старый 09.05.2014, 22:57
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Andorra ацки толстая (и неудобная; как-то вязал ее с lua -- сильно задолбала она меня), я использовал jedi sdl. Вкл. нужные флаги и работай хоть как с канвой, хоть какс 3д.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter