Objektbewegung in C
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Objektbewegung in C
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
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
Deine Infos sind schon ein bißchen arg dünn. Wo hast Du "vid_draw_circle()" her?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
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();
}
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.
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Re: Objektbewegung in C
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.
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
}
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Objektbewegung in C
Auf welcher Plattform arbeitest du denn? Windows/PC, FPGA, SoC?Die Funktion vid_draw_circle stamm aus der vorgegebene Bibliothek graphics.h (Terasic)
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.
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.Hallo wie meinst du es mit rette_hintergrund?in Zwischenspeicher ablegen?
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Re: Objektbewegung in C
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.
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.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Objektbewegung in C
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.Aber jetzt Tipp wie es weiter gehen soll bzw. was in die while-Schleife noch rein muss willst du mir nicht geben?
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
quod erat expectandum
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Re: Objektbewegung in C
Hallo, jawohl es funktioniert! Ich kriege jetzt eine Linie eingezeichnet.
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?
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.
}
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?
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Re: Objektbewegung in C
traktorist hat geschrieben:Hallo, jawohl es funktioniert! Ich kriege jetzt eine Linie eingezeichnet.Jetzt muss ich bestimmt Einkreis zeichnen und davor eins Löschen?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. }
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?
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Objektbewegung in C
Ich gehe mal davon aus, dass es eine "clear_display" Routine gibt, oder ähnlich.Jetzt muss ich bestimmt Einkreis zeichnen und davor eins Löschen?
Ich gehe stark davon aus, konsekutive Aufrufe von "vid_draw_circle" werden wrsl einfach übereinander gezeichnet.Kann ich vielleicht auch zwei unterschiedlich(von durchmesser her) grosse Kreise Zeichnen übereinander.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
-
- Beiträge: 6
- Registriert: So Feb 26, 2017 10:35 am
Re: Objektbewegung in C
Hallo,
wie kann ich ein Abprallwinkell realisieren(Einfallwinkel=Ausfallwinkel) ?
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.
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++;
//}