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

2D/3D εφέ κίνησης ζαριού (C89 + GTK+2)


migf1

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

Με αφορμή αυτό το νήμα είχα γράψει λίγο κώδικα για 2Δ/3Δ εφέ περιστροφής ζαριού:

 

 

 

και είχα υποσχεθεί να σουλουπώσω λίγο τον κώδικα και να τον ποστάρω.

 

Κατόπιν σκέφτηκα να του προσθέσω μερικά ακόμα πράγματα για να υπάρχει σαν ένα μικρό demo χρήσης του GTK+2 με C, αλλά τον τελευταίο καιρό έχω πολύ λίγο ελεύθερο χρόνο, οπότε το "περπατάω" με πάρα πολύ αργούς ρυθμούς.

 

Για να μην τα πολυλογώ, του έφτιαξα ένα μικρό GitHub που μεταξύ άλλων περιέχει screenshots και downloads directories με ότι έχω προσθέσει, για όποιους κι εάν ενδιαφέρονται. Υπάρχει και README.txt αρχείο που εξηγεί τα βασικά και δίνει links για ότι χρειάζεται κανείς για να ξεκινήσει GTK+2 σε οποιαδήποτε πλατφόρμα.

 

Το zip file στα Downloads περιέχει και pre-compiled 32mpita binaries για Win32 και Ubuntu 11.10.

 

GitHub for "GTK+2 Demo - Die": https://github.com/migf1/gtk_dice

 

Προφανώς σηκώνει πολλή βελτίωση (ούτε καν χωρισμένο σε source-modules δεν είναι) αλλά ο κώδικας περιέχει πολλά σχόλια.

 

Πέρα από το εφέ της κίνησης του ζαριού (η αφορμή για την οποία το ξεκίνησα) αυτό που προσέθεσα ήταν η δυναμική αλλαγή γλώσσας για το GUI, κάτι που ούτε είναι συνηθισμένο σε εφαρμογές GTK+2 (οι περισσότερες ζητάνε restart) αλλά ούτε είμαι 100% σίγουρος πως το έχω κάνει σωστά. Δουλεύει πάντως as intended, και σε Windows XP SP3 που το δοκίμασα και σε Ubuntu 11.10 (που επίσης το δοκίμασα).

 

Ο τρόπος που το κάνω είναι να αλλάζω προγραμματιστικά το locale καθώς και τις μεταβλητές περιβάλλοντος LANG και LANGUAGE, και κατόπιν να ξανα-φορτώνω από την αρχή το GUI από το Glade file, με ένα GtkBuilder object.

 

Επειδή το localization στο GTK+ γίνεται κατά κανόνα μέσω της GNU-gettext library (με συνδετικό κρίκο ανάμεσά τους την GLib), κι επειδή θυμόμουν πως η GNU-gettext τσεκάρει το runtime, το ψυλλιάστηκα πως είχε πιθανότητες να δουλέψει και όντως δούλεψε. Περίμενα βέβαια πως θα χρειαζόταν να ξανακάνω χειροκίνητα bind την gettext με το GUI σε κάθε reloading, αλλά τελικά φαίνεται να μη χρειάζεται.

 

Δείχνει να αρκεί η προγραμματιστική αλλαγή του locale environment και των LANG & LANGUAGE (μάλλον το binding γίνεται μέσω του GtkBuilder object... δεν ξέρω σίγουρα... από τη στιγμή που δούλεψε έτσι βαρέθηκα να το ψάξω περισσότερο).

 

Μου βγήκε και σε καλό ότι κατά κανόνα φτιάχνω δικά μου οργανωτικά abstractions όποιου GUI κι αν χρησιμοποιώ, γιατί έτσι βγήκε αβίαστα το reloading του GUI από το Glade file (ένα XML αρχείο είναι αυτό που το δημιουργεί το Glade, ο visual UI editor του GTK+) το οποίο το κάνει αυτόματα parse το GtkBuilder object στην μέθοδο: gtk_builder_add_from_file() με την οποία το φορτώνει.

 

Δυσκολεύτηκα όμως στο σημείο που έπρεπε να κάνω destroy όλα τα φορτωμένα GUI elements (widgets) πριν τα κάνω re-load, επειδή δεν μου λειτουργούσαν όπως περίμενα από την τεκμηρίωσή τους ορισμένες ρουτίνες του GTK+2. Δεν είμαι μάλιστα σίγουρος αν μου έχει ξεφύγει κάνα memory-leak (ελπίζω πως όχι).

 

Με δυο λόγια, όταν ο χρήστης διαλέξει αλλαγή γλώσσας από το σχετικό μενού του προγράμματος, τότε πρώτα αλλάζω το locale environment, μετά ορίζω σε FALSE την gui->quitOnDestroyAppWindow (δικιά μου μεταβλητή είναι αυτή) και μετά στέλνω "destroy" signal σε όλα τα top-level παράθυρα του προγράμματος, άρα και στο κυρίως παράθυρο. Κατόπιν ξαναφορτώνω το GUI από το Glade file.

 

Στον destroy-handler του κύριου παραθύρου (την callback συνάρτηση δηλαδή για το "destroy" signal) έχω βάλει μια συνθήκη, ώστε αν η gui->quitOnDestroyAppWindow είναι FALSE να μην προχωράει σε τερματισμό του προγράμματος.

 

Έγραψα 5 πράγματα παραπάνω σε αυτό το ποστ, γιατί στο GitHub έχω τα πάντα στα Αγγλικά.

 

Αυτά, πάω για νάνι...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

βαζε κανα tldr στο τελος

Αν εννοείς "too long, didn't read", ποιο ακριβώς είναι το νόημα του σχόλιού σου; Σε ενδιαφέρει π.χ. το GTK+ αλλά βρήκες το ποστ ή/και τον κώδικα ακατανόητα μακρινάρια; Αν ναι, έχεις να συνεισφέρεις κάτι καλύτερο; Έστω και υπό μορφή πρότασης για διόρθωση;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Που εννοείς ρε συ; Στο Readme αρχείο ή σε αυτό το ποστ; Επίσης τι είδους περίληψη εννοείς, για τη γενικότερη λογική που έχω χρησιμοποιήσει στον κώδικα ή για το τι κάνει αυτό το πρόγραμμα;

 

Με το τσιγκέλι στα βγάζω :lol:

 

Πάντως κοίτα, αν θες να παίζεις έστω κι από περιέργεια όχι μόνο με αυτό το toy-program αλλά με οποιοδήποτε GTK+2 app, κατέβασε το latest "all-in-one-bundle" από εδώ: http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/.

 

Τώρα που μιλάμε είναι βλέπω το: gtk+-bundle_2.24.10-20120208_win32.zip (εγώ έχω το 2.24.8 ακόμα).

 

Αποσυμπίεσε τα περιεχόμενά του σε όποιον φάκελο θέλεις, αλλά βάλε τον υποφάκελο: bin στο PATH των Windows. Βασικά το bundle περιέχει ένα μικρό readme που σου εξηγεί τι να κάνεις για να τεστάρεις πως είσαι οκ.

 

Το παραθέτω αυτούσιο μιας και είναι πολύ μικρό (επίσης αυτό που λέει για το WinZip δεν ξέρω αν ισχύει, γιατί εγώ έχω βάλει το WinRar να διαχειρίζεται και τα .zip αρχεία)...

 

 

This is a bundle containing the GTK+ stack and its dependencies

for Windows. As such it is nothing more than a combination of the

individual packages it consists of. For a list, see

share/doc/gtk+-bundle_2.24.10-20120208_win32/components.lst.

 

Both run-time and developer packages are included.

 

This bundle is intended for software developers and packagers. You are

expected to know what to do with it, more or less.

 

To use it, create some empty folder like c:\opt\gtk . Using either

Windows Explorer's built-in zip file management, or the command-line

unzip.exe, available for instance at

ftp://tug.ctan.org/tex-archive/tools/zip/info-zip/WIN32/unz552xN.exe

unzip this bundle. Avoid Winzip! It is known to behave oddly.

 

(But you presumably already did extract the files, as you are reading

this file.)

 

Then add the bin folder to your PATH. Make sure you have no other

versions of GTK+ in PATH. Run:

pkg-config --cflags gtk+-2.0

and verify that it prints out something reasonable. Run:

gtk-demo

and verify that it works.

 

To use the MS-Windows theme engine, create a file etc/gtk-2.0/gtkrc

containing the line:

gtk-theme-name = "MS-Windows"

 

 

Θα σου έχει βάλει μέσα όλα τα καλά σε λίγο παραπάνω από 100Mb (και docs, και demo code, κι από όλα... δες π.χ. στον "share\gtk-doc" και στον "share\gtk-2.0\demo").

 

Αν δεν σε ενδιαφέρει να παίξεις με κώδικα και θέλεις απλά να έχεις το GTK+2 runtime για να τρέχεις pre-compiled Win32 executables στο σύστημά σου, δες εδώ: http://gtk-win.sourceforge.net/ (δεν το χω χρησιμοποιήσει ποτέ, αλλά από ότι διάβασα δίνει και ένα GUI front-end tool για παραμετροποίηση του GTK+2 runtime... themes και τέτοια αν κατάλαβα καλά).

 

Παρεμπιπτόντως, υπάρχει θέμα με τα links στο GTK+ όταν τρέχει στα Windows. Το file-engine του GTK+ (Gio λέγεται) αδυνατεί να κάνει register σωστά π.χ. τα πρωτόκολλα http://, mailto: κλπ. Οπότε αν π.χ. στο πρόγραμμά μας έχουμε ένα link (τυπική περίπτωση μέσα στο About dialog) τότε όταν ο χρήστης το κάνει κλικ του βγάζει error-message.

 

Στον κώδικα του gtk_dice, κάνω treat ξεχωριστά τα links που περιέχει το About dialog, αν είμαστε σε Windows.

 

Πιο συγκεκριμένα, το GtkAboutDialog παράθυρο στέλνει από μόνο του ένα "activate-link" signal κάθε φορά που ο χρήστης κάνει κλικ σε ένα link. Αν είμαστε σε μη-Windows πλατφόρμα απλά δεν κάνω τίποτα κι αφήνω να το χειριστεί το GTK+ με την default συμπεριφορά που ορίζει το Gio.

 

Αν είμαστε όμως σε Windows, τότε κάνω εγώ connect τον δικό μου signal-handler στα "activate-link" signals που στέλνει το About dialog κι εκεί μέσα καλώ απευθείας την ShellExecute() του Win32 API, με παράμετρο το link που περιέχεται στο signal.

 

Ο signal-handler μου είναι η callback συνάρτηση: on_activate_link_dlgAbout() η οποία αυτή τη στιγμή στο GitHub αρχίζει στην γραμμή: 1315.

 

Η σύνδεσή της με το "activate-link" signal του About dialog γίνεται (κλασικά με g_signal_connect()) μέσα στην συνάρτηση: gui_init_dlgAbout() η οποία αυτή τη στιγμή βρίσκεται στη γραμμή 2316 στο GitHub (η συγκεκριμένη σύνδεση γίνεται στη γραμμή 2436... το διευκρινίζω γιατί κάνω κι άλλα πράγματα μέσα στην συνάρτηση).

 

Τέσπα, πρέπει να την κάνω (ήδη έκανα κατάχρηση του χρόνου που... δεν είχα :lol:). Πείτε μου όμως αν χρειάζεται οτιδήποτε άλλο και θα βρω χρόνο να απαντήσω (έστω κι επιγραμματικά).

 

EDIT:

 

Βασικά τα links των γραμμών που έχω βάλει πι πάνω δεν είναι από το GitHub αλλά από το BitBucket, αλλά εκεί το έχω private το repo. Οπότε απλώς πηγαίνετε στο GitHub που έχω δώσει στο 1ο ποστ, στο αρχείο gtk_dice.c και απλά σκρολάρετε μέχρι να βρείτε τη γραμμή που ψάχνετε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...