Bild immer in der mitte.

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

bjh

BeitragFr, Jun 14, 2013 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt bin ich fertig.
hat spaß gemacht. Wink

BlitzBasic: [AUSKLAPPEN]
;fenster und backbuffer und zufallsgenerator
Graphics 640,480,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;feld für die daten
Dim map(255,14)

;die 3 bilder für die verschiedenen blöcke: luft, erde, stein
;das bild für den spieler, hier einfach eine kugel
;und der timer
Global bild=CreateImage(32,32,3),player=CreateImage(32,32),timer=CreateTimer(60)

;hier wird die map erstellt
;das will ich nicht so genau erklären
map(0,0)=7
For z=0 To 7
q=128 Shr z ;das selbe wie 128/2^z
For x=0 To 1 Shl z-1 ;das selbe wie 2^z-1
map(x*q*2+q,0)=(map(x*q*2,0)+map(((x+1)*q*2)Mod 256,0))/2+Rand(-q/3,q/3)
If map(x*q*2+q,0)<2 map(x*q*2+q,0)=2
If map(x*q*2+q,0)>13 map(x*q*2+q,0)=13
Next
Next

;map wird gefüllt
For x=0 To 255
z=map(x,0)
For y=0 To z-1
map(x,y)=0
Next
For y=z To 14
map(x,y)=1
Next
Next

;noch zufällige steine
For x=0 To 99
map(Rand(0,255),Rand(0,14))=2
Next

;luft malen
LockBuffer ImageBuffer(bild,0)
For x=0 To 31
For y=0 To 31
WritePixelFast x,y,Rand(48,63)*66052,ImageBuffer(bild,0)
Next
Next
UnlockBuffer ImageBuffer(bild,0)

;erde malen
LockBuffer ImageBuffer(bild,1)
For x=0 To 31
For y=0 To 31
WritePixelFast x,y,Rand(24,48)*262657,ImageBuffer(bild,1)
Next
Next
UnlockBuffer ImageBuffer(bild,1)

;stein malen
LockBuffer ImageBuffer(bild,2)
For x=0 To 31
For y=0 To 31
WritePixelFast x,y,Rand(96,192)*65793,ImageBuffer(bild,2)
Next
Next
UnlockBuffer ImageBuffer(bild,2)

;spielfigur malen, kann man natürlich auch laden
MidHandle player
LockBuffer ImageBuffer(player)
For x=0 To 31
For y=0 To 31
If (x-16)*(x-16)+(y-16)*(y-16)<256 WritePixelFast x,y,Rand(24,48)*65793,ImageBuffer(player)
Next
Next
UnlockBuffer ImageBuffer(player)

While KeyHit(1)=0
;bildschirminhalt löschen
Cls

;tastenabfrage mit pfeiltasten zum laufen
pos_x=(pos_x+KeyDown(205)*4-KeyDown(203)*4+8192)Mod 8192

;springen mit pfeil nach oben
If sprung=0 And KeyHit(200) sprung=20
If sprung>2 sprung=sprung-1:pos_y=pos_y-8*Sgn(sprung)
If pos_y<16 pos_y=16

;wenn spieler im boden steckt, wird er ein stück nach ober versetzt und die sprungvariable auf 0 gesetzt, damit man bodenkontakt für einen erneuten sprung braucht
If map((pos_x/32+10+256)Mod 256,(pos_y+16)/32)>0 pos_y=pos_y-4:sprung=0

;schwerkraft
If map((pos_x/32+10+256)Mod 256,(pos_y+16)/32)=0 pos_y=pos_y+4

;kollisions mit den seiten
If map(((pos_x+12)/32+10+256)Mod 256,(pos_y)/32)>0 pos_x=pos_x-4
If map(((pos_x-16)/32+10+256)Mod 256,(pos_y)/32)>0 pos_x=pos_x+4

;kollisions mit blöcken über dem kopf
If map((pos_x/32+10+256)Mod 256,(pos_y-16)/32)>0 pos_y=pos_y+4

;blöcke zeichnen
For x=0 To 20
For y=0 To 14
DrawBlock bild,x*32-pos_x Mod 32,y*32,map((x+pos_x/32+256)Mod 256,y)
Next
Next

;spieler zeichnen
DrawImage player,320,pos_y

;flip + waittimer, 60 bilder pro sekunde (oben bei createtimer umstellen)
Flip 0
WaitTimer timer
Wend
End


mit den pfeiltasten läuft und springt man.
einfach mal alles durchprobieren und wenn du dann noch fragen hast, einfach fragen.
 

Broco

BeitragFr, Jun 14, 2013 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow super danke Wink
 

Broco

BeitragFr, Jun 14, 2013 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm irgendwie versteh ich nicht ganz wie hier die ganzen variablen deklariert werden.
Und was es mit dem map(0,0)=7 auf sich hat.
 

bjh

BeitragFr, Jun 14, 2013 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
also mit
BlitzBasic: [AUSKLAPPEN]
Dim map(x,y)

wird ein feld definiert, das (x+1)*(y+1) werte speichern kann.

also bei meinem beispiel geht das x von 0 bis 255, also 256=2^8 spalten speichern kann.
die spalten sind dann 15 felder groß, und in jedes feld kann man einen wert speichern.

also map(0,0)=7 heißt, dass an die koordinate 0,0 im feld die 7 geschrieben wird.
bei den dim-feldern musst du aufpassen, dass du nichts außerhalb des feldes liest oder schreibst, weil sonst das programm abstürzt.

schau dir einfach den eintrag unter dim an in der hilfe: https://www.blitzforum.de/help/Dim

aber das mit dem map(0,0)=7 wird später wieder überschrieben mit 0,1 oder 2.
das brauch ich nur, um die höhe auszurechnen, also wie viele luft und erdblöcke in der spalte sind.
 

Broco

BeitragFr, Jun 14, 2013 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok
Jetzt noch wie/wo wurden eigentlich die variablen wie z.B x,y deklariert?
 

bjh

BeitragFr, Jun 14, 2013 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist das schöne an blitzbasic.
man muss sie nicht deklarieren.
wenn man einfach schreibt:
x=0
,dann wird eine lokale variable, falls noch nicht vorhanden, erzeugt.

vielleicht solltest du mal ein tutorial machen. Wink
das find ich gut und es gibt auch eine 3d einführung: https://www.blitzforum.de/showcase/347/

Xeres

Moderator

BeitragFr, Jun 14, 2013 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
bjh hat Folgendes geschrieben:
man muss sie nicht deklarieren.
...sollte man aber. Ist nicht nur ein besserer Stil, ein richtige IDE zeigt einem auch undeklarierte Variablen an, und hilft, super schwer zu findende Bugs zu minimieren. Und einem Anfänger so was kryptisches zu geben
BlitzBasic: [AUSKLAPPEN]
pos_x=(pos_x+KeyDown(205)*4-KeyDown(203)*4+8192)Mod 8192
halte ich auch für weniger Hilfreich... Besonders, weil es nach magischen Zahlen aussieht - gut benannte Konstanten würden dem zumindest etwas abhelfen.

@Broco: Darum selbst ausprobieren - auch wenn fertiger Code gut gemeint ist, lernst du mehr, wenn du es selbst probierst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Broco

BeitragFr, Jun 14, 2013 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok mach ich aber der code hat mir schon echt weitergeholfen Smile

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group