Git Product home page Git Product logo

catcher's People

Contributors

v-braun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

catcher's Issues

I have a Problem

Problem Description:

Hello I find the game very cool and wanted to program the game yourself with your video. unfortunately, I'm showing mistakes although I've kept myself in your instructions. it's a new Xcode version?

Steps to reproduce:

here the code would be very cool if you could visit the code and help me๐Ÿ™๐Ÿ™

import SwiftUI

struct ContentView: View {

@State var player = Player()

@State var food = [Item]()
@State var bomb = [Item]()

@State var elapsedSec = 0.0
@State var lastDate = Date()
@State var score = 0
let updateTimer = Timer.publish(every: 0.05, on: .current, in: .common).autoconnect()

var body: some View {
    GeometryReader { geometry in
        VStack{
            HStack{
            Spacer()
                Text("\(self.score)")
                    .foregroundColor(self.score > 0 ? Color.blue : Color.red)
                    .font(.largeTitle)
                Spacer()
                
            }
            .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
            .offset(x: 0, y: 60)
            
            ZStack{
                //food
                ForEach(self.food, id: \.id){ item in
                    Circle()
                        .frame(width: item.radius * 2, height: item.radius * 2)
                        .foregroundColor(Color.blue)
                        .position(item.pos)
                }
                
                //bomb
                ForEach(self.bomb, id: \.id){ item in
                    Rectangle()
                        .frame(width: item.radius * 2, height: item.radius * 2)
                        .foregroundColor(Color.red)
                        .position(item.pos)
                }
                // player
                Circle()
                    .frame(width: 20 * 2, height: 20 * 2)
                    .foregroundColor(Color.blue)
                    .position(self.player.pos)
                
            }
            .padding()
            .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
        }
        .background(Color.black)
        .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
        .gesture(
            DragGesture(minimumDistance: 50)
                .onEnded { v in
                    let dX = (v.location.x - v.startLocation.x) * 2
                    let dY = (v.location.y - v.startLocation.y) * 2
                    self.player.target.x = self.player.pos.x + dX
                    self.player.target.y = self.player.pos.y + dY
                }
            
            )
            .onReceive(self.updateTimer, perform: {_ in
                let now = Date()
                self.elapsedSec = Double(now.timeIntervalSince(self.lastDate))
                self.lastDate = now
                
                self.movePlayer()
                
                self.checkOutOfBouds(geometry: geometry);
                
                var collisions = self.food.filter{ SO.collide(to: self.player)}
                self.food.removeAll(where: {collisions.contains(SO)})
                self.food.append(conntentsOf: collisions.map({ _ in Item.spawn(within: geometry)}))
                self.score += collisions.count
                
                collisions = self.bomb.filter{ SO.collide(to: self.player)}
                self.bomb.removeAll(where: {collisions.contains(SO)})
                self.bomb.append(contentsOf: collisions.map({ _ in Item.spawn(within: geometry)}))
                self.score += collisions.count = 10
                
            })
            
        .onAppear{
            self.player.pos = CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2)
            self.player.target = self.player.pos
            
            for _ in 1...3{
                self.food.append(.spawn(within: geometry))
            }
            
            for _ in 1...5{
                self.bomb.append(.spawn(within: geometry))
            
        }
    }
    }

    func movePlayer(){
        let x = Double(self.player.target.x - self.player.pos.x)
        let y = Double(self.player.target.y - self.player.pos.y)
    
        let distance = sqrt((x * x) + (y * y))
        let angleRad = atan2(y, x)
    
        let velocity = distance / 0.5
        var dX = velocity * cos(angleRad);
        var dY = velocity * sin(angleRad);
    
        dX = self.elapsedSec * dX
        dY = self.elapsedSec * dY
    
        self.player.pos.x += CGFloat(dX)
        self.player.pos.y += CGFloat(dY)
    }

    func checkOutOfBounds(geometry : GeometryProxy){
        if self.player.pos.x < 0 {
            self.player.pos.x = geometry.size.width
            self.player.target.x = geometry.size.width + self.player.target.x
        
        }else if self.player.pos.x > geometry.size.width{
            self.player.pos.x = 0
            Self.player.target.x = self.player.target.x - geometry.size.width
        }
    
        if self.player.pos.y < 0 {
            self.player.pos.y = geometry.size.height
            self.player.target.y = geometry.size.height + self.player.target.y
            
        } else if self.player.pos.y > geometry.size.height{
            self.player.pos.y = 0
            self.player.target.y = self.player.target.y - geometry.size.height
        }
        
    
    }
}

struct Player : GameElement{
var pos = CGPoint(x:0,y:0)
var target = CGPoint(x:0,y:0)
var radius = CGFloat(20.0)

}
struct Item : GameElement, Equatable{
var id = UUID()
var pos = CGPoint(x:0,y:0)
var radius = CGFloat(5.0)
}
static func spawn(within : GeometryProxy) -> Item{
var f = Item()
f.pos.x = CGFloat.random(in: 0..<within.size.width)
f.pos.y = CGFloat.random(in: 0..<within.size.height)
return f
}

}

protocol GameElement {
var pos: CGPoint { get }
var radius: CGFloat { get }

}

extension GameElement {
    func collide(to : GameElement) -> Bool{
        let p1 = self.pos
        let p2 = to.pos
        let r1 = self.radius
        let r2 = to.radius
        
        //Code...
        let distance = pow(p2.x - p1.x,2) + pow(p1.y - p2.y, 2)
        let minDistance = pow(r1+r2, 2)
        
        return distance <= minDistance
    }
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

Environment:

  • OS: [e.g. MacOS, Windows, Linux]
  • Version of catcher: [e.g. 2.0]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.