Scanlines wie im MS-DOS-Modus/80er Spielautomaten

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Blizzard

Betreff: Scanlines wie im MS-DOS-Modus/80er Spielautomaten

BeitragSa, Jan 22, 2005 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kriegt man so typische dünne, horizontale Leerzeilen auf dem Screen?

1024x768 nehmen und alle 2 Zeilen eine schwarze Linie einfügen?
 

Kekskiller

BeitragSa, Jan 22, 2005 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte heute auch sowas machen, fällt mir gerade auf, für mein SpaceInvadersSpielchen.
Eigentlich ist das ganze recht einfach, du ziehst abwechselnd eine dunklere
und eine hellere Linie über den Bildschirm, transparent versteht sich.
So kriegst de sogar zusätzlich nen kleinen Flimmereffekt, vor allem, wenn
man die Transparenzen kurz hebt und dann senkt. Naja, Schnickschnack.
Aber toller Schnickschnack.

Markus Rossé

BeitragSa, Jan 22, 2005 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function DrawScanlines()
For y=0 To GraphicsHeight() Step 2
   Color 0,0,0
   Line 0,y,GraphicsWidth(),y
Next
End Function


Ist aber nicht sehr schön..

cu, Markus Rossé
 

Blizzard

BeitragSa, Jan 22, 2005 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ruckelt aber bei mir z.B. in einem Spiel...

Die Linien müßten halbtransparent gezeichnet werden... das geht in Realtime natürlich nicht.

Wäre vielleicht ein transparentes PNG mit halbtransparenten 2er Zeilen eine Lösung, was man auf das Spiel einfach "oben" draufklatscht?

Ayman

BeitragSa, Jan 22, 2005 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine weitere Möglichkeit, so hab ich das das mal gelöst, ist es, alle im Spiel verwendeten Grafiken und BMP-Fonts so zu generieren, dass eben jede zweite Zeile schwarz bleibt.

Bei Bewegungen darauf achten, dass man in der Vertikalen immer um zwei Pixel verschiebt.

Diese Lösung ist klar schneller, als jedes nachträgliche Darüberzeichnen.
 

Blizzard

BeitragSa, Jan 22, 2005 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab grad festgestellt, daß bei 640x480 eine kleine Scanline automatisch dabei ist...

Bigmichi

BeitragSa, Jan 22, 2005 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
was ist das überhaupt ? =/ mir stellt sich die frage seit dem eröffnen des Threads o.O
 

Blizzard

BeitragSa, Jan 22, 2005 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

Bigmichi

BeitragSa, Jan 22, 2005 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
sowas hab ich noch nie gesehen o.O hab früher aber viele dosspiele gespielt o.O komisch wofür will man das machen also nachmachen ? =/
 

Blizzard

BeitragSa, Jan 22, 2005 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit es bei Remakes von alten Spielen "authentischer" aussieht Wink
 

noir

BeitragSa, Jan 22, 2005 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
naja am einfachsten is es echt einfach die bilder davor zu bearbeiten

so z.b kannst es ja deinem geschmack anpassen Wink
Code: [AUSKLAPPEN]

grafik = LoadImage ("grafik.bmp")
Breit=ImageWidth (grafik)
Hoch=ImageHeight (grafik)

Graphics breit,hoch,0,2

grafik = LoadImage ("grafik.bmp");wegen graphics noch mal laden

bild = CreateImage(breit,hoch)
SetBuffer ImageBuffer(bild)
DrawImage grafik,0,0
Color 0,0,0

For i = 1 To hoch Step 5
  Rect 0,i,breit,2
Next


SetBuffer BackBuffer()
DrawImage bild,0,0
Flip
SaveBuffer(BackBuffer(),"grafik1.bmp")
WaitKey



und wenn du es in echtzeit machen willst wie Markus Rossé es vorgeschlagen hat nimmt nicht line sondern rect.
 

TOONY

BeitragSo, Jan 23, 2005 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde eine Bitmap erstellen mit der auflösung deines spieles und immer eine weiße, dann eine schwarze linie in diese bitmap zeichnen.
Die farbe weiß setzt du dann auf transparent.

Nun zeichnest du diese bitmap immer vor flip in dein code ein....

Abrexxes

BeitragSo, Jan 23, 2005 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bigmichi hat Folgendes geschrieben:
sowas hab ich noch nie gesehen o.O hab früher aber viele dosspiele gespielt o.O komisch wofür will man das machen also nachmachen ? =/



Bei DOS Spielen gab es das auch nicht.

Der Effekt stammt von Spieleautomeaten wie meiner. Hier war ein TV-Bildröhre mit 50 oder 60 HZ eingebaut. Da diese Apparate nach dem Zeilenprinzip arbeiten hatte das umwandeln der Videodaten in ein PAL oder NTCS Videoformat den obigen Effekt.

Auch bei Konsolen und Computer die an den TV Antenneneingang gesteckt wurden konnte mann den Effekt bewundern (Wenn auch nicht so drastisch wie oben) Heute werden Konsolen mit R-G-B Signal (EUro AV oder SCART genannt) an den Fernseher angeschlossen, ausserdem besitzen heutige Fernseher Filter die das nochmals reduzieren. (Hat nix mit 100Hz zu tun^^)

cu Linux

user posted image

Jan_

Ehemaliger Admin

BeitragMo, Jan 24, 2005 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hm,

Darf ich ne BB3D Lösung Posten oder nciht?
between angels and insects

Abrexxes

BeitragMo, Jan 24, 2005 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Spatz in der Hand ist besser als die Taube auf dem Dach.
 

getlose

BeitragMo, Jan 24, 2005 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@_jan, mach es doch einfach :)

Jan_

Ehemaliger Admin

BeitragMo, Jan 24, 2005 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Einstellbar, dank B3D
user posted image

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2

Bild=LoadImage("landschaft-tirol3.jpg")

SL=Create_Scanlines()

Repeat

   m=m+1
   EntityAlpha SL,Abs(Sin(m))
   DrawImage Bild,0,0
   RenderWorld
   Flip
Until KeyHit(1)

Free_Scanline()

End


Global SL_cam
Global SL_Tex
Global SL_Mesh

Function Create_Scanlines(Horizontalepixel=2)
   Local cam,s,m,rgb,tex,surface
   Local ScanlinesMesh,v0,v1,v2,v3
   Local gh,gw
   If Not(SL_Cam)
      Cam=CreateCamera()
      CameraClsMode cam,0,1
      sl_cam=cam
      tex=CreateTexture(1,GraphicsHeight(),1+4)
      SL_Tex=tex
      SetBuffer TextureBuffer(tex)
      rgb= (33 Shl 8)+(33 Shl 4)+33
      For s = 0 To TextureHeight(tex)-1
         If (s Mod Horizontalepixel) Then
            For m = 0 To TextureWidth(tex)-1
               WritePixel m,s,rgb
            Next
         EndIf
      Next
      SetBuffer BackBuffer()
      ScanlinesMesh=CreateMesh()
      SL_Mesh = ScanlinesMesh
      Surface = CreateSurface(ScanlinesMesh)
      v0=AddVertex(surface,-4,-3,0,0,0)
      v1=AddVertex(surface,4,-3,0,1,0)
      v2=AddVertex(surface,-4,3,0,0,1)
      v3=AddVertex(surface,4,3,0,1,1)
      AddTriangle(surface,v1,v0,v2)
      AddTriangle(surface,v1,v2,v3)
      gw=1
      Repeat
         gw=gw*2
      Until gw >= GraphicsWidth()
      gh=1
      Repeat
         gh=gh*2
      Until gh >= GraphicsHeight()
      ScaleEntity ScanlinesMesh,Float(Float(gw)/Float(GraphicsWidth())),Float(Float(gh)/Float(GraphicsHeight())),1
      EntityTexture ScanlinesMesh,tex
      PositionEntity ScanlinesMesh,0,0,4
      EntityColor ScanlinesMesh,0,0,0
      EntityOrder ScanlinesMesh,-5
   EndIf
   Return SL_Mesh
End Function

Function Free_Scanline()
   FreeEntity SL_Mesh
   FreeTexture SL_Tex
   FreeEntity SL_Cam
End Function


So, bei mir Funzt es, wenn es bei euhc anders ist, bitte nen Screen Posten, damit ich sehe, was meine Graka Falsch angezeigt hat.
Und, bitte Sagt was dazu.
between angels and insects

Jan_

Ehemaliger Admin

BeitragDi, Jan 25, 2005 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
HM, ich fühle mich so misbraucht.
Kein Kommentar kein Danke kein Schlag?
between angels and insects
 

David

BeitragDi, Jan 25, 2005 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Jan_ schlag!
Hehe, nein... Ich habs eben ausprobiert und finde es schon sehr cool, zumal es anscheinend auch für in Realtime zu gebrauchen ist.

Gutes Stück Code! Smile

grüße

Jan_

Ehemaliger Admin

BeitragDi, Jan 25, 2005 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, ist es ganz sicher.
Der REchenaufwand ist sehr gering.
between angels and insects

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group