Ich habe mich nach Plankton etwas hingesetzt und mal das und das gemacht, experimentiert und so. Und natürlich, wie von euch empfohlen, mich etwas mit Listen bzw. Strukturen vertraut gemacht. Nun hatte ich auch mal experimentiert, eine 2D Spiel Engine zu machen. So eine, dass man alles von oben sieht, eigentlich so wie bei Dune. Hier ist der Code (PureBasic 4.00!):
Code: Alles auswählen
Global ScreenWidth = 800
Global ScreenHeight = 600
Global Mapsize = 64 ; more than 64 are too CPU/GPU intensive
InitSprite()
InitMouse()
InitKeyboard()
UsePNGImageDecoder()
OpenScreen(ScreenWidth, ScreenHeight, 32, "2D Felder")
LoadSprite(1, "a.png")
LoadSprite(2, "unit.png")
LoadSprite(3, "cursor_house.png")
LoadSprite(4, "cursor_pointer.png")
LoadSprite(5, "b.png")
MouseLocate(ScreenWidth/2, ScreenHeight/2)
Structure Mapfield
UniqueID.l ; The unique identification number for the field
XPosition.l ; Y Position of the Field
YPosition.l ; X Position of the Field
Type.l ; The Type
EndStructure
Global NewList Mapfield.Mapfield()
Element = 0
XPosition = -1
YPosition = 0
While CountList(Mapfield()) < Mapsize*Mapsize
Element = Element+1
XPosition = XPosition+1
If XPosition = Mapsize
YPosition = YPosition+1
XPosition = 0
EndIf
AddElement(Mapfield())
Mapfield()\UniqueID = Element
Mapfield()\XPosition = XPosition*64
Mapfield()\YPosition = YPosition*64
Mapfield()\Type = 0
Wend
Repeat
ExamineKeyboard()
ExamineMouse()
ClearScreen(RGB(127, 127, 127))
ForEach Mapfield()
DisplaySprite(1, Mapfield()\XPosition, Mapfield()\YPosition)
If MouseX() < 10
Mapfield()\XPosition = Mapfield()\XPosition+7
ElseIf MouseX() > ScreenWidth-10
Mapfield()\XPosition = Mapfield()\XPosition-7
ElseIf MouseY() < 10
Mapfield()\YPosition = Mapfield()\YPosition+7
ElseIf MouseY() > ScreenHeight-10
Mapfield()\YPosition = Mapfield()\YPosition-7
EndIf
If KeyboardPushed(#PB_Key_Up)
Mapfield()\YPosition = Mapfield()\YPosition+10
ElseIf KeyboardPushed(#PB_Key_Down)
Mapfield()\YPosition = Mapfield()\YPosition-10
ElseIf KeyboardPushed(#PB_Key_Left)
Mapfield()\XPosition = Mapfield()\XPosition+10
ElseIf KeyboardPushed(#PB_Key_Right)
Mapfield()\XPosition = Mapfield()\XPosition-10
EndIf
If Mapfield()\Type = 1
DisplaySprite(5, Mapfield()\XPosition, Mapfield()\YPosition)
ElseIf SpriteCollision(4, MouseX(), MouseY(), 1, Mapfield()\XPosition, Mapfield()\YPosition) And MouseButton(#PB_MouseButton_Left)
DisplaySprite(5, Mapfield()\XPosition, Mapfield()\YPosition)
; Listenelement auswählen und bearbeiten
;
; Durch die SpritePixelCollision() muss die UniqueID herausgefunden werden.
; Dann muss jenes Listenelement ausgewählt werden.
; Wenn möglich, werden die Werte geändert,
; andernfalls muss jenes Element gelöscht bzw. durch eines mit geänderten Werten ersetzt werden
;
;
ElseIf SpriteCollision(4, MouseX(), MouseY(), 1, Mapfield()\XPosition, Mapfield()\YPosition)
DisplayTranslucentSprite(5, Mapfield()\XPosition, Mapfield()\YPosition, 64)
EndIf
Next
DisplayTransparentSprite(3, MouseX(), MouseY())
DisplayTransparentSprite(4, MouseX(), MouseY())
StartDrawing(ScreenOutput()) : DrawingMode(1)
DrawText(0, 0, Str(Mapsize)+"x"+Str(Mapsize)+" = "+Str(Mapsize*Mapsize), RGB(255, 0, 0))
DrawText(0, 20, "Currently are "+Str(CountList(Mapfield()))+" Elements in the 'Mapfield' List/Structure", RGB(255, 0, 0))
DrawText(0, 40, "Current selected List Element: "+Str(ListIndex(Mapfield())), RGB(255, 0, 0))
StopDrawing()
FlipBuffers()
ClearScreen(0)
Until KeyboardReleased(#PB_Key_Escape)
http://www.thenameless.de/engine.zip
Jetzt wollte ich fragen, was ihr davon haltet. Ich glaube, ich hab da fundamental was falsch gemacht, denn wenn ich mehr als 64x64 Felder mache (Also nächste größe wäre 128 (Zweierpotenzen)), dann stottert mein PC schon. Es ist einfach lahm... Ist der Ansatz, bzw. der Gedanke der Engine richtig?
Ich hatte mir vorgestellt, dass man später halt durch klicken(SpriteCollisson) das geklickte Listenelement bearbeitet und somit den Status verändert, dass der PC z.B.