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:

Bmp soll sich bewegen

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



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 27.12.2008, 12:09    Titel: Bmp soll sich bewegen Antworten mit Zitat

Hi - ich habe mir gedacht ein neues thead zu erstellen , weil das andere zu lang wurde lächeln

ich habe mir mal die mühe gemacht und alles zusamgebastelt

nimmt irgent eine 256bit datei und nennt sie BILD.BMP

hier das test spiel

Code:


DECLARE SUB LadeBild (dn$, f%(), ind%)
DECLARE SUB LadePalette (dn$, p&(), ind%, mo%)

CONST PalVGA% = 2


DIM bild%(32001), bildpal&(255)

LadeBild "titel", bild%(), LBOUND(bild%)
LadePalette "titel", bildpal&(), LBOUND(bildpal&), PalVGA%


SCREEN 13
PALETTE USING bildpal&


DO

row = 20
column = 20


keyed$ = INKEY$

 IF keyed$ = "w" THEN row = row - 1
 IF keyed$ = "s" THEN row = row + 1
 IF keyed$ = "a" THEN column = column - 1
 IF keyed$ = "d" THEN column = column + 1
 
 
LOCATE row, column

PUT (column, row), bild%, PSET
 
LOOP UNTIL keyed$ = CHR$(27)



__________________________

achja die SUB`s:

Code:



SUB LadeBild (dn$, f%(), ind%)
  OPEN dn$ + ".BMP" FOR INPUT AS 1
  CLOSE 1
  OPEN dn$ + ".BMP" FOR BINARY AS 1
  k$ = INPUT$(2, 1)
  IF k$ <> "BM" THEN
    PRINT "Kein gltiges Windows Bitmap Bild!"
    ERROR 5
  END IF
  SEEK 1, 11&
  basOf& = CVL(INPUT$(4, 1)) + 1&  ' ab hier beginnen die Nutzdaten
  SEEK 1, 19&
  xb& = CVL(INPUT$(4, 1))  ' Bildgr”sse
  yb& = CVL(INPUT$(4, 1))
  anzBpl% = CVI(INPUT$(2, 1))
  IF anzBpl% <> 1 THEN
    PRINT "Bildformat einer knftigen Windowsversion"
    ERROR 5
  END IF
  bpp% = CVI(INPUT$(2, 1))
  komp& = CVL(INPUT$(4, 1))
  IF komp& <> 0& THEN
    PRINT "Komprimierung nicht untersttzt"
    ERROR 5
  END IF
  ' Start der Verarbeitung
  br& = (xb& * CLNG(bpp%) + 31& AND -32&) \ 8&
  IF bpp% = 8 THEN
    f%(ind%) = 8 * CINT(xb&)
  ELSE
    f%(ind%) = CINT(xb&)
  END IF
  f%(ind% + 1) = CINT(yb&)
  ind% = ind% + 2
  SELECT CASE bpp%
  CASE 1, 8
    IF bpp% = 1 THEN
      b% = CINT((xb& + 7&) \ 8&)
    ELSE
      b% = CINT(xb&)
    END IF
    Pu$ = ""
    FOR y& = basOf& + br& * (yb& - 1&) TO basOf& STEP -br&
      SEEK 1, y&
      FOR x% = 1 TO b%
        Pu$ = Pu$ + INPUT$(1, 1)
        IF LEN(Pu$) = 2 THEN
          f%(ind%) = CVI(Pu$)
          ind% = ind% + 1
          Pu$ = ""
        END IF
      NEXT x%
    NEXT y&
    IF Pu$ <> "" THEN
      f%(ind%) = CVI(Pu$ + " ")
      ind% = ind% + 1
    END IF
  CASE 4
    DIM h%(3)
    FOR i% = 0 TO 3
      h%(i%) = 0
    NEXT i%
    b% = CINT(br&) \ 4
    pu1$ = SPACE$(4 * b%)
    FOR y& = basOf& + br& * (yb& - 1&) TO basOf& STEP -br&
      SEEK 1, y&
      FOR x1% = 1 TO b%
        FOR x2% = 1 TO 4
          z% = ASC(INPUT$(1, 1))
          FOR x3% = 0 TO 3
            h%(x3%) = 4 * h%(x3%) + (z% AND 1) + (z% AND 16) \ 8
            z% = z% \ 2
          NEXT x3%
        NEXT x2%
        FOR i% = 0 TO 3
          MID$(pu1$, x1% + b% * i%) = CHR$(h%(i%))
          h%(i%) = 0
        NEXT i%
      NEXT x1%
      FOR i% = 1 TO LEN(pu1$) STEP 2
        f%(ind%) = CVI(MID$(pu1$, i%, 2))
        ind% = ind% + 1
      NEXT i%
    NEXT y&
  CASE 24
    PRINT "Echtfarb (True Color) nicht m”glich"
    ERROR 5
  CASE ELSE
    PRINT "Unbekannte Bildtiefe"
    ERROR 5
  END SELECT
  CLOSE 1
END SUB

SUB LadePalette (dn$, p&(), ind%, mo%)
  OPEN dn$ + ".BMP" FOR INPUT AS 1
  CLOSE 1
  OPEN dn$ + ".BMP" FOR BINARY AS 1
  k$ = INPUT$(2, 1)
  IF k$ <> "BM" THEN
    PRINT "Kein gltiges Windows Bitmap Bild!"
    ERROR 5
  END IF
  SEEK 1, 15&
  palOf& = CVL(INPUT$(4, 1)) + 15&   ' ab hier beginnen die Farbeintr„ge
  SEEK 1, 27&
  anzBpl% = CVI(INPUT$(2, 1))
  IF anzBpl% <> 1 THEN
    PRINT "Bildformat einer knftigen Windowsversion"
    ERROR 5
  END IF
  bpp% = CVI(INPUT$(2, 1))
  IF bpp% > 12 THEN
    PRINT "Echtfarb verwendet keine Farbpalette"
    ERROR 5
  END IF
  ' Start der Verarbeitung
  aF% = 1
  FOR i% = 1 TO bpp%
    aF% = aF% * 2
  NEXT i%
  IF mo% = PalVlf% THEN
    ' verlustfreier Spezialmodus, der keinem SCREEN geh”rt
    ' liest gesamter RGBQUAD ein
    SEEK 1, palOf&
    FOR i% = 1 TO aF&
      p&(ind%) = CVL(INPUT$(4, 1))
      ind% = ind% + 1
    NEXT i%
  ELSE
    FOR i% = 1 TO aF%
      SEEK 1, palOf&
      b% = ASC(INPUT$(1, 1))
      g% = ASC(INPUT$(1, 1))
      r% = ASC(INPUT$(1, 1))
      SELECT CASE mo%
      CASE PalCGA%  ' CGA-Palette von SCREEN 1/2/7/8
        Cga% = (r% AND 128) \ 32 + (g% AND 128) \ 64 + (b% AND 128) \ 128
        ' Selektion, ob hellerer oder dnklerer Farbton darstellen
        h% = (r% AND 127) + (g% AND 127) + (b% AND 127) - 192
        p&(ind%) = CLNG(Cga% - 8 * (h% > 0))
        IF p&(ind%) = 4 AND g% > 80 THEN
          p&(ind%) = 6   ' Spezialfall Orange
        END IF
      CASE PalEGA%  ' EGA-Palette von SCREEN 0/9
        p&(ind%) = CLNG((r% AND 64) \ 2 + (r% AND 128) \ 32 + (g% AND 64) \ 4 + (g% AND 128) \ 64 + (b% AND 64) \ 8 + (b% AND 128) \ 128)
      CASE PalVGA%  ' VGA-Palette von SCREEN 11/12/13
        p&(ind%) = CLNG(r% AND 252) \ 4& + CLNG(g% AND 252) * 64& + CLNG(b% AND 252) * 16384&
      CASE ELSE
        ERROR 5
      END SELECT
      palOf& = palOf& + 4&
      ind% = ind% + 1
    NEXT i%
  END IF
  CLOSE 1
END SUB



die lade_bild und lade_palette wie die bmp anzeige entnahm ich aus "ALDIS SCHIFF_S"

http://www.dreael.ch/Deutsch/Download/Kisten-Schiffspiel.html


wieso bewegt sich mein BMP NICHT ???

wenn dann nur 1 pixel in die jeweilige richtung und dannach springt es wieder zürck
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 27.12.2008, 12:20    Titel: Antworten mit Zitat

Bildpositionen gibt man anders an als Textpositionen. Textzeichen hast du im Screen 13, glaub ich 25x40. Pixel hingegen 320x200.

Lass also das LOCATE weg, vertausche row und col. Denn bei Pixelpositionen wird zuerst der x-wert (die horizontale achse) angegeben und dann der y wert.
Code:
 IF keyed$ = "w" THEN y = y - 1
 IF keyed$ = "s" THEN y = y + 1
 IF keyed$ = "a" THEN x = x - 1
 IF keyed$ = "d" THEN x = x + 1
 
LOCATE 1, 1: PRINT x, y

PUT (x, y), bild%, PSET


Ich merke gerade, das war nur die halbe Wahrheit. In Deiner Schleife setzt du row und col immer wieder auf einen bestimmten Wert! Kein Wunder, dass das Bild immer zurückspringt.

Trotzdem würde ich mir angewöhnen, für Pixelangaben immer Variablen zu nehmen, die ein x und ein y im Namen haben.
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick-Ratz



Anmeldungsdatum: 22.12.2008
Beiträge: 34

BeitragVerfasst am: 27.12.2008, 15:32    Titel: Antworten mit Zitat

jo ich habs gemerkt zwinkern

ich hab locate weggelassen und das so gemachet:

Code:

x = column
y = row

....

put (x,y), bild%, pset



danke nochmals mit den variabel tipp zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
isiprimax



Anmeldungsdatum: 02.01.2009
Beiträge: 77

BeitragVerfasst am: 17.02.2009, 00:04    Titel: Antworten mit Zitat

Der eigentliche Fehler liegt aber hier...

Code:
DO

row = 20
column = 20


keyed$ = INKEY$


Du setz dein bild immer wieder auf 20x20.
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 QBasic. 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