ongelmia

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
naabster
Member
Posts: 56
Joined: Sat Sep 22, 2007 10:10 am

ongelmia

Post by naabster »

tässä olisi aika iso koodin pätkä mut voitteko tutkailla mikä täs on vikana ;)
ongelmina on kun vihu alkaa ampua ja meen vihu näky etäisyydeltä pois luoti pysähtyy siihen mihin jäi
ja taas kun se näkee ne jatkaa matkaa ja luodit lentävät liian nopeasti =(

apua!

Code: Select all

Type SHOT
    Field obj 'object is saved here
End Type

Type ENEMY
    Field obj 'object is saved here
   Field health 'enemys health variable
End Type

Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
    Field obj 'yksi kenttä nimeltään 'obj'
End Type

FrameLimit 40 'limit speed

   'player object
   'master object, all other enemies are cloned from this one
master_enemy=LoadObject("Media\soldier.bmp",72)
ShowObject master_enemy, OFF   'hide the master objecet
bullet_obj=LoadObject("Media\bullet.bmp") ' master bullet object
ShowObject bullet_obj,OFF
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1 
y = LoadSound ("Media\button 1.wav")
ääniAmmu = LoadSound ("Media\gun 1.wav")
aa = LoadSound ("Media\scream1.wav")
osuma = LoadSound ("Media\pop.wav")
f = LoadSound ("Media\gun 7.wav")
player=LoadObject("Media\soldier2.bmp",72)
pati=LoadObject("Media\bullet.bmp")                   
ShowObject pati,OFF  

PositionObject player,30,1150

SetupCollision player,kartta,2,4,2

elämät=100

Repeat
UpdateGame 
CloneCameraPosition player



If CountCollisions(player) Then PlaySound y,20



  
    If LeftKey() Then TurnObject player,5
    If RightKey() Then TurnObject player,-5
    If UpKey() Then MoveObject player,3
    If DownKey() Then MoveObject player,-3  

   
    If KeyDown(cbKeyspace) And reload=0 Then 
     PlaySound ääniammu,35
        newbullet.SHOT = New(SHOT) 
        newbullet\obj=CloneObject(bullet_obj) 
       
        CloneObjectPosition newbullet\obj,player           
       
        CloneObjectOrientation newbullet\obj,player  
        TurnObject newbullet\obj, Rnd(-7, 7)
reload= 5'weapon reload       
    EndIf
     For newbullet.SHOT = Each SHOT
            MoveObject newbullet\obj,1
       If GetMap(2, ObjectX(newbullet\obj), ObjectY(newbullet\obj)) Then
       PlaySound f,30
               DeleteObject newbullet\obj 'poista objekti
                Delete newbullet 'poista luoti kokonaan
            EndIf       
        Next newbullet
    

    If reload>0 Then reload=reload-1
    


If MouseHit(1) Then
    For i = 0 To 10
        newenemy.ENEMY = New(ENEMY)
        newenemy\obj = CloneObject(master_enemy)
 
       PositionObject newenemy\obj,Rand(-600, 600), Rand(-600, 300)' clone it from the master object
      newenemy\health = 40

    SetupCollision newenemy\obj,player,2,2,2
       SetupCollision newenemy\obj,kartta,2,4,2
   
      RotateObject newenemy\obj,Rand(360) 
      Next i
   EndIf


    For newbullet.SHOT = Each SHOT 
        MoveObject newbullet\obj,6
        If ObjectX(newbullet\obj)<-18000 Then
             
         kill_this_bullet = 1
        EndIf       
               
     
         For newenemy.ENEMY = Each ENEMY 
       
            If ObjectsOverlap(newenemy\obj,newbullet\obj) Then 
               newenemy\health - 10 
               kill_this_bullet = 1 
               PlaySound osuma,20
           
            EndIf
         
         Next newenemy
         
  
         
      If kill_this_bullet = 1 Then  
          DeleteObject newbullet\obj 
          Delete newbullet 
         kill_this_bullet = 0 
      EndIf
    Next newbullet

     
      For newenemy.ENEMY = Each ENEMY 
             
            MoveObject newenemy\obj,3
            
            If CountCollisions(newenemy\obj) Then TurnObject newenemy\obj,Rand(10,90)
    
          
            If ObjectSight(newenemy\obj,player) Then
                     
                     PointObject newenemy\obj,player'liikuta vihua
        'jos hahmo osuu vihun näkökenttään, käännä vihu ukkoa kohti...
    If CanSee(newenemy\obj, player, 360) And reload=0 Then                '...ja ammu ukkoa 
         luoti.AMMUS = New(AMMUS) 'luo uusi ammus
        luoti\obj=CloneObject(pati) 'tee klooni
        'asetetaan pati samaan paikkaan
        CloneObjectPosition luoti\obj,newenemy\obj              
        'käännetään pati samaan suuntaan
        CloneObjectOrientation luoti\obj,newenemy\obj          
        reload=15'aseen lataus
    EndIf
    'päivitä aseen lataaminen
    If reload>0 Then reload=reload-1

    'Päivitä kaikki ammukset
    For luoti.AMMUS = Each AMMUS
        MoveObject luoti\obj,4                               'liikuta ammusta
           If ObjectsOverlap (luoti\obj, player) Then         'jos luoti on päällekkäin ukon kanssa...
            elämät -1
            DeleteObject luoti\obj                             
            Delete luoti             
           EndIf     
    Next luoti   
            
            
            
           
            EndIf 
            If ObjectX(newenemy\obj)<-18000 Or ObjectX(newenemy\obj)>18000  Then
               MoveObject newenemy\obj,2
               TurnObject newenemy\obj,180
               
            EndIf
            
            If newenemy\health < 0 Then kill_this_enemy = 1 
            If kill_this_enemy = 1 Then 
               DeleteObject newenemy\obj
               Delete newenemy
               kill_this_enemy = 0
            EndIf
         Next newenemy


  DrawGame 
  
 Text 0,0,"Elämäsi : "+elämät 
   If elämät=-2 Then MakeError "huomasit varmaan mikä oli vikana"
 
    DrawScreen

Until EscapeKey()
Function ObjectDirection(_obj1, _obj2)
    a# = GetAngle2(_obj1, _obj2) - ObjectAngle(_obj1)
    If a > 180 Then a = a - 360
    If a < -180 Then a = a + 360
    Return a
EndFunction

'Tutkitaan näkeekö ukon   
    Function CanSee(_obj1, _obj2, _fov)
'Ensin tarkistetaan että kakkonen on ykkösen näkökentässä
    If Abs(ObjectDirection(_obj1, _obj2)) > _fov Then Return False
'Tarkistetaan ettei ole seinää välissä
    Return ObjectSight(_obj1, _obj2)
EndFunction
Last edited by naabster on Fri Jan 11, 2008 4:01 pm, edited 1 time in total.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: ongelmia

Post by valscion »

Miksi sinulla on TYPEnä SHOT ja AMMUS? Etkö muka voi käyttää samaa kaikkiin tarkoituksiin??

Ja mitä haluat siis meidän tekevän? Antaako koodi sinulla vai MAVin vai mikä ongelma sinulla on?
naabster wrote:ongelmia mitä huomasin on aika paljon selitettäviksi ja osa koodista on "bullshit"
Jos et jaksa kirjoittaa ongelmia emme jaksa korjata koodiasi.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: ongelmia

Post by koodaaja »

Näyttää kyllä copypastetuimmalta purkalta aikoihin. Kommentteja välillä suomeksi, välillä englanniksi ja pitkiä pätkiä ilman yhtään kommenttia. Sisennykset selkeyttäisivät koodisi rakennetta huomattavasti, tämäkin vika löytyisi varmasti nopeammin. OonSuomesta: kaksi typeä, koska koodin kirjoittaja ei osannut lisätä yhteen fieldiä, joka kertoisi kuka kudin ampui. Ja villinä veikkauksena itse ongelmaan: ammuksien päivitys on If cansee()...Endif -lohkossa, varma en kyllä ole, niin hirveää luettavaa tuo koodisi.
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: ongelmia

Post by Marcoder »

koodaaja wrote:Näyttää kyllä copypastetuimmalta purkalta aikoihin.
Jep, aivan kamalaa tuubaa koko koodi. Sisennyksissä ei ole mitään logiikkaa.

Yhtä ja samaa reload-muuttujaa käytetään sekä pelaajan että bottien aseiden lataukseen. Tiedätkö naabster edes miksi tuo reload-muuttuja siellä koodissa on? Mikä on sen tarkoitus? Veikkaan ettet tiedä.

Sitten itse kysymykseen:
Ammusten liikuttelu tehdään "If ObjectSight" iffin sisällä.
Pitää myöntää että tuon iffin endif oli piilotettu aika ovelasti koodin sekaan.
naabster
Member
Posts: 56
Joined: Sat Sep 22, 2007 10:10 am

Re: ongelmia

Post by naabster »

jaa-a aika kovaa kommentia tostaki koodista , mutta kuka tietää mikä on ongelma on ?
voisitte vaikka pistää korjatun koodin jos haluutte =)
Mysterius Coder
Active Member
Posts: 133
Joined: Mon Aug 27, 2007 8:13 pm

Re: ongelmia

Post by Mysterius Coder »

Oikeastaan tuo purkka kannattaisi hylätä kokonaan. Suosittelen lukemaan "komenot" osiota (aka manuaali) Ei kannata copypastettaa pätkiä, vaan opetella itse tekemään.
Kyllä minä osaan, mutta kun mieli on tällasen kaaoksen vallassa, niin ei siitä mitään tule.
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: ongelmia

Post by Marcoder »

naabster wrote:jaa-a aika kovaa kommentia tostaki koodista , mutta kuka tietää mikä on ongelma on ?
voisitte vaikka pistää korjatun koodin jos haluutte =)
No minähän kerroin jo mistä ongelma johtuu. Ammuksia liikutetaan If ObjectSight(newenemy\obj,player) iffin sisällä. Eli liikutetaan ammuksia vain jos vihu näkee pelaajan.

Yhdyn Mysterius Coder:in ehdotukseen täysin.
EDIT:

Ehkä komentti ei olisi ihan näin kovaa jos koodista näkisi että on edes yritetty tehdä jotain itse. Homma nyt vain on niin että jos koodin sekaan copypastettaa muuta koodia jota ei ymmärrä täysin, projekti kusee ennen kuin se ehtii edes käynnistyä.

naabster
Member
Posts: 56
Joined: Sat Sep 22, 2007 10:10 am

Re: ongelmia

Post by naabster »

eli kuinka minä korjaan nuo ongelmat. itse olen kokeillut korjata koodia kauan enkä saanut toimii.
eli voisiko joku kertoa mitä koodin pätkiä pitää korjata ja mitä poistaa ?
BulletStorm

Re: ongelmia

Post by BulletStorm »

naabster wrote:eli kuinka minä korjaan nuo ongelmat. itse olen kokeillut korjata koodia kauan enkä saanut toimii.
eli voisiko joku kertoa mitä koodin pätkiä pitää korjata ja mitä poistaa ?
Kannattaisi ihan ehkä alottaa alusta ja edes kokeilla koodata sitä itse. Jos et tiedä miten jokin asia tehdään, kysy täällä: viewtopic.php?f=10&t=28
EDIT:

No esim. tuossa koodissa sinulla on "SetUpCollision" Repeatin sisällä. Ei sen siellä kuuluisi olla :lol:

naabster
Member
Posts: 56
Joined: Sat Sep 22, 2007 10:10 am

Re: ongelmia

Post by naabster »

jaaha kun ette tiedä miten toi korjataan joten tiedättekö kuinka vihut tässä koodissa saa ampuamaan, nyt se koodi on alku kohas :D

Code: Select all

Type SHOT
    Field obj 'object is saved here
End Type

Type ENEMY
    Field obj 'object is saved here
   Field health 'enemys health variable
End Type


FrameLimit 40 'limit speed

player=LoadObject("Media\soldier.bmp",72)   'player object
   'master object, all other enemies are cloned from this one
master_enemy=LoadObject("Media\guy.bmp",72)
ShowObject master_enemy, OFF   'hide the master objecet
bullet_obj=LoadObject("Media\bullet.bmp") ' master bullet object
ShowObject bullet_obj,OFF

AddText "    Move with arrows, CTRL to shoot."
AddText ""
AddText "    Add enemies with your mouse."
Repeat

    'Control player object with arrows
    If LeftKey() Then TurnObject player,5
    If RightKey() Then TurnObject player,-5
    If UpKey() Then MoveObject player,2
    If DownKey() Then MoveObject player,-2   

    'Shooting system
    If KeyDown(cbKeyRControl) And reload=0 Then   
        newbullet.SHOT = New(SHOT) 'create a new shot
        newbullet\obj=CloneObject(bullet_obj) 'clone from master bullet
        'place the bullet on the player
        CloneObjectPosition newbullet\obj,player           
        'put it on right orientation
        CloneObjectOrientation newbullet\obj,player         
        reload=5 'weapon reload       
    EndIf
    'update shooting
    If reload>0 Then reload=reload-1

   If MouseHit(1) Then   ' If mouse is clicked
      newenemy.ENEMY = New(ENEMY)   ' create a New enemy
      newenemy\obj = CloneObject(master_enemy) ' clone it from the master object
      newenemy\health = 75 'enemy health
      
      PositionObject newenemy\obj,MouseWX(),MouseWY() 'ON the mouse world coordinates
      RotateObject newenemy\obj,Rand(360) ' random direction
   EndIf

    'Update all the bullets
    For newbullet.SHOT = Each SHOT 'Loop through all the bullets
        MoveObject newbullet\obj,6
        If ObjectX(newbullet\obj)<-180 Or ObjectX(newbullet\obj)>180 Or ObjectY(newbullet\obj)<-130 Or ObjectY(newbullet\obj)>130 Then
            'bullet goes outside play-area --> mark it to be destroyed           
         kill_this_bullet = 1
        EndIf       
               
         'The trick is To update te enemies inside the bullet loop
         For newenemy.ENEMY = Each ENEMY 'Loop through all the bullets
            If ObjectsOverlap(newenemy\obj,newbullet\obj) Then 'If objects overlap eachother
               newenemy\health - 25 'reduce some health from the enemy
               kill_this_bullet = 1 'mark the bullet To be removed
            EndIf
            ' the actual AI And health check starts ON row 78
         Next newenemy
         
      If kill_this_bullet = 1 Then ' you cant just remove the bullet, it will cause MAV
          DeleteObject newbullet\obj 'remove the object
          Delete newbullet 'remove the whole bullet
         kill_this_bullet = 0 ' back To Default value
      EndIf
    Next newbullet

      ' And now update the ai And stuff
      For newenemy.ENEMY = Each ENEMY 'Loop through all the bullets
            'some great AI
            MoveObject newenemy\obj,1
            
            'If enemy leaves the boundaries
            If ObjectX(newenemy\obj)<-180 Or ObjectX(newenemy\obj)>180 Or ObjectY(newenemy\obj)<-130 Or ObjectY(newenemy\obj)>130 Then
               MoveObject newenemy\obj,-3 'move it back
               TurnObject newenemy\obj,180 'rotate it To the opposite direction
            EndIf
            
            If newenemy\health < 0 Then kill_this_enemy = 1 'If health goes below zero -> kill
            If kill_this_enemy = 1 Then 'If the enemy is marked To die, kill it now :(
               DeleteObject newenemy\obj
               Delete newenemy
               kill_this_enemy = 0
            EndIf
         Next newenemy

    'this before screen graphics (box)
    DrawGame

    'draw the game boundaries
    Color cbOrange
    Box 20,20,360,260,OFF   
   
    DrawScreen

Until EscapeKey()
BulletStorm

Re: ongelmia

Post by BulletStorm »

naabster wrote:jaaha kun ette tiedä miten toi korjataan joten tiedättekö kuinka vihut tässä koodissa saa ampuamaan, nyt se koodi on alku kohas :D

Code: Select all

Type SHOT
    Field obj 'object is saved here
End Type

Type ENEMY
    Field obj 'object is saved here
   Field health 'enemys health variable
End Type


FrameLimit 40 'limit speed

player=LoadObject("Media\soldier.bmp",72)   'player object
   'master object, all other enemies are cloned from this one
master_enemy=LoadObject("Media\guy.bmp",72)
ShowObject master_enemy, OFF   'hide the master objecet
bullet_obj=LoadObject("Media\bullet.bmp") ' master bullet object
ShowObject bullet_obj,OFF

AddText "    Move with arrows, CTRL to shoot."
AddText ""
AddText "    Add enemies with your mouse."
Repeat

    'Control player object with arrows
    If LeftKey() Then TurnObject player,5
    If RightKey() Then TurnObject player,-5
    If UpKey() Then MoveObject player,2
    If DownKey() Then MoveObject player,-2   

    'Shooting system
    If KeyDown(cbKeyRControl) And reload=0 Then   
        newbullet.SHOT = New(SHOT) 'create a new shot
        newbullet\obj=CloneObject(bullet_obj) 'clone from master bullet
        'place the bullet on the player
        CloneObjectPosition newbullet\obj,player           
        'put it on right orientation
        CloneObjectOrientation newbullet\obj,player         
        reload=5 'weapon reload       
    EndIf
    'update shooting
    If reload>0 Then reload=reload-1

   If MouseHit(1) Then   ' If mouse is clicked
      newenemy.ENEMY = New(ENEMY)   ' create a New enemy
      newenemy\obj = CloneObject(master_enemy) ' clone it from the master object
      newenemy\health = 75 'enemy health
      
      PositionObject newenemy\obj,MouseWX(),MouseWY() 'ON the mouse world coordinates
      RotateObject newenemy\obj,Rand(360) ' random direction
   EndIf

    'Update all the bullets
    For newbullet.SHOT = Each SHOT 'Loop through all the bullets
        MoveObject newbullet\obj,6
        If ObjectX(newbullet\obj)<-180 Or ObjectX(newbullet\obj)>180 Or ObjectY(newbullet\obj)<-130 Or ObjectY(newbullet\obj)>130 Then
            'bullet goes outside play-area --> mark it to be destroyed           
         kill_this_bullet = 1
        EndIf       
               
         'The trick is To update te enemies inside the bullet loop
         For newenemy.ENEMY = Each ENEMY 'Loop through all the bullets
            If ObjectsOverlap(newenemy\obj,newbullet\obj) Then 'If objects overlap eachother
               newenemy\health - 25 'reduce some health from the enemy
               kill_this_bullet = 1 'mark the bullet To be removed
            EndIf
            ' the actual AI And health check starts ON row 78
         Next newenemy
         
      If kill_this_bullet = 1 Then ' you cant just remove the bullet, it will cause MAV
          DeleteObject newbullet\obj 'remove the object
          Delete newbullet 'remove the whole bullet
         kill_this_bullet = 0 ' back To Default value
      EndIf
    Next newbullet

      ' And now update the ai And stuff
      For newenemy.ENEMY = Each ENEMY 'Loop through all the bullets
            'some great AI
            MoveObject newenemy\obj,1
            
            'If enemy leaves the boundaries
            If ObjectX(newenemy\obj)<-180 Or ObjectX(newenemy\obj)>180 Or ObjectY(newenemy\obj)<-130 Or ObjectY(newenemy\obj)>130 Then
               MoveObject newenemy\obj,-3 'move it back
               TurnObject newenemy\obj,180 'rotate it To the opposite direction
            EndIf
            
            If newenemy\health < 0 Then kill_this_enemy = 1 'If health goes below zero -> kill
            If kill_this_enemy = 1 Then 'If the enemy is marked To die, kill it now :(
               DeleteObject newenemy\obj
               Delete newenemy
               kill_this_enemy = 0
            EndIf
         Next newenemy

    'this before screen graphics (box)
    DrawGame

    'draw the game boundaries
    Color cbOrange
    Box 20,20,360,260,OFF   
   
    DrawScreen

Until EscapeKey()
No jos haluat, että vihut ampuu jos on 40 pixelin tai vähemmän (oliko oikein?) päässä, niin teet näin:

Code: Select all

If distance2 (obj1, obj2) <40 then
Ampuminen tähän
Joku saa korjata jos on väärin, sillä en ole käyttänyt Distancea tai distance2:ta pitkään aikaan.
Post Reply