Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Free Basic Put bewegen ?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 25.04.2010, 15:33    Titel: Free Basic Put bewegen ? Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 25.04.2010, 16:27    Titel: Antworten mit Zitat

FBIDE ist kein Compiler. lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 25.04.2010, 16:28    Titel: Antworten mit Zitat

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 * 4cool + 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 Zunge rausstrecken

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 26.04.2010, 18:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 26.04.2010, 18:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 26.04.2010, 18:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 26.04.2010, 19:08    Titel: Antworten mit Zitat

verlegen 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 happy -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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 26.04.2010, 19:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 26.04.2010, 19:34    Titel: Antworten mit Zitat

ALLES KLA ! - HAT FUNCIONIERT zwinkern

hab folgendermassen abgefragt:

if X1 = X2 and Y1 = Y2 THEN print "Collsion"



durchgeknallt 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 zwinkern danke fürs 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 26.04.2010, 22:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz