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 Wend
Tein 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 Forever
Jatkoa
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 Forever
Tä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 Return
Lisä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 Return
Lisä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.