Autor Beitrag
t/f
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mi 16.04.03 00:32 
Hi Board!

Derzeit arbeite ich an einem Rollenspiel. Das Spielprinzip kennt ihr sicherlich von Diablo bzw. Civilisation, Cossacks, Empire Erath und dergleichen.

Die Leute die dort herumlaufen und sich gegenseitig eins auf die Mütze geben sind allesamt kein Problem und tun für mein Beispiel erstmal nix zur Sache.

Was mich stört ist, dass ich keinen vernünftigen Untergergrund gebastelt kriege.

Ich bin bisher so an die Sache herangegangen:

1. Ich hab mir die Canvas von Form1 unter den Nagel gerissen und
2. verschiedene Felder gekachelt darauf dargstellt sowie
3. versucht,dass sich die einzelnen Felder bzw. Terraintypen "überlappen" ...

an Punkt 3 bin ich gescheitert.

Am Ende soll es so aussehen (ich habs mal mit PSP 7 vorgezeichnet...) :
user defined image

Wie man sieht werden verdamt viele Einzelbilder aneinandergereiht.
Da aber die einzelnen Terrainfelder nicht Qudratisch sind sondern gedreht aussehen, muss man es irgendwie packen, diese Dinger gedreht auf die Canvas zu zeichnen. Da wäre meine erste Frage: KANN ICH BILDER, DIE ICH DURCH DIE METHODE ->DRAW<- ZEICHNE, DREHEN? Weil mir die Dreherei vorerst nicht gelungen ist, habe ich probiert, einfach quadrate zu nehmen, deren Ecken transparent sind. Ich habe allerdings das Problem, dass die "transparenten" Ecken der Terrainfelder, die nunmal andere überdecken weiß gezeichnet werden. Also Frage nummero zwei WIE KANN ICH ANHAND VON (FORM1.CANVAS.)DRAW TEILE VON BILDERN, DIE ICH DURCH DIESE FUNKTION AUF EINE ZEICHENOBERFLÄCHE (CANVAS) BRINGEN WILL, TRANSPARENT DARSTELLEN?

Probleme, die mir dabei noch Kopfschmerzen bereiten sind Probleme mit dem Speicher. Wie kann ich diese Lösen? Hat vielleicht jemand eine völlig andere Idee, wie man solch eine Landschaft/solche ein Spielfeld noch zeichnen könnte?

greetz
//me
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 16.04.03 08:48 
Hi!

Zitat:
Ich habe allerdings das Problem, dass die "transparenten" Ecken der Terrainfelder, die nunmal andere überdecken weiß gezeichnet werden


Also doch nicht transparent? Aber du hast die Eigenschaft MeinBitmap.Transparent auf True gesetzt und auch die Eigenschaft MeinBitmap.TransparentColors:=MeinBitmap.Canvas.Pixels[0,0] angegeben?

Cu,
Udontknow

Moderiert von user profile iconUGrohne: Code- durch Quote-Tags ersetzt (oder annersrum??:wink:)
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mi 16.04.03 13:07 
Die Eigenschaft Transparent des Images habe ich auf "true" gesetzt ... Aber die Farbe kann ich nicht wählen.

Ich arbeite mit Delphi 6 und konnte bisher keine Bitmaps finden.

Liegts daran?

greetz
//me
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 16.04.03 13:51 
Probiere es mal mit Image.Picture.Bitmap.TransparentColor.
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mi 16.04.03 14:01 
oh ... jetzt hab ich mist gepostet ... ich benutze die Canvas von Form1... aber is wurscht ich probiers dann einmal mitm Image.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mi 16.04.03 14:13 
Drehen eines Bitmaps:
ausblenden volle Höhe 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:
procedure RotateBitmapA(var Bitmap: TBitmap; const ADegrees: Cardinal;
  const clBack: TColor);
const
  MaxPixelCount   =  32768;

type
  pRGBArray  =  ^TRGBArray;    // Use SysUtils.pByteArray for 8-bit color
  TRGBArray  =  array [0..MaxPixelCount-1] of TRGBTriple;

var
  cosTheta      :  DOUBLE;
  i             :  INTEGER;
  iRotationAxis :  INTEGER;
  iOriginal     :  INTEGER;
  iPrime        :  INTEGER;
  iPrimeRotated :  INTEGER;
  j             :  INTEGER;
  jRotationAxis :  INTEGER;
  jOriginal     :  INTEGER;
  jPrime        :  INTEGER;
  jPrimeRotated :  INTEGER;
  RowOriginal   :  pRGBArray;
  RowRotated    :  pRGBArray;
  sinTheta      :  DOUBLE;
  Theta         :  DOUBLE;       // radians

  OldHeight     :  INTEGER;
  OldWidth      :  INTEGER;
  NewWidth      :  INTEGER;
  NewHeight     :  INTEGER;
  BitmapRotated :  TBitmap;
  Back          :  RGBTriple;
begin
  Back.rgbtBlue := GetBValue(clBack);
  Back.rgbtGreen := GetGValue(clBack);
  Back.rgbtRed := GetRValue(clBack);

  Theta := ADegrees * PI /180;
  sinTheta := Sin(Theta);
  cosTheta := Cos(Theta);

  OldWidth := Bitmap.Width;
  OldHeight := Bitmap.Height;

  //An easy way to calculate the non-clipping rectangle
  NewWidth := Abs(Round(OldHeight * sinTheta)) + Abs(Round(OldWidth *
                cosTheta));
  NewHeight := Abs(Round(OldWidth * sinTheta)) + Abs(Round(OldHeight *
                 cosTheta));

  BitmapRotated := TBitmap.Create;
  BitmapRotated.Width  := NewWidth;
  BitmapRotated.Height := NewHeight;
  BitmapRotated.PixelFormat := pf24bit;
  BitmapRotated.Canvas.Brush.Color := clBack;
  BitmapRotated.Canvas.FillRect(Rect(0, 0, NewWidth, NewHeight));
//  BitmapRotated.Canvas.FillRect(Rect(0, 0, NewWidth, NewHeight));

  iRotationAxis := OldWidth div 2;
  jRotationAxis := OldHeight div 2;

  // Step through each row of rotated image.
  for J := BitmapRotated.Height - 1 downto 0 do begin
    RowRotated  := BitmapRotated.Scanline[J];
    // Assume the bitmap has an even number of pixels in both dimensions and
    // the axis of rotation is to be the exact middle of the image -- so this
    // axis of rotation is not at the middle of any pixel.

    // The transformation (i,j) to (iPrime, jPrime) puts the center of each
    // pixel at odd-numbered coordinates.  The left and right sides of each
    // pixel (as well as the top and bottom) then have even-numbered coordinates.

    // The point (iRotationAxis, jRotationAxis) identifies the axis of rotation.

    // For a 640 x 480 pixel image, the center point is (320, 240).  Pixels
    // numbered (index i) 0..319 are left of this point along the "X" axis and
    // pixels numbered 320..639 are right of this point.  Likewise, vertically
    // pixels are numbered (index j) 0..239 above the axis of rotation and
    // 240..479 below the axis of rotation.

    // The subtraction (i, j) - (iRotationAxis, jRotationAxis) moves the axis
    // of rotation from (i, j) to (iRotationAxis, jRotationAxis), which is the
    // center of the bitmap in this implementation.

    // offset origin by the growth factor (NewHeight - OldHeight) div 2
    jPrime := 2*(J - (NewHeight - OldHeight) div 2 - jRotationAxis) + 1 ;

    for I := NewWidth - 1 downto 0 do begin
      // offset origin by the growth factor (NewWidth - OldWidth) div 2
      iPrime := 2*(I - (NewWidth - OldWidth) div 2 - iRotationAxis) + 1;

      // Rotate (iPrime, jPrime) to location of desired pixel
      // Note:  There is negligible difference between floating point and
      // scaled integer arithmetic here, so keep the math simple (and readable).
      iPrimeRotated := Round(iPrime * CosTheta - jPrime * sinTheta);
      jPrimeRotated := Round(iPrime * sinTheta + jPrime * cosTheta);

      // Transform back to pixel coordinates of image, including translation
      // of origin from axis of rotation to origin of image.
      iOriginal := (iPrimeRotated - 1) div 2 + iRotationAxis;
      jOriginal := (jPrimeRotated - 1) div 2 + jRotationAxis;

      // Make sure (iOriginal, jOriginal) is in BitmapOriginal.  If not,
      // assign blue color to corner points.
      if   (iOriginal >= 0) and (iOriginal <= Bitmap.Width - 1)
      and  (jOriginal >= 0) and (jOriginal <= Bitmap.Height - 1) then begin
        // Assign pixel from rotated space to current pixel in BitmapRotated
        RowOriginal := Bitmap.Scanline[jOriginal];
        RowRotated[I]  := RowOriginal[iOriginal]
      end
{      else
        RowRotated[I] := Back;   }
    end;
  end;
  Bitmap.Assign(BitmapRotated);
  BitmapRotated.Free;
end;
Der Code ist nicht von mir. Such bitte mal bei Google unter "RotateScanline", da solltest du den Orginalerfinder finden!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mi 16.04.03 14:48 
t/f hat folgendes geschrieben:
Derzeit arbeite ich an einem Rollenspiel. Das Spielprinzip kennt ihr sicherlich von Diablo bzw. Civilisation, Cossacks, Empire Erath und dergleichen.


öhm, seit wann ist Cossacks ein Rollenspiel???, ich dachte das ist Aufbau-Startegie???
Rollenspiele sind für mich Baldurs gate, Icewind dale, Diablo I/II...

und ansonsonsten bezweifle ich, dass man auch nur ansatzweise ein Rollenspiel mit dem normalen Window-Canvas proggen kann, ob auf Image oder Form. Dafür benötigst du mindestens DelphiX, besser wäre ProjectOmega, WDirectX oder die jedi Headers, sonst hast du ein Spiel, das mit <5Fps dahinzuckelt.

Meinst du nicht, dass das ein etwas sehr großes Projekt ist? Allein schon die Tiling Engine (der Programmteil der die Isometrische Landschaft, die gezeigten Rauten, zeichnet ist eine Aufgabe für sich)

Suchtipp: Borland Codelibrary, da ist ein Beispiel zum proggen einer Tiling Engine, weis aber leider den Link nimmer

P.S.: die Bilder für die Landschaft werden nicht jedes mal gedreht, sie werden von Anfang an als Rauten gemalt, mit transp. Rändern.

IO-sys/MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 16.04.03 15:24 
Ich schliesse mich da MatthiasH Meinung an, besser ist es, bei Echtzeit-Spielen dann sofort auf DirectX zu setzen.

Bei D3D hättest du auch das Problem mit den diagonalen Flächen erschlagen, du könntest einfach für jedes Tile ein Rechteck aus zwei Vertices bauen, damit dann den Boden "bauen" und dann völlig freie Kameraschwenks machen. So kann sich jeder seinen Betrachtungswinkel frei einstellen.
Ist aber auch eine anstrengende Sache, die 3D-Interfaces anzusprechen (und sich in die Thematik einzuarbeiten).

Cu,
Udontknow
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mi 16.04.03 18:34 
Alles schön und gut. Und wie mache ich das?

Zur Sache, was Strategiespiele sind und was nicht:
Es geht mir übverhaupt nicht darum, was das für Spiele sind, sondern lediglich um deren Maps. Was auf den Maps drauf passiert ist für den Sachverhalt ja Pillepalle.

So... jetzt habt ihr zwei mich trotzdem neugierig gemacht. Was sind eigentlich D3D, DelühiX, ProjectOmega, WDirectX und jedi Headers?

Wie kann ich das Zeug für meine Map nutzen?
Was für 'ne Enginge brauche ich?
Wie binde ich sie ein?
(Gibts da auch was Deutsches in Sachen Tutorials? ... )

greetz
//me
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Mi 16.04.03 18:37 
@wulfskin:

das funktioniert soweit... allerdings krieg ich die Ecken, die nun nicht mehr vom eigentlichen Bild (z.B. bei einer Drehung um 45°) bedeckt werden, transparent. Geht das? Und nochetwas: die Farbe der Bilder wird verändert. Ich erhalte nach der Drehung nicht mehr meine "Wüste" sondern ein komisches Gekrisel aus diversen Farben, die ich eigentlich nicht haben möchte.
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mi 16.04.03 22:52 
das von wulfskin erfüllt nicht den zweck, den du haben möchtest, wenn du jedes image so drehen würdest, lägen deine FPS noch weit unter 5!!!, wulfskin hat dir einen Quelltext gegeben, mit dem man bilder drehen kann.

jedi-headers, projectOmega, DelphiX... sind grafikengines, bzw units, mit denen man einfacher auf DirectX bzw OpenGL zugreifen kann, DelphiX ist für Anfäger das geeignetste, da es im Vergleich zu den andere nur sehr wenig Befehle benötigt, allerdings lässte die Performance zu wünschen überig, ich hab mal ne kleine tiling engine gebaut, damit war DelphiX schon fast überfordert, auf meinen 2,66GHz Rechner.
Schon eher hinkommen würde Project Omega, das ist ein mittelweg, nur relativ wenig Befehle, und eine erhebleich bessere Performance, zusätzlich bietet es die Möglichkeit von schnellem rotieren und alpha blending, und unterstützt meines Wissens mittlerweile auch dinge wie sprites.
jedi-headers, oder das "Nackte" D3D kann ich dir nicht empfehlen, zum Anfangen viel zu komplex

---------
Udontknow hat folgendes geschrieben:
Ich schliesse mich da MatthiasH Meinung an, besser ist es, bei Echtzeit-Spielen dann sofort auf DirectX zu setzen.


böser Galaxy Lord!!! :lol:
---------
IO-sys/MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 17.04.03 09:00 
Tschuldigung... :oops:
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 18.04.03 03:10 
Hi,

also ich würde dir bei einem solchen Spiel stark vom Canvas abraten.. da das wohl auf keinem PC ruckelfrei laufen wird... ;)

Ich würde dir OpenGL oder Direct3D empfehlen, aber da ich nunmal der OpenGL Gemeinde angehöre... nimm OpenGL! :twisted:

Da gibt's auch hier auf der Seite ein paar nette Tutorials dazu (von mir *grinst fröhlich*), schau einfach mal in der Tutorial spalte.

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Fr 18.04.03 13:19 
Hab ich schon gemacht Aya! Und dat fetzt sag' ich dir! Dat fetzt! :D
t/f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: Sa 19.04.03 02:56 
So Leutz... ba is das verdammt früh! Ich sollte langsam schlafen gehen. Es ist wirklich schlimm! Ich komme nicht mehr von dem Zeug los! OpenGL ist einfach göttlich! :D Ich bin schon süchtig nach dem Zeug. Musste mir auch unbedingt alle Tuts 'reinziehen :):):)

Bin ziemlich überzeugt, dass ich das Spiel so umsetzen werde... läuft wie geschmiert.

greetz
//me