Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: CoolBasic Wait aika

Macro [04.01.2010 19:27:47]

#

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.

Antti Laaksonen [04.01.2010 20:17:10]

#

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.

Macro [05.01.2010 10:31:08]

#

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

Macro [05.01.2010 12:12:52]

#

Jatkoa

3. Miten saan tietoon kuinka kauan ohjelma on ollut käynnissä?

alottelijaa [05.01.2010 14:25:14]

#

pistä ohjelman alkuun timer ja sitten kun haluat ajan miinusta nykyisestä ajasta timerin aika.

Macro [05.01.2010 14:37:57]

#

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...

Macro [05.01.2010 19:08:30]

#

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"?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta