Δευτέρα 11 Ιανουαρίου 2016

Παράδειγμα χρήσης Sprites (ανανέωση εικόνων)


Για το παράδειγμα θα χρειαστούμε 2 bitmap,
Εικόνες :
sp.bmp
https://drive.google.com/open?id=0BwSrrDW66vvvTzJlRnhEVm9nZXM
sp1.bmp
https://drive.google.com/open?id=0BwSrrDW66vvvZEVMVW9lNlFSNEU

Στην Μ2000 γράφουμε
win dir$
και ανοίγει ο explorer με το φάκελο που θα βάλουμε τις εικόνες.
Αφού τις έχουμε εκεί, σε ένα τμήμα έστω Α αντιγράφουμε το παρακάτω. Τα πλήκτρα 1 έως και 5 κάνουν αλλαγές με αριστερό κλικ τερματίζουμε το πρόγραμμα.
Βλέπουμε την χρήση του Παίκτη (hardware sprite) και του απλού με την Διάφανο. Το Hardware Sprite είναι σε δικό του επίπεδο, ενώ τα software sprites τα βάζουμε ανάμεσα σε άλλα γραφικά. Εδώ τρία ανθρωπάκια...τρέχουν πίσω από τους λόφους.

Μπορούμε να μικρίνουμε το παράθυρο π.χ. με Παράθυρο 12, 12000, 8000;
Το πρόγραμμα μπορεί να τρέξει και σε διαφορετικά μεγέθη παραθύρων!


οι εντολές Κράτησε/Άφησε κάνουν μια καλή δουλειά. Η πρώτη κρατάει αντίγραφο της οθόνης και η δεύτερη κάνει "επικόλληση". Έτσι ότι θέλουμε να μην αλλάζει το κρατάμε. Κάθε φορά που θέλουμε τα sotwarfe sprites να σχεδιαστούν, αφήνουμε το φόντο (με επικόλληση από ιδιωτικό πρόχειρο χώρο), και μετά βάζουμε τα sprites (η Μ2000 έχει ένα σύστημα να δίνει πίσω αυτό που πατάνε τα sprites, αλλά εδώ δεν το χρησιμοποιώ). Το μεγάλο hardware sprite είναι ανεξάρτητο, μπορούμε να κάνουμε ότι θέλουμε στην οθόνη, γιατί βρίσκεται σε δικό του επίπεδο. Όμως δεν μπορεί να μπει πίσω από τους λόφους! Αφού οι λόφοι είναι "ζωγραφιά" στο βασικό επίπεδο. Όμως επειδή πρώτα βάζουμε τον ήλιο, μετά τα software sprites και μετά τους λόφους...φαίνονται σαν να υπάρχουν επίπεδα...στο επίπεδο!


Τμήμα Φόρτωση_Αρχείων {
      Παίκτης 0
      a$=""
      b$=""
      Εικόνα "sp" στο a$
      Εικόνα "sp1" στο b$
      Επίπεδο 1 {
            Παράθυρο 12, 20000,8000
            Οθόνη 0,0
            Θέση 0,0
            Εικόνα a$
      }
      Επίπεδο 2 {
            Παράθυρο 12, 20000,8000
            Οθόνη 15
            Θέση 0,0
            Εικόνα b$
      }
}
Τμήμα Φύλαξε_Εικόνα {
      Διάβασε L, &A$(), &b$(), xx
      a$="": b$=""
      Για L=L έως 0
      Επίπεδο 1 {
            Θέση 1620*L,15+xx
            Αντέγραψε 1585,2000 Στο a$(L)
      }
      Επίπεδο 2 {
            Θέση 1620*L,15+xx
            Αντέγραψε 1585,2000 Στο b$(L)
      }
      Επόμενο L
}
Τμήμα Λόφοι {
      Διάβασε p
      p*=ResizeCurve
      k=θέση.Χ
      z=θέση.Υ
      Πένα 6 {
            Χρώμα Πάνω 6 {
                  Καμπύλη 3000*p,-500*p,0,-400*p,1000*p, 0,1000*p,0,0,900*p, 2000*p,0, 1000*p,-200*p, 0,-700*p,1000*p, 0,1000*p,0,0,900*p, 2000*p,0,0,1500*p ,0,3000*p,0,0,0 ,0,0,0,-12000*p,0
            }
      }
      Θέση k, z
      Πάχος 4 {
            Καμπύλη 3000*p,-500*p,0,-400*p,1000*p,0,1000*p,0,0,900*p,2000*p,0, 1000*p,-200*p, 0,-700*p,1000*p,0,1000*p,0,0,900*p,2000*p,0
      }
}
Φόρτωση_Αρχείων
Διαφυγή όχι
\* δοκίμασε με Γρηγορα σκέτο ή με Αργά
\* Θέσε Γρήγορα !
Θέσε Γρήγορα
\* Θέσε Αργά
Σχέδιο.Νημάτων Ταυτόχρονο \* Διαδοχικό   *\
Οθόνη 4,0
Δρομέας 0,0
Πένα 14 {
      Διπλά
      ky=υ.σημεία/ύψος*2
      Θέση 0,ky
      Βάψε χ.σημεία,υ.σημεία-ky,1,5
      Αναφορά 2, { Παράδειγμα με Παίκτες
                        διαφάνειες πάνω από ολισθαίνουσα οθόνη
                        }
      Κανονικά
}
Κράτησε
Στη Third=χ.σημεια/1.8, Four=1300
Γενική ResizeCurve=Third/12000*1.05
Four*=ResizeCurve
Στη sc=Third, dr=1, P=2, aa=0, pl3x=χ.σημεία/2, pl3y=Third, ANG=0


Επίπεδο 3 {Δείκτη.Μορφή Κρύψε}
Δείκτη.Μορφή Κρύψε
\* Φορτώνουμε τα Sprites
\*
Πίνακας s$(8), sm$(8)
Φύλαξε_Εικόνα 7, &s$(), &sm$(),0
Πίνακας s1$(8), sm1$(8)
Φύλαξε_Εικόνα 7, &s1$(), &sm1$(),2100
Διαμέσου Σταθερή_Εικόνα()
Παίκτης 3, Δείκτης.χ,Δείκτης.υ Με S$(0), sm$(0)
Παίκτης 3 Δείξε
Νήμα {
      Διαμέσου Σταθερή_Εικόνα()
} Ως m Κάθε 40
\\ βάζουμε μπλοκ εσωτερικά στο νήμα
\\ για να μην επιτρέψουμε άλλο νήμα να τρέξει...
Νήμα {
      {
            Αν dr=1 Τότε {
                  Παίκτης 3 Με S$(aa), sm$(aa), 20, ANG Μέγεθος P*ResizeCurve
            } Αλλιώς Παίκτης 3 Με S1$(7-aa), sm1$(7-aa), 20, ANG Μέγεθος P*ResizeCurve
            aa++
            Αν aa>7 Τότε aa=0
      }           
} Ως L Κάθε 30
\*     Παίκτης 3, mousea.x, mousea.y   \\ αν θέλουμε εναλλακτικά!
Παίκτης 3, pl3x, pl3y
Ανανέωση 3000
Κύριο.Έργο 40 {
      Αν Πατημένο(49) Τότε {
                  Αν P<7 Τότε {
                        P+=.1
                  } Αλλιώς P=7
      } Αλλιώς.Αν Πατημένο(50) Τότε {
                  Αν P>1 Τότε {
                        P-=.1
                  } Αλλιώς p=1
      }
      Αν Πατημένο(51) Τότε {
            ANG+=5
      }  Αλλιώς.Αν Πατημένο(52) Τότε ANG-=5
      Αν Πατημένο(53) Τότε dr-!
      anykey$=Ενκομ$
      Αν Δείκτης>0 Τότε Έξοδος
}
Παίκτης 3 Κρύψε
Δείκτη.μορφή Δείξε
Νήματα Σβήσε
Πένα 0
Οθόνη 15, -10
Ρουτίνα Σταθερή_Εικόνα()
      Ανανέωση 3000
      Άφησε
      Θέση (8000-150*p)*ResizeCurve, (8000-600*p)*ResizeCurve
      Κύκλος Γέμισμα 14, (2000+150*p)*ResizeCurve,1,14
      Θέση Δείκτης.χ, Δείκτης.υ
      Διάφανο s1$(7-aa),2, ang,120*ResizeCurve, sm1$(7-aa)
      Θέση Δείκτης.χ+300, Δείκτης.υ+300
      Διάφανο s1$(7-(aa+2) mod 8),2, ang,80*ResizeCurve, sm1$(7-(aa+2) mod 8)
      Θέση Δείκτης.χ+1000, Δείκτης.υ
      Διάφανο s1$(7-(aa+5) mod 8),2, ang,100*ResizeCurve, sm1$(7-(aa+5) mod 8)
      Αν dr=1 Τότε {
            Θέση (sc-Third)*p,Third-Four*p/4
            Λόφοι p
            Θέση (sc+0)*p, Third-Four*p/4
            Λόφοι p
            Θέση (sc+Third)*p, Third-Four*p/4
            Λόφοι p
            sc-=(150+15*p)*ResizeCurve
            Αν sc<=0 Τότε sc=Third
      } Αλλιώς {
            Θέση (sc-Third)*p,Third-Four*p/4
            Λόφοι p
            Θέση sc*p, Third-Four*p/4
            Λόφοι p
            Θέση (sc+Third)*p, Third-Four*p/4
            Λόφοι p
            sc+=(150+15*p)*ResizeCurve
            Αν sc>=Third Τότε sc=0
      }
      Θέση χ.σημεία, Δείκτης.υ/4
      Διάφανο s1$(7-aa),2, 1+aa*5,(1+AA*40)*ResizeCurve, sm1$(7-aa)

Τέλος Ρουτίνας

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.