Grafik flagge

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag von Epyx »

mipooh hat geschrieben:Schöne Grafik, das ganze Spiel gibt´s wohl nicht???
Gruss
Mipooh

Doch aber da musst du dir WinUAE ziehen, und dann Shadow of the Beast saugen. Dann kannst es zocken, die Grafiken sind übrigens original aus diesem Spiel, die Musik auch. Im Kern steckte aber nur ein normales eher unspektakuläres Jump´n Run, aber Intro war wie immer erste Sahne von Psygnosis.


Edit//
Ich Installier gleich mal das Breaker Spiel, dann schau ich mir mal an was du meinst, Green
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Nicht animation

Beitrag von Danilo »

Green Snake hat geschrieben:hat niemand eine idee, wie das gehen könnte?
entweder muss es sinussprites sein, oder transformsprite3d
Meinst Du vielleicht sowas?

Code: Alles auswählen

;
; by Danilo, 17.04.2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,100)=0
  CloseScreen()
  MessageRequester("ERROR","Cant create sprite !",#MB_ICONERROR):End
EndIf

If StartDrawing(SpriteOutput(1))
  DrawingMode(4)
  Box   (0,  0,200,100,$00FFFF)
  LineXY(0,  0,200,100,$FF0000)
  LineXY(0,100,200,  0,$FF0000)
  StopDrawing()
EndIf

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    y.f + 0.1
    If y > 2*#PI : y = 0 : EndIf

    x = #w/2-100
    For a = 0 To 199
      ClipSprite(1,a,0,1,100)
      DisplayTransparentSprite(1,x,#h/2-50+Sin(y+#factor*a)*70)
      x+1
      If x > 800 : x - 800 : EndIf
    Next a
  EndIf
Until KeyboardPushed(#PB_Key_Escape)
Hier wird also ein Sprite mit ClipSprite aufgeteilt und immer
eine weitere Linie des Sprites gezeichnet.

So sieht das dann mit Text als Sinus-Scroller aus:

Code: Alles auswählen

;
; by Danilo, 16.04.2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "simpel"

#PI      = 3.141592
#factor  = 0.015
x_offset = #w + 100

Dim _sin.f(33)

If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

  ;SetFrameRate(70)

  For a = 0 To 31
    If CreateSprite(a,#w,8)=0
      CloseScreen():MessageRequester("ERROR","Cant init sprites !",#MB_ICONERROR):End
    EndIf
    StartDrawing(SpriteOutput(a))
      For i = 1 To 4
        Line(0,i-1,#w,0,RGB(a*i*2,a*i*2,0))
        Line(0,8-i,#w,0,RGB(a*i*2,a*i*2,0))
      Next i
    StopDrawing()
  Next a

  If CreateSprite(32,#w,#h/8)=0 Or CreateSprite(33,400,#h/10)=0
    CloseScreen()
    MessageRequester("ERROR","Cant init sprites !",#MB_ICONERROR):End
  EndIf
  StartDrawing(SpriteOutput(32))
    Box(0,0,#w,#h/8,RGB($FF,$FF,$FF))
  StopDrawing()

  hFont = LoadFont(1,"Arial",#h/20)
  StartDrawing(SpriteOutput(33))
    DrawingMode(1)
    DrawingFont(hFont)
    FrontColor($00,$00,$FF)
    DrawText("C++ forever!")
  StopDrawing()

  time = ElapsedMilliseconds()+3000
  While ElapsedMilliseconds()<time
    ExamineKeyboard()
    FlipBuffers()
    If IsScreenActive()
      ClearScreen(0,0,0)

      If StartDrawing(ScreenOutput())
        For a = 0 To #h-1 Step 4
          x=0
          While x<#w
            length = Random(#w/8)
            r=Random($FF):g=Random($FF):b=Random($FF)
            Line(x,a  ,#w/8,0,RGB(r,g,b))
            Line(x,a+1,#w/8,0,RGB(r,g,b))
            x+length
          Wend
        Next a
        StopDrawing()
        Delay(Random(100))
      EndIf
      
    EndIf
  Wend

  oldtime = ElapsedMilliseconds()+10

  Repeat
    ExamineKeyboard()
    While oldtime > ElapsedMilliseconds():Delay(1):Wend
    oldtime = ElapsedMilliseconds()+10

    FlipBuffers(0)
    If IsScreenActive()
      ClearScreen(0,0,0)

      DisplaySprite(32,0,0)
      DisplaySprite(32,0,#h-#h/8)

      sin.f + 0.02
      For a = 0 To 31
        _sin(a) = Sin(sin + a*0.15)
        DisplaySprite(a,0,#h/2+_sin(a)*#h/4)
      Next a

      y.f + 0.05 : If y > 2*#PI : y = 0 : EndIf

      x_offset - 2 : If x_offset < -500 : x_offset = #w+100 : EndIf

      x = x_offset
      For a = 0 To 599
        ClipSprite(33,a,0,1,SpriteHeight(33))
        DisplayTransparentSprite(33,x,#h/2+Sin(y+#factor*a)*#h/16)
        x+1
      Next a

    EndIf
  Until KeyboardPushed(#PB_Key_Escape)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag von Epyx »

LoL Danilo, der 2. Source sehr schön ;) Der erste ist genau das was er meint, die Zeilen eines Sprites werden mittels Clipsprite und Sin() positioniert.
Sieh dir Danilos 1. Beispiel an, genau so wirds gemacht :)
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Der 1. aber anders

Beitrag von Green Snake »

hallo

danke das 1 beispiel meinte ich.
habe aber noch eine frage dazo, da es mit solchen formeln noch ehr happert:

also, wie muss der code aussehen:

- anstatt diesen linien sollte es ein bild vom pfad C:\Mein\Bild.bmp sein,
- das ganze darf(sollte) nicht quer sein, so wie in deinem code, sondern aufgestellt.

wie muss ich das machen? hast du mit noch ein beispiel

ps 1000* danke für deinen code


edit: sorri, die erste frage kanst du streihen, habe ich herausgefunden(das mit dem bild), jedoch die 2 ist immer noch offen
-.-"
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag von Epyx »

Hmm Danilo erstellt ja das Sprite und Grabbt es dann, lasse einfach dein Sprite mittels LoadSprite() laden.
Und beim ändern der Richtung versetze einfach das a - das bei Danilo Horizontal abwandert.

Mach aus ClipSprite(1,a,0,1,100) einfach ClipSprite(1,0,a,200,1)
und aus DisplayTransparentSprite(1,x,#h/2-50+Sin(y+#factor*a)*70) wird DisplayTransparentSprite(1,#h/2-50+Sin(y+#factor*a)*70,x)

Naja dann sollte es erstmal wieder laufen, habe es nicht getestet.
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Der 1. aber anders

Beitrag von Danilo »

Green Snake hat geschrieben:- anstatt diesen linien sollte es ein bild vom pfad C:\Mein\Bild.bmp sein,
Ersetze das CreateSprite() durch das auskommentierte
LoadSprite():

Code: Alles auswählen

;
; by Danilo, 17.04.2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,200)=0
;If LoadSprite(1,"c:\mein\bild.bmp")=0
  CloseScreen()
  MessageRequester("ERROR","Cant load sprite !",#MB_ICONERROR):End
EndIf

sw = SpriteWidth(1)
sh = SpriteHeight(1)

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    y.f + 0.1
    If y > 2*#PI : y = 0 : EndIf

    x = #w/2-sw/2
    For a = 0 To sw
      ClipSprite(1,a,0,1,sh)
      DisplaySprite(1,x,#h/2-sh/2+Sin(y+#factor*a)*70)
      x+1
      If x > 800 : x - 800 : EndIf
    Next a
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Green Snake hat geschrieben:- das ganze darf(sollte) nicht quer sein, so wie in deinem code, sondern aufgestellt.
Wie meinst Du das? Es ist egal ob das Bild mehr höher als breit ist.

Oder meinst Du die Wellen-Versetzung horizontal?
Dann checke das:

Code: Alles auswählen

;
; by Danilo, 17.04.2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,200)=0
;If LoadSprite(1,"c:\mein\bild.bmp")=0
  CloseScreen()
  MessageRequester("ERROR","Cant load sprite !",#MB_ICONERROR):End
EndIf

sw = SpriteWidth(1)
sh = SpriteHeight(1)

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    x.f + 0.1
    If x > 2*#PI : x = 0 : EndIf

    y = #h/2-sh/2
    For a = 0 To sh
      ClipSprite(1,0,a,sw,1)
      DisplaySprite(1,#w/2-sw/2+Sin(x+#factor*a)*70,y)
      y+1
    Next a
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Hier wird also horizontal geclippt und somit y versetzt.

BTW, hier noch ein "Quasi-3D-Effekt" der mir grad zufällig
passiert ist: Dabei sieht es aus als wenn es in die Tiefe zeigt:

Code: Alles auswählen

;
; by Danilo, 17.04.2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,200)=0
;If LoadSprite(1,"c:\mein\bild.bmp")=0
  CloseScreen()
  MessageRequester("ERROR","Cant load sprite !",#MB_ICONERROR):End
EndIf

sw = SpriteWidth(1)
sh = SpriteHeight(1)

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    x.f + 0.1
    If x > 2*#PI : x = 0 : EndIf

    y = #h/2-sh/2
    For a = 0 To sh
      ClipSprite(1,a,0,1,sh)
      DisplaySprite(1,#w/2-sw/2+Sin(x+#factor*a)*70,y)
      y+1
    Next a
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Das ist das 2. Beispiel mit dem Clipping vom 1. Beispiel,
also ein Zwischenprodukt. :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Jetzt

Beitrag von Green Snake »

super, das meinte ich (das 2 beispiel)

das mit loadsprite habe ich schon heraus gefundden, trotztdem nochmal danke dir, danke euch allen
-.-"
Benutzeravatar
dige
Beiträge: 1243
Registriert: 08.09.2004 08:53

Beitrag von dige »

Kann man den Effekt auch so gestalten, das eine Seite fest bleibt,
also so wie bei einer richtigen Flagge?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

dige hat geschrieben:Kann man den Effekt auch so gestalten, das eine Seite fest bleibt,
also so wie bei einer richtigen Flagge?
Ja.

Code: Alles auswählen

;
; by Danilo, 17./18. April 2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,200)=0
;If LoadSprite(1,"danilo.bmp")=0
  CloseScreen()
  MessageRequester("ERROR","Cant load sprite !",#MB_ICONERROR):End
EndIf

sw = SpriteWidth(1)
sh = SpriteHeight(1)

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    y.f + 0.1
    If y > 2*#PI : y = 0 : EndIf

    x = #w/2-sw/2
    offset_y.f = Sin(y)*70         ; offset_y hinzugefgt fr feststehende "flagge"
    For a = 0 To sw
      ClipSprite(1,a,0,1,sh)
      DisplaySprite(1,x,(#h/2-sh/2)-offset_y.f+Sin(y+#factor*a)*70) ; offset_y hinzugefgt
      x+1
    Next a
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Und wieder andere Richtung:

Code: Alles auswählen

;
; by Danilo, 17./18. April 2005
;
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize screen !",#MB_ICONERROR):End
EndIf

#w  = 1024;1280
#h  =  768;1024
#sn = "sinus"

#PI     = 3.141592
#factor = 0.01


If OpenScreen(#w,#h,32,#sn)=0
 If OpenScreen(#w,#h,24,#sn)=0
  If OpenScreen(#w,#h,16,#sn)=0
   If OpenScreen(#w,#h,08,#sn)=0
     MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf:EndIf

If CreateSprite(1,200,200)=0
;If LoadSprite(1,"danilo.bmp")=0
  CloseScreen()
  MessageRequester("ERROR","Cant load sprite !",#MB_ICONERROR):End
EndIf

sw = SpriteWidth(1)
sh = SpriteHeight(1)

oldtime = ElapsedMilliseconds()+20

Repeat
  ExamineKeyboard()
  While oldtime > ElapsedMilliseconds():Delay(1):Wend
  oldtime = ElapsedMilliseconds()+20
  FlipBuffers(0)
  If IsScreenActive()
    ClearScreen($FF,$88,$33)
    
    x.f + 0.1
    If x > 2*#PI : x = 0 : EndIf

    y = #h/2-sh/2
    offset_x.f = Sin(x)*70         ; offset_x hinzugefgt fr feststehende "flagge"
    For a = 0 To sh
      ClipSprite(1,0,a,sw,1)
      DisplaySprite(1,(#w/2-sw/2)-offset_x.f+Sin(x+#factor*a)*70,y) ; offset_x hinzugefgt
      y+1
    Next a
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
In beiden Beispielen wurde jeweils 1 Zeile hinzugefügt und
1 Zeile geändert, siehe Kommentar.
Das ist die Versetzung des 1. Wertes und wird immer
addiert bzw. subtrahiert.

Um die Wellenlänge und Verzerrung anzupassen mußt Du
einfach mal mit den Werten und #factor und x.f bzw. y.f
rumspielen.

Ich kannte mal noch einen anderen Weg für feststehende
Sachen, komme aber nicht mehr drauf.
Ging irgendwie mit einem Array mit den Sinus-Werten das
dann durchgescrollt wird.

Naja, so sollte es schon OK sein für eine einfache "Flagge".
Eine richtige Flagge schwingt ja auch nicht so gleichmässig
sondern weht im Wind.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Cool

Beitrag von Green Snake »

hallo

habe noch eine frage zu den oberigen beispielen

geht das auch so, dass die seite rechts und links fest sind? sich also ur der inhalt verformt?

also rechts und links fest, und die "wellen" gehen von unten noch oben, oder von oben nach unten.

geht das??

ach ja..... super beispiele, danke
-.-"
Antworten