Avatar billede lisa99 Nybegynder
23. maj 2005 - 07:41 Der er 19 kommentarer og
1 løsning

Animer en cirkel i qbasic

Hej
Jeg har nogle problemmer med at animere en cirkel i qbasic
Jeg ville gerne have lavet den om så cirklen bevæget sig randome
men kan ikke helt finde ud af hvordan jeg skal gører det?
Og hvordan jeg for den til at forblive en cirkel?
kunne godt tænke mig det var mere som en gamle windows screensaver den med windows logo eller stjerner.


her er det script jeg har fået lavet ind til vidre:
CLS
SCREEN 0            'Text mode only.
'Foreground = 1 (blue), background = 2 (green), border = 3 (cyan).
'EGA and VGA boards do not support the border argument.
COLOR 1, 2, 3
CLS
LOCATE 12, 25: PRINT "Velkommen til Cirklen"
LOCATE 50, 25: PRINT "Press any key to continue..."
DO
LOOP WHILE INKEY$ = ""
SCREEN 1            'Set screen to 320 x 200 graphics.
'Background = 1 (blue), foreground = even palette number (red, green,
'yellow).
FOR x = 2 TO 350
CIRCLE (x, 50), 75
LOCATE 12, 7: PRINT "Press any key to continue..."
NEXT x
CLS
END
Avatar billede Hald Praktikant
23. maj 2005 - 08:24 #1
Nu har jeg ikke lige en QuickBasic afvikler her, men det jeg lige kan simulere i hovedet gør vel bare at den tegner en cirkel, og så skulle flytte den sidelæns, men at det ikke virker.

Jeg plejer dessuden at skrive:

Loop while inkey$ <>""

det betyder at den skal arbejde mens det der kommer ind på tasteturet er "forskellig fra ingenting"

du skal lave en CLS eller tegne oveni med baggrundsfarven hver gang den tager en omgang i loopet, ellers mudrer den bare oveni.

Så ser det også kun ud til at den bevæger sig til siden, altså fra venstre mod højre.

Jeg har desværre lige tage min QB45 bog med hjem igen, ellers har den ligget her på arbejdet.

du skal vel forresten også have et delay ind i loop'et ellers sker det jo så hurtigt at du ikke når at se det. Det kommer selvfølgelig an' på hvilken pc'er du sidder med, men det kan som regl gøres med en tæller:

FOR G = 1 TO 350: NEXT G

Jeg håber det kan bruges, jeg har ikke lige løsningen på dit random problem, men ved at der findes en masse Basic programmering på nettet, det er nemlig ikke så længe siden jeg skulle bruge det sidst til at programmere et stregkode-terminal-styresystem... ja fint lyder det.. og det er det skam også ;-)
Avatar billede Hald Praktikant
23. maj 2005 - 08:36 #2
hmm jeg har tænkt lidt over det, og jeg har muligvis en løsning inde i hovedet.. det er ik så slemt igen at lave, kan huske jeg lavede det da jeg var 12-13 år gammel.. hehe

du skal igang med nogle IF sætninger..

Først skal du have cirklen til at bevæge sig i den hastighed du gerne vil have den til, når først animationen virker, så kan vi lave styringen, det kan ikke lige blive random sår'n som jeg tænker det, men det kan bevæge sig rundt som den gjorde i den gamle windows screensaver.

Lad os sige at skærmen er 320 pixel bred, og cirklen er 75 pixel i omkreds, eller er det radius du arbejder med ??

det skal ihvertfald beregnes hvor langt ud cirklen kan komme før den går mod kanten, så hvis det er radius, så kan du ikke komme længere ud end de 320pix - 75 pix = 245

så dit:

FOR X = 2 TO 350

skal så hedde:

FOR X = 2 TO 245

vi holder os lige til denne ene side lige nu.

så skal du have en IF sætning.

IF X = 245 THEN

så skal den vende systemet om..

Jeg gidder ik lige skrive koden nu, jeg er ret træt, og det med at huske gammel kode, og simulere det oppe i hovedet er ikke lige min bedste morgen præsentation.. beklager..

Men jeg vender måske tilbage med en fortsættelse.

Men ideen er ihvertfald at du skal have sat en parameter hver gang X rammer 2 eller 245, og så skal loop'et følge en if sætning der styres af den parameter.

og så skal det også bare laves med Y retningen, og så skal den skydes skævt igang.

Held og lykke.. og godt at se at Qbasic stadig lever!
Avatar billede Hald Praktikant
23. maj 2005 - 08:37 #3
ved ik om det er point værd....
Avatar billede lisa99 Nybegynder
23. maj 2005 - 09:07 #4
Jeg skal bruge noget mere konkret. Det er en skole opgave som består i at få en cirkel til at bevæge sig i qbasic som jeg jo faktisk har løst.
Men ville gerne have det var meget flotter og speciale så min lærer sagde wow.
Og da jeg fatter næsten igen ting af qbasic og lærer siger find selv ud af det, hvad gør man så spørg eksperten.
Avatar billede Hald Praktikant
23. maj 2005 - 11:23 #5
cheater!
Avatar billede Hald Praktikant
23. maj 2005 - 11:25 #6
lav en tæller på Y kordinatet også, og de skal så tælle baglæns når de når max grænsen, hvis begge tællere starter samtidig, så skulle det komme til at se ritigt ud.
Avatar billede lisa99 Nybegynder
23. maj 2005 - 11:53 #7
Jeg havde tænkt på at bruge en RANDOMIZE TIMER, men kan ikke helt finde ud af hvordan jeg skal lave koden. Så cirklen flytter sig vilkårligt rundt på skræmen. Men da jeg har bestået opgaven og er ved at lave rapport i datakommunikation og lave hardware firma har jeg ikke tid nok til at lave de små ændringer i scriptet så det kommer til at være pænt.
Avatar billede lisa99 Nybegynder
23. maj 2005 - 12:13 #8
Nu ser der sådan her ud.
CLS
SCREEN 0            'Text mode only.
'Foreground = 1 (blue), background = 2 (green), border = 3 (cyan).
'EGA and VGA boards do not support the border argument.
COLOR 1, 2, 3
CLS
LOCATE 12, 25: PRINT "Velkommen til Cirklen"
LOCATE 50, 25: PRINT "Press any key to continue..."
DO
LOOP WHILE INKEY$ = ""
CLS
SCREEN 1            'Set screen to 320 x 200 graphics.
'Background = 1 (blue), foreground = even palette number (red, green,
'yellow).
FOR x = 2 TO 245
IF x = 245 THEN GOTO h
IF x = 2 THEN GOTO a

IF x = 3 THEN GOTO b
IF x = 45 THEN GOTO c
c: CIRCLE (x, 150), 75
SLEEP 2
CLS

b: CIRCLE (x, 245), 75
SLEEP 2
CLS

a: CIRCLE (x, 45), 75
SLEEP 2
CLS

h: CIRCLE (x, 25), 75
SLEEP 2
CLS
FOR G = 1 TO 350: NEXT G
LOCATE 12, 7: PRINT "Press any key to continue..."
NEXT x
CLS
SCREEN 0          'Set screen to 320 x 200 graphics.
'Background = 1 (blue), foreground = even palette number (red, green,
'yellow).
COLOR 1, 0
LOCATE 12, 7: PRINT "Press any key to continue..."
DO
LOOP WHILE INKEY$ <> ""
CLS
END

Nu skal jeg faktisk bare have den til at gøre det afsig selv.
Lige nu skal man trykke på en knap før den bevæger sig
Avatar billede Hald Praktikant
24. maj 2005 - 08:44 #9
du kører med en QB45 compiler ik' ?

(jeg har lige testet din kode... det er da en go' start)
Avatar billede lisa99 Nybegynder
24. maj 2005 - 22:23 #10
det ved jeg ikke jeg bruger Qbasic 7.1, jeg har ingen erfaring med denne slags programering.
Avatar billede Hald Praktikant
25. maj 2005 - 08:59 #11
argh 7,1... den har jeg aldrig hørt om, er det freeware, for jeg burde nok teste din sourcecode på samme program.
Avatar billede Hald Praktikant
25. maj 2005 - 09:04 #12
jeg fandt den :-)

http://members.lycos.co.uk/qbasicturkey/download/qb71.htm

hvis jeg får tid, så prøver jeg nok at kode den lidt om...

skal cirklen være så stor?
Avatar billede Hald Praktikant
25. maj 2005 - 11:13 #13
SCREEN 0
COLOR 1, 2, 3
CLS
LOCATE 12, 25: PRINT "Velkommen til Cirklen"
LOCATE 25, 25: PRINT "Tryk p† en tast for at se den!..."
DO
LOOP WHILE INKEY$ = ""
CLS
SCREEN 7            'Set screen to 320 x 200 graphics.

FARVE = 1
VAND = 25
LOD = 25
SETVAND = 0
SETLOD = 0

DO

IF VAND < 25 THEN : SETVAND = 0
IF VAND > 295 THEN : SETVAND = 1
IF SETVAND = 0 THEN : VAND = VAND + 1:  ELSE VAND = VAND - 1

IF LOD < 25 THEN : SETLOD = 0
IF LOD > 175 THEN : SETLOD = 1
IF SETLOD = 0 THEN : LOD = LOD + 1:  ELSE LOD = LOD - 1

COLOR FARVE, 0
FARVE = FARVE + 1
IF FARVE = 16 THEN : FARVE = 1
CIRCLE (VAND, LOD), 25

FOR T = 1 TO 100000
NEXT T

CLS

LOOP UNTIL INKEY$ > ""
END
Avatar billede Hald Praktikant
25. maj 2005 - 11:36 #14
Her er en forbedret udgave, men her flimrer billedet ikke så meget, delay er også fjernet så nu er det computeren der bestemmer hvor hurtig den kan smide cirklen rundt på skærmen, jeg lavede det på en 1 GHz maskine med winXP.. og der gik det stadig langtsom..

Håber det kan bruges :-)

SCREEN 0
COLOR 1, 2, 3
CLS
LOCATE 12, 25: PRINT "Velkommen til Cirklen"
LOCATE 25, 25: PRINT "Tryk paa en tast for at se den!..."
DO
LOOP WHILE INKEY$ = ""
CLS
SCREEN 7            'Set screen to 320 x 200 graphics.

FARVE = 1
VAND = 25
LOD = 25
SETVAND = 0
SETLOD = 0

DO

IF VAND < 25 THEN : SETVAND = 0
IF VAND > 295 THEN : SETVAND = 1
IF SETVAND = 0 THEN : VAND = VAND + 1:  ELSE VAND = VAND - 1

IF LOD < 25 THEN : SETLOD = 0
IF LOD > 175 THEN : SETLOD = 1
IF SETLOD = 0 THEN : LOD = LOD + 1:  ELSE LOD = LOD - 1

COLOR FARVE, 0
FARVE = 10
CIRCLE (VAND, LOD), 25

COLOR 0, 0
CIRCLE (VAND, LOD), 25

LOOP UNTIL INKEY$ > ""
END
Avatar billede Hald Praktikant
25. maj 2005 - 11:38 #15
Min far testede det lige på hans maskine, og øhh.. han så omkring 15 bolde flyve rundt på skærmen, og det var på en 2,4 GHz, såå.. du skal nok have lavet et delay igen ;-)

FOR T = 1 TO 100000
NEXT T

Så kan du justere det store tal for at ændre hastigheden, jo større jo langtsommere går det.
Avatar billede Hald Praktikant
25. maj 2005 - 11:51 #16
Min far fandt dette eksempel til mig, kan jo være det er lidt for fancy til at din lærer tror på at du har lavet det.. men du skal da lige ha' det

Det er fundet på http://www.qbasicnews.com/tutorials.php?action=view&id=8

DIM picture(1000), sprite(1000), spritesh(1000)

SCREEN 13
CIRCLE (10, 10), 10, 4
PAINT (10, 10), 1, 4
CIRCLE (10, 10), 4, 4
PAINT (10, 10), 0, 4
GET (0, 0)-(20, 20), sprite
LINE (0, 0)-(20, 20), 255, BF
CIRCLE (10, 10), 10, 4
PAINT (10, 10), 1, 4
CIRCLE (10, 10), 4, 4
PAINT (10, 10), 255, 4

GET (0, 0)-(20, 20), spritesh
CLS
FOR i = 1 TO 500
LINE ((RND * 320), (RND * 200))-((RND * 320), (RND * 200)), (RND * 255)
NEXT

x = 1: y = 1          'Sprite X and Y coords
xadj = 1: yadj = 1    'Moves the ball
delay = 10000          'Adjust this for speed...

GET (x, y)-(x + 20, y + 20), picture  'Get the background

DO                'Start loop
press$ = INKEY$  'get ready for key presses...

PUT (x, y), spritesh, AND  ' put the sprite down
PUT (x, y), sprite, OR

oldx = x          'Record old position
oldy = y

x = x + xadj      'Move the ball
y = y + yadj

WAIT &H3DA, 8      'This just keeps things clean, don't worry about

it...

PUT (oldx, oldy), picture, PSET  'Put the old background down...

GET (x, y)-(x + 20, y + 20), picture  'Get The new background

'PUT (x, y), sprite, PSET        'Finally, put the sprite down...

PUT (x, y), spritesh, AND  ' put the sprite down
PUT (x, y), sprite, OR



IF y > 170 THEN yadj = -1      'This is if it hits the walls...
IF y < 10 THEN yadj = 1
IF x > 290 THEN xadj = -1
IF x < 10 THEN xadj = 1

FOR i = 1 TO delay: NEXT      'This adds a delay, If its to fast or

slow...

LOOP UNTIL press$ = CHR$(27)  'Loop until Escape is pressed...
Avatar billede Hald Praktikant
25. maj 2005 - 11:58 #17
De har forresten en del fede tutorials med noget kickass grafik i...



DIM c!(360), s!(360)

'Now dim the array for Eight points...
'Remember, a cube has Eight Points in it...

DIM x(8), y(8), Z(8), x2(8), y2(8), Z2(8), x3(8), y3(8)



FOR i = 1 TO 360
c!(i) = COS(i * 3.14 / 180): s!(i) = SIN(i * 3.14 / 180)
NEXT
FOR i = 1 TO 8: READ x(i): READ y(i): READ Z(i): NEXT

phi = 1: theta = 1
xcenter = 150: ycenter = 100: zcenter = 256

delay = 10000  'You know what this is for...  change for speed

SCREEN 7, 0, 1, 0

DO
press$ = INKEY$


CLS
FOR i = 1 TO 8      'This makes you do this 8 times...

'Remember, these are right from the paper you printed up...

x2(i) = -x(i) * s!(theta) + y(i) * c!(theta)
y2(i) = -x(i) * c!(theta) * s!(phi) - y(i) * s!(theta) * s!(phi) - Z(i)

* c!(phi) + p
Z2(i) = -x(i) * c!(theta) * c!(phi) - y(i) * s!(theta) * c!(phi) + Z(i)

* s!(phi)

x3(i) = 256 * (x2(i) / (Z2(i) + zcenter)) + xcenter
y3(i) = 256 * (y2(i) / (Z2(i) + zcenter)) + ycenter

PSET (x3(i), y3(i)), 15
NEXT

'All these lines just make the box by connecting the points...
'If you erase all the lines you will get just pixels drawn on the

screen...

LINE (x3(1), y3(1))-(x3(3), y3(3)), 15
LINE (x3(1), y3(1))-(x3(4), y3(4)), 15
LINE (x3(1), y3(1))-(x3(5), y3(5)), 15

LINE (x3(2), y3(2))-(x3(3), y3(3)), 15
LINE (x3(2), y3(2))-(x3(4), y3(4)), 15
LINE (x3(2), y3(2))-(x3(6), y3(6)), 15

LINE (x3(7), y3(7))-(x3(6), y3(6)), 15
LINE (x3(7), y3(7))-(x3(3), y3(3)), 15
LINE (x3(7), y3(7))-(x3(5), y3(5)), 15

LINE (x3(8), y3(8))-(x3(5), y3(5)), 15
LINE (x3(8), y3(8))-(x3(4), y3(4)), 15
LINE (x3(8), y3(8))-(x3(6), y3(6)), 15

PCOPY 1, 0


phi = phi + 1: theta = theta + 1
IF phi > 360 THEN phi = phi - 360
IF theta > 360 THEN theta = theta - 360

FOR i = 1 TO delay: NEXT

LOOP UNTIL press$ = CHR$(27)




'These are all of the points... predetermined...
'Remember, there are 8 points in a cube...

'These first four are the square farthest
'from the screen

DATA 50,50,-50
DATA -50,-50,-50
DATA -50,50,-50
DATA 50,-50,-50


'These are the closest...

DATA 50,50,50
DATA -50,-50,50
DATA -50,50,50
DATA 50,-50,50
Avatar billede Hald Praktikant
25. maj 2005 - 13:45 #18
ku' det bruges ? ;-)

Jeg nød at få gang i det gamle Quick Basic igen, en ret sjov opgave for mig :-)
Avatar billede lisa99 Nybegynder
25. maj 2005 - 14:46 #19
ja det er ret fedt takker. :D
Avatar billede Hald Praktikant
26. maj 2005 - 07:08 #20
selv tak :-) (for points)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester