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:

Hänge bei kleinem get/put-problem (grafik) (gelöst)

 
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
mkfezzo



Anmeldungsdatum: 16.08.2007
Beiträge: 25

BeitragVerfasst am: 25.03.2010, 20:43    Titel: Hänge bei kleinem get/put-problem (grafik) (gelöst) Antworten mit Zitat

Hallo zusammen,

ich hänge bei einem projekt etwas fest: ich versuche per get und put einen "sprite" zu bewegen und habe erstmal ne kleine bewegungsroutine rausgehauen. läuft auch ganz ok, bis ich nun hintergrund einfüge. ich hänge den code mal an den text an. ich habe die sprites durch einen block ersetzt, um die grafikdateien nicht gleich mithochzuladen. diesen block kann man per mausklick links auf die gewünschte position verschieben. darunter liegt ein kreis (hitergrund). verschiebt mal den block ein stück nach links und dann anschliessend wieder zum rechten rand, dann seht ihr was ich meine - der hintergrund läuft mit...passiert aber nicht bei anderen verschiebungen. das rechteck um den block zeigt die maske, die ich immer vor der verschiebung wieder put-te. müsste eigentlich reichen-tuts aber nicht! irgendwer ne idee?

Code:

dim shared e(20,168*169) as integer
dim as integer t,x,y,r,mx,my,mr,ms,raus,mov
dim as string txt,a

screen 19,32,,
cls
for t=1 to 8
'txt="D:\Program Files\FreeBASIC\progs\neu\e"+str(t)+".bmp"
'bload txt
line(10,10)-(158,159),rgb(255,255,255),bf
get(1,1)-(166,167),e(t,0)
next t
'put(100,100),e(5,0),trans

cls
circle(200,200),50,rgb(100,100,100),,,,f

x=100:y=100:r=3:raus=0
get(x,y)-(x+168,y+167),e(9,0)
line(x,y)-(x+168,y+167),rgb(200,200,200),b

put(x,y),e(r,0),trans

do
    a=inkey
    getmouse mx,my,mr,ms
    'locate 1,1:?mx,my,ms
    if ms=1 then
            mx=mx-166/2
            my=my-166/2
            raus=0
        if mx>=x and my>=y and raus=0 then
            do
                if r<4 then r=r+1
                if r>4 then r=r-1
                put(x,y),e(9,0),pset
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync:sleep 50
            loop until r=4
           
            do
                put(x,y),e(9,0),pset
                mov=0
                if x<mx then x=x+1:r=3:mov=1
                if y<my then y=y+1:r=5:mov=1
                if x<mx and y<my then r=4:mov=1
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync
                raus=1
            loop until mov=0
        end if
        if mx>=x and my<=y and raus=0 then
            do
                if r<2 then r=r+1
                if r>2 then r=r-1
                put(x,y),e(9,0),pset
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync:sleep 50
            loop until r=2
            do
                put(x,y),e(9,0),pset
                mov=0
                if x<mx then x=x+1:r=3:mov=1
                if y>my then y=y-1:r=1:mov=1
                if x<mx and y>my then r=2:mov=1
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync
                raus=1
            loop until mov=0
        end if
        if mx<=x and my<=y and raus=0 then
            do
                if r<8 then r=r+1
                if r>8 then r=r-1
                put(x,y),e(9,0),pset
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync:sleep 50
            loop until r=8
            do
                put(x,y),e(9,0),pset
                mov=0
                if x>mx then x=x-1:r=7:mov=1
                if y>my then y=y-1:r=1:mov=1
                if x>mx and y>my then r=8:mov=1
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync
                raus=1
            loop until mov=0
        end if
        if mx<x and my>y and raus=0 then
            do
                if r<6 then r=r+1
                if r>6 then r=r-1
                put(x,y),e(9,0),pset
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync:sleep 50
            loop until r=6
            do
                put(x,y),e(9,0),pset
                mov=0
                if x>mx then x=x-1:r=7:mov=1
                if y<my then y=y+1:r=5:mov=1
                if x>mx and y<my then r=6:mov=1
                get(x,y)-(x+168,y+167),e(9,0)
                put(x,y),e(r,0),trans
                line(x,y)-(x+168,y+167),rgb(200,200,200),b
                screensync
                raus=1
            loop until mov=0
        end if
    end if
    sleep 1
loop until a=chr(27)


Zuletzt bearbeitet von mkfezzo am 25.03.2010, 21:33, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 25.03.2010, 21:06    Titel: Antworten mit Zitat

Ich nehme mal an, der Fehler passiert, wenn sich der Block teilweise außerhalb des Fensters befindet? Ich frage deshalb, weil da bei mir das Programm abstürzt; es möchte außerhalb des Grafikfensters lesen. Ich könnte mir vorstellen, dass bei dir der gelesene Buffer angepasst wird und damit der falsche Bildschirmbereich gelesen wird. Ist aber nur eine Vermutung.

Als Lösungsvorschlag: Lies nicht den gesamten Bereich ein, sondern nur den, der sich im Grafikfenster befindet. Muss man ein bisschen tüfteln, lässt sich aber bewerkstelligen, wie ich von meinem patfinder weiß. happy
_________________
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
mkfezzo



Anmeldungsdatum: 16.08.2007
Beiträge: 25

BeitragVerfasst am: 25.03.2010, 21:27    Titel: Antworten mit Zitat

Jep! - ist ja witzig. ich habe den kreis weiter in die mitte gelegt ...und bin nochmals aus allen richtungen mit dem block darübergeschwebt: no problem! passiert also echt nur, wenn ich aus dem fenster rutsche. Das ist doch mal wenigstens ein ansatz...dachte schon ich krieg die kurve mal wieder nicht. THX...wär ich sooo schnell nicht drauf gekommen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

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

Moin!
Ich hab mal sowas ähnliches programmiert. Probier das doch mal aus:

Code:
dim shared g1(90000) as string
dim shared h(90000) as string

dim as integer x,y,i,i2
screen 20,32,3
screenset 1, 0

randomize timer
dim as integer r, g, b,ri, ab
ab =0
ri = 3

r = 100
g = 10
b = 10
for y = 16 to 0 step-1
 circle (16, 16), y, RGB(r,g,b),,,,F
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for y = 16 to 0 step-1
 circle (16, 216), y, RGB(r,g,b),,,,F
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for y = 16 to 0 step-1
 circle (216, 16), y, RGB(r,g,b),,,,F
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for y = 16 to 0 step-1
 circle (216, 216), y, RGB(r,g,b),,,,F
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for y = 0 to 16
 line (16, y)-(216, y), rgb(r, g, b)
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for y = 232 to 216 step-1
 line (16, y)-(216, y), rgb(r, g, b)
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next y

r = 100
g = 10
b = 10
for x = 0 to 16
 line (x, 16)-(x, 216), rgb(r, g, b)
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next x

r = 100
g = 10
b = 10
for x = 232 to 216 step-1
 line (x, 16)-(x-ab, 216), rgb(r, g, b)
 r = r + 20
 if r > 255 then
  b = b + ri
  g = g + ri
  r = 255
 end if
next x
line (17,17)-(215, 215),RGB(r,g,b),BF



'line (0,0)-(220,220),rgb(100,0,0),bf
get (0,0)-(232,232),h

cls
dim as integer t, c,c2,c3,an,ps,pz
for t = 1 to 50
an = rnd*255
c = rnd*(255-an)
c2 = rnd*(255-an)
c3 = rnd*(255-an)
ps = rnd*1024
pz = rnd*768
for i = an to 0 step-1
circle (ps, pz), i,RGB(c,c2,c3),,,,F
c = c+1
c2 = c2+1
c3 = c3+1
next
next
pcopy 1, 0
sleep
i = 1
i2 = 1
x = 256
y = 192
setmouse ,,0,1
do
getmouse x,y
if x > 823 then setmouse 823,y,0,1
if y > 567 then setmouse x,567,0,1

screenset 1, 0
get (x,y)-(x+200,y+200),g1
screenset 0, 2
cls
put (x-16,y-16),h
line (x,y)-(x+200,y+200),rgb(0,0,0),bf
line (x-1,y-1)-(x+201,y+201),rgb(100,0,0),b
put (x,y),g1


pcopy 0, 2

loop until inkey$ =CHR(27)
end


Ist nicht ganz sooo schön, aber es funzt. grinsen
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mkfezzo



Anmeldungsdatum: 16.08.2007
Beiträge: 25

BeitragVerfasst am: 29.03.2010, 20:21    Titel: Antworten mit Zitat

Hi Luke, naja nicht ganz so schöööön? sieht super aus und ist ganz schön weich beim scrollen...aaaaaber: geh mal mit deinem Rechteck an den rechten rand oder an den unteren...wenn mich nicht alles täuscht "flackert" da genau das selbe prob wie bei meinem Beispiel. bin übrigens erstmal ne ecke weiter - nur schränkt mich das "überdenranddarfstenichtgettenundputten" echt noch ein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 29.03.2010, 21:20    Titel: Antworten mit Zitat

Ich habe mir dazu was erarbeitet, was problemlos funktioniert, aber das ist so programmspezifisch, dass ich erst mal sehen muss, ob ich das wieder extrahieren kann ... happy
_________________
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
nemored



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

BeitragVerfasst am: 31.03.2010, 11:55    Titel: Antworten mit Zitat

Du kannst das hier mal probieren; ohne Gewähr (der kurze Test sah ganz gut aus):
Code:
type koord
  as integer startx, starty, endx, endy
end type
declare function berechne(x as integer, y as integer) as koord
screenres 400, 400
dim as integer mx, my, ax, ay
dim as any ptr bild = imagecreate(50, 50, 1), temp
dim as koord box
circle (199, 199), 190, 4,,,, f

do
  getmouse mx, my
  sleep 1
loop until mx >= 0 and mx < 400
box = berechne(mx, my)
temp = imagecreate(box.endx-box.startx+1, box.endy-box.starty+1)
get (box.startx, box.starty)-(box.endx, box.endy), temp
put (box.startx, box.starty), bild, (25+box.startx-mx, 25+box.starty-my)-(25+box.endx-mx, 25+box.endy-my), pset
ax = mx
ay = my

do
  getmouse mx, my
  if mx >= 0 and mx < 400 then
    put (box.startx, box.starty), temp, pset
    imagedestroy temp
    box = berechne(mx, my)
    temp = imagecreate(box.endx-box.startx+1, box.endy-box.starty+1)
    get (box.startx, box.starty)-(box.endx, box.endy), temp
    put (box.startx, box.starty), bild, (25+box.startx-mx, 25+box.starty-my)-(25+box.endx-mx, 25+box.endy-my), pset
    ax = mx
    ay = my
  end if
  sleep 1
loop until inkey <> ""
imagedestroy temp

imagedestroy bild

function berechne(x as integer, y as integer) as koord
  dim ret as koord
  ret.startx = iif(x < 25, 0, x - 25)
  ret.starty = iif(y < 25, 0, y - 25)
  ret.endx = iif(x > 374, 399, x + 24)
  ret.endy = iif(y > 374, 399, y + 24)
  return ret
end function

_________________
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