 |
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 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 25.04.2010, 15:33 Titel: Free Basic Put bewegen ? |
|
|
Hallo - ich habe mir heute in Youtube Qbasic Sachen angeschaut und bin dann auf den FBIDE gestoßen - ein hammer Compieler, weil er Sachen im FENSTER ausführt und nicht in der Konsole. Also: runtergeladen
dannach habe ich mir mal einpaar sachen in FB angeschaut und bin mehr als begeistert von der Sprache, weil sie fast wie qbasic ist nur viel mehr function hat ...
dannach habe ich eine sehr intressante Endeckung gemacht:
ich ging auf Hilfe und gab aus spass "wav" ein und folgender code wurde mir gezeigt:
Code: |
SCREEN 18, 32
CLS
BLOAD "picture.bmp"
SCREEN 18, 32
DIM garray(4 * (48 * 48) + 4) AS BYTE
BLOAD "picture.bmp", @garray(0)
PUT (100,200),garray(0)
Sleep 1000
|
ich bin mehr als erstaunt gewesen , als ich den code ausführte
nun meine frage:
wie kann ich denn jetzt das BMP bewegen ??? ...
ich habe mir mal folgende gedanken gemacht:
Code: |
IF pfeiltaste hoch THAN
PUT = x+1
gehe zu 1
END IF
... oder so
|
dannach hab ich es in FB/QB umgeschrieben
Code: |
cls
SCREEN 18, 32
CLS
BLOAD "picture.bmp"
SCREEN 18, 32
DIM garray(4 * (48 * 48) + 4) AS BYTE
BLOAD "picture.bmp", @garray(0)
x = 20
y = 20
1
cls
PUT (x,y),garray(0)
DO:
taste$ = INKEY$:
LOOP WHILE taste$ = ""
IF taste$ = CHR$(0) + CHR$(80) THEN
x = x + 1
GOTO 1
END IF
|
------------------------------------------------------------------
DO
A$ = INKEY$
IF A$ = CHR$(0) + CHR$(72) THEN PRINT "You pressed up!"
IF A$ = CHR$(0) + CHR$(80) THEN PRINT "You pressed down!"
IF A$ = CHR$(0) + CHR$(75) THEN PRINT "You pressed left!"
IF A$ = CHR$(0) + CHR$(77) THEN PRINT "You pressed right!"
IF A$ = CHR$(27) THEN END
LOOP
---------------------------------------------------------------------
programm geht nur aus
need help |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 25.04.2010, 16:27 Titel: |
|
|
FBIDE ist kein Compiler.
Bewegen kannst du dein Bild ungefährt so:
Code: | SCREEN 18, 32
CLS
BLOAD "picture.bmp"
SCREEN 18, 32
DIM garray(4 * (48 * 48) + 4) AS BYTE
BLOAD "picture.bmp", @garray(0)
dim as integer x = 100,y = 200
dim taste as string
do
taste = InKey
screenlock
cls
PUT (x,y),garray(0)
screenunlock
If taste = Chr(255, 72) Then y -= 5
If taste = Chr(255, 75) Then x -= 5
If taste = Chr(255, 77) Then x += 5
If taste = Chr(255, 80) Then y += 5
loop
Sleep 1000 |
Zuletzt bearbeitet von Stueber am 25.04.2010, 16:28, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 25.04.2010, 16:28 Titel: |
|
|
Hi,
FBIDE ist kein Compiler, es ist eine IDE, also quasi ein Editor. Der Compiler ist der fbc (FreeBASIC Compiler).
Auch QB konnte in Fenstern arbeiten, die Konsole entspricht halt einfach nur Screen 0. FB hat da aber natürlich trotzdem Vorteile.
Jetzt zur eigentlichen Frage.
Code: | Dim As Any Ptr bild
Dim As Integer breite, hoehe, x, y
Dim As String eingabe
Screen 18, 32
breite = 25
hoehe = 25
bild = ImageCreate(breite, hoehe) 'erstellt einen Speicherbereich für das Bild
BLoad "picture.bmp", bild
Put(x, y), bild
Do
eingabe = InKey
If eingabe <> "" Then
Select Case eingabe
Case Chr(255, 72)
y -= 1 'entspricht y = y - 1
Case Chr(255, 80)
y += 1
Case Chr(255, 75)
x -= 1
Case Chr(255, 77)
x += 1
Case Chr(27)
ImageDestroy(bild) 'den speicher wieder freigeben - nicht vergessen!
End
End Select
ScreenLock 'vermeidet flackern
Cls
Put(x, y), bild
ScreenUnLock
EndIf
Sleep 1 'Prozessorauslastung für die Schleife senken
Loop
|
Der Code zeigt, wie ein Bild in einen Speicher geladen wird, der vorher für das Image erstellt wurde (die Technik "DIM garray(4 * (48 * 4 + 4) AS BYTE" sollte nicht mehr verwendet werden) und dann angezeigt und bewegt wird.
Das Bild ist in dem Fall 25x25 Pixel groß, das kannst du aber anpassen.
Desweiten solltest du auf "Goto" komplett verzichten und vergessen, dass du mal wusstest was das ist
Man beachte auch, dass der Speicher für ein Bild auch immer zerstört werden sollte, wenn man ihn nicht mehr benötigt (ImageDestroy). |
|
Nach oben |
|
 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 26.04.2010, 18:32 Titel: |
|
|
vielen dank - vorallem mit den speicher reinigen das gefällt mir
andere frage :
kann man denn dann jetzt auch , wenn ich ein 2tes "sprite" erstelle
eine kollision erzeugen indem ich das so:
Code: |
IF (x_block = x_bmp_point and y_block = y_bmp_point ) THEN PRINT "Collision"
|
mache ?
// x,y_block = player_sprite
// x,y_bmp_point = anderes BMP
oder geht das auch wieder anders ? |
|
Nach oben |
|
 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 26.04.2010, 18:40 Titel: |
|
|
sorry für doppel post aber ich hab den code jetzt mal so gemacht:
Code: |
DIM AS ANY PTR bild
DIM AS ANY PTR bild2
DIM AS INTEGER breite, hoehe, x, y
DIM AS STRING eingabe
SCREEN 18, 32
breite = 25
hoehe = 25
bild = IMAGECREATE(breite, hoehe) 'erstellt einen Speicherbereich für das Bild
bild2 = IMAGECREATE(breite, hoehe) 'erstellt einen Speicherbereich für das Bild
BLOAD "picture.bmp", bild
BLOAD "picture2.bmp", bild2
x2 = 100
y2 = 100
PUT(x, y), bild
PUT(x2, y2), bild2
DO
eingabe = INKEY
IF eingabe <> "" THEN
SELECT CASE eingabe
CASE CHR(255, 72)
y -= 4
CASE CHR(255, 80)
y += 4
CASE CHR(255, 75)
x -= 4
CASE CHR(255, 77)
x += 4
CASE CHR(27)
IMAGEDESTROY(bild) 'den speicher wieder freigeben - nicht vergessen!
END
END SELECT
SCREENLOCK 'vermeidet flackern
CLS
PUT(x, y), bild
PUT(x2, y2), bild2
SCREENUNLOCK
ENDIF
SLEEP 1 'Prozessorauslastung für die Schleife senken
LOOP
|
einfach mal ganz easy bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 26.04.2010, 18:42 Titel: |
|
|
Ich würde für beide Sprites den Mittelpunkt (x1/y1) bzw. (x2/y2) bestimmen, und wenn sich beide Mittelpunkte zu Nahe kommen, dann gibt es eine Kollision.
Code: | AbstandImQuadrat = (x2 - x1)^2 + (y2 - y1)^2 |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 26.04.2010, 19:08 Titel: |
|
|
hä wie realisire ich das jetzt ??
das ganze soll für ein kleines test game sein , weil ich noch mit Free Basic rum experimentieren will -QB ist für mich etwas veraltet und umständlich für spiele, desswegen der ganz aufwand hier im forum
PS: bitte nicht sauer sein wenn ich hier soviele "ASSI-Fragen" stelle |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 26.04.2010, 19:15 Titel: |
|
|
Sprites sind Rechtecke, also ist der Mittelpunkt bei (x1+((x2-x1)/2) | y1+((y2-y1)/2)), wobei x1 und y1 die linke obere Ecke darstellen und x2 und y2 die rechte untere. Wenn du diese Rechnung auf beide Sprites anwendest erhältst du die beiden Mittelpunkte. Über den Satz des Pythagoras kannst du die entfernung zwischen beiden ausrechnen. Wurzel( (x1-x2)^2 + (y1-y2)^2). x1 und y1 bilden hier den Mittelpunkt des einen Sprites, x2 und y2 des anderen. Wenn das Ergebniss dieser Rechnung kleiner ist als ein bestimmter Wert den du festlegst kannst du von einer kollision ausgehen, zumindest bei Rechtecken klappt das gut. |
|
Nach oben |
|
 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 26.04.2010, 19:34 Titel: |
|
|
ALLES KLA ! - HAT FUNCIONIERT
hab folgendermassen abgefragt:
if X1 = X2 and Y1 = Y2 THEN print "Collsion"
danke für alles ,
dessweitern werde ich jetzt versuchen ne maske SPRITE maske zu erstellen habs immerhin hinbekommen, dass aus weissen hintergrund die farben dess sprites normal sind aber wenn ich den
hintergrund: BLAUE BERGE (windows xp / eigende bilder) einfüge
dann mukt die graffik noch aber dass werde ich versuchen selber zu beheben danke fürs 1. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 26.04.2010, 22:49 Titel: |
|
|
Zitat: | Mittelpunkt bei (x1+((x2-x1)/2) | y1+((y2-y1)/2)) |
oder kurz ((x1+x2)/2) | (y1+y2)/2) (arithmetisches Mittel)
Zitat: | if X1 = X2 and Y1 = Y2 THEN print "Collsion" |
kannst du natürlich machen, aber die meisten Objekte sind größer als ein Pixel und sollten vermutlich auch schon früher kollidieren. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
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.
|
|