Ongelma aseiden kanssa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Kippari

Ongelma aseiden kanssa

Post by Kippari »

Elikkäs yritin käyttää tuota yhtä täältä foorumeilta löytämääni ampumis -koodia pelissäni. Ongelma on se että pelissäni on kaksi pelaajaa, ja tuo oli tehty vain yhdelle. Koitin virittää sitä niin että toimisi kahdella mutta nyt tuli muutama ongelma:
Kun ampuu pelaajalla 2, ääni kuuluu myös pelaajalta 1. Kun pelaajalla 2 vaihtaa asetta, se palaa aloituspaikkaansa?
Myös kasa muita ongelmia on että jos joku viitsisi vähän korjailla koodia.

Code: Select all

SCREEN 640, 480







//********************************************************************************
// Weapon.cb
//
// Aseet ja ammukset
//********************************************************************************



//--------------------------------------------------------------------------------
// Globaalit
//--------------------------------------------------------------------------------
Global gLastShoot : gLastShoot = 0      // Koska on viimeksi ammuttu
Global gLastShoot2 : gLastShoot2 = 0

//--------------------------------------------------------------------------------
// Aseet
//--------------------------------------------------------------------------------
Const WPN_PISTOL        = 1     // DESSUT
Const WPN_SMG           = 2     // ak 47!
Const WPN_SPAS          = 3     // sinko
Const WPN_COUNT         = 3     // kaikki aseet



//--------------------------------------------------------------------------------
// Aseiden ominaisuudet
//--------------------------------------------------------------------------------
Const WPNF_CHARACTER    = 1     // Pelihahmon objekti
Const WPNF_RELOADTIME   = 2     // Aseen latausaika
Const WPNF_BULLET       = 3     // Ammusobjekti
Const WPNF_BULLETSPEED  = 4     // Ammuksen lentonopeus
Const WPNF_BULLET_FORTH = 5     // Ammuksen lähtöpaikka pelaajan etupuolella (aseen piipun sijainti pelaajaan nähden)
Const WPNF_BULLET_YAW   = 6     // Ammuksen lähtöpaikka sivusuunnassa (aseen piipun sijainti pelaajaan nähden)
Const WPNF_IMAGE        = 7     // Aseen infokuva
Const WPNF_SPREAD       = 8     // Ammusten hajonta asteina
Const WPNF_SHOOTSOUND   = 9     // Ampumisen ääni
Const WPNF_COUNT        = 9     // Tietoalkioiden lukumäärä



//--------------------------------------------------------------------------------
// Asetaulukko ja sen alustus
//--------------------------------------------------------------------------------
Dim aWeapon(WPN_COUNT, WPNF_COUNT)

// DESSUT
aWeapon(WPN_PISTOL, WPNF_CHARACTER)     = LoadObject("media/pelaaja1.bmp", 45)
aWeapon(WPN_PISTOL, WPNF_RELOADTIME)    = 500
aWeapon(WPN_PISTOL, WPNF_BULLET)        = LoadObject("media/pistol_bullet.png", 45)
aWeapon(WPN_PISTOL, WPNF_BULLETSPEED)   = 19
aWeapon(WPN_PISTOL, WPNF_BULLET_FORTH)  = 33
aWeapon(WPN_PISTOL, WPNF_BULLET_YAW)    = 10
aWeapon(WPN_PISTOL, WPNF_IMAGE)         = LoadImage("media/pistol.png")
aWeapon(WPN_PISTOL, WPNF_SPREAD)        = 0
aWeapon(WPN_PISTOL, WPNF_SHOOTSOUND)    = LoadSound("media/pistol_shot.wav")

// AK 47!!
aWeapon(WPN_SMG, WPNF_CHARACTER)        = LoadObject("media/pelaaja1.bmp", 45)
aWeapon(WPN_SMG, WPNF_RELOADTIME)       = 100
aWeapon(WPN_SMG, WPNF_BULLET)           = LoadObject("media/tracer_bullet.png", 45)
aWeapon(WPN_SMG, WPNF_BULLETSPEED)      = 15
aWeapon(WPN_SMG, WPNF_BULLET_FORTH)     = 35
aWeapon(WPN_SMG, WPNF_BULLET_YAW)       = 8
aWeapon(WPN_SMG, WPNF_IMAGE)            = LoadImage("media/smg.png")
aWeapon(WPN_SMG, WPNF_SPREAD)           = 3
aWeapon(WPN_SMG, WPNF_SHOOTSOUND)       = LoadSound("media/smg_shot.wav")

//SINKO

aWeapon(WPN_SPAS, WPNF_CHARACTER)        = LoadObject("media/pelaaja1.bmp", 45)
aWeapon(WPN_SPAS, WPNF_RELOADTIME)       = 2000
aWeapon(WPN_SPAS, WPNF_BULLET)           = LoadObject("media/rocket.png", 45)
aWeapon(WPN_SPAS, WPNF_BULLETSPEED)      = 8
aWeapon(WPN_SPAS, WPNF_BULLET_FORTH)     = 35
aWeapon(WPN_SPAS, WPNF_BULLET_YAW)       = 8
aWeapon(WPN_SPAS, WPNF_IMAGE)            = LoadImage("media/sinko.png")
aWeapon(WPN_SPAS, WPNF_SPREAD)           = 3
aWeapon(WPN_SPAS, WPNF_SHOOTSOUND)       = LoadSound("media\bazooka_shot.wav")




// Piilotetaan objektit
For i = 1 To WPN_COUNT
    ShowObject aWeapon(i, WPNF_CHARACTER), OFF
    ShowObject aWeapon(i, WPNF_BULLET), OFF
Next i


//--------------------------------------------------------------------------------
// Kokoelma ammuksille
//--------------------------------------------------------------------------------
Type BULLETS
    Field obj       // Ammusobjekti
    Field weapon    // Millä aseella tämä on ammuttu
EndType

Type BULLETS2
    Field obj
    Field weapon
EndType 






Global gMap : gMap = LoadMap("media/uustestmap.til", "media/negative2.bmp")

// Luodaan tyhjä pelaajaobjekti
Global ville : ville = MakeObject()
Global jorma : jorma = MakeObject()

'botti



// Asetetaan törmäys
SetupCollision ville, gMap, 2, 4, 2
SetupCollision jorma, gMap, 2, 4, 2
SetupCollision jorma, ville, 2, 2, 2
SetupCollision ville, jorma, 2, 2, 2

// Pelaajan ase
Global gCurrentWeapon : gCurrentWeapon = WPN_PISTOL
Global gCurrentWeapon2 : gCurrentWeapon2 = WPN_PISTOL



// Pääsilmukka
Repeat
    UpdateBullets()
    UpdateBullets2()
    Paintville()
    ControlPlayer()
    ControlPlayer2()
    Paintjorma()
    
    DrawGame
    DrawImage aWeapon(gCurrentWeapon, WPNF_IMAGE), 0, 0
    DrawImage aWeapon(gCurrentWeapon2, WPNF_IMAGE), 0, 0
    DrawScreen
Forever



//================================================================================
// Maalataan pelaajaobjekti sen mukaan mikä ase sillä on
//================================================================================
Function Paintville()
    // Käytössä olevan aseen tietoa säilytetään objektin integer-muuttujassa
    currentWeapon = ObjectInteger(ville)
    // Ei maalailla turhaan jos oikea pelihahmo on jo valittu
    If currentWeapon = gCurrentWeapon Then Return True
    
    // Maalataan pelaajaobjekti aseen mukaisella kuvalla
    PaintObject ville, aWeapon(gCurrentWeapon, WPNF_CHARACTER)
    ObjectInteger ville, gCurrentWeapon
    
EndFunction


Function Paintjorma()
    // Käytössä olevan aseen tietoa säilytetään objektin integer-muuttujassa
    currentWeapon2 = ObjectInteger(jorma)
    // Ei maalailla turhaan jos oikea pelihahmo on jo valittu
    If currentWeapon2 = gCurrentWeapon2 Then Return True
    
    // Maalataan pelaajaobjekti aseen mukaisella kuvalla
    PaintObject jorma, aWeapon(gCurrentWeapon2, WPNF_CHARACTER)
    ObjectInteger jorma, gCurrentWeapon2
    PositionObject jorma, 20,40
    
EndFunction



//================================================================================
// Pelaajan kontrollointi
//================================================================================
Function ControlPlayer()

    
    // Pelaajan liikuttelu
  If LeftKey() Then TurnObject ville,5
  If RightKey() Then TurnObject ville,-5
  If UpKey() Then MoveObject ville,3
  If DownKey() Then MoveObject ville,-4 
    // Asetta voidaan vaihtaa tai sillä voidaan ampua vain
    // jos aseen latausaika on mennyt umpeen.
    If gLastShoot + aWeapon(gCurrentWeapon, WPNF_RELOADTIME) < Timer() Then
      
    
        // Aseen vaihto Tab-näppäimellä
        If KeyHit(54) Then gCurrentWeapon + 1

        // Varmistetaan vielä että ase on olemassa
        If gCurrentWeapon < 1 Then gCurrentWeapon = WPN_COUNT
        If gCurrentWeapon > WPN_COUNT Then gCurrentWeapon = 1

        // Ampuminen
        If KeyDown(28) Then Shoot()
    EndIf
    
EndFunction




Function ControlPlayer2()

    
    // Pelaajan liikuttelu
  If KeyDown(30) Then TurnObject jorma,5
            If KeyDown(32) Then TurnObject jorma,-5
            If KeyDown(17) Then MoveObject jorma,3
            If KeyDown(31) Then MoveObject jorma,-4 
    // Asetta voidaan vaihtaa tai sillä voidaan ampua vain
    // jos aseen latausaika on mennyt umpeen.
    If gLastShoot2 + aWeapon(gCurrentWeapon2, WPNF_RELOADTIME) < Timer() Then
    
        // Aseen vaihto shift-näppäimellä
        If KeyHit(18) Then gCurrentWeapon2 + 1

        // Varmistetaan vielä että ase on olemassa
        If gCurrentWeapon2 < 1 Then gCurrentWeapon2 = WPN_COUNT
        If gCurrentWeapon2 > WPN_COUNT Then gCurrentWeapon2 = 1

        // Ampuminen
        If KeyDown(34) Then Shoot2()
    EndIf
    
EndFunction






//================================================================================
// Ampuminen
//================================================================================
Function Shoot(_yaw = 1)
    // Luodaan uusi ammus
    b.BULLETS   = New(BULLETS)
    b\obj       = CloneObject(aWeapon(gCurrentWeapon, WPNF_BULLET))
    b\weapon    = gCurrentWeapon
    
    // Asetetaan oikeaan asentoon
    CloneObjectOrientation b\obj, ville

  
    // Hajonta
    TurnObject b\obj, Rnd(-aWeapon(gCurrentWeapon, WPNF_SPREAD), aWeapon(gCurrentWeapon, WPNF_SPREAD))

    // Asetetaan oikeaan paikkaan
    CloneObjectPosition b\obj, ville
    // Siirretään vielä piipun kohdalle.
    // Sopivat siirtymäarvot haetaan asetaulukosta.
    MoveObject b\obj, aWeapon(gCurrentWeapon, WPNF_BULLET_FORTH), aWeapon(gCurrentWeapon, WPNF_BULLET_YAW) * _yaw
    
    // Jos ammuttiin pistoolilla niin tehdään vielä toinen ammus toiselle aseelle
    If _yaw = 1 And gCurrentWeapon = WPN_PISTOL Then Shoot(-1)
    
    // Soitetaan vielä ampumisen ääni
    PlaySound aWeapon(gCurrentWeapon, WPNF_SHOOTSOUND)
    
    gLastShoot = Timer()
EndFunction



//================================================================================
// Päivitetään ammuksia
//================================================================================
Function UpdateBullets()
    For b.BULLETS = Each BULLETS
        // Liikutetaan ammusta ja sen nopeus riippuu siitä millä aseella se on ammuttu
        MoveObject b\obj, aWeapon(b\weapon, WPNF_BULLETSPEED)
        
        // Tarkistetaan ettei osunut seinään
        If GetMap(2, ObjectX(b\obj), ObjectY(b\obj)) <> 0 Then
            DeleteObject b\obj
            Delete b
        EndIf
    Next b
EndFunction





Function Shoot2(_yaw = 1)
    // Luodaan uusi ammus
    b.BULLETS   = New(BULLETS)
    b\obj       = CloneObject(aWeapon(gCurrentWeapon2, WPNF_BULLET))
    b\weapon    = gCurrentWeapon2
    
    // Asetetaan oikeaan asentoon
    CloneObjectOrientation b\obj, jorma

  
    // Hajonta
    TurnObject b\obj, Rnd(-aWeapon(gCurrentWeapon2, WPNF_SPREAD), aWeapon(gCurrentWeapon2, WPNF_SPREAD))

    // Asetetaan oikeaan paikkaan
    CloneObjectPosition b\obj, jorma
    // Siirretään vielä piipun kohdalle.
    // Sopivat siirtymäarvot haetaan asetaulukosta.
    MoveObject b\obj, aWeapon(gCurrentWeapon2, WPNF_BULLET_FORTH), aWeapon(gCurrentWeapon2, WPNF_BULLET_YAW) * _yaw2
    
    // Jos ammuttiin pistoolilla niin tehdään vielä toinen ammus toiselle aseelle
    If _yaw2 = 1 And gCurrentWeapon2 = WPN_PISTOL Then Shoot(-1)
    
    // Soitetaan vielä ampumisen ääni
    PlaySound aWeapon(gCurrentWeapon, WPNF_SHOOTSOUND)
    
    gLastShoot2 = Timer()
EndFunction



Function UpdateBullets2()
    For b.BULLETS = Each BULLETS
        // Liikutetaan ammusta ja sen nopeus riippuu siitä millä aseella se on ammuttu
        MoveObject b\obj, aWeapon(b\weapon, WPNF_BULLETSPEED)
        
        // Tarkistetaan ettei osunut seinään
        If GetMap(2, ObjectX(b\obj), ObjectY(b\obj)) <> 0 Then
            DeleteObject b\obj
            Delete b
        EndIf
    Next b
EndFunction





Post Reply