Code: Select all
ObjectInteger ship_player\obj, ConvertToInteger(ConvertToType(ship_player))
Code: Select all
ObjectInteger ship_player\obj, ConvertToInteger(ConvertToType(ship_player))
Toi toimi kääntämiseen, mutta ajon aikana siitä tuli errori "ConvertToType() failed! Could not find a converted type with ID 1" jotenkin minä arvasin että tämätyyppinen errori tulee hyvä yritys mutta...Sly_Jack0 wrote:En kuollaksenikaan nyt osaa sanoa miksi, mutta tämä toimii:En keksi, miten ship_player ei olisi jo valmiiksi tyyppimuuttuja. Enkä myöskään tiedä toimiiko ohjelma halutulla tavalla noin, se sinun pitää kertoa.Code: Select all
ObjectInteger ship_player\obj, ConvertToInteger(ConvertToType(ship_player))
Uskoisin että pelkästään tämä riittää ongelman korjaamiseksi:Sly_Jack0 wrote:En kuollaksenikaan nyt osaa sanoa miksi, mutta tämä toimii:En keksi, miten ship_player ei olisi jo valmiiksi tyyppimuuttuja. Enkä myöskään tiedä toimiiko ohjelma halutulla tavalla noin, se sinun pitää kertoa.Code: Select all
ObjectInteger ship_player\obj, ConvertToInteger(ConvertToType(ship_player))
Code: Select all
ObjectInteger ship_player\obj, ConvertToInteger(ship_player)
Jahas, taisin jättää lukematta viestisi ja tehdä päätelmät ilman itse informaation ydintä.. (Tämmöisessä olen loistava xD) Tosiaan jännä, tuo jonka laitoin on ihan oikea tapa ja pitäisi toimia ilman mitään ongelmia. Et kai ole määrittänyt ship_player:ia ajemmin minään muuna muuttujana? Ja miksi edes käytät tuollaista ship_player tyyppiosoitinta...?Sly_Jack0 wrote:Alkuperäinen ongelmahan oli nimenomaan, että tuo postaamasi pätkä ei toimi.
Code: Select all
SCREEN 1024,600,0,1
FrameLimit 60
Hehe, no vähä.Tikka19 wrote:Anteeksi jos on liian tyhmä kysymys.
Code: Select all
SCREEN 800, 600
FrameLimit 60
// -----------------------
Function MakeRain(density# = 1, width = 0, height = 0)
If width = 0 Then width = ScreenWidth()
If height = 0 Then height = ScreenHeight()
count = RoundUp(width * height * (density / 10000))
main = MakeMEMBlock(count * 4 + 4)
For drop = 0 To count - 1
PokeShort main, drop * 4, Rand(width) * 21.0
PokeShort main, drop * 4 + 2, Rand(height) * 21.0
Next drop
head = MakeMEMBlock(16)
PokeInt main, count * 4, head
PokeShort head, 0, count
PokeShort head, 2, width
PokeShort head, 4, height
PokeShort head, 6, 0
PokeShort head, 8, 32768
Return main
EndFunction
Function DrawRain(rain, delta# = 16.666, rx = 0, ry = 0)
size = MEMBlockSize(rain)
head = PeekInt(rain, size - 4)
lastdrop = (PeekShort(head, 0) + 0) -1
t = PeekShort(head, 6)
width = PeekShort(head, 2)
height = PeekShort(head, 4)
drift# = ((PeekShort(head, 8) + 0) - 32768) / 1000.0
delta# = delta# / 16.666
gravity# = 4.5
For drop = 0 To lastdrop
x# = (PeekShort(rain, drop * 4) + 0) / 21.0
y# = (PeekShort(rain, drop * 4 + 2) + 0) / 21.0
z# = 0.75 + ((drop Mod 11) ^ 1.66) * 0.025
x# = x# + drift# * z# * delta# * (0.85 + Cos(t * 0.4 + (drop Mod 36) * 10) * 0.15)
y# = y# + gravity# * z# * delta#
If y > height
y# = 0
x# = Rand(width)
Else
If x > width Then x - width
If x < 0 Then x + width
EndIf
PokeShort rain, drop * 4 + 2, y# * 21.0
PokeShort rain, drop * 4, x# * 21.0
Circle rx + x# - z#, ry + y# - z#, z# * 2
Next drop
PokeShort head, 6, t + delta# * 10
EndFunction
Function SetRainDrift(rain, x# = 0)
head = PeekInt(rain, MEMBlockSize(rain) - 4)
PokeShort head, 8, 32768 + x * 1000.0
EndFunction
// -----------------------
myRain = MakeRain(15)
SetRainDrift(myRain, 2)
Repeat
DrawRain(myRain)
Text 16, 16, "FPS: "+FPS()
DrawScreen
Forever
Code: Select all
oikea_vastaus$="la Date"
Code: Select all
z = x << y
Kumiankka wrote:Mikä mahtaisi olla vastine tälle CoolBasic:ssaCode: Select all
z = x << y
Code: Select all
z = x Shl y
Code: Select all
SCREEN 1000,700
Type vector
Field x1
Field y1
Field z1
Field x2
Field y2
Field z2
Field cR
Field cG
Field cB
EndType
Function newVector(x1,y1,z1,x2,y2,z2,cR=255,cG=255,cB=255)
v.vector = New(vector)
v\x1=x1
v\y1=y1
v\z1=z1
v\x2=x2
v\y2=y2
v\z2=z2
v\cR=cR
v\cG=cG
v\cB=cB
EndFunction
camaX#=90.0
camaY#=0.0
sw=ScreenWidth()
sh=ScreenHeight()
sw2=ScreenWidth()/2
sh2=ScreenHeight()/2
For z=0 To 20
For y=-1000 To 1000 Step 300
For x=-1000 To 1000 Step 300
cR=Rand(0,255)
cRR=Rand(0,cR)
cG=cRR*0.7
cB=cRR*0.7
rn=Rnd(0,0.2)
newVector(x,y,z+rn,x+50,y,z+rn,cR,cG,cB)
newVector(x+50,y+50,z+rn,x+50,y,z+rn,cR,cG,cB)
newVector(x,y+50,z+rn,x+50,y+50,z+rn,cR,cG,cB)
newVector(x,y,z+rn,x,y+50,z+rn,cR,cG,cB)
newVector(x,y,z+0.5+rn,x+50,y,z+0.5+rn,cR,cG,cB)
newVector(x+50,y+50,z+0.5+rn,x+50,y,z+0.5+rn,cR,cG,cB)
newVector(x,y+50,z+0.5+rn,x+50,y+50,z+0.5+rn,cR,cG,cB)
newVector(x,y,z+0.5+rn,x,y+50,z+0.5+rn,cR,cG,cB)
newVector(x,y,z+rn,x,y,z+0.5+rn,cR,cG,cB)
newVector(x+50,y+50,z+rn,x+50,y+50,z+0.5+rn,cR,cG,cB)
newVector(x,y+50,z+rn,x,y+50,z+0.5+rn,cR,cG,cB)
newVector(x+50,y,z+rn,x+50,y,z+0.5+rn,cR,cG,cB)
Next x
Next y
Next z
camZ#=2.0
camX#=0
camY#=0
Repeat
camZ=camZ+(KeyDown(cbkeyW)-KeyDown(cbkeyS))*0.01
camZ=camZ+0.5
camaX=(camaX+((KeyDown(cbkeyRight)-KeyDown(cbkeyLeft))*1.5))
camaY=(camaY+((KeyDown(cbkeyUP)-KeyDown(cbkeyDOWN))*1.1))
camX=camX+(KeyDown(cbkeyD)-KeyDown(cbkeyA))*20
camY=camY+(KeyDown(cbkeyW)-KeyDown(cbkeyS))*-Sin(camaY)*200
For v.vector = Each vector
If (v\z1-camZ) > 0 And (v\z2-camZ) > 0 Then
x1=sw2*Cos(camaX)*4 + ((v\x1-camX)/(v\z1-camZ))+sw2
y1=sh2*Sin(camaY)*4 + ((v\y1-camY)/(v\z1-camZ))+sh2
x2=sw2*Cos(camaX)*4 + ((v\x2-camX)/(v\z2-camZ))+sw2
y2=sh2*Sin(camaY)*4 + ((v\y2-camY)/(v\z2-camZ))+sh2
intcol=v\cB+(v\cG Shr 8) + (v\cR shr 16)
Color v\cR,v\cG,v\cB
Line x1,y1,x2,y2
ElseIf (camZ-v\z1) < 20 Then
newVector(v\x1,v\y1,v\z1+20,v\x2,v\y2,v\z2+20,v\cR,v\cG,v\cB)
Delete v
EndIf
Next v
Color 255,255,255
Text 0,0,"camaX="+camaX
Text 0,20,"camaY="+camaY
Text 0,40,"camZ="+camZ
Text 0,60,"camX="+camX
Text 0,80,"camY="+camY
//SetWindow ""+FPS()
DrawScreen
Forever
Tästä voit lähteä soveltamaan jos kameran ei tarvitse katsoa suoraan alas tai ylös päin:DJ-Filbe wrote:Miten saan pyöritettyä 3d-maailmaa (kameraa) pysty/vaakasuunnassa niin, että voin kääntää kameran taaksepäin ja nähdä särmiöiden loittonevan kamerasta?
(Voit liikkua WASD ja nuolista)
Code: Select all
..da code..
Aivan siis kuten atomimalli tarkensi, Vektorikokoelman nimi kannattaisi olla Lines tjsp. En allekirjoita kuitenkaan atomimallin verteksin ja vektorin eroa. Verteksi on verkeksi ja se koostuu erilaisista attribuutti vektoreista, kerran kyse on 3D-grafiikasta.
Code: Select all
uusix=x-camX
uusiy=y-camY
uusiz=z-camZ
Code: Select all
kulma=180 //täysikäännös
uudempix = cos(kulma) * x1 + sin(kulma) * z1
uudempiz = -sin(kulma) * x1 + cos(kulma) * z1
Code: Select all
ruudunx = zoomikerroin*uusix/uusiz+ruudunkeskix
ruuduny = zoomikerroin*uusiy/uusiz+ruudunkeskix
Code: Select all
Type Map
Field Name$
Field Width%
Field Height%
' Layers
Field BG1%
Field BG2%
Field OBJ%
Field FG1%
Field FG2%
EndType
Const BG1% = 0
Const BG2% = 1
Const OBJ% = 2
Const FG1% = 3
Const FG2% = 4
Function af_MakeLayer(Width%, Height%)
_memSize% = ((Width * Height) Shl 2) + 4
_lr% = MakeMEMBlock(_memSize)
PokeShort _lr, 0, Width
PokeShort _lr, 2, Height
Return _lr
EndFunction
Function af_MakeMap(Name$, Width%, Height%)
m.Map = New(Map)
m\Name = Name
m\Width = Width
m\Height = Height
' Layers
m\BG1 = af_MakeLayer(m\Width, m\Height)
m\BG2 = af_MakeLayer(m\Width, m\Height)
m\OBJ = af_MakeLayer(m\Width, m\Height)
m\FG1 = af_MakeLayer(m\Width, m\Height)
m\FG2 = af_MakeLayer(m\Width, m\Height)
Return ConvertToInteger(m)
EndFunction
Function af_LayerInsert(Handle%, X%, Y%, Value%)
_width% = PeekShort(Handle, 0)
_memSize = MEMBlockSize(Handle)
' Calculate Position
_y% = (_width * Y)
_pos% = 4 + ((_y + X) Shl 2)
' Make sure _pos is legal
If _pos > _memSize Then Return False
' Insert Value at Position
PokeInt Handle, _pos, Value
EndFunction
Function af_MapInsert(Handle%, X%, Y%, Layer%, Value%)
m.Map = ConvertToType(Handle)
If Layer = BG1 Then
af_LayerInsert(m\BG1, X, Y, Value)
ElseIf Layer = BG2 Then
af_LayerInsert(m\BG2, X, Y, Value)
ElseIf Layer = OBJ Then
af_LayerInsert(m\OBJ, X, Y, Value)
ElseIf Layer = FG1 Then
af_LayerInsert(m\FG1, X, Y, Value)
ElseIf Layer = FG2 Then
af_LayerInsert(m\FG2, X, Y, Value)
EndIf
EndFunction
Function af_DrawLayer(Handle%)
_width% = PeekShort(Handle, 0)
_memSize% = MEMBlockSize(Handle)
_i% = 4
DRAW:
_pos% = (_i Shr 2) - 1
// Shl 3 = 8x8 tiles, Shl 4 = 16x16 tiles
// Shl 5 = 32x32 tiles, Shl 6 = 64x64 tiles
_x% = (_pos Mod _width) Shl 4
_y% = (_pos / _width) Shl 4
_val% = PeekInt(Handle, _i)
Text _x, _y, _val
If _val = 0 Then Goto UPDATE
UPDATE:
_i = (_i + 4)
If _i = _memSize Then Return True
Goto DRAW
EndFunction
Function af_DrawMap(Handle%)
m.Map = ConvertToType(Handle)
af_DrawLayer(m\BG1)
af_DrawLayer(m\BG2)
af_DrawLayer(m\OBJ)
af_DrawLayer(m\FG1)
af_DrawLayer(m\FG2)
EndFunction
Function af_DeleteMap(Handle%)
m.Map = ConvertToType(Handle)
DeleteMEMBlock m\BG1
DeleteMEMBlock m\BG2
DeleteMEMBlock m\OBJ
DeleteMEMBlock m\FG1
DeleteMEMBlock m\FG2
Delete m
EndFunction
Code: Select all
Include "src/Sprite.CB"
Include "src/Map.CB"
grid_lr = af_MakeLayer(15, 10)
af_LayerInsert(grid_lr, 0, 0, 1)
andria = af_MakeMap("Andria", 15, 10)
'af_MapInsert(andria, 0, 0, FG2, 1)
'af_MapInsert(andria, 1, 1, FG2, 2)
MAIN:
// [ Camera ]
If LeftKey() Then MoveCamera -3, 0
If RightKey() Then MoveCamera 3, 0
If DownKey() Then MoveCamera 0, -3
If UpKey() Then MoveCamera 0, 3
SetWindow "" + FPS()
DrawToWorld ON, ON, ON
af_DrawLayer(grid_lr)
'af_DrawMap(andria)
DrawToWorld OFF, OFF, OFF
DrawScreen
Goto MAIN
Code: Select all
..
Text _x, _y, _val
If _val = 0 Then Goto UPDATE
UPDATE:
..