 |
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: 27.12.2008, 12:09 Titel: Bmp soll sich bewegen |
|
|
Hi - ich habe mir gedacht ein neues thead zu erstellen , weil das andere zu lang wurde
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 |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 27.12.2008, 12:20 Titel: |
|
|
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 |
|
 |
Patrick-Ratz
Anmeldungsdatum: 22.12.2008 Beiträge: 34
|
Verfasst am: 27.12.2008, 15:32 Titel: |
|
|
jo ich habs gemerkt
ich hab locate weggelassen und das so gemachet:
Code: |
x = column
y = row
....
put (x,y), bild%, pset
|
danke nochmals mit den variabel tipp  |
|
Nach oben |
|
 |
isiprimax
Anmeldungsdatum: 02.01.2009 Beiträge: 77
|
Verfasst am: 17.02.2009, 00:04 Titel: |
|
|
Der eigentliche Fehler liegt aber hier...
Code: | DO
row = 20
column = 20
keyed$ = INKEY$ |
Du setz dein bild immer wieder auf 20x20. |
|
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.
|
|