Heippa
Meniköhän oikealle alueelle, vai kuuluuko muihin kieliin?
FrameLimit 40 'Koko
korkeus = ScreenHeight() 'Ruudun korkeus
leveys = ScreenWidth() 'Ruudun leveys
nopeus = 5 'Kuinka nopeasti pallo liikkuu
AddText "Siirtele palloa nuolilla"
AddText ""
AddText "Korkeus: " + korkeus
AddText "Leveys: " + leveys
SetWindow "Siirtele palloa" 'Ohjelman otsikko
x = 170 'Pallon alkusijainti
y = 120 'Pallon alkusijainti
While Not KeyHit(cbkeyesc) 'Niin kauan kun ei paineta esciä
If RightKey() Then x = x + nopeus 'Oikealle
If LeftKey() Then x = x - nopeus 'Vasemmalle
If UpKey() Then y = y - nopeus 'Ylös
If DownKey() Then y = y + nopeus 'Alas
If x > 400 - 40 Then 'Jos osutaan oikeaan laitaan
For a = 0 To 60
x = x - 1
Next a
End If
If x < 0 Then 'Jos osuttiin vasempaan laitaan
For b = 0 To 60
x = x + 1
Next b
End If
If y < 0 Then 'Jos osuttiin yläreunaan
For c = 0 To 60
y = y + 1
Next c
End If
If y > 300 - 40 Then 'Jos osuttiin alareunaan
For d = 0 To 60
y = y - 1
Next d
End If
Color 255, 255, 255 'Laitetaan väriksi valkoinen
Circle x, y, 40 'Piirretään pallo 40 pikselin halkaisialla
DrawScreen 'Piirretään ruudulle
WendTein tuollaisen testiohjelman tuossa monen vuoden tauon jälkeen. Ohjelmalla pystyy siirtelemään palloa nuolilla. Jos se osuu reunaan, niin se kimpoaa tulosuuntaan 60 pikseliä. Ongelmana on se, että For silmukat suoritetaan liian nopeasti. Koitin laittaa For-silmukan sisään Wait 200, mutta tämä odottaa 0,2 sekuntia ennen kuin aloittaa silmukoiden pyörityksen. Tarkoitus olisi, että pallo ei kimpoaisi noin kovaa vauhtia takaisin.
Ongelmana on, että ohjelma piirtää vasta While-silmukan lopuksi ympyrän (Circle) ja päivittää ruudun (DrawScreen). Tämän vuoksi vain For-silmukan viimeinen x:n tai y:n arvo vaikuttaa piirtoon.
Kiitos, miksenköhän itse älynnyt? Kysympähän vielä:
1. Miten piirrän Tilesterillä kartan? Valitsen T-näppäintä painamalla palikan, mutta miten teen niistä (ei) ylimentäviä?
2. Miten saan luodit hävitettyä (Delete object) kun se osuu ei ylimentävään seinään ilman koordinaattien sanelua? Kai tämäkin onnistuu.
Siinä mitä olen saanut aikaan.
Type ammus
Field obj 'Kenttä
End Type
FrameLimit 40 'Nopeus
ukko = LoadObject("soldier.bmp", 72)
pati = LoadObject("bullet.bmp")
vihollinen = LoadImage("soldier.bmp")
ShowObject pati, OFF
aani = LoadSound("pum.wav")
SetWindow "Sniper man"
kartta = LoadMap("testmap.til", "C:\Program Files\Coolbasic\Media\tileset.bmp")
PlayObject kartta, 0, 0, 1
ukko = LoadObject ("soldier.bmp", 72)
SetupCollision ukko, kartta, 1, 4, 2
Repeat
'Ohjaus
If LeftKey() Then TurnObject ukko, 5
If RightKey() Then TurnObject ukko, -5
If UpKey() Then MoveObject ukko, 2
If DownKey() Then MoveObject ukko, -2
If KeyDown(cbkeyspace) And reload = 0 Then
PlaySound aani, 100, 0, 60000
luoti.ammus = New(ammus) 'Ammutaan
luoti \ obj = CloneObject(pati) 'Kloonataan
CloneObjectPosition luoti \ obj, ukko 'Asetetaan se samaan paikkaan
CloneObjectOrientation luoti \ obj, ukko 'Lähetetään samaan suuntaan
reload = 4 'aseen lataus
EndIf
If reload > 0 Then reload = reload - 1 'Latausta aseeseen
'Päivitä kaikki ammukset
For luoti.ammus = Each AMMUS
MoveObject luoti \ obj, 23
Next luoti
UpdateGame
CloneCameraPosition ukko
DrawScreen
ForeverJatkoa
3. Miten saan tietoon kuinka kauan ohjelma on ollut käynnissä?
pistä ohjelman alkuun timer ja sitten kun haluat ajan miinusta nykyisestä ajasta timerin aika.
Kiitos. =)
Miten saisin luodin pysäytetyksi ja hävitetyksi kun se törmää johonkin? Entä olisiko jossain opas tuon Tilesterin käyttöön? En löytänyt...
Olihan se opas siellä Coolbasicin sivuilla.
Seuraavaan ongelmaan: Tein "pelin" jossa liikutetaan ukkelia. Tällä voi myös ampua painamalla spacea. Tässä koodi. Tätä siis voi ohjata näppäimistöllä, ja luodit lähtevät aseesta kun ns. ampuu.
Type ammus
Field obj
Field partikkeli
End Type
SCREEN 800, 600, 0, 0
Type RÄJÄHDYKSET
Field partikkeli
End Type
FrameLimit 40 'Nopeus
pati = LoadObject("data/bullet.bmp")
ShowObject pati, OFF
aani = LoadSound("data/pum.wav")
SetWindow "Sniper man"
kartta = LoadMap("data/cdm2.til", "data/tileset.bmp")
PlayObject kartta, 0, 0, 1
snd = LoadSound("data/tausta.mp3")
SetSound snd, 1
snd_play = PlaySound(snd)
ukko = LoadObject("data/soldier.bmp", 72)
SetupCollision ukko, kartta, 1, 4, 2
ammuttu = 0
aika = Timer()
Repeat
aika_nyt = Timer()
'Ohjaus
If LeftKey() Then TurnObject ukko, 5
If RightKey() Then TurnObject ukko, -5
If UpKey() Then MoveObject ukko, 2
If DownKey() Then MoveObject ukko, -2
If KeyDown(cbkeyspace) And reload = 0 Then
PlaySound aani, 100, 0, 60000
luoti.ammus = New (ammus)
luoti\obj = CloneObject(pati)
CloneObjectPosition luoti\obj, ukko
CloneObjectOrientation luoti\obj, ukko
SetupCollision luoti\obj, kartta, 2, 4, 1
ResetObjectCollision luoti\obj
reload = 5 'aseen lataus
ammuttu = ammuttu + 1
EndIf
If reload > 0 Then reload = reload - 1 'Latausta aseeseen
Locate 5, 0
AddText "Ammuttu " + ammuttu + " kertaa"
Locate 5, 15
AddText "Aikaa kulunut " + (aika_nyt - aika) / 1000 + " sek."
'Päivitä kaikki ammukset
For luoti.ammus = Each AMMUS
MoveObject luoti \ obj, 23
If CountCollisions(luoti\obj) Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti
UpdateGame
CloneCameraPosition ukko
DrawScreen
ForeverTässä taas koodi jonka pitäisi toimia hiirellä liikuttaen. Nuolilla liikutaan, mutta ukko kääntyisi hiiren suuntaan. Tämä ei kuitenkaan toimi, enkä ole osannut yhdistää luotien lähtemistä tähän koodiin.
SCREEN 800, 600, 0, 0
Type EFFECTS
Field x
Field y
Field size
End Type
DrawToWorld ON
FrameLimit 40 'Nopeus
aani = LoadSound("data/pum.wav") 'Ladataan ampumaääni
SetWindow "Sniper man" 'Otsikko
kartta = LoadMap("data/cdm2.til", "data/tileset.bmp") 'Ladataan kenttä
sotilas = LoadObject("data/sotilas.bmp", 360) 'Ladataan sotilas
RotateObject sotilas, 90 'Käännetään sotilaan kasvot ylöspäin
SetupCollision sotilas, kartta, 1, 4, 2 'Tarkistetaan ettei sotilas törmää
ObjectRange soldier, 30 'Asettaa törmäyksen vaihteluvälin
ObjectPickable kartta, ON 'Tehdään kartta valittavaksi
PlayObject kartta, 0, 0, 1 'Animoidaan kartta
tähtäin = LoadImage("data/tahtain.bmp") 'Ladataan tähtäin ja asetetaan se kursoriksi
ShowMouse tähtäin
ammuttu = 0 'Kuinka monta kertaa on ammuttu
aika = Timer() 'Pelin aloitusaika
Repeat
aika_nyt = Timer() 'Nykyinen aika
sijainti = GetAngle(200, 150, MouseX(), MouseY())
RotateObject sotilas, sijainti
'Ohjaus
If LeftKey() Then TurnObject sotilas, 5 'Vasemmalle
If RightKey() Then TurnObject sotilas, -5 'Oikealle
If UpKey() Then MoveObject sotilas, 2 'Ylös
If DownKey() Then MoveObject sotilas, -2 'Alas
If MouseDown(1) And lataus = 0 Then
ObjectPick sotilas
If PickedObject() Then
effect.EFFECTS = New(EFFECTS)
effect\x = PickedX()
effect\y = PickedY()
effect\size = 2
EndIf
lataus = 6
EndIf
If lataus Then lataus = lataus - 1
Locate 5, 0
AddText "Ammuttu " + ammuttu + " kertaa"
Locate 5, 15
AddText "Aikaa kulunut " + (aika_nyt - aika) / 1000 + " sek."
DrawGame
Gosub updateEFFECTS
UpdateGame
CloneCameraPosition sotilas
DrawScreen
Forever
updateEFFECTS:
For effect.EFFECTS = Each EFFECTS
Color cbyellow
Circle effect\x-effect\size, effect\y + effect\size, effect\size * 2, OFF
effect\size = effect\size + 1
If effect\size > 10 Then Delete effect
Next effect
ReturnLisäksi manuaalin oma esimerkki. Miksei tämä toimi fullscreen modessa (SCREEN 800, 600, 0, 0)?
Type EFFECTS
Field x
Field y
Field size
End Type
DrawToWorld ON 'draw circles onto game world
FrameLimit 40 'limit speed for fast computers
'Load the map and the hero
map=LoadMap("Media\cdm2.til","Media\tileset.bmp")
soldier=LoadObject("Media\soldier.bmp",360)
RotateObject soldier,90 'make the soldier face upwards
SetupCollision soldier,map,1,4,2 'create sliding collision
ObjectRange soldier,30 'set collision range for radius 15
ObjectPickable map,ON 'make map pickable
PlayObject map,0,0,1 'animate map
'Load and set a custom mouse pointer (the crosshair)
crosshair=LoadImage("Media\crosshair.bmp")
ShowMouse crosshair
AddText "Move: WASD, Aim: Mouse, Shoot: Mouse1"
Repeat
'Get the angle to the crosshair and turn to it
aim=GetAngle(200,150,MouseX(),MouseY())
RotateObject soldier,aim
'Update Controls
If KeyDown(cbkeys) Then TranslateObject soldier,0, -3
If KeyDown(cbkeyw) Then TranslateObject soldier,0,3
If KeyDown(cbkeyd) Then TranslateObject soldier,3,0
If KeyDown(cbkeya) Then TranslateObject soldier, -3,0
'Update shooting
If MouseDown(1) And reload=0 Then
ObjectPick soldier
If PickedObject() Then
effect.EFFECTS=New(EFFECTS)
effect\x=PickedX()
effect\y=PickedY()
effect\size=2
EndIf
reload=6
EndIf
If reload Then reload=reload-1
'draw objects and then EFFECTS
DrawGame
Gosub updateEFFECTS
'stick the camera to the soldier and draw screen
UpdateGame
CloneCameraPosition soldier
DrawScreen
Until EscapeKey()
End
':::::::::::::::::::::::::::::::::::::::::::::
'This sub-program will update all existing EFFECTS
updateEFFECTS:
'Iterate all
For effect.EFFECTS=Each EFFECTS
'Draw efefct
Color cbyellow
Circle effect\x-effect\size,effect\y+effect\size,effect\size*2,OFF
'Update effect size
effect\size=effect\size+1
'Remove effect when it gets too large
If effect\size>10 Then Delete effect
Next effect
ReturnLisäksi, miten voin kiinnittää kuvia (Media\guy.bmp) kiinteiksi kohteiksi alueelle jotta ne lukittuvat tuohon hiiren "tähtäimeen"?
Aihe on jo aika vanha, joten et voi enää vastata siihen.