Seite 1 von 2
Objektbewegung in C
Verfasst: So Feb 26, 2017 10:51 am
von traktorist
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
Re: Objektbewegung in C
Verfasst: So Feb 26, 2017 11:05 am
von mfro
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.
Re: Objektbewegung in C
Verfasst: So Feb 26, 2017 12:14 pm
von traktorist
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
}
Re: Objektbewegung in C
Verfasst: So Feb 26, 2017 12:40 pm
von cloidnerux
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.
Re: Objektbewegung in C
Verfasst: So Feb 26, 2017 1:26 pm
von traktorist
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.
Re: Objektbewegung in C
Verfasst: So Feb 26, 2017 2:33 pm
von cloidnerux
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.
}
Re: Objektbewegung in C
Verfasst: Mo Feb 27, 2017 8:24 pm
von traktorist
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?
Re: Objektbewegung in C
Verfasst: Mo Feb 27, 2017 8:37 pm
von traktorist
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?
Re: Objektbewegung in C
Verfasst: Mo Feb 27, 2017 11:05 pm
von cloidnerux
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.
Re: Objektbewegung in C
Verfasst: Do Apr 06, 2017 11:01 pm
von traktorist
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.