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

Γραφικά σε C++ ;


nrkmaiden

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

Δημοσ.

Texture = υφή με την οποία 'ντύνεις' τα πολύγωνά σου.

 

Δες το βουνό από πίσω πχ πόσο μάπα φαίνεται. Αν είχα βάλει textures θα φαινόταν κομπλέ αλλά δεν είχα χρόνο για να προσέξω το tilling και όλες τις λεπτομέρειες που ήθελε.

 

PS: Τα σύγχρονα παιχνίδια χρησιμοποιούν και επιπλέον εφέ όπως specular και normal maps που εφαρμόζονται πάνω στα textures. Προσπέρασέ τα αυτά όμως και ασχολήσου με τα βασικά, όπως πχ το να φτιάξεις ένα σωστό σύστημα collision

Δημοσ.
Πολυ απλα γιατι το User Interface ανηκει στο κελεφος του λειτουργικου συστηματος, και αυτα που αναφερεις περι χρωματων και αλλαγει position του κερσορα κλπ κλπ υπαρχουν στο αντιστοιχο console api.

Η STL απο την αλλη περιεχει παρα μα παρα πολυ καλα εργαλεια που σε βοηθουν σε αυτα που δεν μπορει να σε βοηθησει η γλωσσα c++ απο μονη της, βλεπε containers, smart pointers και διαφοροι αλγοριθμοι.

Εαν σε ενδιαφερει το UI τοτε θα πρεπει, ειτε να μαθεις αυτα που σου προσφερει το λειτουργικο ειτε να μαθεις καποιο framework το οποιο περιεχει αντιστοιχη δυνατοτητα.

 

Μάλλον δεν κατάλαβες καλά.

Το θέμα είναι να μπορείς να κάνεις τα απλά (τουλάχιστον) πράγματα ΧΩΡΙΣ να χρειάζεται να ασχοληθείς με ένα πολύπλοκο framework.

Το να μάθεις π.χ. το Qt ή το win ΑPI για να καθαρίζεις την οθόνη ή να αλλάζεις χρώμα στο κείμενο ή να τραβάς γραμμές είναι ανοησία

και χαμένος χρόνος εφόσον το UI δεν σε ενδιαφέρει. Αυτό συμβαίνει πολύ συχνά.

Μια απλή εντολή χρειάζεται. Και ευτυχώς αλλού υπάρχει.

 

Όσο για την STL δεν έχει καμιά θέση με το θέμα μας.

 

Αν ο ΤS ασχολείται με game programming, το opengl είναι καλή αρχή.

Και κατά τη γνώμη είναι καλύτερη επιλογή απο το directX για κάποιον αρχάριο...

 

-

Δημοσ.
Μια χαρά νόημα έχει.

 

Είναι απαράδεκτο να μην μπορείς να τραβήξεις με απλό τρόπο μια γραμμή ή

να καθαρίσεις την οθόνη ή να αλλάξεις το χρώμα/γραμματοσειρά του κειμένου.

 

Κάποτε μπορούσες να το κάνεις σε compilers όπως η turbo C++, τώρα όχι.

Το ευτράπελο είναι ότι σε άλλες γλώσσες υπάρχει...

 

 

Mια λύση είναι το PGPLOT. Εγώ δεν το έχω χρησιμοποιήσει ποτέ αλλά το συστήνουν αρκετά.

Είναι πρωταρχικά γραμμένο για fortran αλλά ξέρω ότι υπάρχει και wrapper για την C++.

 

-

 

Συμφωνώ 100% μαζί σου και αναπολώ τις παλιές καλές εποχές που μπορούσαμε γρήγορα και εύκολα να φτιάξουμε απλά γραφικά με την graphics.h σε περιβάλλον κονσόλας.

 

Anyway, δοκίμασα την PGPLOT σε Ubuntu 10.10 και δουλεύει άψογα. Μπορεί πολύ εύκολα να γίνει install με: sudo apt-get install pgplot5

 

το παράδειγμα (pgplot_1.c) που δοκίμασα σε c το παραθέτω παρακάτω:

 

>
#include "cpgplot.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
 int i;
 static float xs[] = {1.0, 2.0, 3.0, 4.0, 5.0 };
 static float ys[] = {1.0, 4.0, 9.0, 16.0, 25.0 };
 float xr[60], yr[60];
 int n = sizeof(xr) / sizeof(xr[0]);
 /*
  * Call PGBEG to initiate PGPLOT and open the output device; PGBEG
  * will prompt the user to supply the device name and type.
  */
 if(cpgbeg(0, "?", 1, 1) != 1)
   return EXIT_FAILURE;
 /*
  * Call PGENV to specify the range of the axes and to draw a box, and
  * PGLAB to label it. The x-axis runs from 0 to 10, and y from 0 to 20.
  */
 cpgenv(0.0, 10.0, 0.0, 20.0, 0, 1);
 cpglab("(x)", "(y)", "PGPLOT Example 1: y = x\\u2\\d");
 /*
  * Mark five points (coordinates in arrays XS and YS), using symbol
  * number 9.
  */
 cpgpt(5, xs, ys, 9);
 /*
  * Compute the function at 'n=60' points, and use PGLINE to draw it.
  */
 for(i=0; i<n; i++) {
   xr[i] = 0.1*i;
   yr[i] = xr[i]*xr[i];
 }
 cpgline(n, xr, yr);
 /*
  * Finally, call PGEND to terminate things properly.
  */
 cpgend();
 return EXIT_SUCCESS;
}

 

και compile με: gcc pgplot_1.c -o pgplot_1 -L/usr/lib/ -lcpgplot -lpgplot -lm

 

:-)

Δημοσ.

Όλα είναι θέμα framework, για παράδειγμα τόσο στο .NET όσο και στον C++ Builder η σχεδίαση σε ένα παράθυρο διαφόρων γεωμετρικών σχημάτων είναι τετριμμένη υπόθεση.

 

Η παρακάτω εικόνα σε ένα παράθυρο των Windows, σχεδιάζεται σε 44 γραμμές κώδικα VCL (C++ Builder) συν δυο κλήσεων του Windows API και μερικά σχόλια (//) και όλα αυτά εφαρμόζοντας και DoubleBuffer μεθοδολογία (σχεδίαση σε ένα off-screen Bitmap):

 

clipboard01yw.png

 

Κώδικας στο OnPaint event της φόρμας:

>
void __fastcall TForm1::FormPaint(TObject *Sender)
{
const UnicodeString Caption = "COLOR-CYCLE";
// Will draw using a DoubleBuffer way, to eliminate any flick.
std::auto_ptr<Graphics::TBitmap> BackBuffer(new Graphics::TBitmap());
BackBuffer->Width = ClientRect.Width();
BackBuffer->Height= ClientRect.Height();
// Clear background with Black.
BackBuffer->Canvas->Brush->Color = clBlack;
BackBuffer->Canvas->FloodFill(0, 0, clBlack, fsBorder);
// Draw a red circle.
BackBuffer->Canvas->Pen->Color = clRed;
BackBuffer->Canvas->Ellipse(ClientRect);
// Draw a cross.
BackBuffer->Canvas->MoveTo(ClientRect.Width() / 2, 0);
BackBuffer->Canvas->LineTo(ClientRect.Width() / 2, ClientRect.Height());
BackBuffer->Canvas->MoveTo(0, ClientRect.Height() / 2);
BackBuffer->Canvas->LineTo(ClientRect.Width(), ClientRect.Height() / 2);
// Fill circle exterior with darker colors.
BackBuffer->Canvas->Brush->Color = clMaroon;
BackBuffer->Canvas->FloodFill(0, 0, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clGreen;
BackBuffer->Canvas->FloodFill(ClientRect.Width() - 1, 0, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clNavy;
BackBuffer->Canvas->FloodFill(0, ClientRect.Height() - 1, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clDkGray;
BackBuffer->Canvas->FloodFill(ClientRect.Width() - 1, ClientRect.Height() - 1, clBlack, fsSurface);
// Fill cross interior with lighter colors.
TPoint RectCenter = CenterPoint(ClientRect);
BackBuffer->Canvas->Brush->Color = clRed;;
BackBuffer->Canvas->FloodFill(RectCenter.x - 1, RectCenter.y - 1, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clLime;
BackBuffer->Canvas->FloodFill(RectCenter.x + 1, RectCenter.y - 1, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clBlue;
BackBuffer->Canvas->FloodFill(RectCenter.x - 1, RectCenter.y + 5, clBlack, fsSurface);
BackBuffer->Canvas->Brush->Color = clSilver;
BackBuffer->Canvas->FloodFill(RectCenter.x + 1, RectCenter.y + 5, clBlack, fsSurface);
// Switch to a fairly large (12pt) black Font..
BackBuffer->Canvas->Font->Size = 12;
BackBuffer->Canvas->Font->Color = clBlack;
// Ask Windows to draw text transparently..
SetBkMode(BackBuffer->Canvas->Handle, TRANSPARENT);
// Draw text centered on bitmap..
DrawTextW(BackBuffer->Canvas->Handle, Caption.w_str(), Caption.Length(), &ClientRect,
	DT_VCENTER|DT_CENTER|DT_SINGLELINE);
// Draw BackBuffer on Form.. (Flip)
Canvas->Draw(0, 0, BackBuffer.get());
}

Κώδικας στο OnResize event της φόρμας (ώστε με την ανανέωση των διαστάσεων της να ανανεώνεται ανάλογα και η σχεδιαζόμενη εικόνα):

>
void __fastcall TForm1::FormResize(TObject *Sender)
{
// Repaint form when dimensions change.
Invalidate();
}

 

Μάλιστα το μέγεθος του κώδικα θα μπορούσε να μικρύνει μερικές γραμμές ακόμα αν χρησιμοποιούσα πίνακες & for για την αποφυγή των επαναλήψεων στο εσωτερικό και εξωτερικό χρωματισμό των τεταρτημορίων (δεν το έκανα για να διατηρήσω τον παράδειγμα όσο πιο απλό γίνεται).

 

Υ.Γ.

Φυσικά οφείλεις να ασχοληθείς έστω ελάχιστα με το TCanvas class (επί του προκείμενου) της VCL μέσο του οποίου σχεδιάζεις, όπως όφειλες παλαιότερα να ασχοληθείς με το conio.h και το graphics.h (και τα BGI) της Turbo C++ ή το graph.h των παμπάλαιων Microsoft C για DOS compilers. Παρομοίως όφειλες να ασχοληθείς με την βιβλιοθήκη TurboVision αν επιθυμούσες να γράψεις υψηλού επιπέδου UI σε DOS δίχως να γράφεις μόνος σου ολόκληρο το UI της εφαρμογής σου. Απλά στα Windows πολλοί DOSαδες προγραμματιστές τα βρήκαν μπαστούνια στην μετάβαση τους από την κονσόλα και την οθόνη στο παράθυρο και το DC, διότι είτε όταν έκαναν την σκάντζα από DOS σε Windows δεν υπήρχαν τόσο εύχρηστα εργαλεία όπως σήμερα είτε διότι εμμένουν στην αρχική τους άρνηση να μάθουν κάτι καινούργιο θεωρώντας εξ ορισμού ότι θα είναι δύσκολο & περίπλοκο. Το ίδιο πρόβλημα αντιμετωπίζουν και αρκετοί φοιτητές καθώς η διδασκαλεία GUI πάσχει ή είναι ανύπαρκτη κυρίως στα ΑΕΙ της χώρας με αποτέλεσμα την κυκλοφορία εφαρμογών εκτρωμάτων :-/

Δημοσ.

H μεγάλη διαφορά είναι ότι π.χ. με την graphics.h (και τα BGI) της Turbo C++ μπορούσες να κάνεις τα απλά πράγματα

που ήθελες χωρίς να χρειαστεί να μπλέξεις με τίποτε άλλο. Μια - δυο διαισθητικές εντολές αρκούσαν.

(Και φυσικά μπορούσες να φτιάξεις και πολύπλοκα αλλά αυτό είναι άλλη κουβέντα.)

 

Το να μετατραπεί το πρόγραμμα σε event-driven ή να μπλέξεις με κλάσεις όταν θέλεις απλώς να καθαρίσεις την οθόνη

ή να τραβήξεις μια γραμμή, σε απομακρύνει από την μονολιθικότητα που πρέπει (και ζητάς) να έχει το πρόγραμμα στην

κονσόλα.

Αλλιώς, το να γράψεις στην κονσόλα δεν έχει νόημα.

Ο αρχάριος που δεν ξέρει κλάσεις ακόμη ή ο επιστήμονας/φοιτητής που θέλει να δείχνει την λύση ενός συστήματος με κόκκινο

ή να φτιάχνει μια γραφική παράσταση, θέλει μια απλή, διαισθητική εντολή, όχι κλάσσεις και events.

(Το pgplot που ανέφερα πριν και δοκίμασε ο DrFuzzy είναι μια καλή προσπάθεια με αυτόν τον προσανατολισμό δηλ. την απλότητα.)

 

Η κατασκευή πιο σύνθετου UI είναι άλλο ζήτημα και εκεί έχεις δίκιο, πρέπει να σχοληθείς με τα εργαλεία και να αλλάξεις περισσότερο

ή λιγότερο την δομή του προγράμματος.

Αλλά η κουβέντα δεν αφορούσε αυτή την περίπτωση.

 

Άντε, καλημέρα....

 

-

Δημοσ.
[..]

Ο αρχάριος που δεν ξέρει κλάσεις ακόμη ή ο επιστήμονας/φοιτητής που θέλει να δείχνει την λύση ενός συστήματος με κόκκινο

ή να φτιάχνει μια γραφική παράσταση, θέλει μια απλή, διαισθητική εντολή, όχι κλάσσεις και events.

(Το pgplot που ανέφερα πριν και δοκίμασε ο DrFuzzy είναι μια καλή προσπάθεια με αυτόν τον προσανατολισμό δηλ. την απλότητα.)[..]-

 

Άρα καταλήγουμε σιγά, σιγά στην ουσία εκείνης της παλαιότερης κουβέντας σχετικά με το τι εστί Προγραμματιστής και τι αξία έχει η σπουδή της Πληροφορικής. Νομίζω ότι τώρα μπορείς να καταλάβεις πόσο σημαντικός είναι ο Προγραμματιστής όταν οι Επιστήμονες δεν μπορούν να αφιερώσουν λίγο από τον χρόνο τους και την διάνοια τους ώστε να μάθουν τετριμμένες κοινοτυπίες όπως συνηθίζεις να λες και τα βρίσκουν μπαστούνια με έννοιες όπως Event-Driven Λ.Σ., παράθυρο, καθαρισμός οθόνης, σχεδίαση σε ένα Bitmap, Class κλπ.

 

Στρεφόμενοι σε βιβλιοθήκες για να κάνουν την δουλεία τους που όπως μου λέγατε σε παλαιότερα θέματα δεν "καλύπτουν δυστυχώς τα πάντα" οπότε οφείλουν να μην ζητούν και πολλά πράματα έτοιμα αλλά να έχουν την γνώση (ή την διάθεση να την αποκτήσουν) ώστε να τα φτιάχνουν μόνοι τους (δικέ σας αντιλήψεις είναι αυτές όπως τις διατυπώσατε κατά καιρούς σε διάφορα θέματα.. δεν φταίω :-D).

 

...

Anyway, νομίζω ότι καταλαβαίνεις το πνεύμα μου - όπως και εγώ το δικό σου, καλό πρωί!

:-)

Δημοσ.

Δεν διαφωνούμε επί της ουσίας φίλε μου.

 

Άλλο πράγμα είναι να θέλεις να φτιάξεις GUI (όντως, κύρια δουλειά προγραμματιστή) και άλλο να απλώς να

καθαρίσεις την οθόνη ή να σχεδιάσεις μια κόκκινη γραμμή.

Θα έπρεπε να υπάρχει (και υπήρχε ή υπάρχει) μέριμνα και για το δεύτερο.

 

Εν πάση περιπτώση, η κουβέντα γίνεται και για να ενημερώνονται όλοι (κι εγώ βέβαια) - εσύ έχει φανεί κι' αλλού ότι

αντιλαμβάνεσαι τα πράγματα στην σωστή τους βάση...

 

Καλή συνέχεια στη μέρα σου...

 

-

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

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

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