Isometrie, mehr oder weniger [BB2D]

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Kabelbinder

Sieger des WM-Contest 2006

Betreff: Isometrie, mehr oder weniger [BB2D]

BeitragDi, März 27, 2007 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ich habe mich neulich mal an Isometrie herangewagt. Dabei habe ich mich zwar nicht genau an die Vorgaben und Abmessungen gehalten, das Ergebnis kann sich aber finde ich trotzdem sehen lassen.
Das ist dabei herausgekommen:

http://home.arcor.de/platzvers...metrie.rar

Kann sein, dass man zufällig am Anfang ein leeres Feld erwischt und runterfällt. Dann einfach neu starten.
Die Probleme, dies nocht gibt: Die größe der Karte muss in x- und y-Richtugn dieselbe sein, sonst gibt es komischerweise (allerdings nur im Debugmodus) "Array Index out of Bounds" und angezeigt wird eigentlich eine Funktion.

Edit: Achso, kein Problem:
Code: [AUSKLAPPEN]
AppTitle "Isometrie"
Graphics 640,480,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Const ledge = 29
Const redge = 29
Const issue = 1
Const umlaufzeit = 13
Const tilemax = 5

Global scrollx,scrolly,xcor#,ycor#,frame,dir,timer,speed#,zspeed#,slip,ebene,zcor

Dim isomap(ledge,redge,issue)
For i = 0 To redge
For j = 0 To ledge
For k = 1 To issue
isomap(j,i,k)=Rand(0,5)
Next
Next
Next

Global isoset = LoadAnimImage("img/iso/t_tiles.bmp",60,40,0,tilemax+1)
MaskImage isoset,255,0,255
MidHandle isoset

Global lfin = LoadImage("img/iso/l_flanke.bmp")
MaskImage lfin,255,0,255
MidHandle lfin

Global rfin = LoadImage("img/iso/r_flanke.bmp")
MaskImage rfin,255,0,255
MidHandle rfin

Global char = LoadAnimImage("img/char.bmp",30,30,0,64)
MaskImage char,255,0,255
MidHandle char

Function isox#(zx#,zy#)
Return (zx*3-zy*3)
End Function

Function isoy#(zx#,zy#)
Return (zy*2+zx*2)
End Function

Function draw()

;Dahinter
For y = 0 To ledge
For x = 0 To redge
For k = 0 To issue
If ebene>=k Then

 DrawImage isoset,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly,isomap(x,y,k)

If x=redge Then
 If isomap(x,y,k)<>0 Then DrawImage rfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
Else
 If isomap(x+1,y,k)=0 Then
 If isomap(x,y,k)<>0 Then DrawImage rfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
 EndIf
EndIf

If y=ledge Then
 If isomap(x,y,k)<>0 Then DrawImage lfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
Else
 If isomap(x,y+1,k)=0
 If isomap(x,y,k)<>0 Then DrawImage lfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
 EndIf
EndIf

 EndIf
Next
Next
Next

DrawImage char,isox(xcor,ycor)-scrollx,isoy(xcor,ycor)+zcor-scrolly,frame+dir*16

;Davor
For y = 0 To ledge
For x = 0 To redge
For k = 0 To issue
 If k>ebene Then
DrawImage isoset,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly,isomap(x,y,k)

If x=redge Then
 If isomap(x,y,k)<>0 Then DrawImage rfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
Else
 If isomap(x+1,y,k)=0 Then
 If isomap(x,y,k)<>0 Then DrawImage rfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
 EndIf
EndIf

If y=ledge Then
 If isomap(x,y,k)<>0 Then DrawImage lfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
Else
 If isomap(x,y+1,k)=0
 If isomap(x,y,k)<>0 Then DrawImage lfin,isox(x,y)*10-scrollx,isoy(x,y)*10-scrolly
 EndIf
EndIf

EndIf
Next
Next
Next

Text 0,0,isomap(xcor/10,ycor/10,1)
Text 0,20,xcor
Text 0,30,ycor
Text 0,50,Int(xcor/10)
Text 0,60,Int(ycor/10)
End Function

Function steuerung()
If KeyDown(200) Then
ycor = ycor - speed
xcor = xcor - speed
 If MilliSecs()-timer>30 Then
 timer = MilliSecs()
  If frame = 15 Then
  frame = 0
  Else
  frame = frame + 1
  EndIf
 EndIf
dir = 3
EndIf

If KeyDown(208) Then
ycor = ycor + speed
xcor = xcor + speed
 If MilliSecs()-timer>30 Then
 timer = MilliSecs()
  If frame = 15 Then
  frame = 0
  Else
  frame = frame + 1
  EndIf
 EndIf
dir = 1
EndIf

If KeyDown(203) Then
xcor = xcor - speed
ycor = ycor + speed
 If MilliSecs()-timer>30 Then
 timer = MilliSecs()
  If frame = 15 Then
  frame = 0
  Else
  frame = frame + 1
  EndIf
 EndIf
dir = 2
EndIf

If KeyDown(205) Then
xcor = xcor + speed
ycor = ycor - speed
 If MilliSecs()-timer>30 Then
 timer = MilliSecs()
  If frame = 15 Then
  frame = 0
  Else
  frame = frame + 1
  EndIf
 EndIf
dir = 0
EndIf
End Function

Function kamera()
scrollx = isox(xcor,ycor) - 320
scrolly = isoy(xcor,ycor) - 240
End Function

Function fall()
If isomap(xcor/10,ycor/10,1)=0 Then slip = 1
If slip = 1 Then
zspeed=zspeed+0.1
zcor = zcor + zspeed
zspeed = zspeed * 0.999
EndIf
If zcor>20 Then ebene = 0
End Function

scrollx = 0
scrolly = 0
speed = 0.5
ebene = 1
slip = 0
Repeat
fratim = MilliSecs()

If slip = 0 Then steuerung()
kamera()
fall()
draw()

If MilliSecs()-fratim>umlaufzeit Then Delay umlaufzeit-(MilliSecs()-fratim)
Flip
Cls
Until KeyHit(1)
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
  • Zuletzt bearbeitet von Kabelbinder am Di, März 27, 2007 21:57, insgesamt einmal bearbeitet

StepTiger

BeitragDi, März 27, 2007 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
möchte ja nicht der bumann sein, aber kein download-only im codearchiv.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Tornado11

BeitragDi, März 27, 2007 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Manchmal fällt man durch die Bodenplatten hindurch.-->ungenaue Kollision

Silver_Knee

BeitragMi, März 28, 2007 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
das sieht so aus... weil beim fallen die platten immernoch unter dem mensch gemalt werden...

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, März 28, 2007 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Nene, die Kollision stimmt schon. Das kann man schon an dern Werten oben Links in der Ecke sehen. Das is ne Punkt-Kollision

Und nach dem Fallen müssen zwar einige Platten danach (also davor), andere aber noch davor (also dahinter) gezeichnet werden. So einfach ist es nicht.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

krux

BeitragDo, März 29, 2007 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
der grafikfehler,dass man sich so lange noch vor den anderen objekten sieht, sollte noch behoben werden. und isometrische charaktergrafik sollte noch erstellt werden. Das ist auch nicht sonderlich schwer einfach das normale Bild in alle diagonalen himmelsrichtungen drehen, und dann auf 50% in y richtung stauchen.

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, März 29, 2007 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Seit wann geht es bitte im Codearchiv um hübsche Grafik?
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

FWeinb

ehemals "ich"

BeitragFr, März 30, 2007 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Frage dein mensch oder was das sein soll müste doch wenn du schon isometrie haben wilst auch so sein wie der Boden aufdem er steht

Oder nihct ?????
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Kabelbinder

Sieger des WM-Contest 2006

BeitragFr, März 30, 2007 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist völlig egal.
Ich hätte zum testen auch einfach ein weißes Rect nehmen können. Es geht mir im Codearchiv eher um die Strategie und den Code. Hauptsache, das Schema stimmt erstmal. Wir sind hier nicht Projekte-Thread.

Mein character ist aus der Vogelperspektive aufgenommen und passt so vom Blickwinkel her nicht so richtig in die Isometrie hinein.
In nem Spiel würde ich den dann schon von vorn zeichnen.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

krux

BeitragFr, März 30, 2007 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
naja schön muss er ja nicht sein, aber schon perspektiwisch richtig, sonst geht das gefühl von isometrie flöten, und schwer ist das ja nun wirklich nicht. Immerhin hat der kern schon füße, die sicherlich mehr aufwand waren, als das teil in richtiger perspektive darzustellen.

Kabelbinder

Sieger des WM-Contest 2006

BeitragFr, März 30, 2007 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mein Standart-character, den ich immer nehme, wenn ich sowas mache.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 31, 2007 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer Blitz3D hat, kann auch auf folgende Methode zurück greifen: Code: [AUSKLAPPEN]
Graphics3D 400,400,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,12,16,-12
RotateEntity camera,30,45,0
CameraProjMode camera,2
CameraZoom camera,.25

light=CreateLight()
RotateEntity light,70,30,0

mcube=CreateCube()
EntityType mcube,2
HideEntity mcube

ball=CreateSphere(16)
PositionEntity ball,0,6.5,0
ScaleEntity ball,.25,.25,.25
EntityRadius ball,.25
EntityParent camera,ball
EntityType ball,1

Dim cube(48)
For z=-3 To 3
 For x=-3 To 3
  If Rand(10)<>9
   cube(pos)=CopyEntity(mcube)
   PositionEntity cube(pos),x*2,0,z*2
   If Rand(20)=1 MoveEntity cube(pos),0,1,0
   EntityColor cube(pos),255,Rand(128),0
   EntityType cube(pos),2
   pos=pos+1
  End If
 Next
Next

Collisions 1,2,2,2




While Not KeyHit(1)
 If KeyDown(203) MoveEntity ball,-.02,0,-.02
 If KeyDown(205) MoveEntity ball,+.02,0,+.02
 If KeyDown(200) MoveEntity ball,-.02,0,+.02
 If KeyDown(208) MoveEntity ball,+.02,0,-.02
 MoveEntity ball,0,-.05,0
 UpdateWorld
 RenderWorld
 Flip
Wend
End

Zumindest gibt es hier keine Projektionsfehler als auch sind Schräge Flächen möglich. Allerdings hab ich den Code hier mal schnell geschrieben und ist somit nicht besonders optimiert (jede Fläche ein Surface (bzw. Cube)). Es soll nur eine Möglichkeit zeigen.

edit1: Wer ein steileren Winkel haben will, so ändert die Kameraeinstellung wie folgt: Code: [AUSKLAPPEN]
PositionEntity camera,12,23,-12
RotateEntity camera,45,45,0

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group