Τρίτη 10 Νοεμβρίου 2015

Αναθεώρηση 83, Βελτίωση στην περιστροφή εικόνας!

Αναθεώρηση 83 (Τεχνικό Θέμα).
Σε αυτή την αναθεώρηση ασχολήθηκα με την περιστροφή εικόνας. Έκανα αρκετές βελτιώσεις. Τρεις διαφορετικές ρουτίνες περιστροφής, μια με μεγέθυνση που χρησιμοποιείται στην ΑΝΤΕΓΡΑΨΕ, μια στην ΔΙΑΦΑΝΟ (ή ΔΙΑΦΑΝΕΙΑ) και μία στο ΠΑΙΚΤΗΣ (το hardware sprite). Ο λόγος που υπάρχουν τρεις διαφορετικές ρουτίνες είναι ο παρακάτω:
Στην Αντέγραψε έχουμε δυο τύπους αντιγραφής με περιστροφή, με ή χωρίς πλαίσιο. Χωρίς πλαίσιο σημαίνει ότι στη θέση του θα μπουν τα εικονοστοιχεία από την οθόνη. Το πλαίσιο είναι το τετράπλευρο που περιέχει την εικόνα μετά τη περιστροφή, και έχει μέγεθος το ύψος και πλάτος της εικόνας (σε γωνία). Αν η εικόνα είναι σε 0 μοίρες (χωρίς περιστροφή) τότε το μέγεθος πλαισίου ταυτίζεται με το μέγεθος εικόνας. Τι γίνεται με τη μεγέθυνση; Στη μεγέθυνση η ρουτίνα περιστροφής πριν την 83η αναθεώρηση, πρώτα μεγάλωνε την εικόνα και μετά έκανε περιστροφή χρησιμοποιώντας μια  1 προς 1 περιστροφή, και ειδικά στην 82 είχα βάλει στην περίπτωση με το διάφανο πλαίσιο μια καλύτερη περιστροφή με έλεγχο anti-aliasing (μείξη) ενός εικονοστοιχείου (αφαιρεί τα τετράγωνα). Όμως με αυτόν τον τρόπο γίνονταν διπλό anti-aliasing, μια φορά στη μεγέθυνση και μια στην περιστροφή και αυτό είναι λάθος! Οπότε άλλαξα την ρουτίνα και τώρα κάνει την μεγέθυνση και την περιστροφή σε μια κίνηση και είναι τέλεια! (αλλά λίγο πιο αργή).
Στην Διάφανο έχει παραμείνει η παλιά ρουτίνα η οποία μάλιστα δεν έχει καν anti-aliasing, γιατί αφενός θέλουμε γρήγορα να φτιάχνει τις περιστροφές, αφετέρου θέλουμε να υπάρχουν καθαρά χρώματα (ενώ το anti-aliasing κάνει αναμείξεις), ώστε να αφαιρείται το χρώμα που ορίζουμε για διαφάνεια 100%. (Ουσιαστικά και η παλιά ρουτίνα έχει αλλάξει από την 82η αναθεώρηση, λόγω την προσθήκης ως επιλογής μάσκας εικονοστοιχείων, που προσδίδει διαπερατότητα ανά εικονοστοιχείο, αλλά δεν έχει αλλάξει ως προς την περιστροφή).
Στον Παίκτη, εκεί η περιστροφή γίνεται πάντα στο ένα προς ένα, στο μέγεθος 100% και μετά μεγεθύνεται. Επειδή  ο παίκτης έχει δική του μάσκα που φτιάχνεται με διανύσματα, μεγεθύνεται αυτή και αποκόπτει τα επιπλέον στοιχεία με ακρίβεια εικονοστοιχείου (ενώ αν δεν ήταν διανυσματική η μεγέθυνση, τα μικρά εικονοστοιχεία θα μεγάλωναν σε μεγάλα τετράγωνα, άρα θα εμφανίζονταν μεγάλα δόντια). Ο παίκτης μπορεί να δείχνει μια εικόνα χωρίς εσωτερικά διάφανα στοιχεία. Σε αυτή τη περίπτωση αν δεν υπήρχε μάσκα θα βλέπαμε τις πλευρές της εικόνας με μεγάλα δόντια, διότι η ρουτίνα περιστροφής δεν έχει φτιάξει τις άκρες - ενώ κάνει δουλειά στα άλλα εικονοστοιχεία με την μείξη. Με την μάσκα κόβουμε τις άκρες με ακρίβεια εικονοστοιχείου (ουσιαστικά δεν πειράζουμε την εικόνα αλλά αυτόματα το σύστημα παραθύρων των Windows χρησιμοποιεί την μάσκα για να αφαιρεί εικονοστοιχεία).
Μια ακόμα αλλαγή που έκανα είναι στην εντολή Εικόνα όπου σε ένα αλφαριθμητικό βάζουμε μια εικόνα και μπορούμε να ορίσουμε μέγεθος, ή μέγεθος κατά πλάτος και ύψος ανεξάρτητα. Εκεί λοιπόν έβαλα το Resample, δηλαδή τoν επαναπροσδιορισμό των εικονοστοιχείων με υψηλή ποιότητα (το είχα σε χαμηλή..). Η διαφορά ποιοτήτων αναφέρεται εδώ στην SetStretchBltMode συνάρτηση των windows. Εκεί λοιπόν αναφέρει τι κάνει η HALFTONE (αυτή είναι η ποιοτική). Για τις περιστροφές καλύτερη είναι βέβαια η ρουτίνα της ΑΝΤΕΓΡΑΨΕ, ενώ στα άλλα μας ενδιαφέρει το αποδοτικό!


Μια προσθήκη ακόμα είναι στην εντολή Χρώμα {}  όπου μπήκε ένα ακόμα αναγνωριστικό το Πάνω, με το οποίο δεν γράφουμε την γραμμή των περιεχόμενων σχημάτων αλλά μόνο το εσωτερικό. Επιπλέον η δεύτερη παράμετρος δηλώνει τύπο γεμίσματος.Χωρίς αυτή τη παράμετρο ο τύπος είναι το 0, δηλαδή το χρώμα γεμίσματος ως αυτό που δώσαμε στη πρώτη. Με 1 έως 7 υπάρχουν επιλογές διαγράμμισης, με τη 1 να σημαίνει χωρίς φόντο (διάφανο), και τα άλλα να δίνουν πλάγιες, διαγώνιες κ.α. γραμμές, με διάφανο το χώρο μεταξύ τους)
Η χρώμα χωρίς παραμέτρους και με το ελληνικό ερωτηματικό φτιάχνει μάσκα, δηλαδή περιοχή όπου μόνο εκεί βγαίνουν τα γραφικά. Εδώ έχω χρησιμοποιήσει ένα κύκλο και τα γραφικά κόβονται (περιορίζονται) από τον κύκλο. Αν ξεχάσουμε να επαναφέρουμε τη μάσκα σε όλη την οθόνη (γίνεται στις τελευταίες δυο γραμμές), τότε με την εντολή ΟΘΟΝΗ (CLS) η μάσκα επανατοποθετείται σε όλη την οθόνη. Η μάσκα αυτή δεν είναι ίδια με την μάσκα των Παικτών. Η μάσκα των παικτών αφαιρεί "φόρμα", ενώ εδώ αφαιρεί διαθέσιμο χώρο για εκτύπωση. Η αφαίρεση φόρμας για παράδειγμα είναι οι στρογγυλοποιήσεις άκρων σε φόρμες (οπότε εκεί δεν μπορούμε να κάνουμε κλικ, ή Hit Test όπως λέγεται προγραμματιστικά).

Προσθήκη: Η ανανέωση έγινε Ανανέωση 5000 ( δηλαδή μηδενίζει έναν εσωτερικό μετρητή για να γίνει η επόμενη σε 5 δευτερόλεπτα, αλλά ουσιαστικά θα γίνει μόλις δοθεί ξανά αυτή η εντολή. Στην επιστροφή στην γραμμή εντολών ρυθμίζεται αυτόματα στο νορμάλ)

ΤΜΗΜΑ καμ {
      ΔΙΑΒΑΣΕ πολ
      ΠΕΝΑ 6 {
            ΚΑΜΠΥΛΗ 3000*πολ, -500*πολ, 0, -400*πολ, 1000*πολ, 0, 1000*πολ, 0, 0, 900*πολ, 2000*πολ,0, 1000*πολ, -200*πολ, 0, -700*πολ, 1000*πολ, 0, 1000*πολ, 0, 0, 900*πολ, 2000*πολ, 0, 0, 1500*πολ, 0,3000*πολ, 0, 0, 0 ,0, 0, 0, -12000*πολ, 0
      }
}


ΟΘΟΝΗ 1
ΠΕΝΑ 15
ΑΝΑΝΕΩΣΗ 5000
ΘΕΣΗ 6000,6000
ΒΑΨΕ 8000,5000,10
ΘΕΣΗ 6000,6000
ΚΡΑΤΗΣΕ
ΧΡΩΜΑ {ΚΥΚΛΟΣ ΓΕΜΙΣΜΑ 10, 6000 };
κκ=0
ΕΠΑΝΕΛΑΒΕ {
      ΘΕΣΗ 6000+κκ,6000
      ΧΡΩΜΑ ΠΑΝΩ 12 {
            καμ 1
            ΘΕΣΗ 8000+κκ,5000
            ΚΥΚΛΟΣ 1000
            καμ .7
      }
      ΘΕΣΗ 6000+κκ,6000
      ΠΑΧΟΣ 10 {
            ΠΕΝΑ 11 {
                  ΧΡΩΜΑ 15,2 {
                  καμ 1
                  ΘΕΣΗ 8000+κκ,5000
                  ΚΥΚΛΟΣ 1000
                  καμ .7
            }
      }
      }
      ΑΝΑΝΕΩΣΗ
5000
      κκ+=30
      α$=ΚΟΜ$
      ΑΝ α$=" " ΤΟΤΕ ΕΞΟΔΟΣ
      ΑΝ ΘΕΣΗ("βb",ΠΕΖ$(α$))>0 ΤΟΤΕ κκ-=60
      ΑΦΗΣΕ
} ΠΑΝΤΑ

ΘΕΣΗ 0,0
\\ ΕΙΔΙΚΗ ΧΡΩΜΑ ΜΕ ΤΟ ΕΡΩΤΗΜΑΤΙΚΟ ΣΤΟ ΤΕΛΟΣ
\\ ΦΤΙΑΧΝΕΙ ΜΑΣΚΑ ΠΟΥ ΑΠΟΤΡΕΠΕΙ ΤΗΝ ΕΜΦΑΝΙΣΗ ΓΡΑΦΙΚΩΝ
\\ ΧΡΩΜΑ {ΠΟΛΥΓΩΝΟ 0, Χ.ΣΗΜΕΙΑ, 0,0,Υ.ΣΗΜΕΙΑ,-Χ.ΣΗΜΕΙΑ,0,0,-Υ.ΣΗΜΕΙΑ};
\\ το ίδιο κάνει και αυτή
ΧΡΩΜΑ {};




Με Ctrl+C στην εισαγωγή εμφανίζεται το CLS και πατιέται αυτόματα το Enter..
Όταν τρέχει ένα πρόγραμμα το Ctrl+C κάνει διακοπή (μας ρωτάει πρώτα).

Υ.Γ (αυτή είναι η καμπύλη που παίζει στο βίντεο με το ανθρωπάκι που τρέχει).

Κυριακή 8 Νοεμβρίου 2015

Βίντεο από δοκιμές!


Ετοιμάζω ένα παράδειγμα...αλλά έχει τόση πλάκα που δεν άντεξα και έφτιαξα ένα μικρό βίντεο! Μόνο ο άνθρωπος μπροστά και κάτω είναι "hardware" sprite. Τα άλλα φτιάχνονται κάθε φορά στην οθόνη μαζί με τον Ήλιο και τα βουναλάκια! Το δείκτη του ποντικιού τον έχω αφαιρέσει και στη θέση του παίζουν τρία ανισομεγέθη ανθρωπάκια (τα οποία έχω διαφορετική αρχή ακολουθίας εικόνων, ώστε να φαίνονται "ανεξάρτητα"). Έχω ορίσει πέντε πλήκτρα, το 1 και 2 αυξομειώνει το μέγεθος διάφορων αντικειμένων, και τα 4 και 5 περιστρέφει το βασικό και τα τρία άλλα "ανθρωπάκια". Το βασικό "ξεφεύγει" από τα όρια της φόρμας, Ενώ τα άλλα περιορίζονται μέσα σε αυτήν και μάλιστα τα έχω βάλει πίσω από τα βουναλάκια! Τα βουναλάκια είναι τρεις καμπύλες σε επανάληψη. Το πρόγραμμα θέλει φτιάξιμο για να παίζει σε κάθε τύπο οθόνης (αυτός εδώ είναι 1280Χ1024). Επιπλέον έχω χρησιμοποιήσει νήματα όπου παράλληλα κάνουν διάφορα πράγματα, όπως για παράδειγμα την αλλαγή της εικόνας στο βασικό παίκτη (Παίκτες λέγονται οι επιταχυνόμενες από το υλικό διαφάνειες, που βρίσκονται σε δικό τους επίπεδο (ανεξάρτητο από την οθόνη που γράφουμε), οι οποίες έχουν σημεία με 100% διαπερατότητα αλλά όχι μερική διαπερατότητα ανά σημείο ή στο σύνολο, που έχουν οι διαφάνειες που φτιάχνονται απ' ευθείας στην οθόνη). Υπάρχουν 32 τέτοιοι Παίκτες και ο αριθμός τους είναι συνάμα και η θέση τους με το 32 να είναι προς το μέρος μας και το 1 στο βάθος.
Στην αναθεώρηση 82 έβαλα επιπλέον την διαφάνεια να την ορίζω από άλλη εικόνα και όχι βάση χρώματος - αλλά ισχύει και το "παλιό" σύστημα).
Τις εικόνες για το ανθρωπάκι τις βρήκα στο διαδίκτυο. Έφτιαξα δυο εικόνες, μια με τις δεκάξι στάσεις (οκτώ για το τρέξιμο δεξιά και άλλες τόσες για αριστερά) και μία με την "σκιά" τους δηλαδή μαύρο σε άσπρο φόντο όπου το άσπρο είναι το διάφανο. Έτσι εμφανίζεται το άσπρο στα μάτια του παίκτη, διαφορετικά θα έπρεπε να επιλέξω άλλο χρώμα για διάφανο, για να κρατήσω το άσπρο "αδιάφανο".  Επειδή με τις περιστροφές κάπου υπάρχουν "κενά" έκανα το εξής στην πρώτη εικόνα: έβαλα στο περιθώριο μαύρο χρώμα. Δεν είναι τυχαίοπου το ανθρωπάκι έχει μαύρο περίγραμμα. Πιθανόν στις περιστεροφές κάποια μαύρα σημεία να μην προέρχονται από το πραγματικό περίγραμμα αλλά από το επιπλέον μαύρο. Να λοιπόν ποια είναι η ιδέα της χρήσης της δεύτερης εικόνας (της μάσκας) όπως λέμε: Εξυπηρετεί επειδή δεν ορίζουμε χρώμα που θα εξαιρεθεί και επιπλέον το κενό γύρω από τον παίκτη θα χρησιμοποιηθεί για την βελτίωση της ποιότητας εμφάνισης σε μεγεθύνσεις και περιστροφές. Στους παίκτες μεταξύ δυο αλλαγών εικόνας (από την αλληλουχία) δεν ασχολούμαστε με αυτόν, όλα γίνονται αυτόματα, ενώ για τις διαφάνειες πρέπει κάθε φορά για κάθε ανανέωση της οθόνης να κάνουμε νέο υπολογισμό ή όπως λέγεται rendering της εικόνας στη θέση που τη θέλουμε και αυτό είναι κόστος σε διεργασία, σε φόρτο ή απλώς φορτίο στην κεντρική μονάδα. Τους παίκτες τους χειρίζεται αυτόματα η κάρτα γραφικών. Αποτελούν picturebox της Visual Basic με region που αφήνει "κενά" σημεία. Οι διαφάνειες είναι απλές αντιγραφές σε ένα μεγάλο Picutrebox που είναι η οθόνη. Μπορούμε να έχουμε διαφάνειες και μέσα στην εικόνα του "παίκτη"! Ο κάθε παίκτης είναι συνάμα και ένα επίπεδο όπως το βασικό, με χωριστή οθόνη, γραφικά, διαφάνειες.


ΓΚ


Εικόνες στη Μ2000 (μέρος 1ο)

Έχει ανέβει η αναθεώρηση 83 (οπότε κατεβάστε την για να δείτε και πιο σωστά το παράδειγμα - ή 83 έχει βελτιώσεις)
Στο περιβάλλον της Μ2000 μπορούμε να κάνουμε διάφορα πράγματα με εικόνες. Σε αυτή την ανάρτηση θα δούμε πως θα πάρουμε μέρος από την εικόνα και πως μπορούμε να το σώσουμε σε αλφαριθμητικές μεταβλητές. Θα δούμε διάφορους τρόπους εμφάνισης.
Σε επόμενη ανάρτηση θα δούμε πώς εισάγουμε φωτογραφίες απ΄έξω (από αρχείο και από το πρόχειρο) και πώς σώνουμε. Επίσης θα ακολουθήσει άλλη ανάρτηση που θα δούμε τους "παίκτες" δηλαδή τις διαφάνεις μέσω υλικού (με επιτάχυνση υλικού για να είμαστε πιο ακριβείς).

Τρέχουμε το περιβάλλον (m2000.exe). Μας ενδιαφέρει να κρατήσουμε το πάνω τμήμα που γράφει ΠΕΡΙΒΑΛΛΟΝ Μ2000 ...για να το πάρει το πρόγραμμα που βλέπετε παρακάτω. Επειδή ξεκινάει το περιβάλλον με χωριστή οθόνη ακόμα και αν πατήσουμε εκατό Enter οι πάνω γραμμές θα παραμείνουν ως έχουν (μέχρι μια ΟΘΟΝΗ ,0  να επαναφέρει τη χωριστή οθόνη στο 0, δηλαδή στη πρώτη γραμμή, άρα να μην υπάρχει τελικά χωριστή οθόνη).

Γράφουμε Σ Α και ανοίγει ο διορθωτής για το τμήμα Α και εκεί κάνουμε αντιγραφή το παρακάτω. Θα το δούμε αρχικά γκρίζο, πατάμε κάποιο βελάκι για να φύγει το γκρίζο μαρκάρισμα...και βλέπουμε το κώδικα χρωματισμένο. Πατάμε Esc και βγαίνουμε στην πρώτη οθόνη. Γράφουμε Α και τρέχει το πρόγραμμα. Περιμένει κάποιες φορές να πατήσουμε ένα πλήκτρο (αν το κρατήσουμε πατημένο θα πάρει περισσότερα πλήκτρα στη μνήμη και έτσι δεν θα περιμένει μετά. Σε άλλες αναρτήσεις θα δούμε πώς θα διαβάζουμε το πληκτρολόγιο ξεχωριστά για το κάθε πλήκτρο, άρα χωρίς επανάληψη).

Στο πρόγραμμα αυτό θα δούμε τις εντολές Αντέγραψε, Εικόνα και Διάφανο (όχι όλες τις παραλλαγές). Θα δούμε τις Κράτησε και Άφησε καθώς και την Ανανέωση για τον χειρισμό της εμφάνισης της οθόνης (βασικό για παιχνίδια ή παρουσιάσεις με κίνηση). Επιπλέον θα δούμε την Κάθε {} μια απλή δομή επανάληψης ανά χρονικό διάστημα.

θέση 0,0
α=σημείο ' το χρώμα στο σημείο 0,0 (twips 1440 μια λογική ίντσα, στον εκτυπωτή είναι μια πραγματική).


Καθαρό Α$, Β$
Αντέγραψε 3000,2000 στο Α$
Αντέγραψε 5000,5000 με Α$
Αντέγραψε 8000,5000 με Α$, 45 \\ γωνία 45 μοίρες όμως βάζει και το πλαίσιο και χαμηλή ποιότητα
Αντέγραψε 6000,4000 Επάνω Α$, 45 \\ 45 μοίρες γωνία καλή ποιότητα χωρίς πλαίσιο * δες εξηγήσεις
πλήκτρο$=Κομ$ \\ περιμένουμε ένα πλήκτρο
Οθόνη  \\ καθαρίζουμε την οθόνη
Αντέγραψε 2000,5000 με Α$, 90,50 \\ γωνία 90 μοίρες δεν έχει πλαίσιο (0,90,180,270) δεν έχουν
Αντέγραψε 2000,7000 Επάνω Α$, 90,50 \\ και έχει την ίδια ποιότητα με αυτό.
Αντέγραψε 6000,4000 Επάνω Α$, 89, 200 \\ 45 μοίρες γωνία καλή ποιότητα χωρίς πλαίσιο * δες εξηγήσεις
\\ η τρίτη παράμετρος είναι το μέγεθος, όπου 100 είναι το 100%, άρα 200 το διπλάσιο, σε έκταση το τετραπλάσιο.
Κράτησε   \\ κρατάμε όλη την οθόνη σε προσωρινή θέση (την φόρμα του επιπέδου που γράφουμε).
πλήκτρο$=Κομ$ \\ περιμένουμε ένα πλήκτρο
Οθόνη  \\ καθαρίζουμε την οθόνη
πλήκτρο$=Κομ$ \\ περιμένουμε ένα πλήκτρο
Άφησε   \\ αφήνουμε την οθόνη όπως την κρατήσαμε
πλήκτρο$=Κομ$ \\ περιμένουμε ένα πλήκτρο
Οθόνη  \\ καθαρίζουμε την οθόνη
Εικόνα Α$ στο Β$, 200 \\ αύξηση μεγέθους στο 200% με αντιγραφή σε άλλη μεταβλητή
Αντέγραψε 0,4000 επάνω Β$
Αντέγραψε 0,8000 επάνω Α$,,200 \\ εδώ είναι πο ομαλό από το προηγούμενο
Αντέγραψε 4000,4000 επάνω Β$, 30 \\ εδώ το B$ έδωσε καλύτερη οπτική ποιότητα
Αντέγραψε 4000,8000 επάνω Α$, 30,200 \\ ενώ εδώ έδωσε μεν πιο "σωστή" αλλά χάσαμε την αντίθεση στα γράμματα
\\ Θα μπορούσε να κάνει κανείς κινούμενα σχέδια φορτώνοντας στα αλφαριθμητικά εικόνες
\\ και με τη χρήση των εντολών κράτησε και άφησε να προετοιμάζουμε το φόντο
\\ και μετά να βάζουμε τις εικόνες μας
\\ Σημαντικό ρόλο παίζει και η διαχείριση της ανανέωσης της οθόνης
πλήκτρο$=Κομ$ \\ περιμένουμε ένα πλήκτρο
Οθόνη  \\ καθαρίζουμε την οθόνη
Ανανέωση 5000 \\ ορίζουμε ένα μεγάλο νούμερο εδώ 5 δευτερόλεπτα
Για ι=1 έως 100 {
      Άφησε            \\ βάζουμε κάθε φορά το "φόντο" που κρατήσαμε
      Αντέγραψε 4000+ι*30,4000+ι*30 επάνω Β$, 30
      Αντέγραψε 4000+ι*15,8000-ι*45 επάνω Α$, 30,200
      Ανανέωση 5000 \\ ανανεώνουμε για να φανούν και τα δυο μαζί
      αναμονή 10 \\  πρέπει να βάλουμε μια καθυστέρηση ώστε να τα δούμε λίγο!
}
\\ αντί τη Για εώς {} μπορούμε να βάλουμε μια Κάθε
\\ και έτσι δεν χρειάζεται μια Αναμονή
\\ η κάθε έχει το συνολικό χρόνο (αν απαιτηθεί περισσότερος τότε δίνει το σύστημα και άλλο)
\\ αν όμως χρειαστεί λιγότερος τότε περιμένει το σύστημα να τελειώσει ο χρόνος
\\ άρα αρκεί ότι βάζουμε να γίνεται εντός χρόνου για να έχουμε συγχρονισμένη εμφάνιση!
Κάθε 30 {
      ι--
      αν ι<0 τότε έξοδος
      Άφησε            \\ βάζουμε κάθε φορά το "φόντο" που κρατήσαμε
      Αντέγραψε 4000+ι*30,4000+ι*30 επάνω Β$, 10
      Αντέγραψε 4000+ι*15,8000-ι*45 επάνω Α$, 10,200
      Ανανέωση 5000 \\ ανανεώνουμε για να φανούν και τα δυο μαζί
}
Κάθε 30 {
      ι++
      αν ι>100 τότε έξοδος
      Άφησε            \\ βάζουμε κάθε φορά το "φόντο" που κρατήσαμε
      θέση 4000+ι*30,4000+ι*30
      Διάφανο Β$, α,30 \\ το χρώμα α θα είναι 100% διάφανο, 30 μοίρες γωνία
      θέση 4000+ι*15,8000-ι*45
      Διάφανο Α$, α, 30,200, 50 \\ εδώ ορίζουμε ότι  όλο το A$ θα έχει διαπερατότητα 50%
      Ανανέωση 5000 \\ ανανεώνουμε για να φανούν και τα δυο μαζί
}
\\ Η εντολή Διάφανο στην αναθεώρηση 81 πήρε μια επιπλέον παραλλαγή, και εκεί που δίναμε από 0 έως 100 στη διαπερατότητα, τώρα μπορούμε να δώσουμε μια άλλη εικόνα, όπου το 255 στο χρώμα σημαίνει 100% διαπερατότητα και το 0 σημαίνει 0, αλλά όλα τα ενδιάμεσα είναι σημαντικά, και δίνουν ανά εικονοστοιχεία διαφορετική διαπερατότητα (αν το θέλουμε).
\\ Η εντόλη αυτή (και Διαφάνεια να τη γράψουμε είναι οκ), κάθε φορά που αντιγράφουμε στην οθόνη μια μεταβλητή, στην εσωτερική μεταβλητή διαφάνεια$ κρατάει τα περιεχόμενα της οθόνης πίσω από την εικόνα.
\\ Η εντολή διάφανο χρησιμοποιεί το μέσον την εικόνας για να τοποθετήση την εικόνα
\\ ενώ η αντέγραψε την πάνω αριστερή γωνία, ακόμα και αν περιστρέφει εικόνες.
\\ η περιστροφή στις διαφάνειες δεν είναι με καλή ποιότητα για να δουλεύει στη περιστροφή η διαφάνεια!
ι=0
Διάφανο ""  \\ καθαρίζουμε το σύστημα
Κάθε 30 {
      ι++
      αν ι>200 τότε έξοδος
      Διάφανο Διαφάνεια$
      θέση 4000+ι*30,4000+ι*30
      Διάφανο Α$, α,ι, 30+ι \\ το χρώμα α θα είναι 100% διάφανο, 30 μοίρες γωνία
      Ανανέωση 5000 \\ ανανεώνουμε για να φανούν και τα δυο μαζί
}








Τετάρτη 4 Νοεμβρίου 2015

Περί ομάδων στη Μ2000.

(να βάλετε την αναθεώρηση 80 γιατί η 79 και η 78 έχουν πρόβλημα που λύθηκε)

Αντιγράψτε το παρακάτω και βάλτε μετά από κάθε εκτύπωση (το ? είναι το Τυπωσε) μια εντολή Έξοδος για να βλέπεται προοδευτικά τα αποτελέσματα (σιγά σιγά βγάζουμε την έξοδο). Άλλος τρόπος είναι με την εντολή δοκιμή και να κάνουμε βηματική εκτέλεση.
Εδώ θα δούμε τι είναι μια ομάδα και τι σχέση έχει με την Κλάση. Η εντολή κλάση φτιάχνει μια συνάρτηση που δίνει ομάδα, είναι δηλαδή ένας κατασκευαστής. Αυτό που θα δούμε εδώ είναι τα δυο ήδη ομάδων, οι ομάδες με όνομα και εκείνες χωρίς. Ομάδες δίχως όνομα σημαίνει ότι έχουν μόνο θέση, και αυτή μπορεί να είναι σε στοιχείο πίνακα ή στο σωρό (στοίβα ειδικού τύπου στη Μ2000).
Επιπλέον θα δούμε το μηχανισμό με την τελεία (ντοτ). Επίσης θα δούμε την Για {} η οποία ξεχωρίζει από την Για Εως Ανά {} της επανάληψης γιατί εδώ δέχεται η την λέξη Αυτό ή στοιχεία πινάκων ενώ η επανάληψη Για δεν δέχεται στοιχείο πίνακα για μεταβλητή ελέγχου (που αυξάνεται ή μειώνεται στις επαναλήψεις).
Διαβάστε τις σημειώσεις στο κώδικα. Με αντιγραφή σε ένα τμήμα έστω α θα το δείτε χρωματισμένο κατάλληλα! (Το αγγλικό ερωτηματικό χρησιμοποιείται ως εντολή Τύπωσε, επίσης μπορούμε να βάζουμε τόνους στα ελληνικά, προαιρετικά (μόνο σε ετικέτες αν μπουν τόνοι πρέπει για να χρησιμοποιηθούν σε αλλαγή ροής, να γραφούν πάλι με τόνους μετά την εντολή Προς (Goto) ή την εντολή Διαμέσου (Gosub))

Συναρτηση Αλφα {
      ομάδα κλμ { χ, ψ
      Συνάρτηση Πρόσθεσε {
            =.χ+.ψ
      }
      }
      για κλμ {
      Διάβασε .χ, .ψ
      }
      =κλμ
}
Δ=Αλφα(10,20)


? Δ.Χ, Δ.Ψ, Δ.Πρόσθεσε()
Κλάση Αλφα1 {
      χ,ψ
      Τμήμα Αλφα1 {
            Διάβασε .χ, .ψ
            }
      Συνάρτηση Πρόσθεσε {
            =.χ+.ψ
      }      
}
Φ=Αλφα1(10,20)
? Φ.χ,Φ.ψ, Φ.Πρόσθεσε()
\\ μπορούμε να βάλουμε ομάδες σε πίνακες
\\ δηλαδή να έχουμε ομάδες χωρίς όνομα!
Πίνακας Α(10)
Α(2)=Φ
Για Φ {.χ=0:.ψ=0}
Α(3)=Αλφα(5,6)
? Α(3).Πρόσθεσε()
Α(2).χ++
? Α(2).Πρόσθεσε()
Για Α(2) { Τύπωσε .χ, .ψ, .Πρόσθεσε() }

\\ Μπορούμε να φτιάξουμε πίνακα με μια κλάση, ώστε οι συναρτήσεις να είναι κοινές (δεν σώνονται σε κάθε στοιχείο του πίνακα, όπως με την απλή μέθοδο, να βάζουμε μια οποιαδήποτε ομάδα σε στοιχείο πίνακα).
Πίνακας Β(20)=Αλφα1(100,0)
Για Β(4) {
\\ η ομάδα κλμ θα διαγραφεί μετά τη Για { }
ομάδα κλμ {χ=10,ψ=30, δ=10}
Αυτό=κλμ \\ τώρα βάζουμε την ομάδα σε αυτό...το Β(4)
}
? Β(4).Πρόσθεσε() \\ βγάζει το 40
? Β(4).δ \\ δίνει 10, τώρα μόνο το Β(4) έχει επιπλέον μια μεταβλητή, τη δ

Για Β(5) {
ομαδα κλμ {}
κλμ=Αυτό
? κλμ.χ \\ τυπώνει 100, τόσο είχαμε βάλει σε όλα τα στοιχεία του Β()
ομαδα κλμ { ψ=1000, δ=300}
Αυτό=κλμ ' ξανά σώνουμε το αλλαγμένο κλμ στο αυτό..το οποίο θα γυρίσει στο Β(5).
}
? Β(5).δ \\ και εδώ έχουμε μια νέα μεταβλητή

Για Β(6), Β(7) { \\ αν χρειαστεί να βάλουμε το Αυτό τότε πρέπει να είναι μόνο του στη Για
.χ+=..χ
}
? Β(6).χ

Για Β(7) {
       Για Β(8) {
      .χ+=..χ
      }
}
? Β(7).χ

\\ Μπορούμε να αλλάζουμε τον ορισμό μιας συναρτησης αλλά όχι σε πίνακες ομάδων με κοινές συναρτήσεις!
Για Α(2) {
? .Πρόσθεσε()
Ομάδα kkk {
      Συνάρτηση Πρόσθεσε {
      =1000+.χ+.ψ
      }
}
Αυτό=kkk
}
? Α(2).Πρόσθεσε()


\\ Εδώ ο Β() έχει κοινές συναρτήσεις για όλα τα στοιχεία.
Για Β(2) {
? .Πρόσθεσε()
Ομάδα kkk {
      Συνάρτηση Πρόσθεσε {
      =1000+.χ+.ψ
      }
}
Αυτό=kkk
? .Πρόσθεσε() \\ άλλαξε μεν αλλά προσωρινά
}
? Β(2).Πρόσθεσε() \\ δεν άλλαξε η συνάρτηση μετά τη για

Πίνακας Β(40) \\ αυξάνουμε κατά 20 τα στοχεία αλλά είναι άδεια!
Τύπωσε τύπος$(Β(30)) \\ τυπώνει Empty  - άδειο
Β(30)=Αλφα1(100,0)
Τύπωσε τύπος$(Β(30)) \\ τυπώνει Group  - Ομάδα, αλλά δεν μας λέει τι ομάδα!
\\ αν θέλουμε να έχουμε όνομα ομάδας μπορούμε να βάλουμε μια ιδιότητα όνομα$ και να γράφουμε το όνομα εκεί!

\\Μπορούμε να βάλουμε μια ομάδα στο σωρό και να το σηκώσουμε σε ένα στοιχείο πίνακα
\\ αυτό θα μπορούσε να γίνει μεταξύ δυο τμημάτων. Δηλαδή η διάβασε να διαβάζει το Δ που επιστρέφει ένα άλλο τμήμα.
Βάλε Δ
Διάβασε Β(27)
? Β(27).χ

Τμήμα Δείξε_μου {
      Διαβασε &ΔΔ
      ΔΔ.χ+=100
      ? ΔΔ.χ \\ τυπώνει το ΔΔ.χ
}
Δείξε_μου &Δ
Τύπωσε Δ.χ

\\ δεν μπορούμε να περάσουμε κάτι που δεν έχει όνομα με αναφορά!
\\ μπορούμε όμως να περάσουμε πρόσκαιρα το Αυτό!
Για Β(27) {
      Δείξε_μου &Αυτό
}
Τύπωσε Β(27).χ

\\Αναφορές χρησιμοποιούμε και εντός τμήματος
Για Β(27) {
  \\ Αυτό κάνει η Ένωσε   Βάλε &Αυτό : Διάβασε &κλμ  
      Ενωσε Αυτό στο κλμ
      \\ τώρα δώσαμε ένα όνομα
      κλμ.χ++
      ? κλμ.χ
      Αυτό.χ++ \\ το ίδιο όπως το κλμ.χ
      ? Αυτό.χ
      .χ++ \\ το ίδιο όπως το Αυτό.χ
      ? .χ
}
? Β(27).χ
? Έγκυρο(κλμ.χ) \\ τυπώνει 0 γιατί δεν υπάρχει πια η κλμ, η Για σβήνει ότι νέο όνομα δημιουργούμε εντός..και δεν το κρύβουμε σε μια ομάδα...



Αναθεώρηση 80

Μια μικρή βελτίωση στην Τύπωσε (Αναθώρηση 80  - η 79 είχε ένα μικρό Bug...στο χρωματισμό και έριχνε το πρόγραμμα!)
Η εντολή Τύπωσε είναι η πιο πολύπλοκη εντολή και αυτό γιατί χρησιμοποιεί στήλες, φορμάρισμα σε στήλες, τυπώνει αναλογικά και μη αναλογικά, μπορεί με το ελληνικό ερωτηματικό να "σπάσει" τις στήλες (να κολλήσει το επόμενο), μπορεί να αλλάξει πρόσκαιρα το πλάτος στηλών, και έχει τρεις ειδικές εντολές, την @() που μετακινεί το δρομέα και "βάφει" το φόντο ή βάζει γραφικό, την $() που βάζει φορμάρισμα γραμμάτων ή αριθμών (π.χ. πόσα δεκαδικά θέλουμε να βλέπουμε) και επίσης βάζει το πλάτος στηλών, και τέλος την ~() που βάζει χρώμα, γραμμάτων, φόντου, πλαισίου.

Η Τύπωσε κανονικά δεν αλλάζει το φόντο, και τυπώνει με χρήση συντεταγμένων χαρακτήρων.

Η έκδοση 8 περιλαμβάνει τρεις ειδικές Τύπωσε, την Τύπωσε Πάνω, Τύπωσε Μέρος και Τύπωσε Υπό. Ουσιαστικά είναι κάτι σαν μακροεντολές. Και οι τρεις επενεργούν πρόσκαιρα στο σύστημα εκτύπωσης, που σημαίνει ότι κάθε αλλαγή σε διαμόρφωση θα χαθεί. Εξ ορισμού η διαμόρφωση σε αυτές τις τρεις εντολές είναι για την γραφή τύπου 4, που σημαίνει αναλογική γραφή, οι αριθμοί στοιχίζονται δεξιά, τα γράμματα αριστερά και αν χρειάζονται χώρο τότε θα πάρουν από την επόμενη στήλη. Όμως η Πάνω βάζει επιπλέον όλη την γραμμή ως μια στήλη και επιπλέον σβήνει το φόντο με το χρώμα φόντου, εκτός από μια γραμμή στο κάτω μέρος (δείτε στην Υπό γιατί). Και οι τρεις εντολές δεν αλλάζουν γραμμή, έτσι αν γράψουμε δέκα στήλες ενώ βλέπουμε πέντε τότε μόνο πέντε θα δούμε (σε αντίθεση η απλή Τύπωσε θα αλλάξει γραμμή και θα συνεχίσει να βάζει αριθμούς ή αλφαριθμητικά...σε στήλες). Ειδικά η Τύπωσε Υπο ξεκινάει με αλλαγή γραμμής αφού βάλει στην τρέχουσα μια γραμμή στο κάτω μέρος (τη γραμμή που δεν βάζει η Τύπωσε Πάνω). Κατά τα άλλα αυτή και η Τύπωσε Μέρος είναι ίδιες, με στήλες τις στήλες που έχουμε επιλέξει εμείς με την $(), ή αυτόματα με κάποια από τις εντολές Φόρμα ή Τύπος ή Παράθυρο.  Επιπλέον αυτές οι τρεις εντολές υποστηρίζουν τον καθορισμό νέων στηλών με αρχή την θέση απ΄όπου ορίζουμε τις στήλες. Έτσι αν για παράδειγμα είχαμε στήλες των 20 χαρακτήρων (μη αναλογικής γραφής), τότε θα μπορούσαμε να ζητήσουμε μετά τις δυο πρώτες στήλες να αλλάξουν οι στήλες σε δεκάρες (δέκα χαρακτήρων), έτσι ώστε οι επόμενες εκτυπώσει να αλλάζουν αυτόματα στήλη ανά δέκα χαρακτήρες. Αυτή η μετάθεση της αρχής των στηλών δεν γίνεται με την απλή Τύπωσε (επειδή αλλάζει γραμμές αυτόματα, έτσι ώστε σε κάθε αλλαγή να ξεκινάει η αρχή των στηλών από τη θέση μηδέν).

Ότι κάνουμε στη βασική οθόνη (στο βασικό επίπεδο) μπορούμε να κάνουμε στο περιθώριο, ή στα 32 επίπεδα από πάνω (με διαφορετικούς δρομείς, χρώματα κλπ), καθώς επίσης και στο φύλλο του εκτυπωτή. Συνολικά αυτά τα επίπεδα είναι 35 και υπάρχει ένα ακόμα που δεν γράφουμε και είναι το επίπεδο "Επιφάνεια"ή Desktop. Δηλαδή μπορούμε να ορίσουμε διαφάνεια στην φόρμα του περιβάλλοντος της Μ2000 και αν ορίσουμε ένα χρώμα για την επιφάνεια, έστω μαύρο μπορούμε να "σβήνουμε προς το μαύρο" το περιβάλλον (δηλαδή υπάρχει για Εφε). Αντί για χρώμα μπορούμε να βάλουμε εικόνα ή να αντιγράψουμε την επιφάνεια εργασίας σε αυτό. Έτσι συνολικά τα επίπεδα είναι 36, αλλά στα 35 μπορούμε να γράφουμε. Το φύλο εκτυπωτή είναι σε ανάλυση του εκτυπωτή, δηλαδή ενώ μας δίνει την εντύπωση (ακόμα και προγραμματιστικά) ότι χρησιμοποιούμε έστω 12άρια γράμματα, το φύλλο του εκτυπωτή θα έχει μεγαλύτερα γράμματα για να καλύψει τη διαφορά στα dpi, με σκοπό να πάρουμε στην εκτύπωση πραγματικά 12άρια! Με απλά λόγια η Μ2000 δουλεύει απ΄ευθείας στην υψηλή ανάλυση του εκτυπωτή. Παλαιότερα για λόγους ταχύτητας είχα κατεβάσει στο ένα τέταρτο την ανάλυση αλλά στην 8 το έφερα ακριβώς όσο πρέπει, αλλά με έναν μόνο συμβιβασμό, ότι θα χρησιμοποιώ τετράγωνα εικονοστοιχεία (δεν χρησιμοποιούν όλοι οι εκτυπωτές τετράγωνα εικονοστοιχεία, ειδικά οι τύπου dye Sublimation), αλλά στην εκτύπωση αν χρειάζεται "τεντώνεται" η εικόνα ανάλογα για να καλύψει την διαφορά αναλογίας.

Από την βοήθεια της Μ2000 (γράψε Βοήθεια Τύπωσε στο περιβάλλον της Μ2000)
1) Μπορούμε για ευκολία να βάζουμε το ? αντί για Τυπωσε ή Print
? 2+3=5 και 2-1>0
2) Τύπωσε 1, 2+4, "Λέξη "+α$   \\ αν δεν χωράνε στη γραμμή συνεχίζουν από κάτω κατά στήλες
3) Τύπωσε "Όνομα:";α$;" ";β$
4) Τύπωσε @(10,10),"Στη θέση 10, 10"
5) Τύπωσε $(3,8),100,200,"Λέξη",300    \\ ορίζουμε στήλη 8 χαρακτήρων και στοίχιση δεξιά
6) Τύπωσε   \\σκέτο αλλάζει γραμμή, στη τελευταία κάτω γραμμή η αλλαγή προκαλεί ολίσθηση γραμμών προς τα πάνω
7) Δεκαεξ 0xFF00+0x0055       \\ Η Τύπωσε σε εξαγωγή δεκαεξαδικού
                  0xFF55
8) Τύπωσε #Α, "Μια γραμμή στο αρχείο με μεταβλητή χειρισμού το Α"
9)  Τύπωσε $("#,###,###.00", 20), 112313.3788   \\ 20 το πλάτος στήλης
   \\ το ίδιο δίνει και αυτό: Τύπωσε $("#,###,###.00", 20), τιμη(μορφη$("{0:2}",112313.3788))
10) Τύπωσε μορφή$("αριθμός με δυο δεκαδικά:{0:2} και εδώ μια λέξη:{1}", 10.678, "ΟΚ")
                                                              \\ η μορφή$() είναι γενική συνάρτηση, ο αριθμός μετά το : δείχνει το τελευταίο δεκαδικό αν υπάρχει και εφαρμόζεται και σε αριθμούς με επιστημονική μορφή (π.χ. 1.23e100), χωρίς να πειράζει τον εκθέτη.

Η εσωτερική συνάρτηση @(), όπου Χ θέση χαρακτήρα, Υ γραμμή (ξεκινούν από 0 μέχρι Πλάτος-1 και Ύψος-1 ως ορατά, αλλά μπορούμε να δώσουμε και εκτός οθόνης νούμερα).
Τα Χ1, Υ1 ορίζουν ένα πλαίσιο στο οποίο θα χρωματίσουμε με το ΧΡ χρώμα, και με το ΠΕΡ περιθώριο. Ή μπορούμε να βάλουμε γραφικό στο θέση του, φορτώνοντάς το από το δίσκο, και απλώνοντας την σε όλο το πλαίσιο ή με το ,1 διατηρώντας την αναλογία της,
@( Χ )
@( ,Υ)
@( Χ, Υ)
@( Χ, Υ, Χ1 ,Υ1, ΧΡ)
@( Χ, Υ, Χ1, Υ1, ΧΡ, ΠΕΡ)
@( Χ, Υ, Χ1, Υ1, "όνομα αρχείου γραφικών")
@( Χ, Υ, Χ1, Υ1, "όνομα αρχείου γραφικών", 1)

Αντί για όνομα αρχείου μπορούμε να δώσουμε ένα αλφαριθμητικό που κρατάει μια εικόνα!
Α$=""   \ δημιουργούμε μια νέα μεταβλητή
αντέγραψε 3000,2000 στο Α$  \\ αντιγράφουμε από το δρομέα γραφικών πλάτος 3000 twips, ύψος 2000 twips στο Α$

Τύπωσε @(10,10,20,20,α$),~(10),"Γεια"   \\ η πρώτη συνάρτηση αλλάζει το δρομέα στο 10,10 και βάζει μια εικόνα από πίσω που πήραμε από τη οθόνη.. Η δεύτερη βάζει το χρώμα 10 (χρώματα δίνουμε με # όπως στην Html, ή με Χρώμα(κόκκινο, πράσινο, μπλε), ή με νούμερα από 0 ως 15 που είναι τα βασικά των Windows).

H $()
$(στοίχιση) 
$(στοίχιση, πλάτος στήλης)
$(φόρμα$)
$(φόρμα$ , πλάτος στήλης)

στοίχιση αποτελέσματος αριθμητικών και λογικών  παραστάσεων: 
0 = δεξιά, 1 = αριστερά, 2 = κέντρο, 3 = δεξιά  - με σταθερά διαστήματα (όπως οι παλιές γραφομηχανές)
4 = δεξιά, 5 = αριστερά, 6 = κέντρο, 7=δεξιά ,8 = δεξιά και αριστερά μαζί -   με αναλογικά διαστήματα (όπως στις εφημερίδες)

στοίχιση αποτελέσματος αλφαριθμητικών παραστάσεων:
0 = αριστερά, 1 = αριστερά, 2 = κέντρο, 3 = δεξιά   με σταθερά διαστήματα (όπως οι παλιές γραφομηχανές)  
4 = αριστερά, 5 = αριστερά, 6 = κέντρο, 7 = δεξιά , 8 =  αριστερά  με αναλογικά διαστήματα (όπως στις εφημερίδες)
στα 0 και 4 τα αλφαριθμητικά γεμίζουν όσες στήλες χρειαστούν. Σε όλα τα άλλα γίνεται αποκοπή.

Υπάρχει και το 9 το οποίο κάνει αποκοπή και εντός λέξης (ενώ το 5 για παράδειγμα αν δει ότι μια λέξη δεν χωράει δεν θα την βάλει, σαν να κάνει αναδίπλωση λέξης χωρίς όμως να την βάλει πουθενά)

Επιπλέον υπάρχουν διακόπτες  ως ξεχωριστές εντολές όπως Πλάγια και  Φαρδιά που αλλάζουν τη φόρμα των γραμμάτων, καθώς και τα Διπλά-Κανονικά όπου η ΔΙΠΛΑ κάνει τα γράμματα διπλό μέγεθος (κατά Χ και κατά Ψ άρα τετραπλάσια σε έκταση). Μπορούμε να αναμείξουμε στην ίδια σειρά Πλάγια, Φαρδιά και όποιο συνδυασμό αυτών, αλλά όχι Διπλά και Κανονικά (κανονικό μέγεθος είναι το αρχικά δηλωμένο) σε μια γραμμή. Επιπλέον μπορούμε να αλλάζουμε γραμματοσειρά (αλλά προκαλεί αλλαγές στη σύστημα της οθόνης, ανά επίπεδο). Mπορούμε να αλλάζουμε το διάστιχο σε twips ανά 30 (ανά δυο pixels).  Έχει προβλεφθεί στην τύπωσε η χρήση των στηλών να αφήνει κάθετες και οριζόντιες γραμμές χωρίς να πειράζονται, ώστε να μπορούμε να φτιάχνουμε στήλες με πλαίσια. Επίσης στην μη αναλογική γραφή το πλάτος του γράμματος είναι του φαρδύτερου, με φαρδιά (bold). Έτσι αν αναμείξουμε φαρδιά, πλάγια και μη, θα κάθεται το κάθε γράμμα στη θέση του χωρίς να πέφτει στο άλλο δίπλα! Η αναλογική γραφή χρησιμοποιεί τα διαστήματα που δηλώνονται από τις στήλες της μη αναλογική γραφής για να γράψει όσο χωράει κείμενο χωρίς να κόβει λέξεις εκτός του 9 που κόβει στο γράμμα και όχι στη λέξη.

Η τύπωσε εκτός από την γραφή στα επίπεδα κάνει και μεταφορά σε αρχεία (με τον αριθμό αρχείου στην αρχή με το σύμβολο #). Σε αρχεία με την τύπωσε γράφουμε σε UTF16LE (16bit) ή σε ANSI (8bit) ανάλογα με το πως θα ανοίξουμε το αρχείο (ο δείκτης ΕΥΡΕΙΑ δηλωνει το Unicode UTF16LE). Αν θέλουμε εξαγωγή σε δεύτερο χρόνο μπορούμε αντί για την Εκτύπωση να κάνουμε με χρήση της μορφή$() εισαγωγή σε μια μεταβλητή τύπου έγγραφο και μετά το σώνουμε με μια εντολή και με επιλογή τύπου εξαγωγής (παίρνει και UTF-8 και UTF-16BE).  Δείτε παράδειγμα εδώ

Εκτός της τύπωσε υπάρχει η Αναφορά που τυπώνει φορμαρισμένο κείμενο, τμήμα αυτού, ή αν θέλουμε την καλούμε για να μας λογαριάσει σε δοσμένο πλάτος πόσες γραμμές θα χρειαστεί, ώστε τελικά να πάρουμε το κείμενο φορμαρισμένο (με τους τέσσερις βασικούς τρόπους πλήρης, αριστερά, κέντρο, δεξιά). Η αναφορά πολλών γραμμών στην οθόνη προκαλεί σταμάτημα στα 3/4 και αναμονή του πλήκτρου του διαστήματος. (αν παίζουν νήματα, αυτά συνεχίζουν παρά το σταμάτημα της αναφοράς). Στον εκτυπωτή δεν υπάρχει σταμάτημα! Στον εκτυπωτή αν ζητηθεί γραμμή μετά την τελευταία τότε αυτόματα έρχεται νέο φύλλο (ενώ το έτοιμο πια φεύγει για εκτύπωση).

Γενικά με όλες αυτές τις εντολές μπορούμε να γράψουμε στην οθόνη και στον εκτυπωτή ωραίες "συνθέσεις", με γραφικά (στα γραφικά που ανοίγουμε είναι και τα διανυσματικά, wmf & emf, αλλά δεν τα σώνουμε σε αλφαριθμητικά, όμως εμφανίζονται με διαφάνεια, δηλαδή πάνω στην οθόνη χωρίς να την σβήνει εκεί που δεν έχει φόντο το γραφικό).

Στην οθόνη εκτός από τις εντολές Τύπωσε και Αναφορά υπάρχει και  η Επιγραφή η οποία γράφει σε συντεταγμένες γραφικών. Δείτε εδώ τη χρήση της επιγραφής με εκτύπωση γραμμάτων σε γωνία, και εδώ  όπου μπαίνουν τα γράμματα σε γραφικά (σκακιέρα) και μεγαλώνουν όπως μεγαλώνουν και αυτά.

Τέλος μπορούμε να γράψουμε απ΄ευθείας στο Word! Δείτε παράδειγμα εδώ

Η εκτύπωση είναι βασική διεργασία για τις γλώσσες διότι κάπου και κάπως πρέπει να πάρουμε "απαντήσεις", σε αυτά που κάνουμε με τις διάφορες εφαρμογές. Συνήθως λέγαμε παλιά ότι στόχος των προγραμμάτων τύπου Γραφείου είναι η εκτύπωση σε χαρτί. Ο "πελάτης" δηλαδή θέλει το hardk Copy. Σήμερα αυτό με το Cloud δεν είναι απαραίτητο. Βγάζουμε δηλαδή αντί μιας εκτύπωσης στο χαρτί μια εκτύπωση σε pdf αρχείο και το στέλνουμε! Όπως και να έχει το πράγμα, τη διαμόρφωση της εξαγωγής θα την κάνει η γλώσσα βάσει των εντολών που έχει για το σκοπό αυτό.


ΓΚ

Δευτέρα 2 Νοεμβρίου 2015

Πιο πολύπλοκα γραφικά και Animation!



Η ιδέα είναι από εδώ:


Αυτό το πρόγραμμα σχετίζεται με τη προηγούμενη ανάρτηση. Είναι αντιγραφή από ένα Gif που κυκλοφορούσε στο FaceBook.
Η δυσκολία του εγχειρήματος είναι στο ότι δεν υπάρχει στη Μ2000 έλλειψη με γωνία αλλιώς θα ήταν εύκολα τα πράγματα. Εδώ λοιπόν πρέπει να γυρίζει ο εσωτερικός κύκλος και να γράφει τέσσερις ελλείψεις. Για να γίνει αυτό πρέπει εκτός του κανονικού δρομέα που σχεδιάζουμε να έχουμε άλλους τέσσερις. Ώστε καθένας από τους τέσσερις να γράφει στο δικό του χρώμα και τη δική του έλλειψη (καμπύλη βασικά). Οπότε εδώ έχουμε 4 τμήματα, το βασικό ως Α, το Γ που γράφει το σταθερό κύκλο μια φορά όμως και σώνουμε την οθόνη προσωρινά (με μια εντολή ΚΡΑΤΗΣΕ), και μετά μπαίνουμε στο βρόγχο που εκτελείται κάθε 40 χιλιοστά του δευτερολέπτου. Σε αυτόν λοιπόν πρέπει να σχεδιάζουμε με τέσσερις δρομείς γραφικών τις καμπύλες. Επειδή την πρώτη φορά δεν θα έχουμε από που να τυπώσουμε απλά θα συγκεντρώσουμε τα τέσσερα ζευγάρια στον σωρό τιμών (τον έχουμε αδειάσει με την ΑΔΕΙΑΣΕ αλλά θα μπορούσαμε να κάναμε έναν νέο έξω από τη Κάθε..π.χ. ΣΩΡΟΣ ΝΕΟΣ {   ΚΑΘΕ ... } }.. Από την δεύτερη φορά έχουμε ένα σετ συντεταγμένων και βάζουμε στο σωρό στο τέλος άλλο ένα, μετά διαβάζουμε ένα ζευγάρι βγάζοντάς το από το σωρό και διαβάζουμε ένα ζευγάρι από την 7η και 8η θέση πάντα. που είναι ο τερματισμός της χάραξε εως..Δεν σηκώνουμε το πρόσφατο σετ γιατί θα το σηκώσουμε την άλλη φορά όταν θα γράψουμε τα επόμενα. Ουσιαστικά έχουμε μια κυκλική λίστα όπου το κάθε σετ τεσσάρων δρομέων ξεκινάει στο βάθος, έρχεται στην αρχή και "πετιέται" και συνεχίζουμε έτσι μέχρι να τελειώσει το πρόγραμμα

Όταν πατήσουμε με ένα πλήκτρο, τότε το πρόγραμμα θα αδειάσει ότι άφησε...στο σωρό!


ΤΜΗΜΑ Α {θεσε γρηγορα !
ζβ=πι/32 \\ αν βάλουμε 48 κάνει πιο ωραία καμπύλη
ζβ1=ζβ/2 \\ αν βάλουμε αντί για 2 μεγαλύτερο θα δούμε άλλα σχέδια
ζ=πι+ζβ*8
ζ1=ζβ1*16
\\ στο μέσον!
κχ=χ.σημεια/2
κυ=υ.σημεια/2
ανανεωση 2000 \\ για να μην εμφανίσει αλλαγές της οθόνης, εκτός αν θέλουμε!
διπλα
φοντο 1,5
δρομεας 0,0
αναφορα 2,"Παράδειγμα Χρήσης Γραφικών με τη Μ2000"
κανονικα
γ 4000,κχ,κυ,πι/4
Άδειασε  ' αδειάζει το σωρό
κκ=ψευδες
κρατησε   \\ σώνουμε προσωρινά την εικόνα
πάχος 2 { \\ βάζουμε πάχος στις γραμμές μας
      καθε 20 {
            αφησε  \\ αντί να σβήσουμε βάζουμε ότι έχουμε σταθερό
            θεση κχ, κυ
            βήμα γωνια (πι/2+πι/4)+ζ,2000 \\ η θέση του εσωτερικού κύκλου
            κ 2000,θέση.χ, θέση.υ, -ζ1, &κκ \\ την πρώτη φορά απλά παίρνει τα σημεία
            \\ η κ κάθε άλλη φορά θα σώνει την οθόνη χωρίς τον εσωτερικό κύκλο
            δ 2000,θέση.χ,θέση.υ,-ζ1, 1 \\ τυπώνει το κύκλο
            \\ με την ανανέωση εμφανίζουμε τις αλλαγές
            ανανεωση 1000
            αν ενκομ$<>"" τοτε εξοδος
            ζ+=ζβ
            ζ1+=ζβ1*2
      }
}
Αδειασε

}
ΤΜΗΜΑ Κ {διαβασε α, Χ, Ψ, ζ, &σχεδιασε
      θεση Χ, Ψ
            βημα γωνια ζ+πι/4, -α*2
                  \\ η εντολή Βάλε βάζει στη κορυφή ενώ η εντολή Σειρά βάζει στο τέλος
                  \\ όμως θα κάνει συγχώνευση και έτσι το Θέση.υ θα πάει στο τέλος.
                  \\ Αντίθετα η Βάλε βάζει όποιο διαβάζει στην κορυφή
                  Σειρά θέση.χ, θεση.υ
            βημα γωνια ζ+πι/4 , α*4
                  Σειρά θέση.χ, θεση.υ
      θεση Χ, Ψ
            βημα γωνια ζ-πι/4,-α*2
                  Σειρά θέση.χ, θεση.υ
            βημα γωνια ζ-πι/4,α*4
                  Σειρά θέση.χ, θεση.υ
  \\ η εντολή σειρά βάζει στο σωρό από το τέλος, κάνει το σωρό FIFO
Αν σχεδίασε τοτε {
      για ι=1 εως 4 {
                  θεση αριθμός, αριθμός
                  πάνω 8
                  πανω 8


                  χαραξε εως αριθμός, αριθμός, ι+8
      }
}
σχεδιασε=αληθης
κράτησε \\ σωνει την οθόνη
θεση Χ,Ψ
}
ΤΜΗΜΑ Γ {διαβασε α, Χ, Ψ, ζ
θεση Χ, Ψ
κυκλος α
κυκλος α/2,1,7
παχος 1,3 { ' άξονες - δεν μπροούμε να δώσουμε με πάχος άλλο από ένα.
      βημα γωνια ζ+πι/4, -α*1.05
      χαραξε γωνια ζ+πι/4 , α*2.1
      θεση Χ, Ψ
      βημα γωνια ζ-πι/4,-α*1.05
      χαραξε γωνια ζ-πι/4,α*2.1
}
}
ΤΜΗΜΑ Δ {διαβασε α, Χ, Ψ, ζ, τρικ
παχος 1,3 { ' άξονες  -- ενώ απ' έξω έχουμε αλλάξει το πάχος σε 2
      βημα γωνια ζ+πι/4, -α
                  κυκλος α/16
            βημα γωνια ζ+πι/4, -α
                         κυκλος α/16
      χαραξε γωνια ζ+πι/4 , α*3
            κυκλος α/16
                  χαραξε γωνια ζ+πι/4 , α
                              κυκλος α/16
      θεση Χ, Ψ
      βημα γωνια ζ-πι/4,-α*2
                  κυκλος α/16
      χαραξε γωνια ζ-πι/4,α*4
            κυκλος α/16
}
θεση Χ, Ψ
κυκλος α
}

Οι παρακάτω εντολές αντικαταστάθηκαν από το αρχικό για απλοποίηση (από το τμήμα κ):
                  διάβασε χ1, ψ1
                  θεση χ1, ψ1
                  \\ η χαραξε εως παίρνει απόλυτες τιμές
                  \\ τον σωρό μπορούμε να τον προσπελάσουμε σαν πίνακα!
                  \\ αλλά ξεκινάει από το 1 (η κορυφή)
                  χαραξε εως τιμησωρου(7), τιμησωρου(8), ι+8


με αυτές (κάνουν το ίδιο πράγμα)
                  θεση αριθμός, αριθμός
                  πάνω 8
                  πανω 8

                  χαραξε εως αριθμός, αριθμός, ι+8
Και η εξήγηση είναι απλή:

Η αριθμός παίρνει την κορυφή, όταν πάρουμε τις δυο κορυφές θα βγάλουμε από την 8η θέση μια φορά το νούμερο και θα το φέρουμε στην κορυφή ως αντίγραφο (η Πάνω βγάζει αντίγραφο), άρα η 7η τιμή θα γίνει όγδοη, οπότε την φέρνουμε και αυτήν στη κορυφή. Έτσι δεν χρειάζεται να φτιάξουμε μεταβλητές! Ο σωρός στην Μ2000 είναι ειδική στοίβα με συνδεδεμένα στοιχεία. Έτσι το να βγάλει ένα είναι μια άμεση ενέργεια!  Η πάνω αντιγράφει οτιδήποτε. Χωρίς αριθμό βγάζει ένα αντίγραφο της κορυφής! Ισοδυναμεί με το Πάνω 1. Αν θέλουμε μετακινούμε στοιχεία από και προς την κορυφή με την ΦΕΡΕ και την ΦΕΡΕΠΙΣΩ. Η Βάλε βάζει στην κορυφή ενώ η Σειρά συγχωνεύει τα στοιχεία της στο τέλος (το τελευταίο της στοιχείο θα είναι στο τέλος της σειράς, ενώ το πρώτο της στοιχείο θα γίνει το πρώτο μετά το τέλος του σωρού πριν την συγχώνευση. Με την Διάβασε διαβάζουμε μια σειρά από τιμές. Όταν καλούμε ένα τμήμα τότε η σειρά παραμέτρων μπαίνει με συγχώνευση όπως η σειρά με τη διαφορά ότι η σειρά μπαίνει στην αρχή, με πρώτο στοιχείο την πρώτη παράμετρο από το αριστερά! Όταν καλούμε μια συνάρτηση ξεκινάμε με νέο σωρό οπότε η παράθεση στο σωρό αντιστοιχεί με την εντολή Σειρά. Η Άδειασε αδειάζει το σωρό και υπάρχουν και εντολές να δούμε το μήκος το και το τι έχει, τον τύπο των στοιχείων.



Αν αλλάξουμε
το ζβ1=ζβ/2  το 2 στο 23 για παράδειγμα

Εδώ έχουμε επιλέξει Πάχος 2 { } στο τμήμα Δ και έτσι βγάλαμε τις αξονικές γραμμές και βάλαμε διπλού πάχους!