|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 01.01.2013, 13:18 Titel: Grafik mit Tasten bewegen |
|
|
Hi Leute!
Ich plage mich schon lange, einen Befehl zu finden, damit ich z. B. einen Kreis bewegen kann. Ich schreib mal den Code rein, wo ich es schon versucht habe, aber es funktioniert einfach nicht richtig. Kann mir da bitte jemand helfen?
CLS
SCREEN 12
a = 260
b = 340
KEY(11) ON
KEY(12) ON
KEY(13) ON
KEY(14) ON
DO WHILE 1
IF KEY11 = pressed THEN a = a + 1
LINE (a, b)-(a + 100, b), 1.11
SLEEP 1
LOOP
Schon mal danke im voraus _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 01.01.2013, 15:14 Titel: |
|
|
Hallo,
willkommen im Forum und ein frohes neues Jahr!
Die tastaturgesteuerte Bewegung des Kreises kannst du realisieren, indem du in einer Schleife kontinuierlich zunächst überprüfst, ob eine Taste gedrückt wurde. Wenn ja, schaust du, ob und welche Pfeiltaste es war. Davon abhängig veränderst du die Koordinaten des Kreises. Außerdem musst du noch dafür sorgen, dass der Kreis da, wo er vorher zu sehen war, nicht mehr zu sehen ist (damit immer nur 1 Kreis zu sehen ist). Das heißt, der Kreis an der alten Position muss verschwinden. Dafür gäbe es verschiedene Möglichkeiten, am einfachsten ist es aber, ihn mit einem neuen Kreis in der Hintergrundfarbe zu übermalen (schwarz auf schwarz zum Beispiel).
Der folgende Beispielcode (Direktdownload KREISBEW.BAS) demonstriert das mal insgesamt:
Code: | SCREEN 12 'Grafikmodus initialisieren
'Einstellungen / Konstanten
CONST RADIUS = 20
CONST FARBE = 12
CONST SCHRITTWEITE = 2
'Variablen fuer Kreiskoordinaten
DIM X AS INTEGER, Y AS INTEGER
X = 319
Y = 239
'Ersten Startkreis malen unabhaengig von Bewegungen:
CIRCLE (X, Y), RADIUS, FARBE
'Variablen fuer sowas wie einen Bewegungsvektor (DeltaX/Y)
DIM DX AS INTEGER, DY AS INTEGER
'String-Variable fuer Tastatureingaben
DIM TASTE AS STRING
'Jetzt die grosse Schleife, in der alles ablaeuft
DO
TASTE = INKEY$
IF (TASTE <> "") THEN 'Es wurde etwas gedrueckt.
DX = 0: DY = 0
SELECT CASE TASTE
CASE CHR$(0) + "K": ' LINKS
DX = -SCHRITTWEITE
CASE CHR$(0) + "M": ' RECHTS
DX = SCHRITTWEITE
CASE CHR$(0) + "H": ' HOCH
DY = -SCHRITTWEITE
CASE CHR$(0) + "P": ' RUNTER
DY = SCHRITTWEITE
CASE ELSE:
BEEP
END SELECT
IF (DX <> 0) OR (DY <> 0) THEN 'Bewegung eingetragen!
'Alten Kreis uebermalen
CIRCLE (X, Y), RADIUS, 0 'Farbe schwarz
'Neue Koordinaten berechnen
X = X + DX
Y = Y + DY
'Sind die entstandenen Koordinaten gueltig?
IF (X > 639) THEN X = 0
IF (X < 0) THEN X = 639
IF (Y > 479) THEN Y = 0
IF (Y < 0) THEN Y = 479
'-> Der Kreis laeuft ggf. auf der anderen
' Bildschirmseite weiter.
CIRCLE (X, Y), RADIUS, FARBE
END IF
END IF
LOOP UNTIL TASTE = CHR$(27) ' solange bis ESC gedrueckt wird
END |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 01.01.2013, 15:21 Titel: |
|
|
Tja, habe auch gerade einen schönen Beitrag geschrieben, aber da stand nichts drin, was Sebastian nicht auch eben schon geschrieben hätte.
(außer dass KEY(11) und KEY11 nicht dasselbe sein wird) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 01.01.2013, 16:02 Titel: |
|
|
nemored hat Folgendes geschrieben: | Tja, habe auch gerade einen schönen Beitrag geschrieben, aber da stand nichts drin, was Sebastian nicht auch eben schon geschrieben hätte. |
Schade, hättest du doch trotzdem posten können. Fürs Verständnis ist es doch meistens ganz hilfreich, etwas aus mehr als einer Perspektive erklärt zu bekommen. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 02.01.2013, 20:01 Titel: |
|
|
Danke für die Dilfe, aber einige Befehle hab ich noch nicht im FF.
Kann mir das bitte noch jemand besser erklären? _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 02.01.2013, 21:21 Titel: |
|
|
Einmal stark reduziert auf dein Beispiel (Bewegung nach rechts):
Code: | CLS
SCREEN 12
a = 260
b = 340
LINE (a, b)-(a + 100, b), 1
DO WHILE 1 ' Achtung: Diese Schleife wird nie verlassen!!
IF INKEY$ = CHR$(0) + "M" THEN a = a + 1 ' Pfeiltaste rechts
LINE (a, b)-(a + 100, b), 1
SLEEP 1
LOOP |
INKEY$ dient zur Abfrage der gedrückten Taste. Hier wird die alte Linie noch nicht überzeichnet, weshalb sie scheinbar links stehen bleibt und sich nur nach rechts verlängert. Erweitert um eine Löschroutine:
Code: | CLS
SCREEN 12
a = 260
b = 340
LINE (a, b)-(a + 100, b), 1
DO WHILE 1 ' Achtung: Diese Schleife wird nie verlassen!!
IF INKEY$ = CHR$(0) + "M" THEN ' Pfeiltaste rechts
LINE (a, b)-(a + 100, b), 0 ' löschen
a = a + 1
LINE (a, b)-(a + 100, b), 1 ' zeichnen
END IF
SLEEP 1
LOOP |
Bei mehreren Abfragen bietet sich oft SELECT CASE an - wie hier zum Beispiel; das wird in Sebastians Code oben eingesetzt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 10.01.2013, 19:10 Titel: |
|
|
Danke _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 10.01.2013, 19:17 Titel: |
|
|
Jaa danke jetzt habs ich komlpett verstanden! Danke! _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 10.01.2013, 21:36 Titel: |
|
|
SOOO schaut euch den mal an:
Code: | COLOR 0, 7
CLS
PRINT "Herzlich wilkommen beim 1.Spiel.";
PRINT "Gebe bitte deinen Vornamen ein."
INPUT ; Name$
CLS
PRINT "Willst du zu alleine oder zu zweit spielen? Gebe 1 oder 2 ein";
INPUT ; spielerzahl
CLS
IF spielerzahl = 1 THEN
CONST schrittweite = 10
DIM x1 AS INTEGER, y1 AS INTEGER
y1 = 250
x1 = 400
y2 = 250
x2 = 70
y3 = 70
x3 = 70
y4 = 560
x4 = 70
y5 = 0
x5 = 0
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 3"
SLEEP 1
CLS
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 2"
SLEEP 1
CLS
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 1"
SLEEP 1
CLS
SCREEN 12
COLOR 0, 10
CLS
LINE (y1, x1)-(y1 + 100, x1), 1
LINE (y2, x2)-(y2 + 100, x2), 1
LINE (y3, x3)-(y3, x3 + 330), 6
LINE (y4, x4)-(y4, x4 + 330), 6
DIM DX AS INTEGER, DY AS INTEGER
DIM TASTE AS STRING
DO WHILE 1
TASTE = INKEY$
IF (TASTE <> "") THEN
DX = 0: DY = 0
SELECT CASE TASTE
CASE "n":
DY = -schrittweite
CASE "m":
DY = schrittweite
CASE ELSE:
BEEP
END SELECT
IF (DX <> 0) OR (DY <> 0) THEN 'Bewegung eingetragen!
CLS
x1 = x1 + DX
y1 = y1 + DY
LINE (y1, x1)-(y1 + 100, x1), 1
LINE (y2, x2)-(y2 + 100, x2), 1
LINE (y3, x3)-(y3, x3 + 330), 6
LINE (y4, x4)-(y4, x4 + 330), 6
IF (y1 < 80) THEN y1 = 80
IF (y1 > 450) THEN y1 = 450
END IF
END IF
LOOP
END IF
|
_________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 10.01.2013, 21:38 Titel: |
|
|
Ich hab heute mal ein wenig gearbeitet.
Ich glaube man weiß was das fürn Spiel wird.
Diese Frage passt jetzt nicht zum Thema, doch wie kann ich einen Kreis am Fensterrand abprellen lassen, dass es auch die "Flugbahn so richtig berechnet? _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 11.01.2013, 00:03 Titel: |
|
|
Eine Möglichkeit, das Programm auf normalem Weg zu berechnen, wäre nicht schlecht.
Schau dir mal http://www.freebasic-portal.de/porticula/3-6-bewegung-mit-beschleunigung-1344.html an - ist zwar FreeBASIC, aber das Prinzip ist dasselbe. Die Kollision mit dem Rand ist im Kommentar gekennzeichnet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 11.01.2013, 15:09 Titel: |
|
|
Nee versteh ích leider nicht, hats wer auf QB, wo ich die Befehle kenne? _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 11.01.2013, 20:02 Titel: |
|
|
Wenn ich nichts übersehen habe, kommen da genau drei Befehle vor, die es nicht in QB gibt. Ersetze SCREENRES durch einen SCREEN-Befehl deiner Wahl und mache aus dem Einlesen und Setzen der Maus (GETMOUSE, SETMOUSE) irgendwas anderes, um den Kreis zu beschleunigen - als andere sind QB-Befehle. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 06.03.2013, 21:16 Titel: |
|
|
Hi Leute!
Ich hab jetzt fleißig geschrieben und das erste Spiel ist rausgekommen!!!
Hier: Sehts euch an!
Code: | COLOR 0, 7
CLS
PRINT "Herzlich wilkommen bei Ballkicking!";
PRINT "Gebe bitte deinen Vornamen ein."
INPUT ; Name$
CLS
PRINT "Willst du zu alleine oder zu zweit spielen? Gebe 1 oder 2 ein";
INPUT ; spielerzahl
CLS
IF spielerzahl = 1 THEN
lv1:
CLS
score = 0
plus = 5
minus = -5
CONST schrittweite = 10
schrittweite1 = plus
schrittweite2 = plus
DIM x1 AS INTEGER, y1 AS INTEGER
y1 = 250
x1 = 400
y2 = 250
x2 = 70
y3 = 70
x3 = 70
y4 = 560
x4 = 70
y5 = 350
x5 = 170
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 3"
SLEEP 1
CLS
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 2"
SLEEP 1
CLS
PRINT "Tasten belegt: N, M. "
PRINT "Starte das Spiel in 1"
SLEEP 1
CLS
SCREEN 12
COLOR 0, 7
CLS
LINE (y1, x1)-(y1 + 100, x1), 1
LINE (y2, x2)-(y2 + 100, x2), 1
LINE (y3, x3)-(y3, x3 + 330), 6
LINE (y4, x4)-(y4, x4 + 330), 6
CIRCLE (y5, x5), 10
DIM DX AS INTEGER, DY AS INTEGER
DIM TASTE AS STRING
DO WHILE 1
CLS
PRINT "SCORE: "; score
TASTE = INKEY$
IF (TASTE <> "") THEN
DX = 0: DY = 0
SELECT CASE TASTE
CASE "n":
DY = -schrittweite
CASE "m":
DY = schrittweite
END SELECT
IF (DX <> 0) OR (DY <> 0) THEN 'Bewegung eingetragen!
x1 = x1 + DX
y1 = y1 + DY
END IF
END IF
CIRCLE (y5, x5), 10
LINE (y1, x1)-(y1 + 100, x1), 1
LINE (y2, x2)-(y2 + 100, x2), 1
LINE (y3, x3)-(y3, x3 + 330), 6
LINE (y4, x4)-(y4, x4 + 330), 6
IF (y5 > y1 AND y5 < y1 + 100) THEN
IF (x5 >= 395 AND x5 <= 405) THEN
schrittweite2 = minus
END IF
END IF
IF (y5 >= 545) THEN schrittweite1 = minus
IF (y5 <= 80) THEN schrittweite1 = plus
IF (x5 >= 495) THEN GOTO exitloop
IF (x5 <= 75) THEN schrittweite2 = plus
IF (y1 < 80) THEN y1 = 80
IF (y1 > 450) THEN y1 = 450
y5 = y5 + schrittweite1
x5 = x5 + schrittweite2
'schriften
LOCATE 4, 35
PRINT "Computer"
LOCATE 27, 35
PRINT Name$
Zeit = 0.005 'wartet eine halbe Sekunde
t = TIMER
DO WHILE NOT t + Zeit <= TIMER: LOOP
'bewegung gegner
IF (y5 - 40 > y3 AND y5 + 50 < y4) THEN
y2 = y5 - 45
END IF
score = score + 1
IF score = 300 THEN
plus = 6
minus = -6
END IF
IF score = 600 THEN
plus = 7
munus = -7
END IF
IF score = 900 THEN
plus = 8
minus = -8
END IF
IF score = 1200 THEN
plus = 9
munus = -9
END IF
IF score >= 1500 THEN
plus = 10
minus = -10
END IF
LOOP
exitloop:
CLS
PRINT "game over"
PRINT "SCORE: "; score
SLEEP 1
INPUT "Noch einmal spielen? ja/nein "; Nochmalspielen$
IF Nochmalspielen$ = "ja" THEN GOTO lv1
IF Nochmalspielen$ = "nein" THEN END
END IF
|
_________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
Duschek
Anmeldungsdatum: 01.01.2013 Beiträge: 18
|
Verfasst am: 06.03.2013, 21:20 Titel: |
|
|
Nun arbeite ich jedoch an nem Neuen Programm.
Es ist ähnlich wie "Achtung Kurve", doch ich stehe vor nem grooßen Problem.
Wie kann man eine Variable machen, in der man viele andere speichert?
Ich brauche das, wenn eine Schlange einer anderen dreinfährt.
Hier noch der Code und danke schon mal im Voraus.
[code]'achtung kante!
COLOR 0, 7
CLS
'startmen
PRINT "Spieler 1!"
PRINT "Herzlich wilkommen bei Achtung Kante!"
PRINT "Fr dieses Spiel ben”tigt man 2 Spieler."
PRINT "Gebe bitte den Namen des 1. Spielers ein! (ohne Leerzeichen) "
INPUT player1$
CLS
PRINT "Spieler 2!"
PRINT "Nun gebe bitte den Namen des 2. Spielers ein! (ohne Leerzeichen) "
INPUT player2$
CLS
PRINT "Dem 1. Spieler (ORANGE) sind die Tasten N und M zugeteilt!"
PRINT "Dem 2. Spieler (GRAU) sind die Tasten Y und X zugeteilt!"
SLEEP 3
COLOR 4, 3
CLS
PRINT "Nun lasset das Spiel Beginnen!"
PRINT player1$; " VS: "; player2$
PRINT "3 DREI!"
SLEEP 1
CLS
COLOR 3, 6
CLS
PRINT "Nun lasset das Spiel Beginnen!"
PRINT player1$; " VS. "; player2$
PRINT "2 Zwei!"
SLEEP 1
CLS
COLOR 5, 7
CLS
PRINT "Nun lasset das Spiel Beginnen!"
PRINT player1$; " VS: "; player2$
PRINT "1 Eins!"
SLEEP 1
CLS
COLOR 0, 4
CLS
PRINT "GO!"
SLEEP 1
CLS
'vorbereitungen fr das spiel
aeins = 0 'fr die ausrichtung der Schlangen
azwie = 0
einsx = 40 'die Schlangenstandpunkte hier von spieler 1
einsy = 240
zweix = 600 ' und hier von spieler 2
zweiy = 240
schrittweite1x = 5 'player 1: fr breite
schrittweite1y = 0 'player 1: fr h”he
schrittweite2x = -5 'player 2: fr h”he
schrittweite2y = 0 'player 2: fr breite
DIM x1 AS INTEGER, y1 AS INTEGER
'linien vorzeichnen
SCREEN 12
LINE (5, 5)-(635, 5), 1
LINE (5, 5)-(5, 475), 1
LINE (635, 475)-(635, 5), 1
LINE (5, 475)-(635, 475), 1
CIRCLE (einsx, einsy), 5, 6 'schlange spieler 1
PAINT (einsx, einsy), 6
CIRCLE (zweix, zweiy), 5, 7 'schlange spieler 2
PAINT (zweix, zweiy), 7
'das spiel
DO
'tasten input fr spieler 1 und 2
DIM DY AS INTEGER, DX AS INTEGER
DIM TASTE AS STRING
TASTE = INKEY$
IF (TASTE <> "") THEN
DY = 0
DX = 0
SELECT CASE TASTE
CASE "n":
DY = -1
CASE "m":
DY = 1
CASE "y":
DX = -1
CASE "x":
DX = 1
END SELECT
IF (DY OR DX <> 0) THEN 'Bewegung eingetragen!
aeins = aeins + DY
azwei = azwei + DX
END IF
END IF
'spieler 1
IF aeins = -1 THEN aeins = 3
IF aeins = 4 THEN aeins = 0
IF aeins = 0 THEN
schrittweite1x = 5 'player 1: fr breite
schrittweite1y = 0 'player 1: fr h”he
END IF
IF aeins = 1 THEN
schrittweite1x = 0
schrittweite1y = 5
END IF
IF aeins = 2 THEN
schrittweite1x = -5
schrittweite1y = 0
END IF
IF aeins = 3 THEN
schrittweite1x = 0
schrittweite1y = -5
END IF
einsx = einsx + schrittweite1x
einsy = einsy + schrittweite1y
LINE (5, 5)-(635, 5), 1
LINE (5, 5)-(5, 475), 1
LINE (635, 475)-(635, 5), 1
LINE (5, 475)-(635, 475), 1
CIRCLE (einsx, einsy), 5, 6 'schlange spieler 1
PAINT (einsx, einsy), 6
'spieler 2
IF azwei = -1 THEN azwei = 3
IF azwei = 4 THEN azwei = 0
IF azwei = 0 THEN
schrittweite2x = -5 'player 2: fr breite
schrittweite2y = 0 'player 2: fr h”he
END IF
IF azwei = 1 THEN
schrittweite2x = 0
schrittweite2y = -5
END IF
IF azwei = 2 THEN
schrittweite2x = 5
schrittweite2y = 0
END IF
IF azwei = 3 THEN
schrittweite2x = 0
schrittweite2y = 5
END IF
zweix = zweix + schrittweite2x
zweiy = zweiy + schrittweite2y
CIRCLE (zweix, zweiy), 5, 7 'schlange spieler 2
PAINT (zweix, zweiy), 7
Zeit = 0.005
t = TIMER
DO WHILE NOT t + Zeit <= TIMER: LOOP
LOOP _________________ Wenn jeder jeden bescheißt sind alle glücklich |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|