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

Delphi Sources



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

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

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



вот собственно код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
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, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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