Προς το περιεχόμενο

Visual C# - Πολλα layers γραφικών;;;


bnvdarklord

Προτεινόμενες αναρτήσεις

Δημοσ.

Φτιαχνω ενα παιχνιδάκι σε c#, με το οποίο σχεδιάζω τα γραφικά του στην φορμα(με τα απλά fillRectangle κτλ της System.Drawing)...

 

Αυτο που θελω να κάνω, ειναι με καποιο τρόπο να εχω το background σε ενα σταθερο layer που να αλλαζει σπανια, και τα γραφικά που εχουν κινηση σε ενα αλλο layer(στο οποιο να κανω clear χωρις να σβηνονται τα γραφικα του background....)

 

Ως τωρα εχω κανει 2 picturebox πανω στα οποια σχεδιάζω αυτα που θελω, αλλα δεν μπορώ να τα κανω διάφανα, ωστε αν ειναι το ενα πανω στο αλλο να φαινεται η συνολική εικόνα....

 

Υπαρχει καποιος τρόπος να πετύχω αυτό που θελω;

Δημοσ.
Φτιαχνω ενα παιχνιδάκι σε c#, με το οποίο σχεδιάζω τα γραφικά του στην φορμα(με τα απλά fillRectangle κτλ της System.Drawing)...

 

Αυτο που θελω να κάνω, ειναι με καποιο τρόπο να εχω το background σε ενα σταθερο layer που να αλλαζει σπανια, και τα γραφικά που εχουν κινηση σε ενα αλλο layer(στο οποιο να κανω clear χωρις να σβηνονται τα γραφικα του background....)

 

Ως τωρα εχω κανει 2 picturebox πανω στα οποια σχεδιάζω αυτα που θελω, αλλα δεν μπορώ να τα κανω διάφανα, ωστε αν ειναι το ενα πανω στο αλλο να φαινεται η συνολική εικόνα....

 

Υπαρχει καποιος τρόπος να πετύχω αυτό που θελω;

 

Από όσο έχω υπόψη μου τα Forms του .NET δεν υποστηρίζουν πολλαπλού επιπέδου διαφάνειες (transparent layers) μεταξύ των αντικειμένων τους αντίθετα με την VCL των C++ Builder & Delphi όπου αρκεί να ορίσεις τα αντίστοιχα τους controls ως Transparent και αυτόματα θα προβληθούν σωστά στο background κάθε άλλου control ή φόρμας ;). Βέβαια αν θες να κάνεις τέτοια κόλπα η MS προτείνει το WPF αλλά τέλος πάντων είναι άλλη φιλοσοφία αυτό.

 

Εγώ όταν θέλω να γράψω κάποιο παιχνιδάκι όμως ακολουθώ γενικότερα διαφορετική προσέγγιση. Κατασκευάζω ένα off screen Bitmap (το λέμε Back-Buffer) σχεδιάζω πάνω σε αυτό ότι επιθυμώ να προβληθεί στο frame (δεν αντιμετωπίζω τα sprites του παιχνιδιού ως GUI Controls βέβαια όπως εσύ) με σειρά προτεραιότητας (βάθος σκηνής – αυτό που λέμε Z-Order) και ύστερα το προβάλλω κατευθείαν στο παράθυρο του χρήστη επαναλαμβάνοντας αυτή την διαδικασία καθ’ όλη την διάρκεια του game-loop.

 

Υ.Γ.

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

 

++ Τον βρήκα τον κώδικα που θυμόμουν ως λύση, για δες εδώ μήπως και καλύπτει την περίπτωση σου!

Δημοσ.

Ευχαριστώ, θα το κοιταξω...

 

Ο τρόπος σου παντως δεν νομιζω να με εξυπηρετει, γιατι ενω εχω πολυ ευκολα την δυνατότητα να σχεδιασω ολα αυτα που θελω σε ενα bitmap(των picturebox στην δικια μου περιπτωση), επειδη το κανω πολυ συχνα(ανα 500ms πχ) προκειπτει flickering(και με doublebuffered...)...

Δημοσ.
Ευχαριστώ, θα το κοιταξω...

 

Ο τρόπος σου παντως δεν νομιζω να με εξυπηρετει, γιατι ενω εχω πολυ ευκολα την δυνατότητα να σχεδιασω ολα αυτα που θελω σε ενα bitmap(των picturebox στην δικια μου περιπτωση), επειδη το κανω πολυ συχνα(ανα 500ms πχ) προκειπτει flickering(και με doublebuffered...)...

 

Αν το κάνεις σωστά δεν προκύπτει flicker ακόμα και αν σχεδιάζεις με λιγότερο από 100ms. Και σωστά εννοώ την σχεδίαση πάνω στο ίδιο back-buffer όλων των περιεχομένων που επιθυμείς στο frame σου πριν το προβάλεις στο παράθυρο (αυτό που λέμε flip). Βλέπεις ο σκοπός της back-buffering σχεδίασης είναι να εκμηδενίζεις το flick, οπότε υποπτεύομαι ότι μάλλον δεν υλοποιείς σωστά την τεχνική.

 

Υ.Γ.

500ms δεν είναι "συχνά", είναι αρκετά αργά για ομαλό animation εξαρτούμενου και του παιχνιδιού (όσο και των διαστάσεων του Bitmap -αν είναι πολύ μεγάλο τότε το GDI/GDI+ παραδίδει πνεύμα και βλέπεις προς XNA/Managed Directx μεριά).

Double Buffer δεν χρειάζεσαι διότι .. αυτό είναι το back-buffer painting και το κάνεις ήδη ;)

Δημοσ.

Πολυ ενδιαφέρον... Αν κατάλαβα καλά, αν σε ενα Bitmap σχεδιάσω τα πάντα, και μετα περάσω το Bitmap αυτό στο bitmap του Picturebox δεν θα εχω flicker? Αν η ανανέωση γινεται με κατω απο 100ms θα εχω πρόβλημα?(πχ 50 ή και 20ms)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...