Autor Beitrag
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Fr 10.10.08 19:11 
Hi,

Zu deinem Scrolling: Normalerweise wird ja nur gescrollt, wenn der Cursor in die Randbereiche des Bildschirms kommt. Ich habe mir es mal objektiv angesehen.

Hat auch Vorteile. Aber: Beim Fokussieren eines bestimmten Bildschirmbereiches und gleichzeitigen Klicken auf ein Gebäude behindert es kolossal(angenommen du willst nicht einfach auf eine Stelle klicken, sondern z.B. fünf Gebäude gleichzeitig im Blickfeld haben. Und dann eben diese fünf sehen und relativ dazu ein sechstes platzieren).

Könntest du das Scrolling abschalten, während z.B. die Strg-Taste oder die rechte Maustaste gedrückt ist? Dann ginge beides :)

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 10.10.08 22:13 
Hey,

Wunsch ist erfüllt und halte ich auch für sinnvoll. Durch Druck auf die STRG Taste wird das Scrollen für entsprechende Zeit deaktiviert - erhöht das Gameplay schon ziemlich drastisch.

Heute bin ich leider nicht in dem Maße zur Spielsteuerung gekommen, wie ich es eigentlich wollte, da ich mich vorher erstmal mit der Bildschirmausgabe von Nachrichten für den Benutzer herumquälen musste. Funktioniert nun eigentlich, aber irgendwie gibt's noch ein Zugriffsfehler, der nur dann passiert, wenn man ganz häufig hintereinander (momentan natürlich nur) Mühlen baut. Woran das liegt weiß ich noch nicht, habe aber auch heute keinen Nerv mehr das rauszufinden.

Morgen gibt's erst wieder Abends was von mir zu hören, da ich tagsüber unterwegs bin. Für morgen habe ich mir jetzt die Behebung des Bugs + Steuerung vorgenommen.
Ich weiß zwar noch nicht, wie genau ich meiner TMessageWindow Klasse eine entsprechende Klickprozedur implementieren kann (und eventuell auch noch eine Button Klasse), damit man ab morgen auch mal mehr als nur Mühlen bauen kann.

Bisher ist also Fertig gestellt:
* Gebäudeimplementierung
* Ressourcenneuberechnung nach Spielzyklus
* Statusmessageausgabe
* Grafikausgabe (nur die entsprechenden Tiles muss ich noch modellieren (Ich modelliere die Tiles in c4d mit isometrischer Ansicht und skaliere sie dann auf entsprechende 64*32px herunter))

Die aktuelle Version gibt's im ersten Beitrag.
Anbei wieder mal meine Uobject.pas:

ausblenden volle Höhe Delphi-Quelltext
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:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
unit Uobject;

interface

Uses SysUtils,Classes,Graphics,DXDraws;

type TSTringdynarray = array of String;

type

  Tressources=Class(TObject)
  private
    b_oat:integer;
    b_stone:integer;
    b_metal:integer;
    procedure setoat(o:integer);
    procedure setstone(s:integer);
    procedure setmetal(m:integer);
  public
    property oat:integer read b_oat write setoat;
    property stone:integer read b_stone write setstone;
    property metal:integer read b_metal write setmetal;
  end;

  Tpropertylist=Class(TObject)
  private
    b_name:string;
    b_building_id:integer;
    b_tile_id:integer;
    b_need:Tressources;
    b_produce:Tressources;
    b_produce_time:TRessources;
    b_make_inhabitants:integer;
    b_max_level:integer;
    b_life_points:integer;
    b_time:Tressources;
    procedure setname(n:string);
    procedure setbuilding_id(b:integer);
    procedure settile_id(ti:integer);
    procedure setneed(ne:Tressources);
    procedure setproduce(pro:Tressources);
    procedure setproduce_time(prot:Tressources);
    procedure setmake_inhabitants(mi:integer);
    procedure setmax_level(ml:integer);
    procedure setlife_points(lp:integer);
    procedure settime(t:Tressources);
  public
    constructor create;
    destructor destroy;
    property name:string read b_name write setname;
    property building_id:integer read b_building_id write setbuilding_id;
    property tile_id:integer read b_tile_id write settile_id;
    property need:Tressources read b_need write setneed;
    property produce:Tressources read b_produce write setproduce;
    property produce_time:TRessources read b_produce_time write setproduce_time;
    property make_inhabitants:integer read b_make_inhabitants write setmake_inhabitants;
    property max_level:integer read b_max_level write setmax_level;
    property life_points:integer read b_life_points write setlife_points;
    property time:Tressources read b_time write settime;
  end;

  Tspieler=Class(TObject)
  private
    b_res:Tressources;
    b_inhabitants:integer;
    b_century:integer;
    //b_messages:array of TMessage;
    b_messages:array of String;
    procedure setressources(res:Tressources);
    procedure setinhabitants(inhab:integer);
    procedure setcentury(centu:integer);
    function gettext(Index: Integer): string;
    procedure puttext(Index: Integer; tex: string);
  public
    constructor create(oat,stone,metal,inhabitants,century:integer);
    destructor destroy;
    property ressources:Tressources read b_res write setressources;
    property inhabitants:integer read b_inhabitants write setinhabitants;
    property century:integer read b_century write setcentury;
    property messages[Index: Integer]: string read gettext write puttext; default;
  end;

  TMessagewindow=Class(TObject)    //MESSAGEANZEIGE -- NOCH NICHT FERTIG
  private
    b_posx:integer;
    b_posy:integer;
    b_width:integer;
    b_height:integer;
    b_visible:Boolean;
    b_text:array of string;
    procedure setvisible(vis:Boolean);
    function gettext(Index: Integer): string;
    procedure puttext(Index: Integer; tex: string);
  public
    procedure draw(canvas:TDirectDrawSurfaceCanvas); //MUSS NOCH KOMPLETTIERT WERDEN
    constructor create(x,y,width,height:integer;visible:boolean);
    property visible:Boolean read b_visible write setvisible;
    procedure setpos(posx,posy:integer);
    procedure setzsize(width,height:integer);
    property text[Index: Integer]: string read gettext write puttext; default;
  end;

  TPropertymanager=Class(Tobject)
  private
    props:Tpropertylist;
    procedure setprops(prop:Tpropertylist);
  public
    constructor create(building_file:string;building_typ:integer);
    destructor destroy;
    property properties:Tpropertylist read props write setprops;
  end;

  TBuilding=Class(Tobject)
  private
    prope_manager:Tpropertymanager;
    xcoord:integer;
    ycoord:integer;
    b_typ:integer;
    b_level:integer;  //Entwicklungsstufe
    b_status:integer;//"Gesundheitszustand" des Gebäudes
    procedure setx(x:integer);
    procedure sety(y:integer);
    procedure settyp(typ:integer);
    procedure setlevel(level:integer);
    procedure setstatus(status:integer);
    procedure setpropmanager(propmanager:Tpropertymanager);
  public
    constructor create(building_typ:integer);
    destructor destroy;
    property x:integer read xcoord write setx;
    property y:integer read ycoord write sety;
    property typ:integer read b_typ write settyp;
    property level:integer read b_level write setlevel;
    property status:integer read b_status write setstatus;
    property prop_manager:Tpropertymanager read prope_manager write setpropmanager;
    procedure develop;    //Gebäude entwickeln (Inkrementiere Level)
  end;

  TObjectmanager=Class(TObject)
  private
    object_id:integer; //Fortlaufende Objektid
    object_array: array of Tbuilding;
  protected
    function getbuilding(Index: Integer): Tbuilding;
    procedure putbuilding(Index: Integer; build:Tbuilding);
  public
    constructor create;
    destructor destroy;
    function build(typ:integer;x,y:integer;stufe:integer;spieler:Tspieler):integer;
    function search(x,y:integer):integer;
    property objects[Index: Integer]: Tbuilding read getbuilding write putbuilding; default;
    property max_id:integer read object_id;
  end;

  TGame=Class(TObject)
  private
    b_objectmanager:Tobjectmanager;
    b_reswindow:TMessagewindow;
    b_eventwindow:TMessagewindow;
    b_infowindow:TMessagewindow;
    b_spieler:Tspieler;
    procedure inctime(res:Tressources);
    procedure setobjectmanager(om:Tobjectmanager);
    procedure setinfowindow(iw:TMessagewindow);
  public
    constructor create();
    destructor destroy;
    procedure calcressources;
    procedure tick;
    procedure informplayer;
    property Objectmanager : TObjectmanager read b_objectmanager write setobjectmanager;
    property reswindow : TMessagewindow read b_reswindow;
    property eventwindow : TMessageWindow read b_eventwindow;
    property infowindow : TMessageWindow read b_infowindow write setinfowindow;
    property spieler : TSpieler read b_spieler;
  end;

implementation

function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;

//############################# TRESSOURCES #############################

procedure Tressources.setoat(o:integer);
begin
  b_oat:=o;
end;

procedure Tressources.setstone(s:integer);
begin
  b_stone:=s;
end;

procedure Tressources.setmetal(m:integer);
begin
  b_metal:=m;
end;

//############################# TPROPERTYLIST #############################

constructor Tpropertylist.create();
begin
    b_need:=Tressources.create;
    b_produce:=Tressources.create;
    b_produce_time:=Tressources.create;
    b_time:=Tressources.create;
end;

destructor Tpropertylist.destroy;
begin
    b_need.Free;
    b_produce.Free;
    b_produce_time.Free;
    b_time.Free;
end;

procedure Tpropertylist.setname(n:string);
begin
  b_name:=n;
end;

procedure Tpropertylist.setbuilding_id(b:integer);
begin
  b_building_id:=b;
end;

procedure Tpropertylist.settile_id(ti:integer);
begin
  b_tile_id:=ti;
end;

procedure Tpropertylist.setneed(ne:Tressources);
begin
  b_need:=ne;
end;

procedure Tpropertylist.setproduce(pro:Tressources);
begin
  b_produce:=pro;
end;

procedure Tpropertylist.setproduce_time(prot:Tressources);
begin
  b_produce_time:=prot;
end;

procedure Tpropertylist.setmake_inhabitants(mi:integer);
begin
  b_make_inhabitants:=mi;
end;

procedure Tpropertylist.setmax_level(ml:integer);
begin
  b_max_level:=ml;
end;

procedure Tpropertylist.setlife_points(lp:integer);
begin
  b_life_points:=lp;
end;

procedure Tpropertylist.settime(t:Tressources);
begin
  b_time:=t;
end;

//############################# TSPIELER #############################

constructor Tspieler.create(oat,stone,metal,inhabitants,century:integer);
begin
  b_res:=Tressources.Create;
  b_res.oat:=oat;
  b_res.stone:=stone;
  b_res.metal:=metal;
  b_inhabitants:=inhabitants;
  b_century:=century;
  SetLength(b_messages,1);
end;

destructor Tspieler.destroy;
var i:integer;
begin
    b_res.Free;
    //for i:=0 to length(b_messages)-1 do
    //  b_messages[i].Free;
end;

function Tspieler.gettext(Index: Integer): string;
begin
    Result := b_messages[Index];
end;

procedure TSpieler.puttext(Index: Integer; tex:string);
begin
    if Index >= Length(b_messages)-1 then
      SetLength(b_messages, Length(b_messages)+1);
      b_messages[Index] := tex;
end;

procedure Tspieler.setressources(res:Tressources);
begin
    b_res:=res;
end;

procedure Tspieler.setinhabitants(inhab:integer);
begin
  b_inhabitants:=inhab;
end;

procedure Tspieler.setcentury(centu:integer);
begin
  b_century:=centu;
end;
//############################# TMESSAGEWINDOW #############################

constructor TMessagewindow.create(x:integer;y:integer;width:integer;height:integer;visible:boolean);
begin
  b_posx:=x;
  b_posy:=y;
  b_width:=width;
  b_height:=height;
  b_visible:=visible;
  SetLength(b_text,1);
end;

function TMessagewindow.gettext(Index: Integer): string;
begin
    Result := b_text[Index];
end;

procedure TMessagewindow.puttext(Index: Integer; tex:string);
begin
    if Index >= Length(b_text) then
      SetLength(b_text, Length(b_text)+1);
    b_text[Index] := tex;
end;

procedure TMessagewindow.setpos(posx:Integer;posy:integer);
begin
  b_posx:=posx;
  b_posy:=posy;
end;

procedure TMessagewindow.setzsize(width,height:integer);
begin
  b_width:=width;
  b_height:=height;
end;

procedure TMessagewindow.draw(canvas:TDirectDrawSurfaceCanvas);
var i:integer;
begin
  if b_visible then begin
    canvas.Brush.Color:=clsilver;
    canvas.Font.Color:=clblack;
    canvas.Rectangle(b_posx,b_posy,b_posx+b_width,b_posy+b_height);
    for i:=0 to Length(b_text)-1 do
      canvas.TextOut(b_posx+1,b_posy+1+(i*13),b_text[i]);    //AUCH MEHRZEILIGE TEXTAUSGABEN MÖGLICH.
    canvas.release;
  end;
end;

procedure TMessagewindow.setvisible(vis:Boolean);
begin
  b_visible:=vis;
end;

//############################# TPROPERTY MANAGER #############################

constructor Tpropertymanager.create(building_file:string;building_typ:integer);
var b_file:textfile;
var line:string;
var res:TSTringdynarray;
begin
  props:=Tpropertylist.Create;
  AssignFile(b_file,ExtractFilePath(ParamStr(0)) + building_file);
  Reset(b_file);
  while not eof (b_file) do begin
    readln(b_file,line);
    res:=Explode(',',line,0);
    props.name:=res[0];
    props.building_id:=strtoint(res[1]);
    props.tile_id:=strtoint(res[2]);
    props.need.oat:=strtoint(res[3]);
    props.need.stone:=strtoint(res[4]);
    props.need.metal:=strtoint(res[5]);
    props.produce.oat:=strtoint(res[6]);
    props.produce.stone:=strtoint(res[7]);
    props.produce.metal:=strtoint(res[8]);
    props.produce_time.oat:=strtoint(res[9]);
    props.produce_time.stone:=strtoint(res[10]);
    props.produce_time.metal:=strtoint(res[11]);
    props.make_inhabitants:=strtoint(res[12]);
    props.max_level:=strtoint(res[13]);
    props.life_points:=strtoint(res[14]);
    if building_typ=props.building_id then break;
  end;
end;

destructor Tpropertymanager.destroy;
begin
  props.Free;
end;

procedure Tpropertymanager.setprops(prop:Tpropertylist);
begin
  props:=prop;
end;


//############################# TBUILDING #############################

constructor Tbuilding.create(building_typ:integer);
begin
  prope_manager:=Tpropertymanager.create('building.txt',building_typ);
end;

destructor Tbuilding.destroy;
begin
    prope_manager.Free;
end;

procedure Tbuilding.setpropmanager(propmanager:Tpropertymanager);
begin
    prope_manager:=propmanager;
end;

procedure Tbuilding.develop();
begin
  inc(b_level);
end;

procedure Tbuilding.setx(x:integer);
begin
  xcoord:=x;
end;

procedure Tbuilding.sety(y:integer);
begin
  ycoord:=y;
end;

procedure Tbuilding.settyp(typ:integer);
begin
  b_typ:=typ;
end;

procedure Tbuilding.setlevel(level:integer);
begin
  b_level:=level;
end;

procedure Tbuilding.setstatus(status:integer);
begin
  b_status:=status;
end;

//############################# TOBJECTMANAGER #############################

constructor Tobjectmanager.create();
begin
  object_id:=0;
  SetLength(Object_Array, 2500);
end;

destructor Tobjectmanager.destroy;
var i:integer;
begin
    for i:=0 to length(object_array)-1 do
      object_array[i].Free;
end;

function Tobjectmanager.search(x:integer;y:integer):integer;
var i:integer;
begin
  if object_id>0 then begin
    for i:=0 to object_id-1 do begin
        if (object_array[i].x=x) and (object_array[i].y=y) then begin
          result:=i;
          break;
        end;
        result:=-1;
    end;
  end
  else
    result:=-1;
end;

function Tobjectmanager.getbuilding(Index: Integer): Tbuilding;
begin
  result:=nil;
  if object_id > 0 then
    Result := object_array[Index];
end;

procedure Tobjectmanager.putbuilding(Index: Integer; build:Tbuilding);
begin
  if object_id > 0 then
    object_array[Index] := build;
end;

function Tobjectmanager.build(typ:integer;x,y:integer;stufe:integer;spieler:Tspieler):integer;
begin
    result:=-1;
    object_array[object_id]:=TBuilding.create(typ);
    if spieler.ressources.oat >= object_array[object_id].prop_manager.properties.need.oat then
      if spieler.ressources.stone >= object_array[object_id].prop_manager.properties.need.stone then
        if spieler.ressources.metal >= object_array[object_id].prop_manager.properties.need.metal then begin
          object_array[object_id].typ:=typ;
          object_array[object_id].x:=x;
          object_array[object_id].y:=y;
          object_array[object_id].level:=stufe;
          result:=object_id;
          //Ressourcen abziehen
          spieler.ressources.oat:=spieler.ressources.oat - object_array[object_id].prop_manager.properties.need.oat;
          spieler.ressources.stone:=spieler.ressources.stone - object_array[object_id].prop_manager.properties.need.stone;
          spieler.ressources.metal:=spieler.ressources.metal - object_array[object_id].prop_manager.properties.need.metal;
          spieler.messages[length(spieler.b_messages)-1]:='Gebäude erfolgreich gebaut!';
          inc(object_id);
        end;
    if result=-1 then begin
      object_array[object_id].Free;
      spieler.messages[length(spieler.b_messages)-1]:='Gebäude konnte aufgrund fehlender Ressourcen nicht gebaut werden!';
    end;

end;

//############################# TGAME #############################

constructor Tgame.create;
begin
    b_objectmanager:=Tobjectmanager.create;
    b_reswindow:=TMessagewindow.create(0,0,250,15,true);
    b_eventwindow:=TMessagewindow.create(0,618,375,70,true);
    b_infowindow:= TMessagewindow.create(0,0,150,40,false);
    b_spieler:=Tspieler.create(100,100,100,10,1);
    b_reswindow.text[0]:='   Getreide:   '+inttostr(b_spieler.ressources.oat)+'   Stein:   '+inttostr(b_spieler.ressources.stone)+'   Metall:   '+inttostr(b_spieler.ressources.metal);//RESSOURCENFENSTERTEXT SETZEN
end;

destructor Tgame.destroy;
begin
    b_objectmanager.free;
    b_reswindow.Free;
    b_eventwindow.Free;
    b_infowindow.free;
    b_spieler.Free;
end;

procedure Tgame.setobjectmanager(om:Tobjectmanager);
begin
    b_objectmanager:=om;
end;

procedure Tgame.setinfowindow(iw:TMessagewindow);
begin
    b_infowindow:=iw;
end;

procedure Tgame.tick; //ONTIMER EVENT
begin
  calcressources;
  b_reswindow.text[0]:='   Getreide:   '+inttostr(b_spieler.ressources.oat)+'   Stein:   '+inttostr(b_spieler.ressources.stone)+'   Metall:   '+inttostr(b_spieler.ressources.metal);//RESSOURCENFENSTERTEXT SETZEN
  informplayer;
end;

procedure Tgame.calcressources;
var i,x:integer;
begin                                                                     //Wenn Zeitzähler des Gebäudes=Produktionszeitintervall, dann füge Ressourcen hinzu und Zähler=0
  for i:=0 to b_objectmanager.max_id-1 do begin
    inctime(b_objectmanager.objects[i].prop_manager.properties.time);
    if b_objectmanager.objects[i].prop_manager.properties.time.oat>=b_objectmanager.objects[i].prop_manager.properties.produce_time.oat then begin
       b_spieler.ressources.oat:=b_spieler.ressources.oat+b_objectmanager.objects[i].prop_manager.properties.produce.oat;
       b_objectmanager.objects[i].prop_manager.properties.time.oat:=0;
    end;
    if b_objectmanager.objects[i].prop_manager.properties.time.stone>=b_objectmanager.objects[i].prop_manager.properties.produce_time.stone then begin
       b_spieler.ressources.stone:=b_spieler.ressources.stone+b_objectmanager.objects[i].prop_manager.properties.produce.stone;
       b_objectmanager.objects[i].prop_manager.properties.time.stone:=0;
    end;
    if b_objectmanager.objects[i].prop_manager.properties.time.metal>=b_objectmanager.objects[i].prop_manager.properties.produce_time.metal then begin
       b_spieler.ressources.metal:=b_spieler.ressources.metal+b_objectmanager.objects[i].prop_manager.properties.produce.metal;
       b_objectmanager.objects[i].prop_manager.properties.time.metal:=0;
    end;
  end;
end;

procedure Tgame.inctime(res:Tressources);
begin
    res.oat:=res.oat+1;
    res.stone:=res.stone+1;
    res.metal:=res.metal+1;
end;

procedure Tgame.informplayer;
var i,j:integer;
begin
    eventwindow.text[0]:=' STATUS';
    j:=length(spieler.b_messages)-5;
    if j<0 then j:=0; 
    for i:=j to length(spieler.b_messages)-1 do begin    //4 letzten Statusnachrichten anzeigen
        if spieler.messages[i]<>'' then begin
          eventwindow.text[length(spieler.b_messages)-i-1]:='   '+spieler.messages[i];
        end;
    end;
end;

end.


Lg,
Kai
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: Sa 11.10.08 07:22 
Hmmm ich finde es biss jetzt sehr gut!

Aber könnte mann nicht vllt statt dem Gitternetz einfach nur gras haben? also wo es wie in einem Gitternetz ist
bloß mann sieht es halt nicht^^

aber ich glaube das wird echt cool wenns fertig ist^^

_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>
passiv
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 270

WIN XP Professional
Delphi 7 Enterprise, Java (Eclipse), Python 2.5, Django 1.1
BeitragVerfasst: Sa 11.10.08 09:37 
ich habs mir bisher noch nicht angesehen, weils zu dick ist für meine leitung :roll: . aber was man so hört (sorry: liest) soll bisher es ganz gut sein.

was bisher nicht angebracht wurde: deine häuser sind unendlich haltbar. im normalfall, also in allen strategie-spielen, gibt es abnutzung: feuer, krankheit und einsturz. und dann hat man feuerwehr, heilanstalten und architekten/baumeister. und wenn einer das haus passiert (vorbeigeht) wird im haus ein feuer: integer; zurückgesetzt auf 0. das wär noch ein punkt für die überklasse TBuilding. und wenn der wert aber 100 erreicht, bricht feuer aus. dann strömen alle feuerwehren herbei und löschen. incrementieren tut man den halt einfach per timer oder zufall, je nachdem.
den letzten punkt würd ich erst realisieren, wenn du schon eine funktionierende wege- und wegsuchengine hast. also wie ein navi halt :lol:
auch noch: lagerhaus/silo zum lagern der waren, bevor sie aufn markt kommen.
und noch was: wasserversorgung ... falls das noch irgendwie passt :D

ansonsten toi-toi-toi! du schaffst das!

mfg
Fabian

_________________
Die Probleme, die es in der Welt gibt, sind nicht mit der gleichen Denkweise zu lösen, die sie erzeugt hat.
Albert Einstein
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: Sa 11.10.08 10:53 
Das erinnert mich sehr an diese "der erste Kaiser", "Pharao", "Herscher des Olymps", ... Spiele ;)

Da musste mann auch immer Architekten bauen und so^^

Aber sonst sind es Klassiker werden zwar ein bisschen Schnell Langweilig aber sonst eig. ganz gut^^ dort könntest du dir ja Ideen für dein Spiel holen :D

_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>
passiv
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 270

WIN XP Professional
Delphi 7 Enterprise, Java (Eclipse), Python 2.5, Django 1.1
BeitragVerfasst: Sa 11.10.08 13:34 
jop, im konkreten pharao und caesar. letzteres ist ein weltklassespiel 8)

_________________
Die Probleme, die es in der Welt gibt, sind nicht mit der gleichen Denkweise zu lösen, die sie erzeugt hat.
Albert Einstein
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 11.10.08 14:09 
[OT]
Nach Pharao grabe ich schon seit zwei Jahren immer mal wieder. Bisher nicht gefunden :lol:
[/OT]

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 11.10.08 23:44 
Hey,

heute kam ich zu nix, da ich bis grad eben noch unterwegs war und jetzt weder Nerv, noch die entsprechende Wachheit habe, um noch was gescheites auf die Beine zu stellen.

Die Gebäude an sich haben schon keine unendliche Haltbarkeit, die Klasse besitzt einen Integer Wert namens Life Points, die gibt es schon, ist aber bisher nicht ordentlich in die anderen Klassen implementiert - wie auhc, es gibt ja noch keine "zerstörenden Klassen".

Danke schonmal für die Ideen, werde ich an entsprechendem Zeitpunkt gerne drauf zurückgreifen.

@Wurstuk:

Welches Gitter meinst du?
Wie es bei mir aussieht ("nur Gras"), kannst du im Screenshot im Anhang sehen.

Jetzt muss ich aber ins Bett, kam grad erst aus den Horrorwood Studios ;)

Lg,
Kai
Einloggen, um Attachments anzusehen!
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: So 12.10.08 02:14 
Aso....

Ka warum bei mir so ein gitter ist.... liegt warscheinlich an meinem PC^^

bei dier siehts sowie so viel coller aus als bei mir :P

_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 12.10.08 13:12 
Kannst du eventuell mal einen Screenshot hochladen?

Würde mich mal interessieren.

Danke!
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: So 12.10.08 19:27 
ne kann ich nicht sry bei mir ist die drucken taste kaputt und ich hab jetzt echt kein bock gimp zu starten^^

aber du kannst es dir so vorstellen das mann das gras nicht so wirklich sieht sondern nur eine dunkelgrüne Fläche und dadrauf ist ein Gitternetz in schwarzen Linien^^

_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 12.10.08 21:18 
user profile iconwurstuk hat folgendes geschrieben Zum zitierten Posting springen:
ne kann ich nicht sry bei mir ist die drucken taste kaputt und ich hab jetzt echt kein bock gimp zu starten^^
Für einen versierten Programmierer sollte es selbstverständlich sein, dass er sich dann ein Programm schriebt, das mit einem anderen Shortcut einen Screenshot in die Zwischenablage kopiert :mahn:

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 12.10.08 21:34 
user profile iconwurstuk hat folgendes geschrieben Zum zitierten Posting springen:
ne kann ich nicht sry bei mir ist die drucken taste kaputt und ich hab jetzt echt kein bock gimp zu starten^^

aber du kannst es dir so vorstellen das mann das gras nicht so wirklich sieht sondern nur eine dunkelgrüne Fläche und dadrauf ist ein Gitternetz in schwarzen Linien^^


Schade, dann werde ich den Fehler bei Dir wohl auch nicht näher lokalisieren können.
Aber gut - weiter geht's.

Jetzt mache ich mich auf die Suche nach der Ursache der Zugriffsverletzung (s.o.) - damit ich danach ENDLICH mal zur Steuerung kommen kann.
Wenn's was neues gibt, melde ich mich :)

Lg,
Kai
passiv
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 270

WIN XP Professional
Delphi 7 Enterprise, Java (Eclipse), Python 2.5, Django 1.1
BeitragVerfasst: Mo 13.10.08 14:35 
ich hab mir jetzt mal den code für die häuser angesehen und denk mir: wieso hast du soviele property- und object-manager?
dann hab ichs mir durchgedacht und bin auf 2 notwendige dinge gekommen: ein Haus-Objekt (TBuilding) und ein Verwaltungs-Objekt (TObjectInspector). und da verwaltet einfach der OI jedes haus in einem array. und jedes haus hat natürlich auch noch einen pointer auf seinen eltern-OI. und wenn man das gleich für multiplayer auslegen will, schreibt man sich noch ein Spiel-Objekt (TGame), die alle OIs verwaltet ...

das wär meine Idee und ich versuch das ganze auch gerade zu implementieren. (nur scheiterts bei mir an der grafik-engine. die TPaintBox is wohl nicht so super :roll: . und ich kapier sämtliche OGL dinger nicht. [OT]jedes tutorial besteht aus einer .pas-datei und basiert auf try-and-error, was mir bisher noch zu fad war.[/OT])

mfg
passiv

_________________
Die Probleme, die es in der Welt gibt, sind nicht mit der gleichen Denkweise zu lösen, die sie erzeugt hat.
Albert Einstein
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 13.10.08 15:11 
user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
nur scheiterts bei mir an der grafik-engine. die TPaintBox is wohl nicht so super :roll:
Kannst du das näher erläutern? IMHO für ein Spiel die einzige saubere Lösung ;)

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 13.10.08 16:04 
Hey,

also ich halte es für sinnvoll jedem Building im Objectmanager einen propertymanager zuzuweisen, da schließlich auch jedes Gebäude eigene properties besitzt - so ist erstmal jedes Gebäude eine "autarke" Instanz, auf die ich mithilfe des Propertymanagers vollen Zugriff habe und auch haben möchte.
Es gibt übrigens nur EIN Objectmanager und den besitzt die Klasse TGame - also von vielen Objektmanagern kann da wirklich nicht die Rede sein ;)

Natürlich könnte man auch das Object Array entsprechend mehrdimensional anlegen, sodas nach festgelegter Syntax gesagt werden kann Object_Array[id, 1]=Need Oat, ...[id,2]=Need Stone, doch empfinde ich den Zugriff mithilfe des Prop.Managers anhand folgender Klassen sehr viel angenehmer.
Tgame.Tobjectinspector.TBuilding[Integer].TPropertymanager.TProperylist

Performanter und sinnvoller geht es immer - am grundlegenden Klassenkonzept werde ich auch erstmal nichts mehr großartig ändern - Da auf diesem Konzept alle meine Planungen, derzeit noch auf Papier, aufgebaut sind.

EDIT:
=====

Jetzt wo ich mir deinen Beitrag das 2. mal durchgelesen habe: Quasi genau so habe ich es doch gemacht?!

Es gibt eine Klasse Tgame, die besitzt einen Objectmanager, welcher ein Array des Typs TBuilding besitzt. Jedes TBuilding besitzt dann halt einen Objectmanager, aber dazu: s.o.

Lg,
Kai
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: Mo 13.10.08 16:09 
Ok werd ein Screenshot machen^^

ich werd ihn dann morgen reinstellen und das mit dem Programm das mit einer anderen taste einen Screenshot macht
kann ich noch nicht^^ würde mich aber belehren lassen :D

_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>
kai_lamers Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 13.10.08 16:15 
[OT]
Hey,
danke.

Hier hast du mal ein Codeschnipsel, anhand dessen wirds ziemlich schnell klar, wie's geht.
Wie du einen Tastendruck entsprechend abfängst kriegst du ja selbst hin :D

www.scalabium.com/faq/dct0001.htm
ausblenden Delphi-Quelltext
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:
procedure TForm1.Button1Click(Sender: TObject);
var DCDesk: HDC; // hDC of Desktop
  bmp: TBitmap;
begin
  {Create a bitmap}
  bmp := TBitmap.Create;
   
  {Set a bitmap sizes}
  bmp.Height := Screen.Height;
  bmp.Width := Screen.Width;

  {Get a desktop DC handle - handle of a display device context}
  DCDesk := GetWindowDC(GetDesktopWindow);
  
  {Copy to any canvas, here canvas of an image}
  BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
         DCDesk, 0, 0, SRCCOPY);

  {Save the bitmap}
  bmp.SaveToFile('ScreenShot.bmp');

  {Release desktop DC handle}
  ReleaseDC(GetDesktopWindow, DCDesk);

  {Release a bitmap}
  bmp.Free;
end;

[/OT]
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 13.10.08 16:43 
Jop. Nur statt SaveToFile dann CopyToClipboard ;)

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
wurstuk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win XP, Ubuntu
Delphi 7 personal
BeitragVerfasst: Mo 13.10.08 21:45 
hmm ich check dis i-wie nicht... hab jetzt aber auch gerade wenig zeit werde mich morgen mal eindringlicher mit der Seite beschäftigen^^ :roll:

Als Anhang ist jetzt ein Screenshot vom Spiel, war doch einfacher mit Gimp als ich es in Erinnerung hatte^^
Einloggen, um Attachments anzusehen!
_________________
Wer Rechtschreibfehler findet darf sie behalten!
<(^_^)> <[$_$]>