RasterBars flackerfrei über Screen bewegen


  • spindizzy
  • 2533 Aufrufe 24 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • RasterBars flackerfrei über Screen bewegen

    Hi Leute,

    na wie gehts bei der Hitze ?
    Weiss jemand von euch wie man flackerfrei Rasterbars über den Screen bewegt ?
    Vllt. gibts sogar einen SampleCode oder so ?



    Danke für eure Mühe
    ;)
    Markus
  • bitte nicht die hitze erwähnen.... :bmotz:

    Weiss jemand von euch wie man flackerfrei Rasterbars über den Screen bewegt ?


    da solltest du dir erstmal klar werden und sagen was *genau* du machen willst ... eventuell mal auf irgendein intro/demo verlinken wo so ein effekt drin ist.

    allerdings dürfte es bei den allermeissten fällen so aussehen: die rasterroutine steht fest und ändert sich nie - das einzige was geändert wird ist die farbtabelle. für den anfang würde ich dir auch empfehlen genau das zu tun und damit rumzuspielen - schon auf die art lassen sich einige hübsche sachen machen.
  • [achtung alles nur geraten, ich hab nicht in den code geguckt - vermutlich wird es aber schon so sein]

    crypt intro: hier wird nur die farbtabelle geändert

    exodus intro: hier wird der scroller mit einem FLD in Y richtung bewegt, die rasterroutine UND die farbtabelle ändern sich _nicht_ sondern bewegen sich automisch mit in Y richtung

    Fantasy und Fucked beyond Repair 1: hier wird wieder nur die farbtabelle geändert

    System of Devil: wieder nur die farbtabelle

    Vision: ähnlich dem exodus intro, das logo wird per FLD in Y bewegt, die beiden rasterbalken über/unter dem logo bewegen sich automatisch mit. die raster "hinter" dem logo werden wieder per manipulation der farbtabelle bewegt.

    FLD würde ich übrigens für eine gute übung halten wenn du das mit den rasterbalken verstanden hast.....ein sehr einfacher aber auch sehr essentieller vic trick :)
  • Hi Leute ;),

    >Sauhund
    ich hab mir das mal versucht mit dem ändern der Farbtabelle !
    Prinzipiell funktioniert das auch so wie Du gesagt hast, ich kann die Bar nach Oben oder nach unten scrollen lassen nur durch das Ändern der Farbtabelle !
    Versuche ich aber ein Up / Down klappt das nicht mehr, ich krieg das einfach nicht hin, obwohls doch eigentlich ganz einfach sein müsste, erst raufzählen dann wieder runter ;(!

    Wäre super wenn Du ihr mir da weiterhelfen könntet !
    Hier ist mal der Code:

    Quellcode

    1. !to "rasteranim-3.prg",cbm
    2. *= $0800
    3. !byte $00,$0c,$08,$0a,$00,$9e,$32,$31,$32,$38,$00,$00,$00,$00
    4. *=$0850
    5. sei ;2
    6. lda #$7f ;2
    7. sta $dc0d ;4
    8. lda $dc0d ;4
    9. lda #$32 ;2
    10. sta $d012 ;4
    11. lda $d011 ;4
    12. and #$7f ;2
    13. sta $d011 ;4
    14. lda #$01 ;2
    15. sta $d01a ;4
    16. ldx #<irq ;2
    17. ldy #>irq ;2
    18. stx $0314 ;4
    19. sty $0315 ;4
    20. cli ;2
    21. rti ;6
    22. irq
    23. dec $d019 ;4
    24. nop
    25. nop
    26. nop
    27. nop
    28. nop
    29. nop
    30. nop
    31. nop
    32. nop
    33. nop
    34. nop
    35. nop
    36. ldy #$00
    37. .loop1 ldx #$08
    38. .loop2 lda $0f00 ,y ;4
    39. sta $d020 ;4
    40. sta $d021 ;4
    41. iny ;2
    42. dex ;2
    43. beq .loop1 ;3
    44. nop ;2
    45. nop ;2
    46. nop ;2
    47. nop ;2
    48. nop ;2
    49. nop ;2
    50. nop ;2
    51. nop ;2
    52. nop ;2
    53. nop ;2
    54. nop ;2
    55. nop ;2
    56. nop ;2
    57. nop ;2
    58. nop ;2
    59. nop ;2
    60. nop ;2
    61. nop ;2
    62. nop ;2
    63. nop ;2
    64. cpy #$3e ;2
    65. bcc .loop2 ;3
    66. lda #$00 ;2
    67. sta $d020 ;4
    68. lda #$00 ;2
    69. sta $d021 ;4
    70. ldx $0f00
    71. ldy #$00
    72. .loop4 lda $0f01 ,y
    73. sta $0f00 ,y
    74. iny
    75. cpy #$3f
    76. bne .loop4
    77. stx $0f3f
    78. ; ldx $0f3f ;Wird der obere Block aus und dieser einkommentiert scrollt die Bar in die ent-
    79. ; ldy #$00 ;gegengesetzte Richtung !!!
    80. ; .loop5 lda $0f00 ,y
    81. ; sta $0f01 ,y
    82. ; dey
    83. ; bne .loop5
    84. ; stx $0f00
    85. jmp $ea81
    86. *=$0f00
    87. !byte $00, $00, $00, $00, $00, $00, $00, $00
    88. !byte $02, $02, $01, $02, $02, $02, $0a, $0a
    89. !byte $02, $0a, $0a, $0a, $07, $07, $0a, $07
    90. !byte $07, $01, $01, $07, $01, $01, $01, $01
    91. !byte $07, $01, $01, $07, $07, $0a, $07, $07
    92. !byte $0a, $0a, $0a, $02, $0a, $0a, $02, $02
    93. !byte $02, $01, $02, $02, $00, $00, $00, $00
    94. !byte $00, $00, $00, $00, $00, $00, $00, $00
    Alles anzeigen


    Vielen Dank für Eure Mühe schonmal vorab
    ;)
    Spindizzy
  • sieht doch soweit gut aus, das einzige was du jetzt brauchst wär ein schnipsel code der alle paar sekunden (oder was auch immer) die richtung umschaltet?

    ich würde irgendwie sowas stricken:

    Quellcode

    1. dec zaehler+1
    2. zaehler
    3. lda #0
    4. bne weiter
    5. lda #20
    6. sta zaehler+1
    7. inc flag+1
    8. flag lda #0
    9. and #1
    10. beq runter
    11. [...]
    12. jmp weiter
    13. runter
    14. [...]
    15. weiter
    Alles anzeigen



    an der stelle solltest du aber ruhig mal rumspielen was man alles so machen kann :)
  • Hi Leutz ;),

    >Sauhund
    Danke für die Anwort, aber könntest Du n bissl konkreter werden, ich raff net so ganz was Du meinst :rotwerd: :wand :rotwerd:;(



    Danke Sauhund
    mfg
    Spindizzy
  • da ist einmal ein counter der einfach von einem startwert runter gezählt wird, so lange er nicht null ist wird der folgende teil übersprungen; wenn doch wird der counter von vorne gestartet und der nachfolgende code ausgeführt. das sorgt dafür das der besagte code alle X frames einmal ausgeführt wird.

    dann ist da das flag zum hin und her schalten zwischen den beiden zuständen, also hoch oder runter. dafür wird einfach immer wenn die richtung umgeschaltet werden soll ein weiterer zaehler hochgezählt, und das unterste bit auf 0 oder 1 geprüft, wenns 0 ist dann wird der code für "hoch" ausgeführt und wenns 1 ist dann der für runter.

    irgendwie so halt, wie gesagt, spiel mal mit rum :)

    achja, und mein beispiel da verwendet selbstmodifizeirten code, dh der zähler und das flag sind jeweils direkt das argument des LDA befehls (falls dich das verwirrt :=P)

    (ausserdem war da ein kleiner fehler in meinem beispiel sehe ich grade *hust*) ... so sollte es gehen

    Quellcode

    1. dec zaehler+1
    2. zaehler lda #1
    3. bne nichtumschalten
    4. lda #20 ; zähler von vorne zählen lassen
    5. sta zaehler+1
    6. inc flag+1 ; hochzählen um die richtung umzuschalten
    7. nichtumschalten
    8. flag lda #0
    9. and #1
    10. beq runter
    11. [...] ; hier den code für hoch
    12. jmp weiter
    13. runter
    14. [...] ; hier den code für runter
    15. weiter
    Alles anzeigen
  • Hai Sauhund ;)) :roll2:;

    Danke jetzt funzt das ganze mir ist auch prinzipiell klar wie das ganze abläuft, aber die Sache mit dem sich selbst modifizierenden Code ist ziemlich abgefahren :schreck!: :juhu: das klingt irgendwie nach "Der Mann mit den zwei Gehirnen" :freude ;) !
    Gibts dazu Tuts oder articles oder sonstiges Material ???

    Auf jeden Fall vielen Dank Sauhund für Deine Hilfe
    ;)
    Spindizzy


    P.S.:
    ich würde irgendwie sowas stricken


    Coole Strickliese !! ;)
  • Originally posted by spindizzy
    aber die Sache mit dem sich selbst modifizierenden Code ist ziemlich abgefahren :schreck!: :juhu: das klingt irgendwie nach "Der Mann mit den zwei Gehirnen" :freude ;) !


    Das ist aber gang und gebe auf Systemen mit wenig Megaschmerz, selbst in älteren PC-Games mit in Software gerenderter 3D-Grafik wird das gerne gemacht.
    Aufm Cevi ist das eine Frage zwischen 4 und 5(bzw. 6 bei Seitensprung) Zyklen, bei nem Loop der mal eben 1000 mal laufen darf macht das schon einen Unterschied.

    Auch eine nette Sache, wenn du nicht grade unter Bytedruck hängst, ist das hier:

    Quellcode

    1. lda #$20
    2. ldx #$00
    3. clearscreenloop:
    4. sta $0400,x
    5. sta $0500,x
    6. sta $0600,x
    7. sta $06e7,x
    8. dex
    9. bne clearscreenloop
    SELECT signatur FROM dummesprueche WHERE forumsbezug > 0
    0 rows returned.
  • Auch eine nette Sache, wenn du nicht grade unter Bytedruck hängst, ist das hier:


    ...stimmt das hat was ;)

    Ähm nach dem 10. bounce löst sich meine Rastebar teilweise auf ;)


    Hmmmm ....

    ;)
    Spindizzy
  • das klingt irgendwie nach "Der Mann mit den zwei Gehirnen" ! Gibts dazu Tuts oder articles oder sonstiges Material ???


    mmmh, nicht das ich wüsste ... solche sachen sind der grund warum ich immer jedem empfehle erstmal in einem maschinensprache-monitor zu programmieren, da sieht man finde ich viel besser wie sowas funktioniert und wie man darauf kommt.

    gibts ne Möchlichkeit Dir was zu schicken ?


    poste doch lieber hier, dann haben alle was davon :)
  • poste doch lieber hier, dann haben alle was davon


    Hast recht :

    Quellcode

    1. !to "rasteranim-3.prg",cbm
    2. *= $0800
    3. !byte $00,$0c,$08,$0a,$00,$9e,$32,$31,$32,$38,$00,$00,$00,$00
    4. *=$0850
    5. sei ;2
    6. lda #$7f ;2
    7. sta $dc0d ;4
    8. lda $dc0d ;4
    9. lda #$32 ;2
    10. sta $d012 ;4
    11. lda $d011 ;4
    12. and #$7f ;2
    13. sta $d011 ;4
    14. lda #$01 ;2
    15. sta $d01a ;4
    16. ldx #<irq ;2
    17. ldy #>irq ;2
    18. stx $0314 ;4
    19. sty $0315 ;4
    20. cli ;2
    21. rti ;6
    22. irq
    23. dec $d019 ;4
    24. nop
    25. nop
    26. nop
    27. nop
    28. nop
    29. nop
    30. nop
    31. nop
    32. nop
    33. nop
    34. nop
    35. nop
    36. ldy #$00
    37. .loop1 ldx #$08
    38. .loop2 lda $0f00 ,y ;4
    39. sta $d020 ;4
    40. sta $d021 ;4
    41. iny ;2
    42. dex ;2
    43. beq .loop1 ;3
    44. nop ;2
    45. nop ;2
    46. nop ;2
    47. nop ;2
    48. nop ;2
    49. nop ;2
    50. nop ;2
    51. nop ;2
    52. nop ;2
    53. nop ;2
    54. nop ;2
    55. nop ;2
    56. nop ;2
    57. nop ;2
    58. nop ;2
    59. nop ;2
    60. nop ;2
    61. nop ;2
    62. nop ;2
    63. nop ;2
    64. cpy #$3f ;2
    65. bcc .loop2 ;3
    66. lda #$00 ;2
    67. sta $d020 ;4
    68. lda #$00 ;2
    69. sta $d021 ;4
    70. zaehler lda #$01
    71. dec zaehler+1
    72. bne nichtumschalten
    73. lda #$20 ; zähler von vorne zählen lassen
    74. sta zaehler+1
    75. inc flag+1 ; hochzählen um die richtung umzuschalten
    76. nichtumschalten
    77. flag lda #$00
    78. and #$01
    79. beq runter
    80. ; hier den code für hoch
    81. ldx $0f00
    82. ldy #$00
    83. .loop4 lda $0f01 ,y
    84. sta $0f00 ,y
    85. iny
    86. cpy #$3f
    87. bne .loop4
    88. stx $0f3f
    89. jmp weiter
    90. runter
    91. ; hier den code für runter
    92. ldx $0f3f
    93. ldy #$00
    94. .loop5 lda $0f00 ,y
    95. sta $0f01 ,y
    96. dey
    97. bne .loop5
    98. stx $0f00
    99. weiter
    100. jmp $ea81
    101. *=$0f00
    102. !byte $00, $00, $00, $00, $00, $00, $00, $00
    103. !byte $02, $02, $01, $02, $02, $02, $0a, $0a
    104. !byte $02, $0a, $0a, $0a, $07, $07, $0a, $07
    105. !byte $07, $01, $01, $07, $01, $01, $01, $01
    106. !byte $07, $01, $01, $07, $07, $0a, $07, $07
    107. !byte $0a, $0a, $0a, $02, $0a, $0a, $02, $02
    108. !byte $02, $01, $02, $02, $00, $00, $00, $00
    109. !byte $00, $00, $00, $00, $00, $00, $00, $00
    Alles anzeigen


    nach etwa 20 Sekunden Laufzeit löst sich Die Rasterbar auf ?!?!?!?!

    Weisst Du woran das liegen könnte ?

    Danke für die Hilfe
    ;)
    Spindizzy
  • äääh, die zweite kopierschleife (runter) sieht schonmal verdächtig aus.... sicher das das ldy#00 nicht ldy#$3e oder so heissen müsste? :)

    bei solchen schleifen solltest du immer durchspielen was im ersten durchlauf und was im letzten durchlauf passiert...speziell wenn du rückwärts zählst kann man sich da schnell mal um einen verzählen...
  • Hei ;),
    >Sauhund
    Bin grad dabei die Kombinationen durchzuspielen wenn ich di $00 in $3e ändere krieg ich nur nen roten Balken oberhalb der Bar ;( ,
    hmmmmmm sonderbar ....!!!???

    Mal weiter rumprobieren.
    Übrigens mit dem Monitor hast Du recht !

    ;)
    Spindizzy
  • hi...mal wieder mein senf dazu :)

    ich würde grundsätzlich nicht den speicherbereich, der die farben zum DARSTELLEN ($0f00-$0fxx) enthält auch als ablagequelle benutzen.
    Soll heissen, ich würde einen bereich nehmen, der alles enthält was dargestellt werden soll (eben $0f00 - $0fxx), und einen anderen bereich, von wo die farben herkopiert werden (z.b. $3000- xxxx)

    Eine Ursache dafür ist natürlich, dass ich immer im monitor programmiert habe.
    Und wenn man da das programm dann genau während so ein umkopieraktion abbricht, wäre wir anzeigende farbtabelle kaputt..(ok, wenn man das immer wieder neu kopiliert, passiert sowas nicht).
    Aber trotzdem, wenn man die kopierroutinen (rauf/runter) nicht sauber hat, dann
    "lösst" sich die tabelle irgendwann auf :)

    Und ein weitere punkt, der mit 2 tabelle viel einfacher ist:
    Wenn du dann noch weitere Rasterbar über den scrollenen "Hintergrund" drüber
    rumhüpfen lassen willst, dann kannst du das eigentlich nur machen, wenn
    du den "sauberen" Hintergrund aus einer anderen tabelle kopierst.

    Weiterer Punkt: Wenn du den Hintergrund Sinusmässig rauf-und-runter bewegen
    willst, ist das mit 2 tabellen auch viiiiiel einfacher.

    Und noch ein punkt: wenn du ein riesiges rasterfarbmuster hast, das grösser als der angezeigte bereich ist, dann musst du nicht die ganze farbtabelle rauf oder runterkopieren, sondern nur den bereich, der auch dargestellt wird.
    also z.b: du hast farben von $3000 - 3400 (das sind 1024 zeilen). Anzeigen tust du ja aber immer nur so ca. 62 (von $0f00-$0f3e). Da wäre es ja unsinnig, alle 1024 zeile rauf oder runter zu kopieren, sondern immer nur einen 62 zeilen grossen abschnitt von tabelle 2 nach $0f00

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Roland ()