Objektbewegung in C

Schnelle objektorientierte, kompilierende Programmiersprache.
traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Objektbewegung in C

Beitrag von traktorist » So Feb 26, 2017 10:51 am

Hallo Leute,
wie wird Objektbewegungin C realisiert,habe ein Kreis eingezeichnet mit "vid_draw_circle"-Funktion aus der graphics.h Bibliothek. Muss ich jetzt mit if-Schleife weiter machen? Wird dazu ein Timer/Taktgeber benötigt für die Geschwindigkeit?
Danke

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Objektbewegung in C

Beitrag von mfro » So Feb 26, 2017 11:05 am

traktorist hat geschrieben:Hallo Leute,
wie wird Objektbewegungin C realisiert,habe ein Kreis eingezeichnet mit "vid_draw_circle"-Funktion aus der graphics.h Bibliothek. Muss ich jetzt mit if-Schleife weiter machen? Wird dazu ein Timer/Taktgeber benötigt für die Geschwindigkeit?
Danke
Deine Infos sind schon ein bißchen arg dünn. Wo hast Du "vid_draw_circle()" her?

Grundsätzlich bewegt man ein Objekt am Bildschirm so (Pseudocode):

Code: Alles auswählen

while (es_soll_sich_was_bewegen)
{
    rette_hintergrund();
    zeichne_objekt();
    berechne_neue_position()
    stelle_hintergrund_wieder_her();
}
Das kann man noch verfeinern (indem man beispielsweise - um Flackern zu vermeiden - das Zeichnen mit dem Horizontal Blank synchronisiert).

P.S.: so was wie eine "if-Schleife" gibt's nicht.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Re: Objektbewegung in C

Beitrag von traktorist » So Feb 26, 2017 12:14 pm

Hallo wie meinst du es mit rette_hintergrund?in Zwischenspeicher ablegen?Die Funktion vid_draw_circle stamm aus der vorgegebene Bibliothek graphics.h (Terasic)
Ja meineCode sieht wirklichdünne aus.

Code: Alles auswählen

#include "terasic_includes.h"
#include "ILI9341.h"
#include "gui.h"
#include "touch_spi.h"
#include "system.h"

#include "terasic_includes.h"     //aus der gui.c Datei ubernomen
#include "gui.h"
#include "alt_video_display.h"
#include "simple_graphics.h"
#include "geometry.h"
#include "touch_spi.h"

   while(1)
    {
	  vid_draw_circle (105,170,5,RED_24,DO_FILL,&Display); //Der Ball
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Objektbewegung in C

Beitrag von cloidnerux » So Feb 26, 2017 12:40 pm

Die Funktion vid_draw_circle stamm aus der vorgegebene Bibliothek graphics.h (Terasic)
Auf welcher Plattform arbeitest du denn? Windows/PC, FPGA, SoC?

Unter Windows oder Linux gibt es tausende bessere Bibliotheken als diese. Wenn du aber auf einem 240px x 320px SPI Bildschirm arbeitest, ist das natürlich etwas anderes.
Hallo wie meinst du es mit rette_hintergrund?in Zwischenspeicher ablegen?
Zum Beispiel. Das Problem ist, dass der Bildschirminhalt ein Bild ist, wie z.B bei Paint. Du kannst jetzt nicht sagen "Bewege den Kreis", da es keinen Kreis gibt, sondern nur farbige Pixel. Stattdessen musst du dein Bildschirminhalt neu Zeichnen und dabei deinen Kreis verschieben. Wenn du das schnell genug(pro sekunde) machst, dann bewegt sich der Kreis recht "smooth". Um dabei Rechenaufwand zu sparen kann man den "statischen" Inhalt des Bildes auch als solches sichern und nur den Kreis neu darauf Zeichnen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Re: Objektbewegung in C

Beitrag von traktorist » So Feb 26, 2017 1:26 pm

Ja ich arbeite mit FPGA Board.Ich habe De0Nano-Board plus LT24-Display(240 x 320).Versuche Bsp. Projekt Painter umzumünzen. Hardwareteil(Treiber) habe jetzt draufgeladen und Softwareteil was in C geschrieben ist versuche ich zu ändern. Ich habe jetz soweit gekriegt das ich verschiedene Grafiken(Linie,Box,Kreis) darstellen kann.
Aber jetzt Tipp wie es weiter gehen soll bzw. was in die while-Schleife noch rein muss willst du mir nicht geben?
Habe halt in C nur Grundkentnisse und nur sehr wenig Praxis erfahrung. Kann mir vorstellen soll dann irgendwie so aussehen:
read=x-->write=x++(oder x + distance), habe halt Syntaxschwäche.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Objektbewegung in C

Beitrag von cloidnerux » So Feb 26, 2017 2:33 pm

Aber jetzt Tipp wie es weiter gehen soll bzw. was in die while-Schleife noch rein muss willst du mir nicht geben?
Wollen und können sind zwei verschiedene Dinge. Die wenigsten hier haben schon mit genau deinem Setup und den Routinen gearbeitet und einen "standard" gibt es auch nicht, da es davon abhängt, wie die Terasic Leute das umgesetzt haben. Zudem hab ich auch das Problem, dass ich recht wenig Doku zu dem ganzen finden kann.

Hast du denn mal probiert bei dem Aufruf deiner "vid_draw_circle" die Parameter zu ändern:

Code: Alles auswählen

int x = 0, y = 0;
while(1)
{
    vid_draw_circle (x,y,5,RED_24,DO_FILL,&Display); //Der Ball
    x += 5;
    delay_ms(500);     //oder äquivalent, was deine Plattform halt hat.
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Re: Objektbewegung in C

Beitrag von traktorist » Mo Feb 27, 2017 8:24 pm

Hallo, jawohl es funktioniert! Ich kriege jetzt eine Linie eingezeichnet.

Code: Alles auswählen

 int x = 50, y = 60;
 while(1)
 {
     vid_draw_circle (x,y,5,RED_24,DO_FILL,&Display); //Der Ball
     y += 5;
     Delay_Ms(10);
     //delay_ms(500);     //oder äquivalent, was deine Plattform halt hat.
 }
Jetzt muss ich bestimmt Einkreis zeichnen und davor eins Löschen?
Kann ich vielleicht auch zwei unterschiedlich(von durchmesser her) grosse Kreise Zeichnen übereinander.Dann lasse ich die beide laufen, dabei hat der außere Kreis die Hintergrundfarbe und somit übermalt der dann die Farbe von inneren.(gleich werde es ausprobieren)Oder ist das vielleicht nicht die günstigste variante?

traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Re: Objektbewegung in C

Beitrag von traktorist » Mo Feb 27, 2017 8:37 pm

traktorist hat geschrieben:Hallo, jawohl es funktioniert! Ich kriege jetzt eine Linie eingezeichnet.

Code: Alles auswählen

 int x = 50, y = 60;
 while(1)
 {
     vid_draw_circle (x,y,5,RED_24,DO_FILL,&Display); //Der Ball
     y += 5;
     Delay_Ms(10);
     //delay_ms(500);     //oder äquivalent, was deine Plattform halt hat.
 }
Jetzt muss ich bestimmt Einkreis zeichnen und davor eins Löschen?
Kann ich vielleicht auch zwei unterschiedlich(von durchmesser her) grosse Kreise Zeichnen übereinander.Dann lasse ich die beide laufen, dabei hat der außere Kreis die Hintergrundfarbe und somit übermalt der dann die Farbe von inneren.(gleich werde es ausprobieren)Oder ist das vielleicht nicht die günstigste variante?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Objektbewegung in C

Beitrag von cloidnerux » Mo Feb 27, 2017 11:05 pm

Jetzt muss ich bestimmt Einkreis zeichnen und davor eins Löschen?
Ich gehe mal davon aus, dass es eine "clear_display" Routine gibt, oder ähnlich.
Kann ich vielleicht auch zwei unterschiedlich(von durchmesser her) grosse Kreise Zeichnen übereinander.
Ich gehe stark davon aus, konsekutive Aufrufe von "vid_draw_circle" werden wrsl einfach übereinander gezeichnet.
Redundanz macht wiederholen unnötig.
quod erat expectandum

traktorist
Beiträge: 6
Registriert: So Feb 26, 2017 10:35 am

Re: Objektbewegung in C

Beitrag von traktorist » Do Apr 06, 2017 11:01 pm

Hallo,
wie kann ich ein Abprallwinkell realisieren(Einfallwinkel=Ausfallwinkel) ?

Code: Alles auswählen


   int Pos_X, Pos_Y, Touch_X, Touch_Y, Richtung, PlayerBalken, PunktPlayer1;

   Pos_X = 150;
   Pos_Y = 100;
   Richtung = 0;
   PlayerBalken = 120;
   PunktPlayer1 = 0;

   vid_clean_screen(pDisplay, BLACK_24); //Bildschirminhalt leeren - schwarzer Hintergrund

  while(1) {

     usleep(1*1000*8); 

     //Ballrichtung definieren  x++ [-->]; x-- [<--]
     if (Richtung == 0) {
         Pos_X++; //Ball in X bewegen
     }
     else {
       Pos_X--;//Ball in X bewegen
     }

     //Abprallen lassen
     if (Pos_X > 300) {
    	 Richtung = 1;
     }

     //der check ob man den Ball richtig getroffen hat.
     if (Pos_X < 20 && ((PlayerBalken+30 > Pos_Y && (PlayerBalken-30 < Pos_Y)))) {
         Richtung = 0;
     }

     //if(Pos_Y > 195){		// horiz. oben abprallen
    	// Pos_X++;
    	 //Pos_Y--;

    // }

    // if(Pos_Y<10){  //horz. unten abprallen
    	// Pos_X--;
    	// Pos_Y++;
     //}
Wie zu sehen ist, der Ball bewegt sich nur hin und her auf der X-Achse. Habe versucht mit Pos_X++ und Pos_Y-- zu spielen aber es funktioniert nicht wirklich und Richtungsabhängig ist es auch noch.

Antworten